ALSA音频库的移植 ARM 交叉编译 环境变量

Andrew Huang bluedrum@163.com
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
    
[root@hxy 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

[root@hxy 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


下载
http://www.alsa-project.org/main/index.php/Download

交叉编译 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
要在Ubuntu上配置Qt-arm交叉编译环境,您需要执行以下步骤: 1. 安装交叉编译工具链 您可以使用以下命令安装交叉编译工具链: ``` sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi ``` 2. 下载Qt 您可以从Qt官网下载Qt for Embedded Linux的源代码。解压缩下载的文件并将其放在您选择的目录中。 3. 配置Qt 进入解压后的Qt目录,执行以下命令: ``` ./configure -xplatform qws/linux-arm-gnueabi-g++ -embedded arm -little-endian -prefix /usr/local/qt-arm -no-largefile -no-accessibility -no-qt3support -no-sql-sqlite -no-glib -no-cups -no-pch -no-mmx -no-3dnow -no-sse -no-sse2 -no-ssse3 -no-sse3 -no-sse4.1 -no-sse4.2 -no-avx -no-neon -no-openvg -no-gtkstyle -no-nis -no-iconv -no-dbus -no-opengl -no-rpath -no-gif -no-libtiff -no-libpng -no-libmng -no-libjpeg -no-openssl -no-nas-sound -no-pulseaudio -no-alsa -no-xinerama -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-xinput -no-xkb -no-sm -no-xshape -no-xvidmode -no-xinerama -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-xinput -no-xkb -no-sm -no-xshape -no-xvidmode ``` 请注意,此命令假定您已经安装了arm交叉编译工具链,并且将Qt安装到了/usr/local/qt-arm目录中。 4. 编译Qt 执行以下命令编译Qt: ``` make ``` 这将需要一些时间来完成。 5. 安装Qt 执行以下命令安装Qt: ``` sudo make install ``` 6. 配置环境变量 将以下行添加到您的~/.bashrc文件中: ``` export PATH=/usr/local/qt-arm/bin:$PATH ``` 这将使您能够在命令行中轻松访问Qt。 完成以上步骤后,您应该已经成功配置了Qt-arm交叉编译环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值