1. 程式人生 > >asla架構和alsa-lib音訊庫的移植

asla架構和alsa-lib音訊庫的移植

alsa 是在LINUX出現比較晚的音訊處理庫,主要是針對原有的OSS的庫進行改進.效能更好,支援多個播放源等.但相應的,增加的程式設計的複雜性.
  舊的oss是採用標準檔案IO介面,裝置打開採用open,聲音播錄是採用資料IO介面(read/write),裝置的引數採用ioctl來控制.都是系統呼叫因此無需額外庫和配置檔案來操作裝置.但alsa也是最終採用open/read/write/ioctl,但操作結點更多.更復雜.因此在程式設計中是採用額外的庫來操作的.
 
 
 
【ALSA的體系結構】
 
官方主頁 http://www.alsa-project.org/

其中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