1. 程式人生 > >ALSA音訊庫的移植 ARM 交叉編譯 環境變數

ALSA音訊庫的移植 ARM 交叉編譯 環境變數

alsa 是在LINUX出現比較晚的音訊處理庫,主要是針對原有的OSS的庫進行改進.效能更好,支援多個播放源等.但相應的,增加的程式設計的複雜性.   舊的oss是採用標準檔案IO介面,裝置打開採用open,聲音播錄是採用資料IO介面(read/write),裝置的引數採用ioctl來控制.都是系統呼叫因此無需額外庫和配置檔案來操作裝置.但alsa也是最終採用open/read/write/ioctl,但操作結點更多.更復雜.因此在程式設計中是採用額外的庫來操作的. ALSA的體系結構 主要跟程式設計相關是   其中alsa-driver,alsa-firwware是核心開發者所接觸的東西,對於已經正常執行硬體,通常意味著這一部分已經整合到核心當中,無需修改.    而alsa-utils主要是測試一些小工具.    因此對於一個應用程式開發者,或者嵌入式應用開發者,接觸到主要是alsa-lib編譯出來的庫libasound.  Linux ALSA 驅動測試    以下是我在RHEL 5上測試ALSA的結果,在ARM或MIPS開發板上類似    如果安裝ALSA,在/proc會看到相應裝置:    用cat /proc/asound/devices     
[
[email protected]
alsa-lib-1.0.22]# cat /proc/asound/devices
  2:        : timer
  3:        : sequencer
  4: [ 0- 0]: raw midi
  5: [ 0- 1]: digital audio playback
  6: [ 0- 0]: digital audio playback
  7: [ 0- 0]: digital audio capture
  8: [ 0]   : control
   正常情況下,在你的/dev/snd會看到如下裝置結點(有例外,就是核心驅動調整了結點位置) 用ls -l /dev/snd

[[email protected] alsa-lib-1.0.22]# ls -l /dev/snd
total 0
crw------- 1 root root 116, 8 Mar  2 02:41 controlC0
crw------- 1 root root 116, 4 Mar  2 02:41 midiC0D0
crw------- 1 root root 116, 7 Mar  2 02:41 pcmC0D0c
crw------- 1 root root 116, 6 Mar  2 02:41 pcmC0D0p
crw------- 1 root root 116, 5 Mar  2 02:41 pcmC0D1p
crw------- 1 root root 116, 3 Mar  2 02:41 seq
crw------- 1 root root 116, 2 Mar  2 02:41 timer
  通常桌面版已經安裝了alsa-utils.可以執行一下aplay -h,測試是否輸出.如果可以來播入一下wav檔案來測試整個環境是否正常工作. 以下是一些用alsa-utils測試樣例
  • 播放wave檔案
    •  aplay /mnt/nfs/test.wav
  • 變頻播放,(以是以 44 KHz來播放音訊)
    • aplay -D rate_44k /mnt/nfs/test.wav
  • 錄音,以20秒的間隔(-d 20),立體聲(-c 2),頻率是 8000Hz來錄製Wave格式音訊
    • arecord -d 20 -c 2 -t wav -r 8000 -f "Signed 16 bit Little Endian" /mnt/nfs/test.wav
  • 測試混音播放(先是播放test1.wav,然後再同時播放test2.wav)
    • aplay -D plug:dmix_44k /mnt/nfs/test1.wav & 
    • aplay -D plug:dmix_44k /mnt/nfs/test2.wav
  • 設定放音增益(0 to 3)
    • amixer set Master 1
  • 設定錄音音量(0-31)
    •  amixer set Line 10
嵌入式LINUX下 alsa庫移植.    在ARM-LINUX/MIPS LINUX下移植ALSA庫,首先儲存裝置驅動結點正確無誤.    然後主要移植 alsa-lib    alsa-lib的移植.    解壓 tar xvjf alsa-lib-1.0.22.tar.bz2    cd alsa-lib-1.0.22    生成Makefile
./configure --host=arm-linux --prefix=$PWD/../../output/arm-linux --enable-static --enable-shared  --disable-python  --with-configdir=/usr/local/share --with-plugindir=/usr/local/lib/alsa_lib
在這裡要注意 --with--configdir的選項.它將影響 include/config.h中的 ALSA_CONFIG_DIR 目錄. 它預設是你的--prefix目錄.這樣在嵌入式交叉編譯將是一個桌面機的路徑,在libasoud.so執行.會提示,如果出來這個提示,一般都是ALSA_CONFIG_DIR路徑錯誤造成的.

 ALSA lib pcm.c:2145:(snd_pcm_open_noupdate) Unknown PCM default

