DSP

linux dev/dsp 声卡学习笔记

2019-07-13 12:11发布

原文地址:linux dev/dsp 声卡学习笔记作者:ziyou飞翔       无论是从声卡读取数据,或是向声卡写入数据,事实上都具有特定的格式(format),默认为8位无符号数据、单声道、8KHz采样率,如果默认值无法达到要求,可以通过ioctl系统调用来改变它们。通常说来,在应用程序中打开设备文件/dev/dsp之后,接下去就应该为其设置恰当的格式,然后才能从声卡读取或者写入数据。   下面的代码示范了如何以只写方式打开声卡进行放音(playback)操作:   int handle = open("/dev/dsp", O_WRONLY);   if (handle == -1) {   perror("open /dev/dsp");   return -1;   }   下面的代码示范了怎样设置声卡驱动程序中的内核缓冲区的大小:   int setting = 0xnnnnssss;   int result = ioctl(handle, SNDCTL_DSP_SETFRAGMENT, &setting);   if (result == -1) {   perror("ioctl buffer size");   return -1;   }   设置声卡工作时的声道(channel)数目,根据硬件设备和驱动程序的具体情况,可以将其设置为0(单声道,mono)或者1(立体声,stereo)。下面的代码示范了应该怎样设置声道数目:   int channels = 0; // 0=mono 1=stereo   int result = ioctl(handle, SNDCTL_DSP_STEREO, &channels);   if ( result == -1 ) {   perror("ioctl channel number");   return -1;   }   if (channels != 0) {   // 只支持立体声   } 采样格式和采样频率是在进行音频编程时需要考虑的另一个问题,声卡支持的所有采样格式可以在头文件soundcard.h中找到,而通过ioctl系统调用则可以很方便地更改当前所使用的采样格式。下面的代码示范了如何设置声卡的采样格式:   int format = AFMT_U8;   int result = ioctl(handle, SNDCTL_DSP_SETFMT, &format);   if ( result == -1 ) {   perror("ioctl sample format");   return -1;   } 在Linux下进行音频编程时最常用到的几种采样频率是11025Hz、16000Hz、22050Hz、32000Hz和44100Hz。下面的代码示范了如何设置声卡的采样频率:   int rate = 22050;   int result = ioctl(handle, SNDCTL_DSP_SPEED, &rate);   if ( result == -1 ) {   perror("ioctl sample format");   return -1;   }