1. 程式人生 > >alsa移植到arm linux嵌入式系統中

alsa移植到arm linux嵌入式系統中

1  alsa-lib的移植

1.1  軟體包下載

假設該軟體包存放在目錄/home/alsa中

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  軟體包下載

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     
[[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
一、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配置相關(細節掌握)