xuejianhui

导航

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;
}// 检查设置值的正确性

/**在设置缓冲区大小时,参数setting实际上由两部分组成:
 * 参数setting: 低16位->标明缓冲区的尺寸,缓冲区大小 = 65536字节.
                    相应的公式 :buffer_size = 2^ssss。
 *              高16位->标明分片最大序号,取值范围 : 2 -- 0x7FFF.
                    分片(fragment);0x7FFF表示没有任何限制.
 */
 
 /**设置声卡工作时的声道(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) {
    // 只支持立体声
}

posted on 2012-11-21 11:36  xuejianhui  阅读(660)  评论(0编辑  收藏  举报