Chinaunix首页 | 论坛 | 博客
  • 博客访问: 829148
  • 博文数量: 125
  • 博客积分: 4066
  • 博客等级: 上校
  • 技术积分: 1401
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-03 18:58
文章分类

全部博文(125)

文章存档

2014年(1)

2013年(1)

2012年(2)

2011年(29)

2010年(92)

我的朋友

分类: 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的架构。

阅读(2383) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~