21.10. ossaudiodev —访问 OSS 兼容的音频设备

2.3 版的新Function。

该模块允许您访问 OSS(开放声音系统)音频接口。 OSS 可用于各种开源和商业 Unices,并且是 Linux 和 FreeBSD 的最新版本的标准音频接口。

See also

该模块定义了 OSS 设备驱动程序提供的大量常量。请参阅 Linux 或 FreeBSD 上的<sys/soundcard.h>以获得 Lists。

ossaudiodev定义以下变量和函数:

(如果ossaudiodev从诸如open()write()ioctl()之类的系统调用中收到错误,则会引发IOErrorossaudiodev直接检测到的错误将导致OSSAudioError。)

(为了向后兼容,异常类也可以用作ossaudiodev.error.)

请注意不同寻常的调用语法:* first *参数是可选的,第二个参数是必需的。这是与以前的ossaudiodev取代的linuxaudiodev模块兼容的历史工件。

21.10.1. 音频设备对象

在可以写入音频设备或从音频设备读取之前,必须以正确的 Sequences 调用三个方法:

或者,您可以使用setparameters()方法来一次设置所有三个音频参数。这更方便,但可能在所有情况下都不那么灵活。

open()返回的音频设备对象定义以下方法和(只读)属性:

以下方法每个都 Map 到一个ioctl()系统调用。对应关系很明显:例如,setfmt()对应于SNDCTL_DSP_SETFMT ioctl,而sync()对应于SNDCTL_DSP_SYNC(这在查阅 OSS 文档时很有用)。如果基础ioctl()失败,它们都将引发IOError

Format Description
AFMT_MU_LAW 对数编码(由 Sun .au文件和/dev/audio使用)
AFMT_A_LAW 对数编码
AFMT_IMA_ADPCM 交互式多媒体协会定义的 4:1 压缩格式
AFMT_U8 无符号 8 位音频
AFMT_S16_LE 带符号的 16 位音频,低位字节序(由 Intel 处理器使用)
AFMT_S16_BE 带符号的 16 位音频,大端字节序(由 68k,PowerPC,Sparc 使用)
AFMT_S8 带签名的 8 位音频
AFMT_U16_LE 无符号 16 位 Little-endian 音频
AFMT_U16_BE 无符号 16 位大端音频

请查阅 OSS 文档以获取音频格式的完整列表,并注意大多数设备仅支持这些格式的一部分。一些较旧的设备仅支持AFMT_U8;今天使用的最常见格式是AFMT_S16_LE

Rate Description
8000 /dev/audio的默认费率
11025 speech recording
22050
44100 CD 质量的音频(16 位/samples 和 2 通道)
96000 DVD 质量的音频(24 位/samples)

以下便捷方法将多个 ioctl 或一个 ioctl 与一些简单的计算结合在一起。

For example,

(fmt, channels, rate) = dsp.setparameters(fmt, channels, rate)

相当于

fmt = dsp.setfmt(fmt)
channels = dsp.channels(channels)
rate = dsp.rate(rate)

音频设备对象还支持几种只读属性:

21.10.2. 调音台设备对象

混合器对象提供了两种类似于文件的方法:

其余方法特定于音频混合:

mixer=ossaudiodev.openmixer()
if mixer.controls() & (1 << ossaudiodev.SOUND_MIXER_PCM):
    # PCM is supported
    ... code ...

对于大多数目的,SOUND_MIXER_VOLUME(主音量)和SOUND_MIXER_PCM控件就足够了,但是在选择混音器控件时,使用混音器的代码应该很灵活。例如,在 Gravis 超声上,SOUND_MIXER_VOLUME不存在。

有关从位掩码获取数据的示例,请参见controls()函数的代码示例。

如果指定了无效的控件,则引发OSSAudioError;如果指定了不受支持的控件,则引发IOError

如果指定了无效的混音器控件,或者指定的音量超出范围,则引发OSSAudioError

mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC)
首页