Advanced Linux Sound Architecture (ALSA) 研究筆記

ALSA並非是最近纔出現的新事物,它實際上已經發展很多年了,不過直到在kernel 2.6,才成爲OSS名正言順的替代者。ALSA提供的不只是幾個聲卡的驅動程序,而是從驅動程序到上層應用程序的一整套解決方案。最近花了點時間去閱讀ALSA相關資料和代碼,本文記錄了一些在研究過程中所記的筆記

 

按照ALSA官方網站上的說法,它有如下特點:

1.       有效的支持所有類型的音頻接口,從普通的聲卡到專業的音頻設備。

2.       完全模塊化的聲卡驅動程序。

3.       SMP和線程安全的設計。

4.       一個用戶空間的函數庫,提供了高層次的編程接口,從而簡化了應用程序的開發。

5.       支持較老的OSS API,兼容大多數OSS應用程序。

 

爲什麼說ALSA比OSS更有前途呢?從前有人說ALSA會有更好的性能和更少延遲。但設計良好的OSS驅動程序在性能上並不比ALSA驅動程序差,所以現在大家都不在性能上做比較了,而是說ALSA有下面這些優點:

1.       分離了內核代碼和用戶空間的代碼。只有必要的代碼才放到內核中,其它代碼在alsalib中實現。

2.       alsa-kernel/alsa-driver的架構設計得更好,不同驅動程序之間可以共享更多代碼。驅動程序的行爲也更加統一,對應用程序來說也是有好處的。

3.       alsa-lib提供了更易使用的API,讓應用程序的開發更爲簡單

 

不過OSS似乎也不太服氣,不甘心就這樣讓ALSA搶了風頭。Opensound網站上有一篇《關於音頻的神話與坊間傳說》,寫得非常有煽動性和說服力,可以認爲是對ALSA支持者的反駁。我個人也認爲ALSA上述的優點完全可以通過改進OSS來達到,而不必推倒重來,或者真正的焦點在於OSS沒有開放源代碼,使得Linux愛好者決定自己搞一套。不管怎麼樣,OSS也不會這麼快成爲歷史,因爲它支持所有的unix系統,而且ALSA則側重於Linux系統。

 

ALSA由下面幾部分組成:

1.       Driver 內核驅動程序,包括硬件相關的和一些公共代碼。有近30萬行代碼,太龐大的了,只選擇性的看了core裏一些代碼。比如粗略的瀏覽了一遍《Writing an ALSA Driver》,寫得不錯。

2.       Library 用戶空間的函數庫,這是給應用程序使用的。要包含頭文件asoundlib.h,鏈接共享庫libasound.so。

3.       Lib-plugins 提供了兩個插件,一個用jack模擬alsa接口,一個用oss來模擬alsa接口。高!alsa可以作爲jack的後端,jack也可以作爲alsa的後端,alsa可以模擬oss,oss也可以模擬alsa。

4.       Utilities一些基於alsa的命令行小程序,可以作爲示例代碼參考。

5.       Tools 一些小工具, 比如vxloader可以用來加載Firmware。

6.       Firmware 一些設備的Firmware,這些Firmware由內核在適當的時候通過hotplug加載。Firmware其實就是一些程序,每個設備實際上就是一個獨立的嵌入式系統,聲卡也一樣,有自己的程序。但爲了節約成本和方便升級,這些設備可能只有RAM而沒有ROM,在起動設備時,由系統(如Linux)把設備的Firmware加載到設備的RAM裏,設備才能運行。

7.       OSS Compat 與OSS兼容的代碼。

 

目前ALSA內核提供給用戶空間的接口有:

1.       Information Interface (/proc/asound)

2.       Control Interface (/dev/snd/controlCX)

3.       Mixer Interface (/dev/snd/mixerCXDX)

4.       PCM Interface (/dev/snd/pcmCXDX)

5.       Raw MIDI Interface (/dev/snd/midiCXDX)

6.       Sequencer Interface (/dev/snd/seq)

7.       Timer Interface (/dev/snd/timer)

 

OSS類似,也是以文件的方式提供的,但這些接口是給alsalib使用的,而不是給應用程序使用的。應用程序應該使用alsalib,或者更高級的接口,比如jack提供的接口。

 

ALSA編程

開發基於ALSA的應用程序時,不要直接使用alsa-driver提供的接口,而應該使用alsalib的函數。alsalib提供了豐富的功能,估計有好幾百個函數,幸好常用的並不多。ALSA的howto提供一個簡單的播放和錄音的示例,值得參考。

 

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