ossaudiodev ---访问与OSS兼容的音频设备


此模块允许您访问OSS(开放式音响系统)音频接口。OSS可用于广泛的开源和商业Unice,是Linux和最新版本FreeBSD的标准音频接口。

在 3.3 版更改: 此模块中的操作现在引发 OSError 在哪里? IOError 提高了。

参见

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 .

音频设备对象

在可以写入或读取音频设备之前,必须按正确的顺序调用三种方法:

  1. setfmt() 设置输出格式

  2. channels() 设置通道数

  3. 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.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])

在一个方法调用中设置关键音频采样参数——采样格式、通道数和采样率。 格式非信道抽样调查 应符合 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.close()

此方法关闭打开的混音器设备文件。关闭此文件后,任何进一步尝试使用混音器都将引发 OSError .

oss_mixer_device.fileno()

返回打开的混音器设备文件的文件句柄号。

在 3.2 版更改: 混音器对象还支持上下文管理协议。

剩下的方法是针对音频混合的:

oss_mixer_device.controls()

此方法返回指定可用混音器控件的位掩码(“control”是特定的可混音“channel”,例如 SOUND_MIXER_PCMSOUND_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) . leftright 必须是整数,介于0(静默)和100(全音量)之间。成功后,新卷作为2元组返回。请注意,由于某些声卡混音器的分辨率有限,这可能与指定的音量不完全相同。

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

oss_mixer_device.get_recsrc()

此方法返回一个位掩码,指示当前将哪个控件用作录制源。

oss_mixer_device.set_recsrc(bitmask)

调用此函数以指定录制源。返回一个位掩码,指示成功时的新记录源;引发 OSError 如果指定的源无效。要将当前录制源设置为麦克风输入:

mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC)