1. 程式人生 > >alsa和oss聲音系統比較

alsa和oss聲音系統比較

OSS(Open Sound System)

OSS的含義為,Open Sound System,是unix平臺上一個統一的音訊介面。以前,每個Unix廠商都會提供一個自己專有的API,用來處理音訊。這就意味著為一種Unix平臺 編寫的音訊處理應用程式,在移植到另外一種Unix平臺上時,必須要重寫。不僅如此,在一種平臺上具備的功能,可能在另外一個平臺上無法實現。但 是,OSS出現以後情況就大不一樣了,只要音訊處理應用程式按照OSS的API來編寫,那麼在移植到另外一個平臺時,只需要重新編譯即可。因此,OSS提 供了原始碼級的可移植性。
同時,很多的Unix工作站中,只能提供錄音與放音的功能。有了OSS後,給這些工作站帶來了 MIDI功能,加上音訊流、語音識別/生成、計算機電話(CT)、JAVA以及其它的多媒體技術,在Unix工作站中,同樣可以享受到同Windows、 Macintosh環境一樣的音訊世界。另外,OSS還提供了與視訊和動畫播放同步的音訊能力,這對在Unix中實現動畫、遊戲提供了幫助。

本文首先解釋在音訊程式設計時經常遇到的名詞、裝置檔案的含義,然後分別在錄音、播放、Mixer方面對OSS介面的使用方法進行介紹。
數字音訊裝置(有時也稱codec,PCM,DSP,ADC/DAC裝置):播放或錄製數字化的聲音。它的指標主要有:取樣速率(電話為8K,DVD為96K)、channel數目(單聲道,立體聲)、取樣解析度(8-bit,16-bit)。
mixer(混頻器):用來控制多個輸入、輸出的音量,也控制輸入(microphone,line-in,CD)之間的切換。
synthesizer(合成器):通過一些預先定義好的波形來合成聲音,有時用在遊戲中聲音效果的產生。
MIDI 介面:MIDI介面是為了連線舞臺上的synthesizer、鍵盤、道具、燈光控制器的一種序列介面。

在Unix系統中,所有的裝置都被統一成檔案,通過對檔案的訪問方式(首先open,然後read/write,同時可以使用ioctl讀取/設定引數,最後close)來訪問裝置。在OSS中,主要有以下的幾種裝置檔案:
* /dev/mixer:訪問音效卡中內建的mixer,調整音量大小,選擇音源。
* /dev/sndstat:測試音效卡,執行cat /dev/sndstat會顯示音效卡驅動的資訊。
* /dev/dsp 、/dev/dspW、/dev/audio:讀這個裝置就相當於錄音,寫這個裝置就相當於放音。/dev/dsp與/dev/audio之間的區別在於 取樣的編碼不同,/dev/audio使用μ律編碼,/dev/dsp使用8-bit(無符號)線性編碼,/dev/dspW使用16-bit(有符號) 線形編碼。/dev/audio主要是為了與SunOS相容,所以儘量不要使用。

* l /dev/sequencer:訪問音效卡內建的,或者連線在MIDI介面的synthesizer。
Linux中OSS的相關檔案:
include/linux/sound.h
sound/sound_core.c
OSS的裝置節點,字元裝置,其主裝置號為14
0 = /dev/mixer Mixer control
1 = /dev/sequencer Audio sequencer
2 = /dev/midi00 First MIDI port
3 = /dev/dsp Digital audio
4 = /dev/audio Sun-compatible digital audio
6 = /dev/sndstat Sound card status information {2.6}
7 = /dev/audioctl SPARC audio control device
8 = /dev/sequencer2 Sequencer -- alternate device
16 = /dev/mixer1 Second soundcard mixer control
17 = /dev/patmgr0 Sequencer patch manager
18 = /dev/midi01 Second MIDI port
19 = /dev/dsp1 Second soundcard digital audio
20 = /dev/audio1 Second soundcard Sun digital audio
33 = /dev/patmgr1 Sequencer patch manager
34 = /dev/midi02 Third MIDI port
50 = /dev/midi03 Fourth MIDI port

ALSA

ALSA (Advanced Linux Sound Architecture(高階Linux聲音體系)的縮寫) 是為音效卡提供驅動的Linux核心元件,以替代原先的OSS(開放聲音系統)。 一部分的目的是支援音效卡的自動配置,以及完美的處理系統中的多個聲音裝置,這些目的大多都已達到。另一個聲音框架JACK使用 ALSA 提供低延遲的專業級音訊編輯和混音能力。
Jaroslav Kysela過去是這個專案的領導者,這個專案開始於為1998年Gravis Ultrasound所開發的驅動,它一直作為一個單獨的軟體包開發,直到2002年他被引進入 linux核心的開發版本 (2.5.4-2.5.5)1。從2.6 版本開始ALSA成為Linux核心中預設的標準音頻驅動程式集,OSS則被標記為廢棄。
ALSA是一個完全開放原始碼的音訊驅動程式集,除了像OSS那樣提供了一組核心驅動程式模組 之外,ALSA還專門為簡化應用程式的編寫提供了相應的函式庫,與OSS提供的基於ioctl的原始程式設計介面相比,ALSA函式庫使用起來要更加方便一 些。利用該函式庫,開發人員可以方便快捷的開發出自己的應用程式,細節則留給函式庫內部處理。當然 ALSA也提供了類似於OSS的系統介面,不過ALSA的開發者建議應用程式開發者使用音訊函式庫而不是驅動程式的API。
Linux中ALSA的主要檔案:
include/sound/driver.h
sound/core/*.c
注:OSS(Open Sound System)是Linux中的另外一個音訊驅動程式框架。

以下是我的一些理解:

ALSA(高階Linux聲音體系)和OSS(開放聲音系統).這兩個是系統發出聲音最低層的軟體系統,可以視為(或者就是)驅動.注意以下幾點:

1、兩個聲音系統不能同時驅動音效卡
兩個分別基於這兩個聲音系統的應用程式是不能同時驅動音效卡的,所以這兩個應用程式也就沒法同時發出聲音了。
realplayer只能由oss聲音系統驅動,而Mplayer可以選擇alsa,不能同時發出聲音;Ausacious是alsa,與YOYOPlayer也不能同時發聲(我猜測YOYOPlayer也去通過驅動oss來發聲)

2、OSS(開放聲音系統)不支援混音
說oss具有音效卡獨佔問題,兩個基於oss的應用程式不能同時驅動音效卡,也就沒法同時發出聲音。
我的realplayer是oss聲音系統,而Mplayer可以選擇oss,不能同時發出聲音; realplayer與YOYOPlayer也不能同時發聲

3、ALSA(高階Linux聲音體系)支援混音,具有音效卡共享的特性

兩個基於alsa的不同應用程式能同時驅動音效卡,就是說能同時發出聲音,需要裝libalsa。
Audacious與選擇alsa的Mplayer能同時發聲,