ossaudiodev
此模块允许您访问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.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.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.sync()
等待声音设备播放缓冲区中的每个字节。(这在关闭设备时隐式发生。)OSS文档建议关闭并重新打开设备,而不是使用
sync()
.
- oss_audio_device.reset()
立即停止播放或录制,并将设备恢复到可以接受命令的状态。OSS文档建议在调用后关闭并重新打开设备
reset()
.
以下方便方法结合了几个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)
音频设备对象还支持几个只读属性:
混音器设备对象
mixer对象提供两种类似文件的方法:
- oss_mixer_device.close()
此方法关闭打开的混音器设备文件。关闭此文件后,任何进一步尝试使用混音器都将引发
OSError
.
在 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.set_recsrc(bitmask)
调用此函数以指定录制源。返回一个位掩码,指示成功时的新记录源;引发
OSError
如果指定的源无效。要将当前录制源设置为麦克风输入:mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC)