日期:2014-05-16  浏览次数:20710 次

linux下无法得到音频流,望有人讲解清楚录音原理,分不够再加
参考了网上大部分文章, 基本都是 你抄我来我抄他。在录音着一块,基本思路都是从声卡读数据。我调试到现在也没调通。只能从声卡读到一个统一的乱码字符“?”。特来请教,代码如下
C/C++ code
 
int Audio_Record(char *pathname,int nSampleRate,int nChannels,int fmt)
{
    int dsp_fd,mix_fd,status,arg;
    dsp_fd = open("/dev/dsp" , O_RDWR);  /*open dsp*/
   
    if(dsp_fd < 0)
    {
        return  OPEN_DSP_FAILED;
    }
   
    // arg = nSampleRate;
    //status = ioctl(dsp_fd,SOUND_PCM_READ_RATE,&arg); /*set samplerate*/
   
/**
    if(status < 0)
    {
        close(dsp_fd);
        return SAMPLERATE_STATUS;
    }

    if(arg != nSampleRate)
    {
        close(dsp_fd);
        return SET_SAMPLERATE_FAILED;
    }
**/   
  // arg = nChannels;  /*set channels*/
  // status = ioctl(dsp_fd, SOUND_PCM_READ_CHANNELS, &arg);
/**   
    if(status < 0)
    {
        close(dsp_fd);
        return CHANNELS_STATUS;
    }
   
    if( arg != nChannels)
    {
        close(dsp_fd);
        return SET_CHANNELS_FAILED;
    }
**/
    // arg = fmt; /*set bit fmt*/
   
    //status = ioctl(dsp_fd, SOUND_PCM_READ_BITS, &arg);
/**   
    if(status < 0)
    {
        close(dsp_fd);
        return FMT_STATUS;
    }
   
    if(arg != fmt)
    {
        close(dsp_fd);
        return SET_FMT_FAILED;
    }
**/

    arg = 0;
    ioctl( dsp_fd, SNDCTL_DSP_RESET, (char *)&arg );
    ioctl( dsp_fd, SNDCTL_DSP_SYNC, (char *)&arg );

    arg = 1;
    ioctl( dsp_fd, SNDCTL_DSP_NONBLOCK, (char*)&arg );

    arg = nSampleRate;
    ioctl( dsp_fd, SNDCTL_DSP_SPEED, (char *)&arg );
   
    arg = nChannels;
    ioctl( dsp_fd, SNDCTL_DSP_STEREO, 0 );
    ioctl( dsp_fd, SNDCTL_DSP_CHANNELS, (char *)&arg );

    arg = fmt;
    ioctl( dsp_fd, SNDCTL_DSP_SETFMT, (char*)&arg );

    arg = 3;
    ioctl( dsp_fd, SNDCTL_DSP_SETTRIGGER, (char*)&arg );

    arg = 3;
    ioctl( dsp_fd, SNDCTL_DSP_SETFRAGMENT, (char*)&arg );

    arg = 1;
    ioctl( dsp_fd, SNDCTL_DSP_PROFILE, (char*)&arg );

    FILE *file_fd = fopen(pathname,"w+");
    if(file_fd == NULL)
    {
        close(dsp_fd);
        return OPEN_FILE_FAILED;
    }

    int num = 2 * nChannels*nSampleRate*fmt/8;
    int get_num;
    unsigned char buf[num];

    // Record
    int j = 0;
    while( 1 )
    {