alsa lib和utils交叉編譯與移植
阿新 • • 發佈:2018-12-31
一、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-gccCXX=arm-linux-gnueabihf-g++
LD=arm-linux-gnueabihf-ld
解釋: 1)一般在makefile時,部分程式會首先執行配置檔案進行配置,然後再生成makefile檔案,注意不同工程的配置方案並不相同,這些命令不一定在其他配置檔案中也能使用
2)--host:為使用的交叉編譯工具名,直接使用arm-linux也可以,根據PC上安裝的交叉編譯工具來決定;
3)--prefix:即makeinstall時程式安裝的目錄,可以根據自己的情況進行修改,不用拘泥
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-alsaCFLAGS="-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/libCC=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,在結尾新增exportALSA_CONFIG_PATH=/usr/local/share/alsa/alsa.conf,然後執行source/etc/profile
解釋: 1)移植時一定要和PC上目錄對應
2)只需要庫的話,alsa-util理論上不需要安裝,也不用拷貝bin和sbin
3)PC上使用eclipse的遠端登入直接拷貝到板子上可能存在可執行檔案不能執行的問題,所以要對bin,sbin目錄下的可執行檔案賦許可權,執行sudochomd 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表示card1,D0表示driver 1
>執行sudo~/.asoundrc,在其中新增
pcm.!default {
typehw
card1
device0
}
ctl.!default {
typehw
card1
device0
}
解釋: 1).asoundrc這個檔案可能不存在,建立一個即可,因為程式在呼叫alsa時,會進入alsa.conf這個配置檔案,這個配置檔案會預設搜尋到~/.asoundrc
2)card 1和driver0要根據具體的編號來定
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) functionsnd_func_card_driver returned error: No such file ordirectory
ALSA lib confmisc.c:392:(snd_func_concat) error evaluatingstrings
ALSA lib conf.c:4241:(_snd_config_evaluate) functionsnd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1251:(snd_func_refer) error evaluatingname
ALSA lib conf.c:4241:(_snd_config_evaluate) function snd_func_referreturned error: No such file or directory
ALSA lib conf.c:4720:(snd_config_expand) Evaluate error: No suchfile or directory
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCMdefault
error opening PCM device: No such file or directory 出錯原因:①交叉編譯後拷貝配置檔案時沒有按照對應目錄 ②沒有新增環境變數,或者新增環境變數後沒有執行更新命令,/etc/profile對應的更新命令為source/etc/profile ③沒有找到音效卡,如果使用USB音效卡時,預設沒有載入成功 2)情況2 ALSA libconf.c:3501:(snd_config_hook_load) cannot stat file/directory/usr/local/share/alsa/cards/aliases.confALSA libconf.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 PCMcards.pcm.default
error opening PCM device: No such file or directory 出錯原因:①重新交叉編譯,將alsa的配置檔案單獨放到一個位置,不要使用預設位置 3)情況3 ALSA libpcm_hw_c(_snd_pcm_hw_open)invalid value for card erroropening PCM device: No such file or directory 出錯原因:①.asoundrc中音效卡的修改繫結有錯誤,需要重新按照正確的方式配置 4)情況4 erroropening PCM device: No such file or directory 出錯原因:程式可能需要管理員許可權才能執行,將系統改為管理員許可權執行或者執行sudo命令執行 5)情況5 PC下出錯的原因一般只有兩種,一種是沒有安裝好alsa,一種是在編譯的時候沒有新增連結庫-lasound 四、參考連結: 1.alsa交叉編譯 2.alsa程式設計 3.alsa配置相關(細節掌握)
解釋:
ALSA lib confmisc.c:768:(parse_card) cannot find card '0'
ALSA lib conf.c:4241:(_snd_config_evaluate) functionsnd_func_card_driver returned error: No such file ordirectory
ALSA lib confmisc.c:392:(snd_func_concat) error evaluatingstrings
ALSA lib conf.c:4241:(_snd_config_evaluate) functionsnd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1251:(snd_func_refer) error evaluatingname
ALSA lib conf.c:4241:(_snd_config_evaluate) function snd_func_referreturned error: No such file or directory
ALSA lib conf.c:4720:(snd_config_expand) Evaluate error: No suchfile or directory
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCMdefault
error opening PCM device: No such file or directory 出錯原因:①交叉編譯後拷貝配置檔案時沒有按照對應目錄 ②沒有新增環境變數,或者新增環境變數後沒有執行更新命令,/etc/profile對應的更新命令為source/etc/profile ③沒有找到音效卡,如果使用USB音效卡時,預設沒有載入成功 2)情況2 ALSA libconf.c:3501:(snd_config_hook_load) cannot stat file/directory/usr/local/share/alsa/cards/aliases.confALSA libconf.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 PCMcards.pcm.default
error opening PCM device: No such file or directory 出錯原因:①重新交叉編譯,將alsa的配置檔案單獨放到一個位置,不要使用預設位置 3)情況3 ALSA libpcm_hw_c(_snd_pcm_hw_open)invalid value for card erroropening PCM device: No such file or directory 出錯原因:①.asoundrc中音效卡的修改繫結有錯誤,需要重新按照正確的方式配置 4)情況4 erroropening PCM device: No such file or directory 出錯原因:程式可能需要管理員許可權才能執行,將系統改為管理員許可權執行或者執行sudo命令執行 5)情況5 PC下出錯的原因一般只有兩種,一種是沒有安裝好alsa,一種是在編譯的時候沒有新增連結庫-lasound 四、參考連結: 1.alsa交叉編譯 2.alsa程式設計 3.alsa配置相關(細節掌握)