2) 打开设备
if ((audio_fd = open(DEVICE_NAME, open_mode, 0)) == -1) {
/* Open of device failed */
perror(DEVICE_NAME);
exit(1);
}
|
open_mode有三种选择:O_RDONLY,O_WRONLY和O_RDWR,分别表示只读、只写和读写。OSS建议尽量使用只读或只写,只有在全双工的情况下(即录音和放音同时)才使用读写模式。
2. 录音
int len;
if ((len = read(audio_fd, audio_buffer, count)) == -1) {
perror("audio read");
exit(1);
}
|
count为录音数据的字节个数(建议为2的指数),但不能超过audio_buffer的大小。从读字节的个数可以精确的测量时间,例如8kHZ 16-bit stereo的速率为8000*2*2=32000bytes/second,这是知道何时停止录音的唯一方法。
3. 放音
放音实际上和录音很类似,只不过把read改成write即可,相应的audio_buffer中为音频数据,count为数据的长度。
注意,用户始终要读/写一个完整的采样。例如一个16-bit的立体声模式下,每个采样有4个字节,所以应用程序每次必须读/写4的倍数个字节。
另外,由于OSS是一个跨平台的音频接口,所以用户在编程的时候,要考虑到可移植性的问题,其中一个重要的方面是读/写时的字节顺序。
4. 设置参数
- 设置采样格式
int format;
format = AFMT_S16_LE;
if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format) == -1) {
/* fatal error */
perror("SNDCTL_DSP_SETFMT");
exit(1);
}
if (format != AFMT_S16_LE) {
/* 本设备不支持选择的采样格式. */
}
在设置采样格式之前,可以先测试设备能够支持那些采样格式,方法如下:
int mask;
if (ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &mask) == -1) {
/* Handle fatal error ... */
}
if (mask & AFMT_MPEG) {
/* 本设备支持MPEG采样格式 ... */}
|
- 设置通道数目
int channels = 2; /* 1=mono, 2=stereo */
if (ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &channels) == -1) {
/* Fatal error */
perror("SNDCTL_DSP_CHANNELS");
exit(1);
}
if (channels != 2)
{/* 本设备不支持立体声模式 ... */}
|
- 设置采样速率
int speed = 11025;
if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &speed)==-1) {
/* Fatal error */
perror("SNDCTL_DSP_SPEED");
exit(Error code);
}
if ( /* 返回的速率(即硬件支持的速率)与需要的速率差别很大... */ ) {
/* 本设备不支持需要的速率... */
}
|
音频设备通过分频的方法产生需要的采样时钟,因此不可能产生所有的频率。驱动程序会计算出最接近要求的频率来,用户程序要检查返回的速率值,如果误差较小,可以忽略,但误差不能太大。
上一页 [1] [2] [3] 下一页

【责编:Peng】