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

***************************************************************************************************************************
作者: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架构的站点例如以下所看到的:http://www.alsa-project.org/main/index.php/Main_Page


我这里下载的不是最新版本号的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库移植总结

      在移植过程中出现过非常多状况。只是这也是一个学习的机会,只是好在问题都所有找到并解决啦。

原文地址:https://www.cnblogs.com/yutingliuyl/p/6718875.html