漫談Linux下的音頻問題

 

現今的互聯網,比較Linux和Windows的戰爭貼基本都成月經貼了。一羣羣激進的用戶不斷轟轟烈烈攻擊對方,但是很少有能拿出新鮮乾貨的,基本上雙方理由我現在都能背得了。在攻擊Linux的陣營中,一條很重要的理由就是:硬件驅動不完善。

今天要談的聲卡問題,就是屬於“驅動”這類問題。我在我工作用筆記本,家用筆記本,工作用服務器兩臺,上面都裝過Ubuntu,無一例外遇到聲音的問題。去ubuntu.org看看,抱怨聲卡問題的吶喊不絕於耳,無論是菜鳥,中鳥還是老鳥。當然不光是ubuntu,debian系的,Redhat系的(包括Fedora),據我所知都能找到類似的問題。我的博客之前也有關於聲音問題的文章。到底是什麼原因導致Linux這麼難發聲呢?


Ubuntu官方Forum上有一篇非常好的帖子談了這一點。本文其實是該帖原意的中文表達。但這只是從理論的高度上來分析的,如果你是遇到問題了,通過搜索引擎來到了這裏,請直接看本文“總結部分”,這部分的reference post基本上就就是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開發者,注意,不是所謂的高手。然後再把硬件晾在家裏幾個月,等待驅動的推出…….

爲什麼Linux的驅動就這麼難開發呢?有人會說,驅動不就是一個翻譯轉換部件麼,你聲卡芯片不就是通過操作系統提供的底層服務和其他軟件打交道的麼,Linux源碼都在那裏了,這麼多底層硬件驅動示例都在那裏了,你怎麼就開發不出來呢?

對,驅動的作用就是講操作系統傳遞過來的命令和請求翻譯並遞交給聲卡芯片,並將結果反饋。正因爲這樣,驅動就必須對硬件的細節非常瞭解。它必須知道,並能檢測,那些廠商對芯片的固件或者配置電路做了什麼手腳,因爲OEM們從來就懶得去發佈這種信息。否則,就算是同樣的芯片,也無法保證能適應不同的cable搭配。這個難度有多大呢?舉個例子,就算是在同樣的電腦的同樣的芯片組上,新的7.1環繞聲卡芯片的麥克風輸入的線路,也可能是和以前老的5.1的配置過的聲卡芯片的speaker輸出用的是相同的線路。

現在,你知道問題所在了吧?作爲驅動編寫者,他們可以讓驅動去適應所能發現的所有的變化,但是,這就像一場猜謎遊戲一樣,沒有盡頭。所以,如果你擁有一款比較特殊的聲卡芯片並受困於其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的插件。插件是一個很好的東西,用戶應該去儘可能多地擁有他們,這樣纔會有更好的靈活性,以及更寬的選擇。

總結
基本上,這就是音頻系統在系統中工作的基礎知識。希望看到這裏的朋友沒有被搞昏頭了。這篇文章只是給大家一個基礎概念,並沒有牽涉到很多的細節。關於具體很多問題是怎麼產生的,怎麼解決,可以參考一下一些資料

1 Multiple Sound Solution

目前最全的音頻問題闡述分析以及一些可能的解決方法,沒有之一。

太長了?那就往下繼續看

Debugging Sound Problems

簡單的,如何去測試音頻問題的Wiki指南。

Howto Enable system sound in Ubuntu Intrepid

如果你的系統聲音,是指開機關機這種,工作不正常了,可以參考這篇文章。

Simple guide to Sound Solutions for Hardy,Intrepid and Jaunty Jackalope Users

如果你的系統有聲音,但是不完全,請注意,不是完全沒聲音,那麼可以參考這篇文章

 

 

原文地址:http://www.kunli.info/2009/03/24/linux-sound-issue/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章