无论是从声卡读取数据,或是向声卡写入数据,事实上都具有特定的格式(format),默认为8位无符号数据、单声道、8KHz采样率,如果默认值无法达到要求,可以通过ioctl系统调用来改变它们。通常说来,在应用程序中打开设备文件/dev/dsp之后,接下去就应该为其设置恰当的格式,然后才能从声卡读取或者写入数据。
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;
}