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