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

作者: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库移植总结

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

嵌入式Linux下ALSA音频架构ALSA-lib移植与编译心得的更多相关文章

  1. 嵌入式Linux下MP4视频录制库MP4V2移植和简单介绍

    **************************************************************************************************** ...

  2. 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误

    嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报  分类: 嵌入式(928)  一般察看函数运行时堆栈的 ...

  3. 【转】基于Qt, TUIO和TSLIB的嵌入式Linux下的多点触摸设计

    这个教程描述了在嵌入式linux下使用Qt如何设置一个支持多点触摸和单点触摸的输入系统.这里假定你已经有了对应的驱动程序,驱动可以从触摸屏的厂商那里获得或者使用一个linux 内核源码中已经存在的驱动 ...

  4. 嵌入式 Linux下永久生效环境变量bashrc

    嵌入式 Linux下永久生效环境变量bashrc 1) .bashrc文件 在linux系统普通用户目录(cd /home/xxx)或root用户目录(cd /root)下,用指令ls -al可以看到 ...

  5. Linux下常见音频格式之间的转换方法

    Linux下常见音频格式之间的转换方法[转] 下面简单介绍下Linux环境常见音频格式之间的转换方法: MP3 相关工具: lameOGG 相关工具: vorbis-toolsAPE 相关工具: ma ...

  6. 转: 嵌入式linux下usb驱动开发方法--看完少走弯路【转】

    转自:http://blog.csdn.net/jimmy_1986/article/details/5838297 嵌入式linux下的usb属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至 ...

  7. Windows/Linux下引用jar包,并用javac/java编译运行

    Windows/Linux下引用jar包,并用javac/java编译运行,有需要的朋友可以参考下. 1> Windows 假设要引用的jar放在D:/test目录下,名字为t1.jar, ja ...

  8. 嵌入式Linux下BOA网页server的移植

    **************************************************************************************************** ...

  9. 嵌入式linux下wifi网卡的使用(二)——应用程序iw编译

    首先编译iw,Iw支持两种加密/认证方式.第一种是OPEN/OPEN 第二种是WEP/WEP在网上下载iw源码,发现iw的编译需要依赖libnl库(这个库是为了方便应用程序使用netlink借口而开发 ...

随机推荐

  1. Tasker, Android系统增强神器

    Tasker是一个让系统根据用户定制的”配置文件”(Profiles),在特定的”背景”下(Contexts),执行指定”任务”(Tasks)的软件, 除此之外,它还提供”可供点击”的(Clickab ...

  2. Mosfet Bi-Directional Switch NMOS PMOS Back to Back

    http://www.electronic-products-design.com/geek-area/electronics/mosfets/using-mosfets-as-general-swi ...

  3. 红帽子企业版 7.3 INSTALL SYSTEMTAP

    [root@workstation2017 ~]# uname -r 1.安装程序 yum install systemtap systemtap-runtime // 这个会被安装 systemta ...

  4. sourceinsight 工程和源码不在同一个盘符下

    建立sourceinsight的时候,si工程可以和项目源码不在同一个盘下面,即si工程在D盘下,而阅读的源码在E盘下. 方法步骤如下: 下看一下目录结构: Y:\work\Hi3521\Hi3521 ...

  5. 解析天气预报JSON数据

    解析天气预报JSON数据 JSON字符串 constjson2 = '{' + #13#10 +'"error":0,' + #13#10 +'"status" ...

  6. 使用wget提示无法建立SSL连接

    wget 下载URL 提示无法建立SSL连接 解决方法: 原命令上加上" --no-check-certificate" 这是因为wget在使用HTTPS协议时,默认会去验证网站的 ...

  7. appium+python自动化52-多点触控MultiAction

    前言 MultiAction是针对多点触控操作的,是TouchAction的一个补充模块 TouchAction用法参考前面的一篇:appium+python自动化33-TouchAction 多点触 ...

  8. 如何从MATLAB里面保存出分辨率高的图形

    MATLAB堪称科技工作者的倚天屠龙,其科学计算,简洁的编程风格,友好的图形界面等等,都使得它颇受欢迎.MATLAB作图相当简单,而且美观,但是,缺点是分辨率低,一直没有发现,直到最近一期刊编辑告诉我 ...

  9. jenkins中“Poll SCM”和“Build periodically”的区别

    Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作.我的配置如下: */5 * * * *  (每5分钟检查一次源码变化) B ...

  10. c#中this的用法

    在C#中,this关键字代表当前实例,我们可以用this.来调用当前实例的成员方法,变量,属性,字段等; 也可以用this来做为参数状当前实例做为参数传入方法. 还可以通过this[]来声明索引器 下 ...