嵌入式linux alsa,嵌入式Linux下ALSA音频架构ALSA-lib移植与编译心得

本文详细介绍了在Linux环境下移植和编译ALSA-lib库时遇到的问题及其解决方案,包括'versionsort'未声明错误、'atomic_add'等重复定义错误以及--with-versioned选项问题。作者通过打补丁、修改配置文件等方式成功解决了这些问题,为读者提供了宝贵的移植经验。
摘要由CSDN通过智能技术生成

***************************************************************************************************************************

作者:EasyWave                                                                   时间:2014.10.25

类别:Linux应用-ALSA音频架构ALSA-lib的移植于编译      声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

***************************************************************************************************************************

一:ALSA音频架构简介

ALSA是Advanced Linux Sound Architecture,高级Linux声音架构的简称,它在Linux操作系统上提供了音频和MIDI(Musical Instrument Digital Interface,音乐设备数字化接口)的支持。在2.6系列内核中,ALSA已经成为默认的声音子系统,用来替换2.4系列内核中的OSS(Open Sound System,开放声音系统)。ALSA的主要特性包括:高效地支持从消费类入门级声卡到专业级音频设备所有类型的音频接口,完全模块化的设计,

支持对称多处理(SMP)和线程安全,对OSS的向后兼容,以及提供了用户空间的alsa-lib库来简化应用程序的开发。

ALSA是一个完全开放源代码的音频驱动程序集,除了像OSS那样提供了一组内核驱动程序模块之外,ALSA还专门为简化应用程序的编写提供了相应的函数库,与OSS提供的基于ioctl的原始编程接口相比,ALSA函数库使用起来要更加方便一些。利用该函数库,开发人员可以方便快捷的开发出自己的应用程序,细节则留给函数库内部处理。当然 ALSA也提供了类似于OSS的系统接口,不过ALSA的开发者建议应用程序开发者使用音频函数库而不是驱动程序的API。

二:ALSA官方网站

2a1f7b917ea0134504b3ec613551253e.png

我这里下载的不是最新版本的alsa-lib-1.0.28,而是alsa-lib-1.0.26,其主要原因当然是为了版本的稳定性才选择低一点版本。而ALSA-lib的文件架构如下所示:

83660a3b26dd554048407bd60c52f7b2.png

三:ALSA移植和编译

在ALSA-lib的移植当中,还是出现过很多奇怪的问题,当然这个跟我当前所有的uClibc的版本有关,对于低于uClibc-0.9.23的版本地uClibc,需要对ALSA的库源码进行更新,否则会出现编译失败的问题,这个我一一道来。

1):‘versionsort‘ undeclared的错误

‘versionsort‘ undeclared错误的提示信息如下所示:

860dad4f60d00b4c23ca1fbf89c514b8.png

这个是由于uClibc如果低于0.9.23的话,就会出现这个问题,因为在uClibc-0.9.32以下的版本没有versionsort函数导致的,这个可以在uClibc的源码中看到的,在uClibc-0.9.32的版本里就有versionsort函数,如下所示:

768e8271bd158c93b340fcdea3f04cfb.png

低于这个版本uClibc的就没有这个函数和文件的,那么就需要下载一个补丁包,并且将其移植到ALSA-lib中去。如果你的uClibc本身的版本就比这个高的话,可以跳过这个部分。其补丁包文件如下所示:

3514128d357d75e74a16dbd697f85c0a.png

将这个补丁打上,采用如下命令,如下所示:

5b2b88f1b6773143ab9afd4636a5e658.png

这个只是第一步,如果只是这样打下补丁,还是会出现‘versionsort‘ undeclared错误的提示,不过不是在parse.c文件中,而是在conf.c文件中,如下所示:

2cd5148e35042219afb4db7306314edf.png

这样就不能采用上面的方法再来打补丁的方式来解决,否则会出现versionsort重复定义的错误,怎么办呢,那就只能将versionsort移植到alsa-lib库中去。首先从alsa-lib/src/ucm/parse.c中复制出versionsort的那部分函数代码,重新新建一个versionsort.c文件在alsa-lib/src/下,如下所示:

a53ed1601b63c65ccf8ac9a5e2f87231.png

同时修改上图中的Makefile.am文件,加上这个文件,如下所示:

304e4946f6170134072521b60194f3c0.png

还需要在alsa-lib/include/local.h文件中加入一行代码,如下所示:

611450f477fc98ad8e5ca2cdbde9d3a4.png

重新修改编译脚本build.sh文件,加上一行代码:autoreconf -ivf,如下所示:

5d509a9807bf0f1a37dd436edda230d9.png

重新编译整个alsa-lib库。

2):‘ atomic_add‘之类的重复定义的错误

如果在编译中遇到这个问题的话,就需要修改configure和configure.ac文件,如果没有这类错误就不需要修改。如下所示:

4ef1578e95b6be2cd324de2597aa26ac.png

eb414809fa796a1775be06ef8327d24b.png

就需要将-D__arm__拿掉,之后重新编译整个alsa-lib库...

3):--with-versioned的问题

这个问题是最难找的问题,不过不加--with-versioned=no的话,会出现静态库调用snd_pcm_hw_params_get_buffer_size(x,x)可以正确的返回buffer_size的大小,而动态库却无法正确返回,总是返回0。这个地方我整整查了两天,才找到是这里导致的问题。

四:ALSAlib库移植总结

在移植过程中出现过很多状况,不过这也是一个学习的机会,不过好在问题都全部找到并解决啦。

原文:http://blog.csdn.net/wavemcu/article/details/40453235

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值