嵌入式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借口而开发 ...
随机推荐
- ext:grid分页,列宽度自动填满grid宽度
var cm = new Ext.grid.ColumnModel([{ header : '编号', dataIndex : 'id' }, { header ...
- Windows蓝屏dump文件查看器(转)
Windbg-分析Windows蓝屏原因利器[转]下载地址先声明下,虽然用windbg诊断蓝屏之前网络上已经有人发过教程了,但就我而言, 学会使用windbg来诊断蓝屏也算是自己的原创吧.以前看一个微 ...
- pytest文档10-命令行传参
前言 命令行参数是根据命令行选项将不同的值传递给测试函数,比如平常在cmd执行"pytest --html=report.html",这里面的"--html=report ...
- lua中遍历table的几种方式比较
当我在工作中使用lua进行开发时,发现在lua中有4种方式遍历一个table,当然,从本质上来说其实都一样,只是形式不同,这四种方式分别是: for key, value in pairs(tbtes ...
- Lua中的元表和元方法
Lua中每个值都可具有元表. 元表是普通的Lua表,定义了原始值在某些特定操作下的行为.你可通过在值的原表中设置特定的字段来改变作用于该值的操作的某些行为特征.例如,当数字值作为加法的操作数时,Lua ...
- 使用OllyDbg破解软件
好,废话不多说,教程开始. 我们首先查壳,是Aspark的壳,对于这个壳,大家应该很熟了.<ignore_js_op> 我已经脱好了壳,再查一下壳,是Dephi的<ignore ...
- Js组件layer的使用
作为独立组件使用 layer 引入好layer.js后,直接用即可 <script src="layer.js"></script> <script& ...
- windows服务的安装和卸载方法
安装 创建“安装.bat”文件,用记事本打开此文件,内容为 c:\windows\microsoft.net\framework\v4.0.30319\InstallUtil.exe E:\progr ...
- iOS:网络编程的第三方框架:AFNetworking、SDWebImage
网络编程第三方框架:AFNetworking.SDWebImage 介绍:这些框架是开源的,经过前人的封装.改进,成为使用次数很多的一个性能好的源代码框架,只需要将它导入项目中,就可以使用.因此,在做 ...
- 数学图形(1.25)cassini曲线
通过这种曲线可以看到一种由8到0的过度 相关软件参见:数学图形可视化工具,使用自己定义语法的脚本代码生成数学图形.该软件免费开源.QQ交流群: 367752815 #http://www.mathcu ...