1. 程式人生 > >ALSA交叉編譯與測試

ALSA交叉編譯與測試

情況簡介

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

./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