主题 : oss音频应用的问题,,求救,,, 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 7762
精华: 0
发帖: 8
金钱: 80 两
威望: 80 点
综合积分: 16 分
注册时间: 2009-07-27
最后登录: 2017-09-13
楼主  发表于: 2009-08-10 11:10

 oss音频应用的问题,,求救,,,

本人用在mini2440小,自己编写了两个小程序,分别调用内核驱动模块,实现录音和放音功能,可是在程序运行的时候,播放的声音是噪音,而不是我录制的音乐,特此求救?
//录音程序
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>

int main( )
{
    int audio_fd;
    int music_fd;    
        signed short applicbuf[2048];        
    int count;
    int channels ;
    int format;
    int speed ;  //44.1 KHz
    int mixer_fd;
        int testchan ;        
    int recsrc ;  
    int totalbyte ;
    int totalword ;
    int total ;
    char *filename;

    filename="/mnt/net/CHA13/alarm.wav";    //打开音频设备
    if ((audio_fd = open("/dev/dsp",O_RDONLY,0)) == -1)
    {
        perror("/dev/dsp");
        exit(1);
    }
        //设置音频格式、声道数、采样频率
//    format = AFMT_S16_NE;
    format = 16 ;
    if (ioctl(audio_fd,SNDCTL_DSP_SETFMT, &format) == -1)
    {
        perror("SNDCTL_DSP_SETFMT");
        exit(1);
    }
    channels= 1;
    if (ioctl(audio_fd, SNDCTL_DSP_CHANNELS, & channels) == -1)
    {
        perror("SNDCTL_DSP_CHANNELS");
        exit(1);
    }
//     speed = 44100;  //44.1 KHz
    speed = 22050;   //11 KHz
    if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &speed) == -1)
    {
        perror("SNDCTL_DSP_SPEED");
        exit(1);
    }
    if ( (music_fd = open(filename, O_WRONLY| O_APPEND| O_CREAT, 0) ) == -1)
    {
            perror(filename);
            exit(1);
        }
        if ( (mixer_fd = open("/dev/mixer", O_WRONLY) ) == -1)
    {
        perror("open /dev/mixer error");
            exit(1);
        }
        //设置录音源

    testchan = SOUND_MIXER_MIC;        
    recsrc = (1 << testchan);
       if (ioctl(mixer_fd, SOUND_MIXER_WRITE_RECSRC,&recsrc) == -1)
//       if (ioctl(mixer_fd, SOUND_MIXER_WRITE_RECSRC,&testchan ) == -1)
    {
        perror("CD");
        exit(1);
    }

    totalbyte= speed * channels * 2 * 60 * 3;
    totalword = totalbyte/2;
    total = 0;

    while (total != totalword)
    {
        if (totalword - total >= 2048)
        count = 2048;
        else
        count = totalword - total;

        read(audio_fd, applicbuf, count);//录音
        write(music_fd, applicbuf, count);//写入文件
        total += count;          
    }
    close(mixer_fd);
    close(audio_fd);
    close(music_fd);
}
级别: 新手上路
UID: 7762
精华: 0
发帖: 8
金钱: 80 两
威望: 80 点
综合积分: 16 分
注册时间: 2009-07-27
最后登录: 2017-09-13
1楼  发表于: 2009-08-10 11:11
//放音程序
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>

