alsa軟件結構

1,alsa的基本軟件結構    
alsa  app  
--------------------    
alsa lib
 --------------------   
alsa driver  
--------------------   
alsa device driver           
linux下軟件模塊架構的一些重要特點:  
       1),對應用層提供了經過高度抽象的接口,使得可以支持非常多的應用,可以支持現存的許多應用軟件,同時方便應用開發;  
       2),向下支持非常多的設備驅動,設備驅動一般只需要實現模塊定義的一些接口即可,同樣這些設備驅動相對容易開發; 
以上特點不難在network subsystem/tty subsystem/usb subsystem ...等發現. alsa 同樣保持了這些特點,alsa app調用alsa lib提供的接口, 這些接口的核心內容並不複雜; alsa lib和alsa driver作爲整個模塊的中間層,對sound接口做了相當完備的抽象.上面的alsa app只需要集中注意力到應用邏輯,下層的alsa device driver也只需要關注如何實現alsa driver 要求的接口.   
2,alsa lib中pcm是如何組織的  
alsa lib pcm部分提供了許多pcm plugin,比如Plugin: hw/Plugin: copy/ Plugin: Route/Plugin: Rate/Plugin: file/...等. 這些plugin的提供大大方便了alsa app的開發. 這些衆多的plugin中,只有Plugin: hw和alsa driver 打交道,其他Plugin只需要和Plugin:hw打交道即可.    一般alsa app訪問的設備名稱爲 plughw:x,y/hw:x,y/...等類似名稱,這些名稱在alsa lib層一般都會轉化到hw:x,y設備, 最終轉化爲/dev/snd/pcmCxDyc 以及/dev/snd/pcmCxDyc等類似設備.       
3,alsa driver中pcm是如何組織的
snd module(pcm_native.c)提供了alsa lib需要的接口,這些接口的表現形式 ---標準linux system call.                 

 4,一些結論 
用戶所要開發的軟件模塊一定只依賴於系統提供的支撐模塊,系統支持模塊只可以依賴其他系統支撐模塊,絕對不可以依賴於用戶模塊. 這條規則看起來很直觀.   從上面可以看出,用戶模塊的arrow都是指向其他模塊的. 無論是alsa app,還是alsa dev driver.   snd_pcm/snd/snd_timer/snd_page_alloc/snd_ac97_codec/snd_ac97_bus等模塊構成了 alsa driver中間層的主體,對sound接口從邏輯上做了抽象.

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提供一個簡單的播放和錄音的示例,值得參考。
  TODO:
繼續閱讀alsa-driver和alsalib的代碼。

研究JACK的架構。

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