1. 程式人生 > >轉載:Linux音頻驅動-OSS和ALSA聲音系統簡介及其比較

轉載:Linux音頻驅動-OSS和ALSA聲音系統簡介及其比較

sdn stat 邏輯 音量 技術 hone ltr close clear

Linux音頻驅動-OSS和ALSA聲音系統簡介及其比較

概述

昨天想在Ubuntu上用一下HTK工具包來繪制語音信號的頻譜圖和提取MFCC的結果,但由於前段時間把Ubuntu升級到13.04,系統的聲卡驅動是ALSA(Advanced Linux Sound Architecture,高級Linux聲音體系),而不是HTK中所使用的OSS(Open Sound System,開放聲音系統)。網上查閱了大半天,按照 http://forum.ubuntu.org.cn/viewtopic.php?t=316792 中提供的方法用OSS4來替換ALSA,結果OSS4沒替換成功,而原來的ALSA也不好使了,真坑爹啊!到現在還沒辦法完全復原,現在只能通過alsamixer來設置音量了,系統的音量設置根本無法用,而且聲音設置中的輸入設備和輸出設備都是空的。(現在將系統升級到13.10版,系統的音量設置可以用了,哈哈)搗鼓了半天也沒還原回來唉,整個人都快崩潰了,都是由於對Linux不熟悉才被虐至如此地步,得惡補啊!!!下面本文就主要介紹一下OSS和ALSA,並將二者進行比較。

在介紹OSS和ALSA之前,先介紹一下音頻設備的一些基礎知識。
數字音頻設備,有時也稱codec,PCM,DSP,ADC/DAC設備,用來播放或錄制數字化的聲音。它的指標主要有:采樣速率(電話為8K,DVD為96K)、channel數目(單聲道,立體聲)、采樣分辨率(8-bit,16-bit)等。
mixer(混頻器):用來控制多個輸入、輸出的音量,也控制輸入(microphone,line-in,CD)之間的切換。
synthesizer(合成器):通過一些預先定義好的波形來合成聲音,有時用在遊戲中聲音效果的產生。
MIDI接口:MIDI接口是為了連接舞臺上的synthesizer、鍵盤、道具、燈光控制器的一種串行接口。

OSS開放聲音系統簡介

Open Sound System是一個類Unix和POSIX兼容系統上一個可選的聲音架構。OSSv3是Linux下原始的聲音系統並集成在內核裏,但是OSSv4在2002年OSS成為商業軟件時它地位被ALSA所取代。OSSv4在2007年又成為了開源軟件,4Front Technologies以GPL協議發布了它的源碼。

OSS(Open Sound System)是unix平臺上一個統一的音頻接口。以前,每個Unix廠商都會提供一個自己專有的API,用來處理音頻。這就意味著為一種Unix平臺編寫的音頻處理應用程序,在移植到另外一種Unix平臺上時,必須要重寫。不僅如此,在一種平臺上具備的功能,可能在另外一個平臺上無法實現。但是,OSS出現以後情況就大不一樣了,只要音頻處理應用程序按照OSS的API來編寫,那麽在移植到另外一個平臺時,只需要重新編譯即可。因此,OSS提供了源代碼級的可移植性。

同時,很多的Unix工作站中,只能提供錄音與放音的功能。有了OSS後,給這些工作站帶來了MIDI功能,加上音頻流、語音識別/生成、計算機電話(CT)、JAVA以及其它的多媒體技術,在Unix工作站中,同樣可以享受到同Windows、Macintosh環境一樣的音頻世界。另外,OSS還提供了與視頻和動畫播放同步的音頻能力,這對在Unix中實現動畫、遊戲提供了幫助。

在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兼容,所以盡量不要使用。
/dev/sequencer:訪問聲卡內置的,或者連接在MIDI接口的synthesizer。

OSS為音頻編程提供三種設備,分別是/dev/dsp,/dev/dspW和/dev/audio,用戶可以直接使用Unix的命令來放音和錄音,命令cat /dev/dsp >xyz可用來錄音,錄音的結果放在xyz文件中;命令cat xyz >/dev/dsp播放聲音文件xyz。如果通過編程的方式來使用這些設備,那麽Unix平臺通過文件系統提供了統一的訪問接口。程序員可以通過文件的操作函數直接控制這些設備,這些操作函數包括:open、close、read、write、ioctl等。

ALSA高級Linux聲音系統簡介

高級Linux聲音體系(英語:Advanced Linux Sound Architecture,縮寫為ALSA)是Linux內核中,為聲卡提供的驅動組件,以替代原先的OSS(開放聲音系統)。一部分的目的是支持聲卡的自動配置,以及完美的處理系統中的多個聲音設備,這些目的大多都已達到。另一個聲音框架JACK使用ALSA提供低延遲的專業級音頻編輯和混音能力。

這個項目開始於為1998年Gravis Ultrasound所開發的驅動,它一直作為一個單獨的軟件包開發,直到2002年他被引進入Linux內核的開發版本(2.5.4-2.5.5)。從2.6版本開始ALSA成為Linux內核中默認的標準音頻驅動程序集,OSS則被標記為廢棄。

