asla架构和alsa-lib音频库的移植

来源:互联网 发布:linux开启防火墙命令 编辑:程序博客网 时间:2024/05/17 23:50

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库,首先保证设备驱动结点正确无误.

如果没有这些节点,可用下面命令创建:

[c-sharp] view plain copy
  1. mkdir /dev/snd  
  2. mknod /dev/snd/controlC0 c 116 0  
  3. mknod /dev/snd/hwC0D0 c 116 4  
  4. mknod /dev/snd/pcmC0D0c c 116 24  
  5. mknod /dev/snd/pcmC0D0p c 116 16  
  6. mknod /dev/snd/seq c 116 1  
  7. mknod /dev/snd/timer c 116 33  

 


然后主要移植 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


S3C2440移植alsa-lib

    博客分类: 
  • 嵌入式
LinuxC#C++CPython 

---------------------------------------------------------------------------------------------------------------------------------

目标版:TQ2440,天嵌s3c2440开发板

目标版系统:Linux2.6.30.4,已经整合了alsa驱动。

交叉编译器版本:arm-linux-gcc 4.3.3

开发平台:ubuntu10.04

alsa-lib版本:1.0.22

---------------------------------------------------------------------------------------------------------------------------------

准备工作:

(1)下载alsa-lib和alsa-utils

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

(2)建立相关目录

---------alsa

                |-------libs (存放源码)

                |-------output (输出文件)

                               |----------arm-linux

---------------------------------------------------------------------------------------------------------------------------------

编译alsa-lib

(1)解压alsa-lib-1.0.22.tar.bz2

(2)进入alsa-lib-1.0.22目录

Shell代码  收藏代码
  1. ./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  

(3)make

(4)make install

----------------------------------------------------------------------------------------------------------------------------------

编译alsa-utils

(1)同上

Shell代码  收藏代码
  1. ./configure --host=arm-linux --prefix=$PWD/../../output/arm-linux --enable-static --enable-shared --with-configdir=/usr/local/share  CFLAGS="-I$PWD/../../output/arm-linux/include" LDFLAGS="-L$PWD/../../output/arm-linux/lib -lasound "  --disable-alsamixer --disable-xmlto  

(2)make

(3)make install

------------------------------------------------------------------------------------------------------------------------------------

将库和可执行文件拷贝到开发板上:

(1)将/output/arm-linux/lib下libiconv.so.2.5.0,libasound.so.2.0.0及其软链接拷贝到目标版上的/lib目录下。将/usr/local/share目录下的文件拷贝到目标板上同样的目录下。

(2)拷贝/output/arm-linux/bin/目录下的aplay到目标版上,同时可以拷贝一个wav测试文件/output/arm-linux/share/sounds/alsa/Front_Center.wav到目标板。

(3)在目标板上,ls -l /dev/snd 看看系统是否已经有了设备节点,如果没有,手动建立。

Shell代码  收藏代码
  1. mkdir /dev/snd  
  2. mknod /dev/snd/controlC0 c 116 0  
  3. mknod /dev/snd/hwC0D0 c 116 4  
  4. mknod /dev/snd/pcmC0D0c c 116 24  
  5. mknod /dev/snd/pcmC0D0p c 116 16  
  6. mknod /dev/snd/seq c 116 1  
  7. mknod /dev/snd/timer c 116 33  

 在TQ2440板子上,只需建立pcmC0D0c,pcmC0D0p,timer三个节点即可。

(4)播放声音文件

./aplay Front_Center.wav

------------------------------------------------------------------------------------------------------------------------------------

参考文章

http://cgy136652.blog.163.com/blog/static/36168728201027105324523/

http://blog.csdn.net/reille/archive/2010/08/28/5845913.aspx

http://blog.chinaunix.net/u3/114374/showart_2278278.html



原创粉丝点击