情況簡介
ALSA 是目前 Linux 系統上大量采用的音頻設備庫,通過 Alsa 架構能分離驅動和應用的開發。 Alsa 為上層提供API 的同時,也為下層提供了接口,在內核配置的時候指定“支持 Alsa” 就能得到內核支持,具體位置為:
Menuconfig -> Device Drivers -> Sound card support -> Advanced Linux Sound Architecture ,驅動層所添加的音頻設備應該也會在這里出現。
由於我們的內核已經包含了對應音頻設備的驅動,故不做深入。
有了 Alsa 內核驅動,我們還需要 Alsa Lib 和 Alsa Util 的支持,這 3 者的關系如下圖所示:
Alsa Util
-------------
Alsa lib
-------------
Alsa Driver
Alsa Util 是純應用層的軟件,相當於 Alsa 設備的測試程序, Alsa Lib 則是支持應用 API 的中間層程序。移植Alsa 程序的順序就是先后移植 Driver,Lib,Util 。
Alsa Lib 移植
Lib 移植不需要修改一丁點兒的源碼,只需要重新編譯 lib 以支持自己的平台。其源碼可以從官網下載。編譯過程如下:
1.Configure
sudo ./configure --host=arm-none-linux-gnueabi --prefix=/home/jamie/dvsdk/alsa/alsa-lib-1.0.24.1/build --with-alsa-devdir=/dev --enable-static --enable-shared --disable-python --with-configdir=/usr/local/share/alsa --with-plugindir=/usr/local/lib/alsa_lib
配置會先對此命令中的配置項進行檢查,然后實現配置。需要注意的是:配置如果出錯,未必一定報錯,而是會采用默認的配置選項。幾個重要的配置項:
1 ) --host 指定編譯器,這里指定為交叉編譯器。注意運行本配置命令前務必保證編譯器已經可以在 Shell下直接執行了 。
2 ) --prefix 指定編譯后文件的安裝路徑,后續的安裝命令會在該目錄中創建 lib 和 include 兩個目錄
3 ) --with-configdir 指定 conf 文件的安裝目錄,該目錄中對我們最有用的 alsa.conf ,此文件會被直接移植到你的目標系統中。
4) (本人增加) --with-alsa-devdir 指定音頻設備的目錄。(pcmC0D0c/pcmC0D0p/pcmC0D1p等)alsa_lib 默認到/dev/snd找這些音頻設備,但有時候創建音頻設備並不在/dev/snd里,而是在/dev/里或者其它目錄里,這就需要指定目錄,不然會提示找不到pcmCxDx 。
2.make
直接運行:
make 或者 sudo make
3.make install
運行 install 有 2 點需要注意
1) install 可能會在一些非用戶目錄安裝一些文件,因此需要 root 權限
2) install 也會執行一些編譯命令,因此記得保證 root 權限下的交叉編譯器同樣可用。
Alsa Util 移植
Util 會生成用於播放,錄制,配置音頻的應用文件,對測試很有用處。編譯過程如下:
1.Configure
./configure --host=arm-none-linux-gnueabi --prefix=/home/jamie/dvsdk/alsa/alsa-lib-1.0.24.1/build --enable-static --enable-shared CFLAGS="-I/home/jamie/dvsdk/alsa/alsa-lib-1.0.24.1/build/include" LDFLAGS="-L/home/jamie/dvsdk/alsa/alsa-lib-1.0.24.1/build/lib -lasound" --disable-alsamixer --disable-xmlto --with-alsa-inc-prefix=/home/jamie/dvsdk/alsa/alsa-lib-1.0.24.1/build/include
其中幾個重要的配置項:
1 ) --host 指定編譯器,與 lib 的配置選項相同
2 ) --prefix 指定編譯后文件的安裝路徑,與 lib 的配置選項相同
3 ) CFLAGS 用於編譯時指定的編譯選項,在這里將利用 lib 編譯后生成的頭文件,因此指定為該頭文件所在目錄
4 ) LDFLAGS 用於編譯時指定連接庫文件,與 CFLAGS 同樣狀況,將 lib 編譯生成的庫文件指定出來,
5 ) --with-alsa-inc-prefix 指定頭文件目錄,這個與 3) 類似,但必須指定,因為 Configure 程序會去該目錄檢查版本情況。如果不指定的話,則會直接去默認目錄 ( 即宿主機對應的 alsalib 目錄中尋找,因此可能會有錯誤 )
2. make
必須編譯成功。
網上有種方法教大家 1 ) make clean 2)configure 3)make install 這種方法確實不會報錯,但其實是安裝了預編譯的可執行程序,該程序是基於 x86 體系的,無法用於嵌入式平台。
3.make install
lib 和 util 安裝到嵌入式平台
在目標板上,以下文件必須被拷貝至對應位置:
1) lib 庫文件,放在 /lib/ 中
2) conf 文件,應放在 /usr/local/share 中,與編譯時指定的目錄相同
3) 應用文件, util 能產生 aplay,amixer,arecord 可執行程序,這些文件可放在 /usr/sbin 中
4) 必須保證有 /dev/snd/ 目錄中,此目錄下應包含以下幾個設備文件 ( 驅動 ) ,
controlC0, pcmC0D0c, pcmC0D0p, timer
如果這些文件已經在 /dev/ 下,可拷貝到 snd 目錄中。
運行測試程序
在我們當前的板子上存在着 4 個音頻鏈路,分別是 :MIC, Line in, Line out, Headphone Out 。這 4 個鏈路都需要進行測試。
對於播放鏈路 (Line out, Headphone Out) ,相應的播放命令為:
aplay mysound.wav
對於錄制鏈路 (Mic, Line in) ,相應的錄制命令為:
arecord myvoice.wav –fdat –d 5
其中 -fdat 指定以 CD 音質錄制, -d 代表錄制 5 秒后退出。
命令 amixer 可以用來控制鏈路的通斷以及相應配置。對於每一個系統,會有不一樣的鏈路名稱,通過amixer可以了解當前系統上所有鏈路的名稱及狀態。
命令amixer scontrols可以查看系統中的simple控制鏈路,相對應的還有完全版的控制鏈路(amixer controls),根據筆者的經驗,這個simple控制鏈路足矣。
命令amixer scontent可以查看系統的所有simple鏈路極其當前狀態。
以我目前的系統為例,為了讓不同的鏈路工作,我們必須通過該命令進行設定。
Headphone Out
Amixer –c 0 sset ‘PCM’,0 100%,100% unmute playback
Line out
amixer –c 0 sset ‘Line’,0 100%,100% unmute playback
Line in
Amixer –c 0 sset ‘Right PGA Mixer Line1L’,0 100%,100% unmute cap
MIC
Amixer –c 0 sset ‘Right PGA Mixer Mic3L’,0 100%,100% unmute cap
轉自:http://blog.csdn.net/iamgooday/article/details/6323863
PS:我在編譯util 1.0.24.2時出現make錯誤,后來發現是version.h有問題,修改就好了,不知道為什么,version.h里面的內容會變亂了。