On this page
21.10. ossaudiodev —访问 OSS 兼容的音频设备
2.3 版的新Function。
该模块允许您访问 OSS(开放声音系统)音频接口。 OSS 可用于各种开源和商业 Unices,并且是 Linux 和 FreeBSD 的最新版本的标准音频接口。
See also
OSS C API 的官方文档
该模块定义了 OSS 设备驱动程序提供的大量常量。请参阅 Linux 或 FreeBSD 上的<sys/soundcard.h>
以获得 Lists。
ossaudiodev定义以下变量和函数:
- exception
ossaudiodev.
OSSAudioError
- 某些错误会引发此异常。参数是描述错误原因的字符串。
(如果ossaudiodev从诸如open()
,write()
或ioctl()
之类的系统调用中收到错误,则会引发IOError。ossaudiodev直接检测到的错误将导致OSSAudioError。)
(为了向后兼容,异常类也可以用作ossaudiodev.error
.)
ossaudiodev.
open
(模式)ossaudiodev.
open
(* device , mode *)- 打开音频设备并返回 OSS 音频设备对象。该对象支持许多类似文件的方法,例如
read()
,write()
和fileno()
(尽管常规 Unix 读/写语义与 OSS 音频设备的语义之间存在细微的差异)。它还支持多种音频特定的方法。有关方法的完整列表,请参见下文。
- 打开音频设备并返回 OSS 音频设备对象。该对象支持许多类似文件的方法,例如
device *是要使用的音频设备文件名。如果未指定,则此模块首先在环境变量
AUDIODEV
中查找要使用的设备。如果未找到,则回退到/dev/dsp
。mode *是
'r'
(用于只读(记录)访问),'w'
(用于仅写(播放)访问)和'rw'
(两者都使用)之一。由于许多声卡只允许一次打开录音机或播放器的一个过程,因此最好仅针对所需的活动打开设备。此外,某些声卡是半双工的:可以将其打开以进行读取或写入,但不能同时打开。
请注意不同寻常的调用语法:* first *参数是可选的,第二个参数是必需的。这是与以前的ossaudiodev取代的linuxaudiodev
模块兼容的历史工件。
ossaudiodev.
openmixer
([* device *])- 打开混合器设备并返回 OSS 混合器设备对象。 * device *是要使用的混音器设备文件名。如果未指定,则此模块首先在环境变量
MIXERDEV
中查找要使用的设备。如果未找到,则回退到/dev/mixer
。
- 打开混合器设备并返回 OSS 混合器设备对象。 * device *是要使用的混音器设备文件名。如果未指定,则此模块首先在环境变量
21.10.1. 音频设备对象
在可以写入音频设备或从音频设备读取之前,必须以正确的 Sequences 调用三个方法:
setfmt()
设置输出格式channels()
设置 Channels 数speed()
设置采样率
或者,您可以使用setparameters()
方法来一次设置所有三个音频参数。这更方便,但可能在所有情况下都不那么灵活。
open()返回的音频设备对象定义以下方法和(只读)属性:
oss_audio_device.
close
( )- 明确关闭音频设备。当您完成对音频设备的写入或读取操作时,应明确将其关闭。关闭的设备无法再次使用。
oss_audio_device.
fileno
( )- 返回与设备关联的文件 Descriptors。
oss_audio_device.
read
(* size *)- 从音频 Importing 中读取* size *个字节,并将其作为 Python 字符串返回。与大多数 Unix 设备驱动程序不同,处于阻止模式(默认)的 OSS 音频设备将阻止read(),直到请求的全部数据可用为止。
oss_audio_device.
write
(* data *)- 将 Python 字符串* data *写入音频设备,并返回写入的字节数。如果音频设备处于阻止模式(默认),则始终写入整个字符串(同样,这与通常的 Unix 设备语义不同)。如果设备处于非阻塞模式,则可能无法写入某些数据-请参阅writeall()。
oss_audio_device.
writeall
(* data *)- 将整个 Python 字符串* data 写入音频设备:await 直到音频设备能够接受数据,写入将要接受的尽可能多的数据,然后重复直到 data *被完全写入为止。如果设备处于阻止模式(默认),则其作用与write()相同; writeall()仅在非阻止模式下有用。没有返回值,因为写入的数据量始终等于提供的数据量。
以下方法每个都 Map 到一个ioctl()
系统调用。对应关系很明显:例如,setfmt()
对应于SNDCTL_DSP_SETFMT
ioctl,而sync()
对应于SNDCTL_DSP_SYNC
(这在查阅 OSS 文档时很有用)。如果基础ioctl()
失败,它们都将引发IOError。
oss_audio_device.
nonblock
( )- 将设备置于非阻止模式。一旦进入非阻塞模式,就无法将其返回到阻塞模式。
oss_audio_device.
getfmts
( )- 返回声卡支持的音频输出格式的位掩码。 OSS 支持的一些格式是:
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
。
oss_audio_device.
setfmt
(* format *)- try将当前音频格式设置为* format *-有关列表,请参见getfmts()。返回设备设置的音频格式,可能不是请求的格式。也可以用于返回当前的音频格式,方法是传递
AFMT_QUERY
的“音频格式”。
- try将当前音频格式设置为* format *-有关列表,请参见getfmts()。返回设备设置的音频格式,可能不是请求的格式。也可以用于返回当前的音频格式,方法是传递
oss_audio_device.
channels
(* nchannels *)- 将输出通道数设置为* nchannels *。值为 1 表示单声道声音,值为 2 立体声。某些设备可能具有两个以上的通道,而某些高端设备可能不支持单声道。返回设备设置的通道数。
oss_audio_device.
speed
(* samplerate *)- try将音频采样率设置为每秒* samplerate *个采样。返回实际设置的速率。大多数声音设备不支持任意采样率。常见费率是:
Rate | Description |
---|---|
8000 | /dev/audio 的默认费率 |
11025 | speech recording |
22050 | |
44100 | CD 质量的音频(16 位/samples 和 2 通道) |
96000 | DVD 质量的音频(24 位/samples) |
oss_audio_device.
sync
( )- await 声音设备播放其缓冲区中的每个字节。 (这在关闭设备时隐式发生.)OSS 文档建议关闭并重新打开设备,而不要使用sync()。
oss_audio_device.
reset
( )- 立即停止播放或录制,并将设备返回到可以接受命令的状态。 OSS 文档建议在调用reset()之后关闭并重新打开设备。
oss_audio_device.
post
( )- 告诉驾驶员输出中可能会有暂停,使设备可以更智能地处理暂停。您可以在播放 site 音效之后,await 用户 Importing 之前或执行磁盘 I/O 之前使用此Function。
以下便捷方法将多个 ioctl 或一个 ioctl 与一些简单的计算结合在一起。
oss_audio_device.
setparameters
(* format , nchannels , samplerate * [,* strict = False *])- 在一个方法调用中设置关键的音频采样参数-采样格式,通道数和采样率。 * format , nchannels 和 samplerate 应该与setfmt(),channels()和speed()方法中指定的一样。如果 strict 为 true,则setparameters()检查每个参数是否实际上设置为请求的值,如果不是,则加OSSAudioError。返回一个 Tuples( format , nchannels , samplerate *),以指示设备驱动程序实际设置的参数值(即与setfmt(),channels()和speed()的返回值相同)。
For example,
(fmt, channels, rate) = dsp.setparameters(fmt, channels, rate)
相当于
fmt = dsp.setfmt(fmt)
channels = dsp.channels(channels)
rate = dsp.rate(rate)
oss_audio_device.
bufsize
( )- 以 samples 为单位返回硬件缓冲区的大小。
oss_audio_device.
obufcount
( )- 返回硬件缓冲区中尚未播放的 samples 数。
oss_audio_device.
obuffree
( )- 返回可以排队进入硬件缓冲区进行播放而不会阻塞的 samples 数。
音频设备对象还支持几种只读属性:
oss_audio_device.
closed
- 指示设备是否已关闭的布尔值。
oss_audio_device.
name
- 包含设备文件名的字符串。
oss_audio_device.
mode
- 文件的 I/O 模式
"r"
,"rw"
或"w"
。
- 文件的 I/O 模式
21.10.2. 调音台设备对象
混合器对象提供了两种类似于文件的方法:
oss_mixer_device.
close
( )- 此方法关闭打开的混音器设备文件。关闭此文件后,再try使用混音器将引发IOError。
oss_mixer_device.
fileno
( )- 返回打开的混音器设备文件的文件句柄号。
其余方法特定于音频混合:
oss_mixer_device.
controls
( )- 此方法返回一个位掩码,指定可用的混音器控件(“ Control”是特定的可混音“通道”,例如
SOUND_MIXER_PCM
或SOUND_MIXER_SYNTH
)。此位掩码指示所有可用的混音器控件的子集-在模块级别定义的SOUND_MIXER_*
常量。例如,要确定当前的混音器对象是否支持 PCM 混音器,请使用以下 Python 代码:
- 此方法返回一个位掩码,指定可用的混音器控件(“ Control”是特定的可混音“通道”,例如
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
不存在。
oss_mixer_device.
stereocontrols
( )- 返回指示立体声混音器控件的位掩码。如果设置为 1,则对应的控件为立体声;否则为 0.如果未设置,则该控件为单声道或混频器不支持(与controls()组合使用以确定哪个控件)。
有关从位掩码获取数据的示例,请参见controls()函数的代码示例。
oss_mixer_device.
reccontrols
( )- 返回指定用于记录的混音器控件的位掩码。有关从位掩码读取的示例,请参见controls()的代码示例。
oss_mixer_device.
get
(* control *)- 返回给定调音台控件的音量。返回的卷是 2Tuples
(left_volume,right_volume)
。音量指定为 0(无声)到 100(最大音量)之间的数字。如果控件是单声道的,则仍返回 2Tuples,但是两个音量相同。
- 返回给定调音台控件的音量。返回的卷是 2Tuples
如果指定了无效的控件,则引发OSSAudioError;如果指定了不受支持的控件,则引发IOError。
oss_mixer_device.
set
(* control ,(left , right)*)- 将给定混音器控件的音量设置为
(left,right)
。left
和right
必须为整数,且介于 0(无声)和 100(完整音量)之间。成功后,新卷将以 2Tuples 的形式返回。请注意,由于某些声卡混音器的分辨率有限,此音量可能与指定的音量不完全相同。
- 将给定混音器控件的音量设置为
如果指定了无效的混音器控件,或者指定的音量超出范围,则引发OSSAudioError。
oss_mixer_device.
get_recsrc
( )- 此方法返回一个位掩码,该位掩码指示当前将哪个控件用作记录源。
oss_mixer_device.
set_recsrc
(* bitmask *)- 调用此Function以指定记录源。如果成功,则返回一个指示新记录源的位掩码;如果指定了无效的来源,则引发IOError。要将当前录音源设置为麦克风 Importing,请执行以下操作:
mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC)