ossaudiodev
ossaudiodev — Access to OSS-compatible audio devices
2.3版本的新功能。
该模块允许您访问OSS(开放式声音系统)音频接口。OSS适用于广泛的开源和商业Unices,是Linux和FreeBSD最新版本的标准音频接口。
该模块定义了由OSS设备驱动程序提供的大量常量; 见<sys/soundcard.h>在Linux或者FreeBSD的列表项。
ossaudiodev
定义了以下变量和函数:
exception ossaudiodev.OSSAudioError
这个例外在某些错误中引发。参数是一个描述出错的字符串。
(如果ossaudiodev
从系统调用收到错误时,例如open()
,write()
,或ioctl()
,它提出了IOError
通过直接检测到的错误ossaudiodev
结果OSSAudioError
。)
(为了向后兼容,异常类也可用ossaudiodev.error
。)
ossaudiodev.open(mode)ossaudiodev.open(device, mode)
打开音频设备并返回OSS音频设备对象。此对象支持许多类文件的方法,如read()
,write()
和fileno()
(虽然有读常规的Unix之间的细微差别/写语义和那些OSS音频设备)。它还支持许多音频特定的方法; 请参阅下面的方法的完整列表。
设备
是要使用的音频设备
文件名。如果未指定,则该模块首先在环境变量中AUDIODEV
查找要使用的设备
。如果找不到,则返回/dev/dsp
。
模式
是'r'
只读(记录)访问,'w'
只写(回放)访问和'rw'
两者之一。由于许多声卡只允许一个进程一次打开录像机或播放器,因此只有为需要的活动打开设备是一个好主意。此外,一些声卡是半双工的:它们可以打开以便读取或写入,但不能同时打开。
注意不寻常的调用语法:第一个
参数是可选的,第二个参数是必需的。这是与替代旧linuxaudiodev
模块兼容的历史工件ossaudiodev
。
ossaudiodev.openmixer([device])
打开混音器设备
并返回OSS混音器设备
对象。设备
是要使用的混合器设备
文件名。如果未指定,则该模块首先在环境变量中MIXERDEV
查找要使用的设备
。如果找不到,则返回/dev/mixer
。
1.音频设备对象
在您可以写入或读取音频设备之前,您必须按正确的顺序调用三种方法:
setfmt()
设置输出格式
channels()
设置通道数
speed()
设置采样率
或者,您可以使用该setparameters()
方法一次设置全部三个音频参数。这样更方便,但在所有情况下可能都不那么灵活。
通过open()
定义以下方法和(只读)属性返回的音频设备对象:
oss_audio_device.close()
明确关闭音频设备。当您完成写入或读取音频设备时,应该明确地关闭它。封闭的设备不能再次使用。
oss_audio_device.fileno()
返回与设备关联的文件描述符。
oss_audio_device.read(size)
从音频输入中读取大小
字节并将它们作为Python字符串返回。与大多数Unix设备驱动程序不同,处于阻止模式(默认设置)的OSS音频设备将阻塞,read()
直到整个请求的数据量可用。
oss_audio_device.write(data)
将Python字符串数据
写入音频设备并返回写入的字节数。如果音频设备处于阻塞模式(默认设置),则整个字符串总是被写入(同样,这与通常的Unix设备语义不同)。如果设备处于非阻塞模式,则可能不会写入某些数据
- 请参阅writeall()
。
oss_audio_device.writeall(data)
将整个Python字符串数据
写入音频设备:等待音频设备能够接受数据
,写入尽可能多的数据
,并重复数据
直到数据
完全写入。如果设备处于阻止模式(默认设置),则与此效果相同write(
writeall()仅在
非阻塞模式下有用。没有返回值,因为写入的数据
量总是等于所提供的数据
量。
以下方法分别映射到一个ioctl()
系统调用。的对应是显然的:例如,setfmt()
对应于所述SNDCTL_DSP_SETFMT
的ioctl,和sync()
到SNDCTL_DSP_SYNC
(咨询OSS文档时这可能是有用的)。如果底层ioctl()
失败,他们都会升起IOError
。
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)
将输出通道的数量设置为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()
。
oss_audio_device.post()
告诉驱动程序,输出中可能会出现暂停,使设备可以更智能地处理暂停。在等待用户输入之前或在执行磁盘I / O之前,您可以在播放专辑效果之后使用此功能。
以下便利方法结合了几个ioctl,或一个ioctl和一些简单的计算。
oss_audio_device.setparameters(format, nchannels, samplerate[, strict=False])
在一次方法调用中设置关键音频采样参数 - 采样格式
,通道数量和采样率
。格式
,nchannels
,和采样率
应该在中的规定setfmt()
,channels()
,和speed()
方法。如果严格
为真,则setparameters()
检查每个参数是否实际设置为所请求的值,OSSAudioError
如果不是则引发。返回一个元组(格式
,nchannels
,采样率
表示实际上是由设备驱动器(即,相同的返回值设置的参数值)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"
。
2.调音台设备对象
混音器对象提供了两种类似文件的方法:
oss_mixer_device.close()
该方法关闭打开的混音器设备文件。在该文件关闭后再次尝试使用混音器将会引发一次IOError
。
oss_mixer_device.fileno()
返回打开的混音器设备文件的文件句柄编号。
其余的方法特定于音频混合:
oss_mixer_device.controls()
此方法返回一个指定可用混音器控件的位掩码(“Control”是特定的可混音“通道”,如SOUND_MIXER_PCM
or 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
如果被指定了无效的控制,或者IOError
如果指定了不支持的控制。
oss_mixer_device.set(control, (left, right))
将给定混音器控制的音量设置为(left,right)
。left
并且right
必须是整数并且在0(无声)和100(全音量)之间。成功时,新卷将作为2元组返回。请注意,这可能与指定的音量不完全相同,因为某些声卡混音器的分辨率有限。
如果指定了无效的混音器控制,或者指定的音量超出范围,则会引发OSSAudioError
。
oss_mixer_device.get_recsrc()
此方法返回一个位掩码,指示当前正在将哪些控件用作记录源。
oss_mixer_device.set_recsrc(bitmask)
调用此功能指定一个录音源。如果成功,则返回指示新录制源(或多个源)的位掩码; IOError
如果指定了无效源,则会引发此问题。将当前录音源设置为麦克风输入:
mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC)