轉自 http://www.kunli.info/2009/03/24/linux-sound-issue/php
現今的互聯網,比較Linux和Windows的戰爭貼基本都成月經貼了。一羣羣激進的用戶不斷轟轟烈烈攻擊對方,可是不多有能拿出新鮮乾貨的,基本上雙方理由我如今都能背得了。在攻擊Linux的陣營中,一條很重要的理由就是:硬件驅動不完善。linux
今天要談的聲卡問題,就是屬於「驅動」這類問題。我在我工做用筆記本,家用筆記本,工做用服務器兩臺,上面都裝過Ubuntu,無一例外遇到聲音的 問題。去ubuntu.org看看,抱怨聲卡問題的吶喊不絕於耳,不管是菜鳥,中鳥仍是老鳥。固然不光是ubuntu,debian系的,Redhat系 的(包括Fedora),據我所知都能找到相似的問題。個人博客以前也有關於聲音問題的文章。究竟是什麼緣由致使Linux這麼難發聲呢?
web
Ubuntu官方Forum上有一篇很是好的帖子談了這一點。本文實際上是該帖原意的中文表達。但這只是從理論的高度上來分析的,若是你是遇到問題了,經過搜索引擎來到了這裏,請直接看本文「總結部分」,這部分的reference post基本上就就是Ubuntu 音頻問題大全了。ubuntu
如今讓咱們從下到上對這個問題來一次bottom-up的分析吧。後端
首先,Linux社區面對的最大也是最現實的現狀,就是獲得的支持太少了。從芯片的層次講,每個OEM商都有能力去配置線路的鏈接,以適應本身生 產機器的需求,好比一個廠商能夠在機器上搞兩個麥克風接口,一個在前面板,一個在後面板;而另外一個廠商則可能會反過來配置,諸如此類。商家們搞完個性化, 弄好Windows驅動,就萬事大吉開慶功會了,可憐咱們的Linux社區不得不針對不一樣機器的不一樣配置進行處理,而後還要保證用戶們能搞清楚本身的機器 是什麼樣的配置狀況。服務器
從聲卡自己的層次講。目前,臺式機最流行的也就是創新的聲卡了。最讓人沮喪的就是,創新的Linux驅動歷來就沒有作好過。創新本身也沒有辦法,幹 脆本身就放棄了這塊的開發,於去年11月宣佈公開發布Sound Blaster X-Fi和X-Fi Titanium系列的Linux 32/64-bit驅動源代碼,說好聽點,叫作衆人拾材火焰高,說很差聽點,就是爺不玩了,誰愛用誰開發去。固然也有一些支持比較好的,好比C- Media的一些板載,或者就是那種高端和專業的聲卡了。網絡
是否是以爲很沮喪?Linux的問題就在這裏,若是你哪天發現x廠商發佈一款超級無敵牛逼限量發行1000套的硬件,而後你想入手給周邊衆多狐朋狗 友炫耀,而後很不幸你用的是Linux…….好吧,你必須祈禱在另外購買的999我的裏面有至少2-3個Linux開發者,注意,不是所謂的高手。而後再 把硬件晾在家裏幾個月,等待驅動的推出…….app
爲何Linux的驅動就這麼難開發呢?有人會說,驅動不就是一個翻譯轉換部件麼,你聲卡芯片不就是經過操做系統提供的底層服務和其餘軟件打交道的麼,Linux源碼都在那裏了,這麼多底層硬件驅動示例都在那裏了,你怎麼就開發不出來呢?工具
對,驅動的做用就是講操做系統傳遞過來的命令和請求翻譯並遞交給聲卡芯片,並將結果反饋。正由於這樣,驅動就必須對硬件的細節很是瞭解。它必須知 道,並能檢測,那些廠商對芯片的固件或者配置電路作了什麼手腳,由於OEM們歷來就懶得去發佈這種信息。不然,就算是一樣的芯片,也沒法保證能適應不一樣的 cable搭配。這個難度有多大呢?舉個例子,就算是在一樣的電腦的一樣的芯片組上,新的7.1環繞聲卡芯片的麥克風輸入的線路,也多是和之前老的 5.1的配置過的聲卡芯片的speaker輸出用的是相同的線路。post
如今,你知道問題所在了吧?做爲驅動編寫者,他們可讓驅動去適應所能發現的全部的變化,可是,這就像一場猜謎遊戲同樣,沒有盡頭。因此,若是你擁 有一款比較特殊的聲卡芯片並受困於其Linux驅動,請不要責備編寫驅動的人,他們已經春蠶到死絲方盡了。現在,最有名且活躍的Ubuntu/linux 驅動編寫團隊要數ALSA和OSS了,對於他們所接受的這種極度困難的任務,咱們所能做的,應該是對他們的感謝。
講完驅動,來說講音頻服務器吧。音頻服務器就是位於驅動上面一層的東西,它負責給那些須要音頻支持的應用提供內核服務,同時還調度這些服務,以及做 爲其餘硬件和軟件交互的接口抽象。總的來講,音頻服務器就是用來鏈接應用程序到你的聲卡,或者到網絡,或者哪都不到,若是你配置錯誤的話。
剛纔提到的ALSA和OSS團隊,不只僅提供驅動,同時還提供音頻服務器的服務。對於ALSA來講,大多數提供的服務是單獨運行的程序,好比 ESD,Enlightened Sound Demon,這玩意容許多個應用程序共享音頻服務。這些程序已經開發了好幾年了,可是都是以一種比較混亂的方式去解決已經觀察到的缺陷。而OSS呢,則是 一個更老的項目,它是內核版本2.4.x時期的惟一認定音頻系統,但以後一度被ALSA所替代,最後仍是存活了下來。關於二者的比較,請參考這裏,我就不贅言了。後來OSS整個被重寫,被命名爲OSS4,如今還在活躍中。
接下來要介紹的Pulseaudio則是一個比較新的,徹底獨立的音頻服務器,只不過它利用的是ALSA的驅動,因此其目標就是替代ALSA的音頻 服務器,包括全部的輔助部分,好比ESD。Pulseaudio同時還致力於提供ALSA當初很難提供的功能,好比網絡廣播,同步刷新多個聲卡,分別控制 不一樣應用程序的音量,以及不少別的好玩的功能。也有小道消息指出,Pulseaudio正在試驗看可否工做在OSS4.1基礎上。
而後咱們看看Jackd。不少人都把Jackd看做是音頻服務器,這實際上是不許確的,它不是音頻服務器,它的本質是音頻鏈接套件。它的設計目標就是 圍繞着提供某些應用所須要的服務來制定的。什麼樣的應用呢?是那些爲音樂界專業大佬們服務的,這些應用的特殊之處在於,他們須要「實時」。好比說,它們可 能是位於支持實時內核/CPU優先訪問和底層驅動訪問的操做系統,用於減小在一些對時間狠敏感的活動中可能會出現的延遲或者中斷,好比現場錄製啊,表演啊 之類的。Jackd支持全部以JACK API套件編寫的應用程序鏈接在一塊兒,並同時被鍵盤或者midi設備本地或遠程操做。因此說,Jackd很是適用於音樂家。但正是因爲Jackd提供瞭如 此底層的控制,因此須要很仔細地去支配資源,並可能和一樣但願支配這些資源的音頻服務器相沖突。考慮到這點,不管是ALSA OSS仍是Pulseaudio音頻服務器,都提供了專門的模塊負責和Jackd交互。
還有一個值得一提的玩意就是Phonon,這是一個新的音頻服務器和應用API,專門用於KDE的,它能夠兼容Pulseaudio以及ALSA驅動。具體的介紹請參加這篇文章。
講完了音頻服務器,接下來說講接口。和驅動不同的是,音頻服務器須要一個公用接口,用戶才能和它們交互,並告知本身的需求。這個接口在哪裏呢?就 在菜單裏面的System/Preferences/Sound裏面,打開看看。在這裏,你能夠指定將系統的聲音送往音頻服務器,或者直接送往驅動。前者 將致使音頻服務器掌控一切,後者則會以驅動爲主,服務器爲輔。若是你選擇autodetect,那第一個應用程序如何決定聲音傳輸路徑,以後的應用程序就 會遵循這個路徑。若是你選擇音頻服務器,那麼服務器會幫你管理,你能夠在其之上作出一些調整。像ALSA就能夠調用ESD來作聲音共 享,Pulseaudio則會本身搞定這個。你還可讓一個音頻服務器來調用另外一個,好比讓Pulseaudio做爲ALSA的默認聲卡,這樣全部的 ALSA相關程序都會被重定向到Pulseaudio,這個過程,應用程序都是不知道的。
對於ALSA來說,它的接口包括了不少調音工具,最基本的就是在終端中調用的alsamixer,固然,你也能夠用GUI版本的 alsamixer。在調音工具中,你能夠經過各類各樣的滑塊和開關來控制聲卡,固然有什麼樣的滑塊和開關取決於你聲卡的類型了。固然還有咱們更熟悉的音 量控制器,在這裏也能夠調節不少的選項。ALSA另外一個常用的接口就是asoundrc文件,你能夠經過手工編輯它,也能夠用asoundconf- gtk來調整選項。
對於Pulseaudio來講,它自己對於驅動並無很深刻的控制,因此Pulseaudio也是調用的ALSA的調音工具。然 後,Pulseaudio能夠控制主音量,聲道的音量,應用程序的音量,等等。Pulseaudio的接口給用戶提供了很詳細的控制選項,在 Pulseaudio音量控制,也就是pavucontrol中,你能夠看到你全部的輸入輸出設備,並能夠將其中任何一個設置成默認設備。你還能夠在不影 響應用程序操做的前提下控制任何程序的音量,以及它所使用的設備。在Pulse Audio Preferences (paprefs)中,你能夠控制對你音頻設備的網絡訪問,創建RTP服務器,甚至創建實際上幾乎等同於實際硬件設備的虛擬設備。
正是因爲這麼多不一樣的音頻格式,不一樣的音頻服務器,爲了保證音頻仍然能正常工做,咱們最後不得不被帶進一個充斥着音頻濾波器,插件,包裝器(wrapper)等等部件的時代。爲了能讓你們理解這些東西是怎麼工做的,舉大名鼎鼎的Amarok做爲例子吧。
當你準備使用Amarok播放mp3的時候,Amarok會先看看你指定的文件,而後對本身說,好,如今我須要一些幫助,讓我來看看誰能幫助我……好,xine引 擎,你小子有mp3插件,來把mp3文件轉換成我能使用的東西,就是你了。Xine一看,喲,Amarok須要幫忙了,哪能見死不救呢,立馬將mp3插件 雙手奉上。Amarok會再對xine說,來,能幫我把數據送到Pulseaudio音頻服務器那裏去麼?Xine天然不敢怠慢,立馬找到 Pulseaudio,說,哥們,我這裏有Amarok送過來的流數據,你能幫忙播放一下麼?Pulseaudio說,沒問題,拿過來吧。因而 Amarok獲得消息,開始處理文件,送到xine,xine將其轉換爲pcm,並將pcm流送到Pulseaudio,Pulseaudio將流數據送 到alsa負責驅動的輸出音頻設備。若是這個設備是音箱或者耳機,pcm就會在alsa音量控制中被調整以讓你能聽到。因此最後整個流程是這樣的
Amarok-xine-pulseaudio-alsa driver-sound card-speakers
只有xine能作這種後端處理的服務麼?不是,另外一個大名遠揚的服務就叫Gstreamer,喜歡用Rhythmbox的朋友估計不會對其陌生。事 實上Gstreamer和xine還能提供視頻處理服務,只要有相應插件和濾波器支持就好了。這種方式對於程序開發者來講更加具備吸引力,緣由就是他們只 須要編寫和Gstreamer或者xine交互的接口,其餘細節一概不關心。Gstreamer和xine同時也提供能夠更改的配置文件。
對於插件來講,程序開發者能夠建立本身的插件,實際上,不管是gstreamer仍是xine,仍是alsa或者 oss 或者pulseaudio或者jack,都是很常見的程序插件。音頻服務器也是包含了各類各樣插件的,好比Pulseaudio就有不少被稱爲模塊的插 件。ALSA也有不少包裝到libasound2和libasound2-plugins的插件。插件是一個很好的東西,用戶應該去儘量多地擁有他們, 這樣纔會有更好的靈活性,以及更寬的選擇。
總結: 基本上,這就是音頻系統在系統中工做的基礎知識。但願看到這裏的朋友沒有被搞昏頭了。這篇文章只是給你們一個基礎概念,並無牽涉到不少的細節。關於具體不少問題是怎麼產生的,怎麼解決,能夠參考一下一些資料