linux下无法得到音频流,望有人讲解清楚录音原理,分不够再加
参考了网上大部分文章, 基本都是 你抄我来我抄他。在录音着一块,基本思路都是从声卡读数据。我调试到现在也没调通。只能从声卡读到一个统一的乱码字符“?”。特来请教,代码如下
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 )
{
get_num = read( dsp_fd, buf, num );
printf( "buf = %s\n", buf );
printf( "buf = %d\n", buf[0] );
fwrite( buf, 1, get_num, file_fd );
j++;
}
close(dsp_fd);
fclose(file_fd);
return 0;
}