DSP

Linux下声卡编程(录制音频文件)

2019-07-13 20:19发布

将音频文件写入声卡的设备文件中可以实现音频文件的播放。而使用read函数来读取声卡设备文件中的内容,则可以实现录音功能。下面的程序代码实现了在Linux系统下使用声卡设备的录音功能。      具体代码如下:

//p6.8.c声卡录音功能
#include
#include
#include
#include
#include
#include
#include //录音时间
#define LENGTH 3 //采样频率
#define RATE 8000 //量化位数
#define SIZE 16 //声道数目
#define CHANNELS 2 //保存录音的音频数据
unsigned char buf[LENGTH*RATE*SIZE*CHANNELS/8]; int main(void){
   //声音设备的文件描述符
   int fd;
  
   int arg;
   //用于保存ioctl的返回值
   int status;    //打开声音设备
   fd=open("/dev/dsp",O_RDWR);    if(fd<0){
      perror("Cannot open /dev/dsp device");
      return 1;
   }    //以下设置声卡参数
   //设置采样时的量化位数
   arg=SIZE;
   status=ioctl(fd,SOUND_PCM_WRITE_BITS,&arg);    if(status==-1){
      perror("Cannot set SOUND_PCM_WRITE_BITS");
      return 1;
   }    //设置采样声道数目
   arg=CHANNELS;    status=ioctl(fd,SOUND_PCM_WRITE_CHANNELS,&arg);
   if(status==-1){
      perror("Cannot set SOUND_PCM_WRITE_CHANNELS");
      return 1;
   }
  
   //设置采样频率
   arg=RATE;
  
   status=ioctl(fd,SOUND_PCM_WRITE_RATE,&arg);    if(status==-1){
     perror("Cannot set SOUND_PCM_WRITE_RATE");
     return 1;
   }    //一直录音,直到按下“ Control-C”停止
   while(1){
     printf("Recording ...: ");
     status=read(fd,buf,sizeof(buf));
    
     if(status==-1){
        perror("read wrong number of bytes");
     }      printf("Play ...: ");
     status=write(fd,buf,sizeof(buf));
     if(status != sizeof(buf)) perror("wrote wrong number of bytes");      //在继续录音前等待回放结束
     status=ioctl(fd,SOUND_PCM_SYNC,0);      if(status==-1) perror("Cannot set SOUND_PCM_SYNC");
   }
   return 0;
   }