嵌入式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库移植总结
在移植过程中出现过非常多状况。只是这也是一个学习的机会,只是好在问题都所有找到并解决啦。
嵌入式Linux下ALSA音频架构ALSA-lib移植与编译心得的更多相关文章
- 嵌入式Linux下MP4视频录制库MP4V2移植和简单介绍
**************************************************************************************************** ...
- 嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误
嵌入式 linux下利用backtrace追踪函数调用堆栈以及定位段错误 2015-05-27 14:19 184人阅读 评论(0) 收藏 举报 分类: 嵌入式(928) 一般察看函数运行时堆栈的 ...
- 【转】基于Qt, TUIO和TSLIB的嵌入式Linux下的多点触摸设计
这个教程描述了在嵌入式linux下使用Qt如何设置一个支持多点触摸和单点触摸的输入系统.这里假定你已经有了对应的驱动程序,驱动可以从触摸屏的厂商那里获得或者使用一个linux 内核源码中已经存在的驱动 ...
- 嵌入式 Linux下永久生效环境变量bashrc
嵌入式 Linux下永久生效环境变量bashrc 1) .bashrc文件 在linux系统普通用户目录(cd /home/xxx)或root用户目录(cd /root)下,用指令ls -al可以看到 ...
- Linux下常见音频格式之间的转换方法
Linux下常见音频格式之间的转换方法[转] 下面简单介绍下Linux环境常见音频格式之间的转换方法: MP3 相关工具: lameOGG 相关工具: vorbis-toolsAPE 相关工具: ma ...
- 转: 嵌入式linux下usb驱动开发方法--看完少走弯路【转】
转自:http://blog.csdn.net/jimmy_1986/article/details/5838297 嵌入式linux下的usb属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至 ...
- Windows/Linux下引用jar包,并用javac/java编译运行
Windows/Linux下引用jar包,并用javac/java编译运行,有需要的朋友可以参考下. 1> Windows 假设要引用的jar放在D:/test目录下,名字为t1.jar, ja ...
- 嵌入式Linux下BOA网页server的移植
**************************************************************************************************** ...
- 嵌入式linux下wifi网卡的使用(二)——应用程序iw编译
首先编译iw,Iw支持两种加密/认证方式.第一种是OPEN/OPEN 第二种是WEP/WEP在网上下载iw源码,发现iw的编译需要依赖libnl库(这个库是为了方便应用程序使用netlink借口而开发 ...
随机推荐
- jquery如何判断checkbox(复选框)是否被选中(转)
谁都知道 在html 如果一个复选框被选中 是 checked="checked". 但是我们如果用jquery alert($("#id").attr(&qu ...
- visual studio 2008试用版的评估期(万能破解)
教程 http://jingyan.baidu.com/article/a3a3f811ee87268da2eb8ae7.html 参考: http://blog.chinaunix.net/uid- ...
- vue头像上传与文件压缩
工作中遇到的问题记录:vue开发头像上传组件,后端提供接口,需求为可相册上传,可相机拍摄上传,文件大小限制为2M 需求点分析 移动端调用相册/摄像头实现拍照 图片压缩,当前高像素的相机拍出来的图片都有 ...
- jquery开发之第一个程序
前一段时间学习了js和css.可是发现好多的程序里面都用到了jquery当时本来想着先吧js弄熟了 再搞这个.后来发现不行,好多的程序好像是有益和自己为难似的,所以我决定接下来认认真真的把jquery ...
- Linux环境redis集群搭建
集群后tomcat context.xml的配置 <!-- 集群配置--> <Valve className="com.radiadesign.catalina.sessi ...
- javascript无缝滚动原理
相比之下,无缝拼接能避免切换时出现空白,使用户体验更好! 无缝滚动原理: 制作一个双胞胎,内容跟主体内容一致,样式一致,如果横向排列则并排,当切换的时候,就可以弥补主体空白的地方,其他按普通循环操作即 ...
- pytest文档12-skip跳过用例
前言 pytest.mark.skip可以标记无法在某些平台上运行的测试功能,或者您希望失败的测试功能 skip意味着只有在满足某些条件时才希望测试通过,否则pytest应该跳过运行测试. 常见示例是 ...
- GO语言 -- 调用DLL函数,填平所有的坑,最详尽攻略
编译dll文件(源代码c++):g++ -shared main.cpp -o test.dll set GOARCH=386 第一个DLL函数,第一个参数,要求传入一个指针,直接指向[]byte类型 ...
- MySQL create table as与create table like对比
a.create table like方式会完整地克隆表结构,但不会插入数据,需要单独使用insert into或load data方式加载数据b.create table as 方式会部分克隆表结 ...
- pidera安装node.js(树莓派)
1. 下载node.js wget http://nodejs.org/dist/v0.10.5/node-v0.10.5-linux-arm-pi.tar.gz tar -xzvf node-v0. ...