ALSA交叉編譯與測試
情況簡介
ALSA 是目前 Linux 系統上大量採用的音訊裝置庫,通過 Alsa 架構能分離驅動和應用的開發。 Alsa 為上層提供 API 的同時,也為下層提供了介面,在核心配置的時候指定“支援 Alsa” 就能得到核心支援,具體位置為:
Menuconfig -> Device Drivers -> Sound card support -> Advanced Linux Sound Architecture ,驅動層所新增的音訊裝置應該也會在這裡出現。
由於我們的核心已經包含了對應音訊裝置的驅動,故不做深入。
有了 Alsa 核心驅動,我們還需要 Alsa Lib
Alsa Util
-------------
Alsa lib
-------------
Alsa Driver
Alsa Util 是純應用層的軟體,相當於 Alsa 裝置的測試程式, Alsa Lib 則是支援應用 API 的中間層程式。移植 Alsa 程式的順序就是先後移植 Driver,Lib,Util 。
Alsa Lib 移植
Lib 移植不需要修改一丁點兒的原始碼,只需要重新編譯 lib 以支援自己的平臺。其原始碼可以從官網下載。編譯過程如下:
1. Configure
./configure --host=arm-none-linux-gnueabi --prefix=/home/jeff/Downloads/alsa-lib/out/arm-linux/ --enable-static --enable-shared –-with-configdir=/usr/local/share |
配置會先對此命令中的配置項進行檢查,然後實現配置。需要注意的是:配置如果出錯,未必一定報錯,而是會採用預設的配置選項。幾個重要的配置項:
1 ) --host 指定編譯器,這裡指定為交叉編譯器。注意執行本配置命令前務必保證編譯器已經可以在 Shell 下直接執行了 。
2 ) --prefix 指定編譯後文件的安裝路徑,後續的安裝命令會在該目錄中建立 lib 和 include 兩個目錄
3 ) --with-configdir 指定 conf 檔案的安裝目錄,該目錄中對我們最有用的 alsa.conf ,此檔案會被直接移植到你的目標系統中。
2. make
直接執行:
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/jeff/Downloads/alsa-lib/out/arm-linux/ --enable-static --enable-shared CFLAGS="-I$PWD/../out/arm-linux/include" LDFLAGS="-L$PWD/../out/arm-linux/lib -lasound" --disable-alsamixer --disable-xmlto --with-alsa-inc-prefix=/home/jeff/Downloads/alsa-lib/out/arm-linux/include |
其中幾個重要的配置項:
1 ) --host 指定編譯器,與 lib 的配置選項相同
2 ) --prefix 指定編譯後文件的安裝路徑,與 lib 的配置選項相同
3 ) CFLAGS 用於編譯時指定的編譯選項,在這裡將利用 lib 編譯後生成的標頭檔案,因此指定為該標頭檔案所在目錄
4 ) LDFLAGS 用於編譯時指定連線庫檔案,與 CFLAGS 同樣狀況,將 lib 編譯生成的庫檔案指定出來,
5 ) --with-alsa-inc-prefix 指定標頭檔案目錄,這個與 3) 類似,但必須指定,因為 Configure 程式會去該目錄檢查版本情況。如果不指定的話,則會直接去預設目錄 ( 即宿主機對應的 alsalib 目錄中尋找,因此可能會有錯誤 )
2. make
直接執行:
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 |
注意線路錄音時應確定輸入裝置本身為有源裝置,無源的 Microphone 是不能用來接線路輸入的。
MIC
Amixer –c 0 sset ‘Right PGA Mixer Mic3L’,0 100%,100% unmute cap |