ALSA由許多聲卡的聲卡驅動程序組成,同時它也提供一個稱為libasound的API庫。應用程序開發者應該使用libasound而不是內核中的ALSA接口。因為libasound提供最高級並且編程方便的編程接口。並且提供一個設備邏輯命名功能,這樣開發者甚至不需要知道類似設備文件這樣的低層接口。相反,OSS/Free驅動是在內核系統調用級上編程,它要求開發者提供設備文件名並且利用ioctrl來實現相應的功能。為了向後兼容,ALSA提供內核模塊來模擬OSS,這樣之前的許多在OSS基礎上開發的應用程序不需要任何改動就可以在ALSA上運行。另外,libaoss庫也可以模擬OSS,而它不需要內核模塊。另外,ALSA還包含插件功能,使用插件可以擴展新的聲卡驅動,包括完全用軟件實現的虛擬聲卡。ALSA提供一系列基於命令行的工具集,比如混音器(mixer),音頻文件播放器(aplay),以及控制特定聲卡特定屬性的工具。

ALSA API主要分為以下幾種接口:
控制接口:提供靈活的方式管理註冊的聲卡和對存在的聲卡進行查詢。
PCM接口:提供管理數字音頻的捕捉和回放。
原始MIDI接口: 支持 MIDI (Musical Instrument Digital Interface),一種標準電子音樂指令集。這些API提供訪問聲卡上的MIDI總線。這些原始借口直接工作在 The MIDI事件上,程序員只需要管理協議和時間。
記時接口: 為支持聲音的同步事件提供訪問聲卡上的定時器。
音序器接口:一個比原始MIDI接口高級的MIDI編程和聲音同步高層接口。它可以處理很多的MIDI協議和定時器。
混音器接口:控制發送信號和控制聲音大小的聲卡上的設備。

API庫使用邏輯設備名而不是設備文件。設備名字可以是真實的硬件名字也可以是插件名字。硬件名字使用hw:i,j這樣的格式。其中i是卡號,j是這塊聲卡上的設備號。第一個聲音設備是hw:0,0.這個別名默認引用第一塊聲音設備並且在本文示例中一真會被用到。插件使用另外的唯一名字。比如plughw:,表示一個插件,這個插件不提供對硬件設備的訪問,而是提供像采樣率轉換這樣的軟件特性,硬件本身並不支持這樣的特性。

OSS與ALSA的優缺點比較

ALSA是一個完全開放源代碼的音頻驅動程序集,除了像OSS那樣提供了一組內核驅動程序模塊之外,ALSA還專門為簡化應用程序的編寫提供了相應的函數庫,與OSS提供的基於ioctl的原始編程接口相比,ALSA函數庫使用起來要更加方便一些。利用該函數庫,開發人員可以方便快捷的開發出自己的應用程序,細節則留給函數庫內部處理。當然ALSA也提供了類似於OSS的系統接口,不過ALSA的開發者建議應用程序開發者使用音頻函數庫而不是驅動程序的API。Ubuntu默認使用ALSA作為底層聲音驅動,程序則與PulseAudio交互,這是一個很不錯的方案。

下面來比較一下OSS和ALSA的優缺點:


(1)OSS的優點(對用戶來說)
在內核空間(kernel space)裏面包含了一個透明軟件混音器(vmix)。這樣多個程序就可以同時使用聲音設備而且沒有任何問題。
這個混音器可以讓你單獨調節各個程序的音量。
對某些老聲卡有著更好的支持比如創新(Creative)的X-Fi。
聲音程序的初始反應時間一般更好。
對使用OSS的應用程序接口(API)的程序有更好的支持,很多程序都支持OSS的API,而不需要ALSA的模擬。
(2)OSS的優點(對開發者來說)
清晰的API文檔,更易於使用。
支持用戶空間的聲音驅動。
可移植性強,OSS也可以在BSDs和Solaris下運行。
本身可以跨平臺,可以更方便移植到新的操作系統。
(3)ALSA的優點
ALSA對USB音頻設備支持更好,而OSS的輸出還在試驗中,輸入還未實現。
ALSA支持藍牙聲音設備。
ALSA支持AC‘97和HDAudio dial-up soft-modems (比如Si3055)。
ALSA對MIDI支持得更好,但用OSS你只能通過軟件合成器(如timidity和fluidsynth)來使用MIDI。
ALSA對待機支持更好,而用OSS,你需要在待機前使用soundoff來停止OSS驅動,在恢復後使用soundon來啟動OSS。
OSS的jack檢測目前在某些HDAudio-powered主板上不能正常工作。也就是說在某些型號的主板上,你可能需要在插入耳機的時候手動關閉外置揚聲器。而ALSA沒這個問題。

參考資料

[1]Archlinux上介紹OSS的Wiki:https://wiki.archlinux.org/index.php/OSS_%28%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87%29
[2]Archlinux上介紹ALSA的Wiki:https://wiki.archlinux.org/index.php/Advanced_Linux_Sound_Architecture_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
[3]OSS--跨平臺的音頻接口簡介: http://www.ibm.com/developerworks/cn/linux/l-ossapi/
[4]Linux ALSA聲卡驅動之一:ALSA架構簡介: http://blog.csdn.net/droidphone/article/details/6271122
[5]Linux ALSA聲卡編程簡介: http://enmind.blog.163.com/blog/static/164138001201092334620355/

轉載:Linux音頻驅動-OSS和ALSA聲音系統簡介及其比較