ALSA语音库移植到OK6410

本文详细介绍了如何将ALSA语音库移植到OK6410平台,包括ALSA库和工具的简介、版本下载、移植步骤以及在单板上的测试过程,旨在帮助开发者在Linux环境下实现音频功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ALSA语音库移植到OK6410

环境简介:

系   统   ubuntu12.04.1 LTS
单   板:OK6410-A  linux-3.0.1
编译器:gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72) 
时   间: 2015/5/21

一、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-driver,alsa-firwware是内核开发者所接触的东西,对于已经正常运行硬件,通常意味着这一部分已经整合到内核当中,无需修改.
      而alsa-utils主要是测试一些小工具.
      因此对于一个应用程序开发者,或者嵌入式应用开发者,接触到主要是alsa-lib编译出来的 libasound.so等库
  

二、下载alsa-utils, alsa-lib, 版本要一致

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


            我使用的版本是alsa-lib-1.0.22 和 alsa-utils-1.0.22

三、移植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>
说明:
(1) 目标板类型
(2) 生成的可执行文件的路径,这里一般不使用默认路径。因为生成的文件需要发布到单板,以免和PC的冲突
(3) 使能静态链接
(4) 使能共享库
(5)  禁止python脚本
(6)  --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
(7)  --with-plugindir也是同样道理了.它是设为 ALSA_PLUGIN_DIR 宏.

在开发板上发布alsa库.除了libasound.so库以外,必须还要把 alsa.conf发布到板上--with-configdir所指向目录下的alsa目录,否则还是会报"audio open error: No such file or directory".
这个文件可以在make install后在你安装目录下的share找到alsa目录,把这个目录整个拷贝到开发板即可.

补充:我在此处编译遇到的两个问题
(1) 此时若出现mv: cannot stat `t-ja.gmo’: No such file or directory错误 解决方法是下载gettext: apt-get install gettext  重新配置编译 。
(2) 此处最容易出现的错误还有 切换到root用户之后没有添加arm-linux-gcc的PATH路径 而导致的提示没有安装gcc编译器的问题。解决办法是:
sudo -s 
export PATH=PATH:/usr/local/arm/4.3.2/bin
或者另一种一劳永逸的方法:
#vim /etc/environment  在文件中添加你的gcc安装路径到环境变量

四、移植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>
说明:
(1) 这个 PKG_CONFIG_PATH 主要指明 ALSA .pc 文件的所在路径,这样  pkg-config 工具就可以根据 .pc 文件的内容动态生成编译和连接选项,比如  cflags (编译用的头文件)和  libs  (连接用的库),至于说 pkg-config 的具体细节?百度下就知道了,了解这个工具非常有用。
(2) LDFLAGS和CFLAGS就是指定链接和编译的库的路径
(3)  --with-alsa-prefix和 -with-alsa-inc 是非标准的库和头文件的路径,就是上面alsa-lib编译出来的文件的路径。

五、发布到单板


将编译alsa-lib,alsa-utils所产生的4个目录拷贝到SD卡.插入单板。
四个目录:
/usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/arm-alsa
/usr/share/alsa
/usr/lib/alsa_lib
/home/yuanxiang/alsa_arm/alsa_u


在超级终端下进入/sdcard目录

(1)首先移植alsa_u中的文件:
cd /sdcard/alsa_u
cp -r bin/* /bin
(2)然后移植arm-alsa中的文件
cd /sdcard/arm-alsa
cp -r lib/* /lib
(3)然后移植alsa中的文件
cd /sdcard
cp -r alsa/* /usr/share
(4)到此alsa移植完成,alsa_lib中的文件不移植也可以

六、测试

如果安装ALSA,在/proc会看到相应设备:
cat /proc/asound/devices
[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

在单板上执行:
# aplay test.wav


参考:感谢参考博客的作者,如有侵权,本人第一时间删除。

linux音频库编程指南



# make
# make install
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值