Alsa 音频库的移植
Alsa 是在LINUX出现比较晚的音频处理库,主要是针对原有的OSS的库进行改进,性能更好,支持多个播放源等。但相应的,增加的编程的复杂性。
alsa 是在LINUX出现比较晚的音频处理库,主要是针对原有的OSS的库进行改进,性能更好,支持多个播放源等。但相应的,增加的编程的复杂性。
旧的oss是采用标准文件IO接口,设备打开采用open,声音播录是采用数据IO接口 (read/write),设备的参数采用ioctl来控制,都是系统调用因此无需额外库和配置文件来操作设备。但alsa也是最终采用open/read/write/ioctl,但操作结点更多,更复杂,因此在编程中是采用额外的库来操作的。
一、ALSA的体系结构
官方主页 http://www.alsa-project.org/
主要跟编程相关是
alsa-lib. ALSA 应用库(最常用)
ftp://ftp.alsa-project.org/pub/lib/alsa-lib-1.0.22.tar.bz2
alsa-driver 一些常见芯片的ALSA驱动代码,一般内核会集成。
ftp://ftp.alsa-project.org/pub/driver/alsa-driver-1.0.22.1.tar.bz2
alsa-firmware 一些DSP或ASIC的专用的微码 (运在芯片之上,启动时由LINUX装入到硬件中)。
ftp://ftp.alsa-project.org/pub/firmware/alsa-firmware-1.0.20.tar.bz2
alsa-utils 一般ALSA小的测试工具,如aplay/arecord 播放和录音小程序。
ftp://ftp.alsa-project.org/pub/utils/alsa-utils-1.0.22.tar.bz2
alsa-oss 用alsa接口模拟旧的oss接口。
ftp://ftp.alsa-project.org/pub/oss-lib/alsa-oss-1.0.17.tar.bz2
其中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
1、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目录,把这个目录整个拷贝到开发板即可。
2、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
更多推荐
所有评论(0)