ALSA语音库移植到OK6410
环境简介:
一、ALSA语音库简介
出于对安全性方面的考虑,Linux下的应用程序无法直接对声卡这类硬件设备进行操作,而是必须通过内核提供的驱动程序才能完成。在Linux上进行音频编程的本质就是要借助于驱动程序,来完成对声卡的各种操作。
对硬件的控制涉及到寄存器中各个比特位的操作,通常这是与设备直接相关并且对时序的要求非常严格,如果这些工作都交由应用程序员来负责,那么对声卡的编程将 变得异常复杂而困难起来,驱动程序的作用正是要屏蔽硬件的这些底层细节,从而简化应用程序的编写。目前Linux下常用的声卡驱动程序主要有两种:OSS 和ALSA。
最早出现在Linux上的音频编程接口是OSS(Open Sound System),它由一套完整的内核驱动程序模块组成,可以为绝大多数声卡提供统一的编程接口。OSS出现的历史相对较长,这些内核模块中的一部分 (OSS/Free)是与Linux内核源码共同免费发布的,另外一些则以二进制的形式由4Front Technologies公司提供。由于得到了商业公司的鼎力支持,OSS已经成为在Linux下进行音频编程的事实标准,支持OSS的应用程序能够在绝 大多数声卡上工作良好。
虽然OSS已经非常成熟,但它毕竟是一个没有完全开放源代码的商业产品,ALSA(Advanced Linux Sound Architecture)恰好弥补了这一空白,它是在Linux下进行音频编程时另一个可供选择的声卡驱动程序。ALSA除了像OSS那样提供了一组内 核驱动程序模块之外,还专门为简化应用程序的编写提供了相应的函数库,与OSS提供的基于ioctl的原始编程接口相比,ALSA函数库使用起来要更加方便一些。
ALSA官网: http://www.alsa-project.org/
二、下载alsa-utils, alsa-lib, 版本要一致
http://www.alsa-project.org/main/index.php/Download
三、移植alsa-lib-1.0.22
<span style="font-family:SimSun;font-size:18px;"># tar xvjf alsa-lib-1.0.22.tar.bz2
# cd alsa-lib-1.0.22
# ./configure \
--host=arm-linux \
--prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/arm-alsa \
--enable-static \
--enable-shared \
--disable-python \
--with-configdir=/usr/share \
--with-plugindir=/usr/lib/alsa_lib
# make
# make install</span>
ALSA lib pcm.c:2145:(snd_pcm_open_noupdate) Unknown PCM default
aplay: main:546: audio open error: No such file or directory
(7)
--with-plugindir也是同样道理了.它是设为 ALSA_PLUGIN_DIR 宏.
四、移植alsa-utils-1.0.22
<span style="font-family:SimSun;"># tar xvjf alsa-utils-1.0.22.tar.bz2
# cd alsa-utils-1.0.22
# PKG_CONFIG_PATH="/usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/arm-alsa/lib/pkgconfig" \
LDFLAGS="-L/usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/ -lpthread -lc -lgcc" \
CFLAGS="-I/usr/local/arm/4.3.2/arm-none-linux-gnueabi/include" \
./configure \
--host=arm-linux \
--target=arm-linux \
--prefix=/home/yuanxiang/alsa_arm/alsa_u \
--disable-alsamixer \
--disable-xmlto \
--with-alsa-prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/arm-alsa/lib/ \
--with-alsa-inc-prefix=/usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/arm-alsa/include/
# make
# make install</span><span style="font-family:Courier New;"> </span>
五、发布到单板
/usr/lib/alsa_lib
/home/yuanxiang/alsa_arm/alsa_u
(1)首先移植alsa_u中的文件:
cd /sdcard/alsa_u
cp -r bin/* /bin
cd /sdcard/arm-alsacp -r lib/* /lib
cd /sdcardcp -r alsa/* /usr/share
六、测试
[root@FORLINX6410]# cat /proc/asound/devices
0: [ 0] : control
1: : sequencer
16: [ 0- 0]: digital audio playback
24: [ 0- 0]: digital audio capture
33: : timer
正常情况下,在你的/dev/snd会看到如下设备结点(有例外,就是内核驱动调整了结点位置)
用ls -l /dev/snd
[root@FORLINX6410]# ls -l /dev/snd/
crw-rw-r-- 1 root root 116, 0 Jan 1 2000 controlC0
crw-rw-r-- 1 root root 116, 24 Jan 1 2000 pcmC0D0c
crw-rw-r-- 1 root root 116, 16 Jan 1 2000 pcmC0D0p
crw-rw-r-- 1 root root 116, 1 Jan 1 2000 seq
crw-rw-r-- 1 root root 116, 33 Jan 1 2000 timer
在单板上执行: