alsa移植到arm linux嵌入式系統中
1 alsa-lib的移植
1.1 軟體包下載
- alsa-lib庫:進入網站http://www.alsa-project.org/選擇下載,在這裡下載的是alsa-lib-1.0.22.tar.bz2
1.2 安裝alsa-lib
- 安裝路徑
在本例中,安裝路徑為/usr/local/custom_install_arm/alsa_lib,因此如果沒有該路徑中的某些目錄,需要建立這些目錄。
- 編譯安裝alsa-lib
執行如下操作
#cd /home/alsa/
#tar -jxv -f alsa-lib-1.0.22.tar.bz2
#cd /home/alsa/alsa-lib-1.0.22
#./configure --host=arm-linux CC=arm-linux-gcc --enable-static --enable-shared --disable-Python --prefix=/usr/local/custom_install_arm/alsa_lib
//=========================================================
//---------------------------------------------------------------------------------------------------說明:
(1) 如果需要自定義include/config.h中ALSA_CONFIG_DIR的值,可通過引數--with-configdir指定,即alsa.conf檔案安裝路徑,預設值是--prefix指定的路徑值/share/alsa/
(1) 如果需要自定義include/config.h中ALSA_PLUGIN_DIR的值,可通過引數--with-plugindir指定,即smixer的安裝路徑,預設值是--prefix指定的路徑值/lib/alsa-lib///---------------------------------------------------------------------------------------------------
//=========================================================
#make#make install
該步驟執行完成之後,alsa-lib的相關檔案就會安裝到pc機中configure步驟先關引數指定的路徑中。
1.3 移植alsa-lib
alsa-lib編譯安裝完成之後,進行如下操作
(1) 將引數--prefix指定的路徑值/lib下的動態庫檔案移植到arm linux系統的檔案系統的/usr/lib/目錄中
(2) 將--with-configdir指定的目錄的所有內容(主要是alsa.conf)移植到arm linux系統的檔案系統中的相同的目錄路徑中
(3) 其它內容可以移植,也快以不移植,但是如果移植,那麼它們在arm linux系統中的目錄路徑必須和其在pc機上的安裝路徑相同
2 alsa-utils的移植
2.1 軟體包下載
- alsa-utils工具包:進入網站http://www.alsa-project.org/選擇下載,在這裡下載的是alsa-utils-1.0.22.tar.bz2
2.2 安裝alsa-utils
- 安裝路徑
- 編譯安裝
執行如下操作:
#cd /home/alsa/
#tar -jxv -f alsa-utils-1.0.22.tar.bz2
#cd /home/alsa/alsa-utils-1.0.22/
如果pkgconfig不是預設路徑(alsa-lib安裝路徑/lib/),則可執行如下操作重新指定:
#PKG_CONFIG_PATH="/usr/local/custom_install_arm/alsa_lib/lib/pkgconfig"
繼續執行如下操作
#./configure --host=arm-linux CC=arm-linux-gcc --disable-alsamixer --disable-xmlto CPPFLAGS=-I/usr/local/custom_install_arm/alsa_lib/include LDFLAGS=-L/usr/local/custom_install_arm/alsa_lib/lib --with-alsa-prefix=/usr/local/custom_install_arm/alsa_lib/lib --with-alsa-inc-prefix=/usr/local/custom_install_arm/alsa_lib/include --prefix=/usr/local/custom_install_arm/alsa_utils
#make
#make install
該步驟完成之後,alsa-utils的相關檔案就會安裝到pc機中configure步驟先關引數指定的路徑中。
2.3 移植alsa-utils
alsa-utils編譯安裝完成之後,進行如下操作
(1) 將引數--prefix指定的路徑值/bin/目錄中的檔案移植到arm linux系統中的/usr/bin或其它目錄中,如果移植到其它目錄中,則需要將該目錄新增到環境變數PATH指的執行路徑中
(2) 將引數--prefix指定的路徑值/sbin/目錄中的檔案移植到arm linux系統中的/usr/bin或其它目錄中,如果移植到其它目錄中,則需要將該目錄新增到環境變數PATH指的執行路徑中
(3) 引數--prefix指定的路徑值/share/目錄中的內容可以移植也可以不移植,如果移植,則移植到arm linux系統中的目錄路徑和其在pc中的安裝路徑相同
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正常情況下,在你的/dev/snd會看到如下裝置結點(有例外,就是核心驅動調整了結點位置) 用ls -l /dev/snd
[[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通常桌面版已經安裝了alsa-utils.可以執行一下aplay -h,測試是否輸出.如果可以來播入一下wav檔案來測試整個環境是否正常工作. 以下是一些用alsa-utils測試樣例
[[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嵌入式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
- 播放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
在這裡要注意 --with--configdir的選項.它將影響 include/config.h中的 ALSA_CONFIG_DIR 目錄. 它預設是你的--prefix目錄.這樣在嵌入式交叉編譯將是一個桌面機的路徑,在libasoud.so執行.會提示,如果出來這個提示,一般都是ALSA_CONFIG_DIR路徑錯誤造成的.
./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-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
ALSA lib pcm.c:2145:(snd_pcm_open_noupdate) Unknown PCM default
aplay: main:546: audio open error: No such file or directory
注意這裡LDFLAGS是必須,否則會找不到libasound.另外 alsamixer 是一個ncurses程式,基本上在嵌入式終端上很難移植.所以這裡取消掉.--disable-xmlto也是因為找不到庫. 編譯 make 安裝 make install
./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
交叉編譯 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 libwithout 要改成disable
makeCopy 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
一、PC端使用alsa 1)PC上使用alsa時,正常的安裝alsa-lib和alsa-util即可,alsa-lib提供alsa音訊程式執行所需要的庫,alsa-util主要生成可執行程式,在程式執行時,在link裡新增-lasound即可使用 2)PC端使用alsa程式設計,具體過程可以參考網上的連結,基本都是一樣的 二、將alsa移植到arm時的步驟 1.alsa交叉編譯 >下載alsa-lib和alsa-util >切換到alsa-lib目錄下,執行 ./configure --host=arm-linux-gnueabihf --prefix=/usr/local/share/arm-alsa --enable-shared --disable-python --with-configdir=/usr/local/share/alsa --with-plugindir=/usr/local/lib/alsa_lib CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ LD=arm-linux-gnueabihf-ld
解釋:1)一般在makefile時,部分程式會首先執行配置檔案進行配置,然後再生成makefile檔案,注意不同工程的配置方案並不相同,這些命令不一定在其他配置檔案中也能使用 2)--host:為使用的交叉編譯工具名,直接使用arm-linux也可以,根據PC上安裝的交叉編譯工具來決定; 3)--prefix:即make install時程式安裝的目錄,可以根據自己的情況進行修改,不用拘泥 4)--enable:開啟功能 --disable:關閉功能 5)--with-configdir:alsa配置檔案所在目錄,本目錄要定好位置,交叉編譯過後,移植到板子上時要和PC上路徑一致。預設alsa配置檔案會在安裝目錄裡,不過根據經驗,最好提出來,因為沒有提出來的時候會報錯 6)--with-plugindir:alsa_lib所在目錄,目前意義不明,可以自由定位,也可以預設安裝 7)CC,CXX,LD:我單獨加的,即配置生成的makefile檔案中的編譯工具為這幾項 >切換到alsa-util目錄下,執行 ./configure --host=arm-linux-gnueabihf --prefix=/usr/local/share/arm-alsa CFLAGS="-I/usr/local/share/arm-alsa/include" LDFLAGS="-L/usr/local/share/arm-alsa/lib -lasound" --disable-alsamixer --disable-xmlto --with-alsa-inc-prefix=/usr/local/share/arm-alsa/include --with-alsa-prefix=/usr/local/share/arm-alsa/lib CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ LD=arm-linux-gnueabihf-ld 解釋:1)注意其中幾個特殊的命令就行,不過不能少 > 1)移植,將/usr/local/share目錄下的alsa,arm-alsa拷貝到開發板的/usr/local/share目錄下,將/usr/local/lib目錄下的alsa_lib拷貝到開發板上/usr/local/lib目錄下 2)將arm-alsa/lib目錄下的檔案拷貝到/lib目錄下,sudo cp -rfa /usr/local/share/arm-alsa/lib /lib 3)將arm-alsa/bin目錄下的檔案拷貝到/sbin目錄下,sudo cp -rfa /usr/local/share/arm-alsa/bin /sbin 4)將arm-alsa/sbin目錄下的檔案拷貝到/sbin目錄下,sudo cp -rfa /usr/local/share/arm-alsa/bin /sbin 5)新增環境變數,執行 sudo vi /etc/profile,在結尾新增export ALSA_CONFIG_PATH=/usr/local/share/alsa/alsa.conf,然後執行source /etc/profile 解釋: 1)移植時一定要和PC上目錄對應 2)只需要庫的話,alsa-util理論上不需要安裝,也不用拷貝bin和sbin 3)PC上使用eclipse的遠端登入直接拷貝到板子上可能存在可執行檔案不能執行的問題,所以要對bin,sbin目錄下的可執行檔案賦許可權,執行sudo chomd 777 4)cp命令中的-rfa是組合命令,r是可以迴圈層次拷貝資料夾,f是強制覆蓋 5)環境變數的新增方法有多種,這裡使用的是一種,還可以在/etc/bash.bash.rc等目錄中新增,具體的執行機制略有不同,但都可以成功,具體可以網上查閱 >如果開發板上有正常的音效卡配置,有3.5mm聲音輸入,以上步驟完成後就可以了,程式應該能正常執行,可以執行aplay和arecord等命令來測試 2.使用USB麥克風時 >USB麥克接入後 1)執行cat /proc/asound/cards,會輸出接入音效卡的資訊,有預設系統的裝置和自己的USB裝置,對應有裝置號 2)執行ls /dev/snd,會輸出當前的裝置,其中USB裝置對應的為controlC1,pcmC1D0p(與之類似),其中C1b表示card 1,D0表示driver 1 >執行sudo ~/.asoundrc,在其中新增 pcm.!default { type hw card 1 device 0 } ctl.!default { type hw card 1 device 0 } 解釋: 1).asoundrc這個檔案可能不存在,建立一個即可,因為程式在呼叫alsa時,會進入alsa.conf這個配置檔案,這個配置檔案會預設搜尋到~/.asoundrc 2)card 1和driver 0要根據具體的編號來定 3)ls /dev/snd目錄下可能會沒有裝置,這個時候需要參考網上的建議,使用連結命令或者直接將裝置拷貝到這個目錄下 >重啟作業系統,然後即可執行,可能程式在執行時需要使用管理員許可權,不然會報錯 3.待解決問題 到上述步驟為止,已經能夠錄音,不過還是有點問題,聲音比較嘈雜,還有是單聲道錄音,這些可以通過amixer命令來解決,具體的可以網上查詢,非常多參考資料 三、出錯記錄 1)情況1
ALSA lib confmisc.c:768:(parse_card) cannot find card '0'
ALSA lib conf.c:4241:(_snd_config_evaluate) function snd_func_card_driver returned error: No such file or directory
ALSA lib confmisc.c:392:(snd_func_concat) error evaluating strings
ALSA lib conf.c:4241:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1251:(snd_func_refer) error evaluating name
ALSA lib conf.c:4241:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:4720:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM default
error opening PCM device: No such file or directory 出錯原因:①交叉編譯後拷貝配置檔案時沒有按照對應目錄 ②沒有新增環境變數,或者新增環境變數後沒有執行更新命令,/etc/profile對應的更新命令為source /etc/profile ③沒有找到音效卡,如果使用USB音效卡時,預設沒有載入成功 2)情況2 ALSA lib conf.c:3501:(snd_config_hook_load) cannot stat file/directory /usr/local/share/alsa/cards/aliases.confALSA lib conf.c:3501:(snd_config_hook_load) cannot stat file/directory /usr/local/share/alsa/cards/aliases.conf
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.default
error opening PCM device: No such file or directory 出錯原因:①重新交叉編譯,將alsa的配置檔案單獨放到一個位置,不要使用預設位置 3)情況3 ALSA lib pcm_hw_c(_snd_pcm_hw_open)invalid value for card error opening PCM device: No such file or directory 出錯原因:①.asoundrc中音效卡的修改繫結有錯誤,需要重新按照正確的方式配置 4)情況4 error opening PCM device: No such file or directory 出錯原因:程式可能需要管理員許可權才能執行,將系統改為管理員許可權執行或者執行sudo命令執行 5)情況5 PC下出錯的原因一般只有兩種,一種是沒有安裝好alsa,一種是在編譯的時候沒有新增連結庫-lasound 四、參考連結: 1.alsa交叉編譯 2.alsa程式設計 3.alsa配置相關(細節掌握)