***************************************************************************************************************************
作者: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官方网站
我这里下载的不是最新版本的alsa-lib-1.0.28,而是alsa-lib-1.0.26,其主要原因当然是为了版本的稳定性才选择低一点版本。而ALSA-lib的文件架构如下所示:
三:ALSA移植和编译
在ALSA-lib的移植当中,还是出现过很多奇怪的问题,当然这个跟我当前所有的uClibc的版本有关,对于低于uClibc-0.9.23的版本地uClibc,需要对ALSA的库源码进行更新,否则会出现编译失败的问题,这个我一一道来。
1):‘versionsort‘ undeclared的错误
‘versionsort‘ undeclared错误的提示信息如下所示:
这个是由于uClibc如果低于0.9.23的话,就会出现这个问题,因为在uClibc-0.9.32以下的版本没有versionsort函数导致的,这个可以在uClibc的源码中看到的,在uClibc-0.9.32的版本里就有versionsort函数,如下所示:
低于这个版本uClibc的就没有这个函数和文件的,那么就需要下载一个补丁包,并且将其移植到ALSA-lib中去。如果你的uClibc本身的版本就比这个高的话,可以跳过这个部分。其补丁包文件如下所示:
将这个补丁打上,采用如下命令,如下所示:
这个只是第一步,如果只是这样打下补丁,还是会出现‘versionsort‘ undeclared错误的提示,不过不是在parse.c文件中,而是在conf.c文件中,如下所示:
这样就不能采用上面的方法再来打补丁的方式来解决,否则会出现versionsort重复定义的错误,怎么办呢,那就只能将versionsort移植到alsa-lib库中去。首先从alsa-lib/src/ucm/parse.c中复制出versionsort的那部分函数代码,重新新建一个versionsort.c文件在alsa-lib/src/下,如下所示:
同时修改上图中的Makefile.am文件,加上这个文件,如下所示:
还需要在alsa-lib/include/local.h文件中加入一行代码,如下所示:
重新修改编译脚本build.sh文件,加上一行代码:autoreconf -ivf,如下所示:
重新编译整个alsa-lib库。
2):‘ atomic_add‘之类的重复定义的错误
如果在编译中遇到这个问题的话,就需要修改configure和configure.ac文件,如果没有这类错误就不需要修改。如下所示:
就需要将-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