int main( )
{
    int audio_fd;
    int music_fd;    
        signed short applicbuf[2048];        
    int count;
    int channels = 2;
    int format;
    int speed ;  //44.1 KHz
    int mixer_fd;
        int testchan ;        
    int recsrc ;  
    int totalbyte ;
    int totalword ;
    int total ;
    char *filename;
    filename="/mnt/net/CHA13/alarm.wav";    //打开音频设备
    if ((audio_fd = open("/dev/dsp",O_WRONLY,0)) == -1)
    {
        perror("/dev/dsp");
        exit(1);
    }
        //设置音频格式、声道数、采样频率

//    format = AFMT_S16_NE;
    format = 16 ;
    if (ioctl(audio_fd,SNDCTL_DSP_SETFMT, &format) == -1)
    {
        perror("SNDCTL_DSP_SETFMT");
        exit(1);
    }
    channels = 1 ;
    if (ioctl(audio_fd, SNDCTL_DSP_CHANNELS, & channels) == -1)
    {
        perror("SNDCTL_DSP_CHANNELS");
        exit(1);
    }
//    speed = 44100;  //44.1 KHz
    speed = 22050;  //11 KHz
    if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &speed) == -1)
    {
        perror("SNDCTL_DSP_SPEED");
        exit(1);
    }
    if ( (music_fd = open(filename, O_RDONLY, 0) ) == -1)
    {
        perror(filename);
        exit(1);
    }
        //从文件中读音频数据,直接发送到音频设备
    printf(" read sound from filename\n ");
    while ((count = read(music_fd, applicbuf, 2048)) > 0)
    {
        write(audio_fd, applicbuf, count);
    }
    close(audio_fd);
    close(music_fd);
}
级别: 新手上路
UID: 7762
精华: 0
发帖: 8
金钱: 80 两
威望: 80 点
综合积分: 16 分
注册时间: 2009-07-27
最后登录: 2017-09-13
2楼  发表于: 2009-08-10 11:12
因为相关的应用资料比较少,所以没有找到解决的方法,特此来向各位版主请教
级别: 新手上路
UID: 7762
精华: 0
发帖: 8
金钱: 80 两
威望: 80 点
综合积分: 16 分
注册时间: 2009-07-27
最后登录: 2017-09-13
3楼  发表于: 2009-08-10 11:23

 回 2楼(xiaoneiwan) 的帖子

您好,很谢谢你在这个贴着中给与的解答。
但是我现在进行oss音频应用开发时,出现了一点小问题,因为自己能力有限,而且资料不足,故现在没有解决,现在将问题发布在此论坛中,恳请您给予一点帮助。请教的问题链接如下。
http://www.aiothome.com/bbs/read.php?tid=2702&page=e&#a
级别: 新手上路
UID: 8120
精华: 0
发帖: 3
金钱: 30 两
威望: 25 点
综合积分: 6 分
注册时间: 2009-08-11
最后登录: 2009-10-13
4楼  发表于: 2009-08-11 16:52
你好。请问你录制的声音文件用其他播放器播放是正常的吗?
级别: 新手上路
UID: 8120
精华: 0
发帖: 3
金钱: 30 两
威望: 25 点
综合积分: 6 分
注册时间: 2009-08-11
最后登录: 2009-10-13
5楼  发表于: 2009-08-11 17:08
我看了你贴上来的回放部分的代码,猜测可能是写入音频设备的方式有些问题。
刚好前些天写过一个linux上播放PCM编码音频数据的的小程序,也贴上来一起交流一下。
代码中的thread_func_playback线程从一个媒体缓冲队列中取出PCM数据,然后写入音频设备中。
注意在写入的时候每次只写入一个byte,事实上这么做的原因我也不是很清楚,不过猜测是由于音频设备本身属于字符设备所致。
你可以每次写入一个字节试试。

/* Start routine for PCM playback thread */
void thread_func_playback(void)
{
    /* Playback audio frame */
    int32 frame, len;
    
    while (!g_bQuit)
    {
        /* Preparing to re-initialize sound device, pause sending data */
        if (g_bReInitDev || mq_is_buffering())
        {
            continue;
        }
        
        /* Data count want to fetch from mediaq */
        len = 1;
        
        if (mq_fetch((uchar *)&frame, &len))
        {
            wav_send_data(&frame, 1);
            if (mq_percentage() < 20)
            {
                mq_set_buffering();
            }
        }
    }
    
    return;
}

/* Write pcm data to sound device */
void wav_send_data(void * buf, size_t siz)
{
    if (-1 != g_lSoundDev)
    {
        write(g_lSoundDev, buf, siz);
    }
    
    return;
}