aplay: main:546: audio open error: No such file or directory

--with-plugindir也是同樣道理了.它是設為 ALSA_PLUGIN_DIR 巨集.  編譯 make  安裝 make install 開發板釋出注意: 在開發板上釋出alsa庫.除了libasound.so庫以外,必須還要把 alsa.conf釋出到板上--with-configdir所指向目錄下的alsa目錄,否則還是會報"audio open error: No such file or directory". 這個檔案可以在make install後在你安裝目錄下的share找到alsa目錄,把這個目錄整個拷貝到開發板即可. alsa-utils移植   解壓:tar xvjf alsa-utils-1.0.22.tar.bz2    cd alsa-utils-1.0.22 生成Makefile  
./configure --host=arm-linux --prefix=$PWD/../../output/arm-linux --enable-static --enable-shared    --with-configdir=/usr/local/share --with-libiconv-prefix=$PWD/../../output/arm-linux CFLAGS="-I$PWD/../../output/arm-linux/include" LDFLAGS="-L$PWD/../../output/arm-linux/lib -lasound -liconv"  --disable-alsamixer --disable-xmlto
注意這裡LDFLAGS是必須,否則會找不到libasound.另外 alsamixer 是一個ncurses程式,基本上在嵌入式終端上很難移植.所以這裡取消掉.--disable-xmlto也是因為找不到庫. 編譯 make 安裝 make install

交叉編譯 alsa-lib
./configure --host=arm-none-linux-gnueabi --prefix=/usr/share/arm-alsa   
make & make install                                                                                        

交叉編譯 alsa-utils
./configure --host=arm-none-linux-gnueabi --with-alsa-inc-prefix=/usr/share/arm-alsa/include -- with-alsa-prefix=/usr/share/arm-alsa/lib --without-alsamixer // avoid the ncurses lib

without 要改成disable
make

Copy lib to target board
cp -avr /usr/share/arm-alsa {$rootfs}/usr/share/arm-alsa

環境變數
export ALSA_CONFIG_PATH=/usr/share/arm-alsa/share/alsa/alsa.conf                                         
未新增環境變數前出現的錯誤:
~ # ./aplay 
ALSA lib conf.c:2827:(snd_config_hook_load) cannot access file /usr/share/arm-alsa/share/alsa/cards/aliases.conf
ALSA lib pcm.c:1959:(snd_pcm_open_conf) Invalid type for PCM default definition (id: default, value: cards.pcm.default)
aplay: main:533: audio open error: Invalid argument
~ # ./aplay 
ALSA lib pcm.c:2090:(snd_pcm_open_noupdate) Unknown PCM default
aplay: main:533: audio open error: No such file or directory

MIPS:

alsa-lib-1.0.24.1配置編譯

CC=/opt/buildroot-gcc342/bin/mipsel-linux-gcc ./configure --host=mipsel-linux --prefix=/opt/mips/alsa_lib/  --enable-shared --disable-python

alsa-utils-1.0.24.2配置編譯

CC=/opt/buildroot-gcc342/bin/mipsel-linux-gcc ./configure --prefix=/opt/mips/alsa_utils/ --host=mips --with-alsa-prefix=/opt/mips/alsa_lib/lib_1.0.24.1/lib/ --with-alsa-inc-prefix=/opt/mips/alsa_lib/lib_1.0.24.1/include/

CC=/opt/buildroot-gcc342/bin/mipsel-linux-gcc ./configure --host=mipsel-linux --prefix=/home/armmlinux/zdfwork/project/audio/alsa/output/mips-linux/  --enable-shared --disable-python  --with--configdir=/lib/


交叉編譯其他程式:
Add included file in program: #include <alsa/asoundlib.h>
~# arm-none-linux-gnueabi-gcc -lasound -L/usr/share/arm-alsa/lib/ -I/usr/share/arm-alsa/include/ -o test my_test.c