You are here:  Home » Python » – 访问兼容OSS的音频设备 – 多媒体服务(Python教程)(参考资料)

ossaudiodev– 访问兼容OSS音频设备


此模块允许您访问OSS(开放式音响系统)音频接口.OSS可用于各种开源和商用Unices,并且是标准音频接口对于Linux和FreeBSD的最新版本.

在版本3.3中更改:此模块中的操作现在提升OSError其中IOError被提升了

另见

Open Sound System程序员指南
OSS C API的官方文档

该模块定义了OSS devicedriver提供的大量常量;在Linux或FreeBSD上查看<sys/soundcard.h>以获取列表.

ossaudiodev定义以下变量和函数:

exception ossaudiodev.OSSAudioError

在某些错误上引发此异常。参数是一个描述出错的字符串.

(如果ossaudiodev收到来自系统调用的错误,如open(), write()ioctl(),它会引发OSErrorossaudiodev直接检测到的错误导致OSSAudioError.)

(为了向后兼容,异常类也可用作ossaudiodev.error。)

ossaudiodev.openmode
ossaudiodev.opendevice, mode

打开音频设备并返回OSS音频设备对象。这个对象支持许多类似文件的方法,例如read(), write()fileno()(尽管传统的Unixread / write语义与OSS音频设备之间存在细微的差别)。它还支持许多特定于音频的方法;请参阅下面的完整方法列表.

device是要使用的音频设备文件名。如果未指定,则此模块首先在环境变量AUDIODEV中查找deviceto用法。如果没有找到,它会回退到/dev/dsp.

mode"r"之一用于只读(记录)访问,"w"仅转发(回放)访问和"rw" 对彼此而言。由于许多声卡只允许一个进程一次打开记录器或播放器,因此仅为所需的活动打开设备是个好主意。此外,某些声卡是半双工的:它们可以打开读取或写入,但不能同时打开.

注意不寻常的调用语法:first参数是可选的,第二个是必需的。这是一个与theolder linuxaudiodev模块兼容的历史文物ossaudiodev supersedes.

ossaudiodev.openmixer ( [device]

打开混音器设备并返回OSS混音器设备对象。device是使用的混合设备文件名。如果未指定,则此模块首先查找环境变量MIXERDEV以查找要使用的设备。如果没有发现,它会回落到/dev/mixer.

音频设备对象

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

  1. setfmt()设置输出格式
  2. channels()设置通道数
  3. speed()设置采样率

或者,你可以使用setparameters()方法设置所有三个音频参数立刻。这样更方便,但在allcases中可能不那么灵活.

open()返回的音频设备对象定义了以下方法和(只读)属性:

oss_audio_device.close

明确关闭音频设备。完成写入或读取音频设备后,应明确关闭它。封闭的设备不能再使用了.

oss_audio_device.fileno ()

返回与设备关联的文件描述符.

oss_audio_device.read (size)

size来自音频输入的字节并将它们作为Python字符串返回。与大多数Unix设备驱动程序不同,处于阻塞模式的OSS音频设备(默认)将阻止read()直到整个要求的数据量可用.

oss_audio_device.write (data)

写一个字节对象 data到音频设备并返回写入的字节数。如果音频设备处于阻塞模式(默认),则始终写入整个数据(同样,这与Unix设备语义不同)。如果设备处于非阻塞模式,则可能无法写入某些数据 – 请参阅writeall().

版本3.5更改:可写字节对象现已被接受.

oss_audio_device.writeall (data)

写一个类似字节的对象 data到音频设备:等到音频设备能够接受数据,写入尽可能多的数据,并重复直到data已完全写入。如果设备处于阻塞模式(默认),则效果与write()相同;writeall()仅在非阻塞模式下有用。Hasno返回值,因为写入的数据量总是等于提供的数据量.

在版本3.5中更改:可写字节对象现在被接受了

更改版本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位音频,little-endian byteorder(由英特尔处理器使用)
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.setfmtformat

尝试将当前音频格式设置为format – 见getfmts()对于alist。返回设备设置的音频格式,可能不是格式。也可以用来返回当前的音频格式 – 通过传递AFMT_QUERY.

oss_audio_device.channelsnchannels

设置输出通道数为nchannels。值1表示单声道声音,2表示立体声。某些设备可能有两个以上的通道,而某些高端设备可能不支持单声道。返回设备设置为的通道数.

oss_audio_device.speedsamplerate

尝试将音频采样率设置为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.setparametersformat, nchannels, samplerate [, strict=False]

在一次方法调用中设置关键音频采样参数 – 采样格式,通道数和采样率。format, nchannelssamplerate应按setfmt(), channels()speed()方法。如果strict为真,setparameters()检查每个参数是否实际上达到了所要求的值,并引发OSSAudioError如果不。返回一个元组(format, nchannels,samplerate)表示设备驱动程序实际设置的参数值(即与的返回值相同)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".

混音器设备对象

混音器对象提供两种类似文件的方法:

oss_mixer_device.close

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

oss_mixer_device.fileno

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

更改版本3.2:混音器对象也支持上下文管理协议.

其余的方法特定于音频混合:

oss_mixer_device.controls

此方法返回一个位掩码,指定可用的混音器控件(“Control”是一个特定的可混合“通道”, 如 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控件应该足够了 – 但是在选择混音器控件时,使用混音器的代码应该是灵活的。例如,在GravisUltrasound上,SOUND_MIXER_VOLUME不存在.

oss_mixer_device.stereocontrols ()

返回指示立体声混音器控件的位掩码。如果设置了一个位,则相应的控制是立体声;如果没有设置,控制器可以是单音或不支持混音器(与结合使用)controls()确定哪个).

请参阅controls()函数用于从bitmask获取数据的例子.

oss_mixer_device.reccontrols

返回一个位掩码,指定可用于记录的混音器控件。请参阅controls()的代码示例,以便从bitmask读取示例.

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(完整音量)之间。Onsuccess,新卷以2元组的形式返回。请注意,这可能与指定的音量完全不同,因为某些声卡的混音器的分辨率有限.

如果指定了无效的混音器控制,或者如果指定的音量超出,则增加OSSAudioErrorof -range.

oss_mixer_device.get_recsrc ()

这个方法返回一个位掩码,表明当前正在使用哪个控件作为录音源.

oss_mixer_device.set_recsrcbitmask

调用此函数指定录制源。如果成功,返回指示新记录源(或多个源)的位掩码;如果指定了无效的来源,则会引发OSError。将当前录音源设置为麦克风输入:

mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC)