分类: LINUX
2010-06-02 10:41:03
1,alsa的基本软件结构
alsa app
--------------------
alsa lib
--------------------
alsa driver
--------------------
alsa device driver
linux下软件模块架构的一些重要特点:
1),对应用层提供了经过高度抽象的接口,使得可以支持非常多的应用,可以支持现存的许多应用软件,同时方便应用开发;
2),向下支持非常多的设备驱动,设备驱动一般只需要实现模块定义的一些接口即可,同样这些设备驱动相对容易开发;
以上特点不难在network subsystem/tty subsystem/usb subsystem ...等发现. alsa
同样保持了这些特点,alsa app调用alsa lib提供的接口, 这些接口的核心内容并不复杂; alsa lib和alsa
driver作为整个模块的中间层,对sound接口做了相当完备的抽象.上面的alsa app只需要集中注意力到应用逻辑,下层的alsa
device driver也只需要关注如何实现alsa driver 要求的接口.
2,alsa lib中pcm是如何组织的
alsa lib pcm部分提供了许多pcm plugin,比如Plugin: hw/Plugin: copy/ Plugin:
Route/Plugin: Rate/Plugin: file/...等. 这些plugin的提供大大方便了alsa app的开发.
这些众多的plugin中,只有Plugin: hw和alsa driver
打交道,其他Plugin只需要和Plugin:hw打交道即可. 一般alsa app访问的设备名称为
plughw:x,y/hw:x,y/...等类似名称,这些名称在alsa lib层一般都会转化到hw:x,y设备,
最终转化为/dev/snd/pcmCxDyc 以及/dev/snd/pcmCxDyc等类似设备.
3,alsa driver中pcm是如何组织的
snd module(pcm_native.c)提供了alsa lib需要的接口,这些接口的表现形式 ---标准linux system call.
4,一些结论
用户所要开发的软件模块一定只依赖于系统提供的支撑模块,系统支持模块只可以依赖其他系统支撑模块,绝对不可以依赖于用户模块.
这条规则看起来很直观. 从上面可以看出,用户模块的arrow都是指向其他模块的. 无论是alsa app,还是alsa dev
driver.
snd_pcm/snd/snd_timer/snd_page_alloc/snd_ac97_codec/snd_ac97_bus等模块构成了
alsa driver中间层的主体,对sound接口从逻辑上做了抽象.
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的架构。