免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 783 | 回复: 0
打印 上一主题 下一主题

Advanced Linux Sound Architecture (ALSA) 研究笔记 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-02 21:37 |只看该作者 |倒序浏览

ALSA并非是最近才出现的新事物,它实际上已经发展很多年了,不过直到在kernel 2.6,才成为OSS名正言顺的替代者。ALSA提供的不只是几个声卡的驱动程序,而是从驱动程序到上层应用程序的一整套解决方案。最近花了点时间去阅读ALSA相关资料和代码,本文记录了一些在研究过程中所记的笔记。

按照ALSA官方网站上的说法,它有如下特点:
1.       有效的支持所有类型的音频接口,从普通的声卡到专业的音频设备。
2.       完全模块化的声卡驱动程序。
3.       SMP和线程安全的设计。
4.       一个用户空间的函数库,提供了高层次的编程接口,从而简化了应用程序的开发。
5.       支持较老的OSS API,兼容大多数OSS应用程序。

为什么说ALSA比OSS更有前途呢?从前有人说ALSA会有更好的性能和更少延迟。但设计良好的OSS驱动程序在性能上并不比ALSA驱动程序差,所以现在大家都不在性能上做比较了,而是说ALSA有下面这些优点:
1.       分离了内核代码和用户空间的代码。只有必要的代码才放到内核中,其它代码在alsalib中实现。
2.       alsa-kernel/alsa-driver的架构设计得更好,不同驱动程序之间可以共享更多代码。驱动程序的行为也更加统一,对应用程序来说也是有好处的。
3.       alsa-lib提供了更易使用的API,让应用程序的开发更为简单

不过OSS似乎也不太服气,不甘心就这样让ALSA抢了风头。Opensound网站上有一篇《关于音频的神话与坊间传说》,写得非常有煽动性和说服力,可以认为是对ALSA支持者的反驳。我个人也认为ALSA上述的优点完全可以通过改进OSS来达到,而不必推倒重来,或者真正的焦点在于OSS没有开放源代码,使得linux爱好者决定自己搞一套。不管怎么样,OSS也不会这么快成为历史,因为它支持所有的unix系统,而且ALSA则侧重于linux系统。

ALSA由下面几部分组成:
1.       Driver 内核驱动程序,包括硬件相关的和一些公共代码。有近30万行代码,太庞大的了,只选择性的看了core里一些代码。比如粗略的浏览了一遍《Writing an ALSA Driver》,写得不错。
2.       Library 用户空间的函数库,这是给应用程序使用的。要包含头文件asoundlib.h,链接共享库libasound.so。
3.       Lib-plugins 提供了两个插件,一个用jack模拟alsa接口,一个用oss来模拟alsa接口。高!alsa可以作为jack的后端,jack也可以作为alsa的后端,alsa可以模拟oss,oss也可以模拟alsa。
4.       Utilities一些基于alsa的命令行小程序,可以作为示例代码参考。
5.       Tools 一些小工具, 比如vxloader可以用来加载Firmware。
6.       Firmware 一些设备的Firmware,这些Firmware由内核在适当的时候通过hotplug加载。Firmware其实就是一些程序,每个设备实际上就是一个独立的嵌入式系统,声卡也一样,有自己的程序。但为了节约成本和方便升级,这些设备可能只有RAM而没有ROM,在起动设备时,由系统(如linux)把设备的Firmware加载到设备的RAM里,设备才能运行。
7.       OSS Compat 与OSS兼容的代码。

目前ALSA内核提供给用户空间的接口有:
1.       Information Interface (/proc/asound)
2.       Control Interface (/dev/snd/controlCX)
3.       Mixer Interface (/dev/snd/mixerCXDX)
4.       PCM Interface (/dev/snd/pcmCXDX)
5.       Raw MIDI Interface (/dev/snd/midiCXDX)
6.       Sequencer Interface (/dev/snd/seq)
7.       Timer Interface (/dev/snd/timer)

和OSS类似,也是以文件的方式提供的,但这些接口是给alsalib使用的,而不是给应用程序使用的。应用程序应该使用alsalib,或者更高级的接口,比如jack提供的接口。

ALSA编程
开发基于ALSA的应用程序时,不要直接使用alsa-driver提供的接口,而应该使用alsalib的函数。alsalib提供了丰富的功能,估计有好几百个函数,幸好常用的并不多。ALSA的howto提供一个简单的播放和录音的示例,值得参考。

TODO:
继续阅读alsa-driver和alsalib的代码。
研究JACK的架构


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/25572/showart_655298.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP