Linux ALSA 系統架構及音效卡註冊檔案操作

qianxuedegushi發表於2020-12-26

ALSA 是Linux音效卡驅動的架構,下面基於linux-2.6.32描述下ALSA系統架構。ALSA系統可以分為alsa-lib、alsa- driver,而alsa-driver又分為core層和底層硬體層。作為開發者,我們只需移植底層硬體層,根據自己硬體特性,實現底層的移植。而 core層基本屬於ALSA標準框架,不需要自己實現。介紹ALSA框架,下面是大體框架圖。

 

 

 

 

     如上圖所示,alsa驅動最終會被上層應用呼叫,這是通過alsa-lib實現的,alsa-lib為alsa-driver封裝了許多API,通過這 些API,上層應用可以呼叫到驅動層。而alsa-lib中的這些API,我們可暫時把他們當做一個黑盒子,裡面具體實現不需要去關注,下面以 linux-2.6.32中ALSA呼叫函式關係說明其架構。先分析ALSA驅動的註冊過程。

一、ALSA驅動的註冊

 

註冊流程檢視上圖,具體的註冊過程不在此贅述。

二、開啟流程

在ALSA驅動註冊完畢以後,當應用程式開始呼叫時,會有一個過程:開啟裝置、對映、設定硬體引數、準備工作、觸發資料流。下圖為整個流程。

  帶sep0611的是需要自己實現的底層驅動。

三、寫資料流程

    圖中應用程式通過ALSA-lib的API函式寫入資料,ALSA-lib呼叫等待函式等待底層可寫。ALSA-lib通過poll系統呼叫進入底層驅動 並將poll訊號加入sleep佇列阻塞程式。硬體的中斷訊號觸發底層驅動註冊的中斷處理函式,中斷處理函式進而呼叫ALSA-driver中的函式判讀 是否該寫。ALSA-driver中的函式再呼叫底層晶片硬體驅動獲取硬體當前資料大小。ALSA-driver再判斷空閒資料區的大小,如果滿足條件就 喚醒sleep佇列,poll訊號從而被喚醒,進而返回給ALSA-lib,ALSA-lib收到訊號後再執行往buffer裡寫資料。
ALSA- lib通過mmap機制將硬體申請的記憶體對映到使用者空間,從而應用程式只需呼叫ALSA-lib往相應位置寫資料,硬體就可以直接讀取了。如果對映記憶體裡 已有資料,通過DMA傳輸給codec,codec便開始讀取資料並進行解碼播放聲音了。經過測試,基於sep6200的ALSA音效卡驅動工作正常,既可 以播放聲音也可以錄製。、

 

我對ALSA錄音和播音的理解,當我們通過麥克風講話的聲音蒐集到音效卡里之後,記憶體從音效卡里讀取聲音資料的過程就是錄音過程,即snd_pcm_readi()函式的執行,把記憶體中的聲音資料寫入到音效卡的過程就是播音過程,即snd_pcm_writei()函式的執行。

轉自:http://www.360doc.com/content/12/0731/17/10388890_227508444.shtml

最早見於:http://www.360doc.com/content/12/0731/17/10388890_227508444.shtml (2012-07-31 )

相關文章