ossaudiodev
---访问与OSS兼容的音频设备¶
此模块允许您访问OSS(开放式音响系统)音频接口。OSS可用于广泛的开源和商业Unice,是Linux和最新版本FreeBSD的标准音频接口。
参见
- Open Sound System Programmer's Guide
OSS C API的官方文档
模块定义了OSS设备驱动程序提供的大量常量;请参见 <sys/soundcard.h>
在linux或freebsd上查找列表。
ossaudiodev
定义以下变量和函数:
- exception ossaudiodev.OSSAudioError¶
在某些错误上引发此异常。参数是一个描述出问题的字符串。
(如果
ossaudiodev
接收来自系统调用的错误,例如open()
,write()
或ioctl()
它升起OSError
. 由直接检测到的错误ossaudiodev
导致OSSAudioError
)(为了向后兼容,异常类也可用作
ossaudiodev.error
)
- ossaudiodev.open(mode)¶
- ossaudiodev.open(device, mode)
打开音频设备并返回OSS音频设备对象。此对象支持许多类似文件的方法,例如
read()
,write()
和fileno()
(尽管传统的Unix读/写语义与OSS音频设备有细微的区别)。它还支持许多特定于音频的方法;有关方法的完整列表,请参阅下面的内容。装置 是要使用的音频设备文件名。如果未指定,则此模块首先查找环境变量
AUDIODEV
用于设备。如果找不到,它会回到/dev/dsp
.mode 是其中之一
'r'
对于只读(记录)访问,'w'
仅限写(播放)访问和'rw'
两者兼而有之。由于许多声卡只允许一个进程一次打开录音机或播放机,因此最好只为所需的活动打开设备。此外,有些声卡是半双工的:可以打开读或写,但不能同时打开。注意异常的调用语法: 第一 参数是可选的,第二个参数是必需的。这是一个历史文物,与旧的兼容
linuxaudiodev
模块哪个ossaudiodev
取代。
- ossaudiodev.openmixer([device])¶
打开混音器设备并返回OSS混音器设备对象。 装置 是要使用的混音器设备文件名。如果未指定,则此模块首先查找环境变量
MIXERDEV
用于设备。如果找不到,它会回到/dev/mixer
.
音频设备对象¶
在可以写入或读取音频设备之前,必须按正确的顺序调用三种方法:
setfmt()
设置输出格式channels()
设置通道数speed()
设置采样率
或者,您可以使用 setparameters()
方法一次设置所有三个音频参数。这更方便,但在任何情况下都可能不够灵活。
音频设备对象由返回 open()
定义以下方法和(只读)属性:
- oss_audio_device.close()¶
显式关闭音频设备。当您完成对音频设备的写入或读取时,应该显式地关闭它。关闭的设备不能再次使用。
- oss_audio_device.fileno()¶
返回与设备关联的文件描述符。
- oss_audio_device.read(size)¶
读 size 来自音频输入的字节,并将其作为python字符串返回。与大多数Unix设备驱动程序不同,处于阻塞模式(默认)的OSS音频设备将阻塞
read()
直到整个请求的数据量可用为止。
- oss_audio_device.write(data)¶
写一篇 bytes-like object data 到音频设备并返回写入的字节数。如果音频设备处于阻塞模式(默认),则始终写入整个数据(同样,这与通常的Unix设备语义不同)。如果设备处于非阻塞模式,则可能无法写入某些数据---请参阅
writeall()
.在 3.5 版更改: 可写的 bytes-like object 现在被接受。
- oss_audio_device.writeall(data)¶
写一篇 bytes-like object data 到音频设备:等待音频设备能够接受数据,写入尽可能多的数据,然后重复直到 data 已经写完了。如果设备处于阻塞模式(默认),则其效果与
write()
;writeall()
仅在非阻塞模式下有用。没有返回值,因为写入的数据量始终等于提供的数据量。在 3.5 版更改: 可写的 bytes-like object 现在被接受。
在 3.2 版更改: 音频设备对象还支持上下文管理协议,即它们可以用于 with
语句。
以下方法每个映射到一个 ioctl()
系统调用。通信是显而易见的:例如, setfmt()
对应于 SNDCTL_DSP_SETFMT
IOCTL和 sync()
到 SNDCTL_DSP_SYNC
(这在查阅OSS文档时很有用)。如果基础 ioctl()
失败了,他们都提高了 OSError
.
- oss_audio_device.nonblock()¶
将设备置于非阻塞模式。一旦处于非阻塞模式,就无法将其返回到阻塞模式。
- oss_audio_device.getfmts()¶
返回声卡支持的音频输出格式的位掩码。OSS支持的一些格式有:
格式
描述
AFMT_MU_LAW
对数编码(由Sun使用
.au
文件和/dev/audio
)AFMT_A_LAW
对数编码
AFMT_IMA_ADPCM
交互式多媒体协会定义的4:1压缩格式
AFMT_U8
无符号,8位音频
AFMT_S16_LE
有符号、16位音频、小尾数字节顺序(英特尔处理器使用)
AFMT_S16_BE
有符号、16位音频、大端字节顺序(68K、PowerPC、SPARC使用)
AFMT_S8
有符号,8位音频
AFMT_U16_LE
无符号,16位小尾数音频
AFMT_U16_BE
无符号,16位大端音频
有关音频格式的完整列表,请参阅OSS文档,并注意大多数设备只支持这些格式的一个子集。某些旧设备仅支持
AFMT_U8
;今天最常用的格式是AFMT_S16_LE
.
- oss_audio_device.setfmt(format)¶
尝试将当前音频格式设置为 格式 ---见
getfmts()
一个列表。返回设备设置为的音频格式,该格式可能不是请求的格式。也可用于返回当前音频格式---通过传递AFMT_QUERY
.
- oss_audio_device.channels(nchannels)¶
将输出通道数设置为 非信道 . 值为1表示单声道,2表示立体声。有些设备可能有两个以上的通道,有些高端设备可能不支持单声道。返回设备设置为的通道数。
- oss_audio_device.speed(samplerate)¶
尝试将音频采样率设置为 抽样调查 每秒采样数。返回实际设置的速率。大多数声音设备不支持任意采样率。一般费率为:
速率
描述
8000
违约率
/dev/audio
11025
语音记录
22050
44100
CD质量音频(16位/采样和2个通道)
96000
DVD质量音频(24位/样本)
- oss_audio_device.post()¶
告诉驱动程序输出可能有停顿,使设备能够更智能地处理停顿。您可以在播放点音效、等待用户输入或执行磁盘I/O之前使用此功能。
以下方便方法结合了几个IOCTL或一个IOCTL和一些简单的计算。
- oss_audio_device.setparameters(format, nchannels, samplerate[, strict=False])¶
在一个方法调用中设置关键音频采样参数——采样格式、通道数和采样率。 格式 , 非信道 和 抽样调查 应符合
setfmt()
,channels()
和speed()
方法。如果 strict 是真的,setparameters()
检查每个参数是否实际设置为请求的值,并引发OSSAudioError
如果不是。返回元组( 格式 , 非信道 , 抽样调查 )指示设备驱动程序实际设置的参数值(即,与setfmt()
,channels()
和speed()
)例如:
(fmt, channels, rate) = dsp.setparameters(fmt, channels, rate)
等于:
fmt = dsp.setfmt(fmt) channels = dsp.channels(channels) rate = dsp.rate(rate)
- oss_audio_device.bufsize()¶
返回硬件缓冲区的大小(以示例为单位)。
- oss_audio_device.obufcount()¶
返回硬件缓冲区中尚未播放的样本数。
- oss_audio_device.obuffree()¶
返回可以在不阻塞的情况下列队到要播放的硬件缓冲区中的样本数。
音频设备对象还支持几个只读属性:
- oss_audio_device.closed¶
布尔值,指示设备是否已关闭。
- oss_audio_device.name¶
包含设备文件名的字符串。
- oss_audio_device.mode¶
文件的I/O模式,或者
"r"
,"rw"
或"w"
.
混音器设备对象¶
mixer对象提供两种类似文件的方法:
- oss_mixer_device.fileno()¶
返回打开的混音器设备文件的文件句柄号。
在 3.2 版更改: 混音器对象还支持上下文管理协议。
剩下的方法是针对音频混合的:
- oss_mixer_device.controls()¶
此方法返回指定可用混音器控件的位掩码(“control”是特定的可混音“channel”,例如
SOUND_MIXER_PCM
或SOUND_MIXER_SYNTH
)该位掩码表示所有可用混音器控件的子集SOUND_MIXER_*
在模块级定义的常量。例如,要确定当前混音器对象是否支持PCM混音器,请使用以下python代码:mixer=ossaudiodev.openmixer() if mixer.controls() & (1 << ossaudiodev.SOUND_MIXER_PCM): # PCM is supported ... code ...
在大多数情况下,
SOUND_MIXER_VOLUME
(主卷)和SOUND_MIXER_PCM
控件应该足够---但是在选择混音器控件时,使用混音器的代码应该是灵活的。例如,在重力超声上,SOUND_MIXER_VOLUME
不存在。
- oss_mixer_device.stereocontrols()¶
返回指示立体声混音器控件的位掩码。如果设置了位,则相应的控制为立体声;如果未设置,则控制为单声道或不受混音器支持(与
controls()
确定哪个)。参见代码示例
controls()
函数,例如从位掩码获取数据。
- oss_mixer_device.reccontrols()¶
返回指定可用于录制的混音器控件的位掩码。参见代码示例
controls()
例如从位掩码读取。
- oss_mixer_device.get(control)¶
返回给定混音器控件的音量。返回的卷是2元组
(left_volume,right_volume)
. 卷被指定为从0(静默)到100(全卷)的数字。如果控件是单声道的,则返回2元组,但两个卷相同。引发
OSSAudioError
如果指定了无效的控件,或者OSError
如果指定了不支持的控件。
- oss_mixer_device.set(control, (left, right))¶
将给定混音器控件的音量设置为
(left,right)
.left
和right
必须是整数,介于0(静默)和100(全音量)之间。成功后,新卷作为2元组返回。请注意,由于某些声卡混音器的分辨率有限,这可能与指定的音量不完全相同。引发
OSSAudioError
如果指定了无效的混音器控件,或者指定的卷超出范围。
- oss_mixer_device.get_recsrc()¶
此方法返回一个位掩码,指示当前将哪个控件用作录制源。