alsa lib和utils交叉编译与移植

转载地址:https://blog.csdn.net/cean1024/article/details/52247807

一、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编程
存为wav格式参考(有点小错误,仅供参考): http://blog.csdn.net/sea918/article/details/7249216
WAVE文件格式解析(当存储文件为wav格式时参考): http://www.cnblogs.com/liyiwen/archive/2010/04/19/1715715.html
一个简短的范例(有点小错误,仅供参考): http://blog.sina.com.cn/s/blog_705094cc010151pl.html
3.alsa配置相关(细节掌握)
有很多相关的查看声卡信息的命令(和系统有关,不一定都好使,选择使用) http://wiki.audacityteam.org/index.php?title=USB_mic_on_Linux

猜你喜欢

转载自blog.csdn.net/kunkliu/article/details/80005869