ossaudiodev
--- 訪問(wèn)兼容OSS的音頻設(shè)備?
Deprecated since version 3.11, will be removed in version 3.13: The ossaudiodev
module is deprecated
(see PEP 594 for details).
該模塊允許您訪問(wèn) OSS(開(kāi)放式音響系統(tǒng))音頻接口。 OSS 可用于廣泛的開(kāi)源和商業(yè) Unices,并且是 Linux 和最新版本的 FreeBSD 的標(biāo)準(zhǔn)音頻接口。
參見(jiàn)
- 開(kāi)放之聲系統(tǒng)程序員指南
OSS C API 的官方文檔
該模塊定義了大量由OSS設(shè)備驅(qū)動(dòng)提供的常量; 請(qǐng)參閱``<sys/soundcard.h>`` Linux 或 FreeBSD 上的列表。
ossaudiodev
定義了下列變量和函數(shù):
- exception ossaudiodev.OSSAudioError?
此異常會(huì)針對(duì)特定錯(cuò)誤被引發(fā)。 其參數(shù)為一個(gè)描述錯(cuò)誤信息的字符串。
(如果
ossaudiodev
從系統(tǒng)調(diào)用例如open()
,write()
或ioctl()
接收到錯(cuò)誤,它將引發(fā)OSError
。 由ossaudiodev
直接檢測(cè)到的錯(cuò)誤將引發(fā)OSSAudioError
。)(為了向下兼容,此異常類也可通過(guò)
ossaudiodev.error
訪問(wèn)。)
- ossaudiodev.open(mode)?
- ossaudiodev.open(device, mode)
打開(kāi)一個(gè)音頻設(shè)備并返回 OSS 音頻設(shè)備對(duì)象。 此對(duì)象支持許多文件類方法,例如
read()
,write()
和fileno()
(不過(guò)傳統(tǒng)的 Unix 讀/寫(xiě)語(yǔ)義與 OSS 音頻設(shè)備的存在一些細(xì)微的差異)。 它還支持一些音頻專屬的方法;完整的方法列表見(jiàn)下文。device 是要使用的音頻設(shè)備文件名。 如果未指定,則此模塊會(huì)先在環(huán)境變量
AUDIODEV
中查找要使用的設(shè)備。 如果未找到,它將回退為/dev/dsp
。mode 可以為
'r'
表示只讀(錄音)訪問(wèn),'w'
表示只寫(xiě)(回放)訪問(wèn)以及'rw'
表示同時(shí)讀寫(xiě)。 由于許多聲卡在同一時(shí)間只允許單個(gè)進(jìn)程打開(kāi)錄音機(jī)或播放器,因此好的做法是只根據(jù)活動(dòng)的需要打開(kāi)設(shè)備。 并且,有些聲卡是半雙工的:它們可以被打開(kāi)用于讀取或?qū)懭耄荒芡瑫r(shí)讀寫(xiě)。請(qǐng)注意這里特殊的調(diào)用語(yǔ)法: first 參數(shù)是可選的,而第二個(gè)參數(shù)則是必需的。 這是出于歷史原因要與
ossaudiodev
所替代的linuxaudiodev
模塊保持兼容。
- ossaudiodev.openmixer([device])?
打開(kāi)一個(gè)混音設(shè)備并返回 OSS 混音設(shè)備對(duì)象。 device 是要使用的混音設(shè)備文件名。 如果未指定,則此模塊會(huì)先在環(huán)境變量
MIXERDEV
中查找要使用的設(shè)備。 如果未找到,它將回退為/dev/mixer
。
音頻設(shè)備對(duì)象?
在你寫(xiě)入或讀取音頻設(shè)備之前,你必須按照正確的順序調(diào)用三個(gè)方法:
setfmt()
設(shè)置輸出格式channels()
設(shè)置聲道數(shù)量speed()
設(shè)置采樣率
或者,你也可以使用 setparameters()
方法一次性地設(shè)置全部三個(gè)音頻參數(shù)。 這更為便捷,但可能不會(huì)在所有場(chǎng)景下都一樣靈活。
open()
所返回的音頻設(shè)備對(duì)象定義了下列方法和(只讀)屬性:
- oss_audio_device.close()?
顯式地關(guān)閉音頻設(shè)備。 當(dāng)你完成寫(xiě)入或讀取音頻設(shè)備后,你應(yīng)當(dāng)顯式地關(guān)閉它。 已關(guān)閉的設(shè)備不可被再次使用。
- oss_audio_device.fileno()?
返回與設(shè)備相關(guān)聯(lián)的文件描述符。
- oss_audio_device.read(size)?
從音頻輸入設(shè)備讀取 size 個(gè)字節(jié)并返回為 Python 字節(jié)串。 與大多數(shù) Unix 設(shè)備驅(qū)動(dòng)不同,處于阻塞模式(默認(rèn))的 OSS 音頻設(shè)備將阻塞
read()
直到所請(qǐng)求大小的數(shù)據(jù)全部可用。
- oss_audio_device.write(data)?
將一個(gè) bytes-like object data 寫(xiě)入音頻設(shè)備并返回寫(xiě)入的字節(jié)數(shù)。 如果音頻設(shè)備處于阻塞模式(默認(rèn)),則總是會(huì)寫(xiě)入完整數(shù)據(jù)(這還是不同于通常的 Unix 設(shè)備語(yǔ)義)。 如果設(shè)備處于非阻塞模式,則可能會(huì)有部分?jǐn)?shù)據(jù)未被寫(xiě)入 --- 參見(jiàn)
writeall()
。在 3.5 版更改: 現(xiàn)在接受可寫(xiě)的 字節(jié)類對(duì)象。
- oss_audio_device.writeall(data)?
將一個(gè) bytes-like object data 寫(xiě)入音頻設(shè)備:等待直到音頻設(shè)備能夠接收數(shù)據(jù),將根據(jù)其所能接收的數(shù)據(jù)量盡可能多地寫(xiě)入,并重復(fù)操作直至 data 被完全寫(xiě)入。 如果設(shè)備處于阻塞模式(默認(rèn)),則其效果與
write()
相同;writeall()
僅適用于非阻塞模式。 它沒(méi)有返回值,因?yàn)閷?xiě)入的數(shù)據(jù)量總是等于所提供的數(shù)據(jù)量。在 3.5 版更改: 現(xiàn)在接受可寫(xiě)的 字節(jié)類對(duì)象。
在 3.2 版更改: 音頻設(shè)備對(duì)象還支持上下文管理協(xié)議,就是說(shuō)它們可以在 with
語(yǔ)句中使用。
下列方法各自映射一個(gè) ioctl()
系統(tǒng)調(diào)用。 對(duì)應(yīng)關(guān)系很明顯:例如,setfmt()
對(duì)應(yīng) SNDCTL_DSP_SETFMT
ioctl,而 sync()
對(duì)應(yīng) SNDCTL_DSP_SYNC
(這在查閱 OSS 文檔時(shí)很有用)。 如果下層的 ioctl()
失敗,它們將引發(fā) OSError
。
- oss_audio_device.nonblock()?
將設(shè)備轉(zhuǎn)為非阻塞模式。 一旦處于非阻塞模式,將無(wú)法將其轉(zhuǎn)回阻塞模式。
- oss_audio_device.getfmts()?
返回聲卡所支持的音頻輸出格式的位掩碼。 OSS 支持的一部分格式如下:
格式
描述
AFMT_MU_LAW
一種對(duì)數(shù)編碼格式(被 Sun
.au
文件和/dev/audio
所使用)AFMT_A_LAW
一種對(duì)數(shù)編碼格式
AFMT_IMA_ADPCM
一種 4:1 壓縮格式,由 Interactive Multimedia Association 定義
AFMT_U8
無(wú)符號(hào)的 8 位音頻
AFMT_S16_LE
有符號(hào)的 16 位音頻,采用小端字節(jié)序(如 Intel 處理器所用的)
AFMT_S16_BE
有符號(hào)的 16 位音頻,采用大端字節(jié)序(如 68k, PowerPC, Sparc 所用的)
AFMT_S8
有符號(hào)的 8 位音頻
AFMT_U16_LE
無(wú)符號(hào)的 16 位小端字節(jié)序音頻
AFMT_U16_BE
無(wú)符號(hào)的 16 位大端字節(jié)序音頻
請(qǐng)參閱 OSS 文檔獲取音頻格式的完整列表,還要注意大多數(shù)設(shè)備都只支持這些列表的一個(gè)子集。 某些較舊的設(shè)備僅支持
AFMT_U8
;目前最為常用的格式是AFMT_S16_LE
。
- oss_audio_device.setfmt(format)?
嘗試將當(dāng)前音頻格式設(shè)為 format --- 請(qǐng)參閱
getfmts()
獲取格式列表。 返回為設(shè)備設(shè)置的音頻格式,這可能并非所請(qǐng)求的格式。 也可被用來(lái)返回當(dāng)前音頻格式 --- 這可以通過(guò)傳入特殊的 "音頻格式"AFMT_QUERY
來(lái)實(shí)現(xiàn)。
- oss_audio_device.channels(nchannels)?
將輸出聲道數(shù)設(shè)為 nchannels。 值為 1 表示單聲道,2 表示立體聲。 某些設(shè)備可能擁有 2 個(gè)以上的聲道,并且某些高端設(shè)備還可能不支持單聲道。 返回為設(shè)備設(shè)置的聲道數(shù)。
- oss_audio_device.speed(samplerate)?
嘗試將音頻采樣率設(shè)為每秒 samplerate 次采樣。 返回實(shí)際設(shè)置的采樣率。 大多數(shù)設(shè)備都不支持任意的采樣率。 常見(jiàn)的采樣率為:
采樣率
描述
8000
/dev/audio
的默認(rèn)采樣率11025
語(yǔ)音錄音
22050
44100
CD品質(zhì)的音頻(16位采樣和2通道)
96000
DVD品質(zhì)的音頻(24位采樣)
- oss_audio_device.sync()?
等待直到音頻設(shè)備播放完其緩沖區(qū)中的所有字節(jié)。 (這會(huì)在設(shè)備被關(guān)閉時(shí)隱式地發(fā)生。) OSS 建議關(guān)閉再重新打開(kāi)設(shè)備而不是使用
sync()
。
- oss_audio_device.reset()?
立即停止播放或錄制并使設(shè)備返回可接受命令的狀態(tài)。 OSS 文檔建議在調(diào)用
reset()
之后關(guān)閉并重新打開(kāi)設(shè)備。
- oss_audio_device.post()?
告知設(shè)備在輸出中可能有暫停,使得設(shè)備可以更智能地處理暫停。 你可以在播放一個(gè)定點(diǎn)音效之后、等待用戶輸入之前或執(zhí)行磁盤(pán) I/O 之前使用此方法。
下列便捷方法合并了多個(gè) ioctl,或是合并了一個(gè) ioctl 與某些簡(jiǎn)單的運(yùn)算。
- oss_audio_device.setparameters(format, nchannels, samplerate[, strict=False])?
在一次方法調(diào)用中設(shè)置關(guān)鍵的音頻采樣參數(shù) --- 采樣格式、聲道數(shù)和采樣率。 format, nchannels 和 samplerate 應(yīng)當(dāng)與在
setfmt()
,channels()
和speed()
方法中所指定的一致。 如果 strict 為真值,則setparameters()
會(huì)檢查每個(gè)參數(shù)是否確實(shí)被設(shè)置為所請(qǐng)求的值,如果不是則會(huì)引發(fā)OSSAudioError
。 返回一個(gè)元組 (format, nchannels, samplerate) 指明由設(shè)備驅(qū)動(dòng)實(shí)際設(shè)置的參數(shù)值 (即與setfmt()
,channels()
和speed()
的返回值相同)。例如,:
(fmt, channels, rate) = dsp.setparameters(fmt, channels, rate)
等價(jià)于
fmt = dsp.setfmt(fmt) channels = dsp.channels(channels) rate = dsp.rate(rate)
- oss_audio_device.bufsize()?
返回硬件緩沖區(qū)的大小,以采樣數(shù)表示。
- oss_audio_device.obufcount()?
返回硬件緩沖區(qū)中待播放的采樣數(shù)。
- oss_audio_device.obuffree()?
返回可以被加入硬件緩沖區(qū)隊(duì)列以非阻塞模式播放的采樣數(shù)。
音頻設(shè)備對(duì)象還支持幾個(gè)只讀屬性:
- oss_audio_device.closed?
指明設(shè)備是否已被關(guān)閉的布爾值。
- oss_audio_device.name?
包含設(shè)備文件名稱的字符串。
- oss_audio_device.mode?
文件的 I/O 模式,可以為
"r"
,"rw"
或"w"
。
混音器設(shè)備對(duì)象?
混音器對(duì)象提供了兩個(gè)文件類方法:
- oss_mixer_device.close()?
此方法會(huì)關(guān)閉打開(kāi)的混音器設(shè)備文件。 在文件被關(guān)閉后任何繼續(xù)使用混音器的嘗試都將引發(fā)
OSError
。
- oss_mixer_device.fileno()?
返回打開(kāi)的混音器設(shè)備文件的文件處理句柄號(hào)。
在 3.2 版更改: 混音器設(shè)備還支持上下文管理協(xié)議。
其余方法都是混音專屬的:
- oss_mixer_device.controls()?
此方法返回一個(gè)表示可用的混音控件的位掩碼 ("控件" 是專用的可混合 "聲道",例如
SOUND_MIXER_PCM
或SOUND_MIXER_SYNTH
)。 該掩碼會(huì)指定所有可用混音控件的一個(gè)子集 --- 它們是在模塊層級(jí)上定義的SOUND_MIXER_*
常量。 舉例來(lái)說(shuō),要確定當(dāng)前混音器對(duì)象是否支持 PCM 混音器,就使用以下 Python 代碼:mixer=ossaudiodev.openmixer() if mixer.controls() & (1 << ossaudiodev.SOUND_MIXER_PCM): # PCM is supported ... code ...
對(duì)于大多數(shù)目的來(lái)說(shuō),
SOUND_MIXER_VOLUME
(主音量) 和SOUND_MIXER_PCM
控件應(yīng)該足夠了 --- 但使用混音器的代碼應(yīng)當(dāng)在選擇混音器控件時(shí)保持靈活。 例如在 Gravis Ultrasound 上,SOUND_MIXER_VOLUME
是不存在的。
- oss_mixer_device.stereocontrols()?
返回一個(gè)表示立體聲混音控件的位掩碼。 如果設(shè)置了比特位,則對(duì)應(yīng)的控件就是立體聲的;如果未設(shè)置,則控件為單聲道或者不被混音器所支持(請(qǐng)配合
controls()
使用以確定是哪種情況)。請(qǐng)查看
controls()
函數(shù)的代碼示例了解如何從位掩碼獲取數(shù)據(jù)。
- oss_mixer_device.reccontrols()?
返回一個(gè)指明可被用于錄音的混音器控件的位掩碼。 請(qǐng)查看
controls()
的代碼示例了解如何讀取位掩碼。
- oss_mixer_device.get(control)?
返回給定混音控件的音量。 返回的音量是一個(gè) 2 元組
(left_volume,right_volume)
。 音量被表示為從 0 (靜音) 到 100 (最大音量) 的數(shù)字。 如果控件是單聲道的,仍然會(huì)返回一個(gè) 2 元組,但兩個(gè)音量必定相同。如果指定了無(wú)效的控件則會(huì)引發(fā)
OSSAudioError
,或者如果指定了不受支持的控件則會(huì)引發(fā)OSError
。
- oss_mixer_device.set(control, (left, right))?
將給定混音控件的音量設(shè)為
(left,right)
。left
和right
必須為整數(shù)并在 0 (靜音) 至 100 (最大音量) 之間。 當(dāng)執(zhí)行成功的,新的音量將以 2 元組形式返回。 請(qǐng)注意這可能不完全等于所指定的音量,因?yàn)槟承┞暱ǖ幕煲羝饔芯认拗啤?/p>如果指定了無(wú)效的混音控件,或者指定的音量超出限制則會(huì)引發(fā)
OSSAudioError
。
- oss_mixer_device.get_recsrc()?
此方法返回一個(gè)表示當(dāng)前被用作錄音源的的控件的位掩碼。