分类: LINUX
2011-06-02 14:19:05
谨以此文纪念过往的岁月
一.前言
在ALSA中,复杂的不是code而是frame。看code的时候有点像是盲人摸象,没有一个整体的框架,仅仅是一个一个独立而且错综复杂的code。故在此献丑,讲诉鄙人对ALSA的架构的一些理解,如有不对之处,请各位同仁不吝指教。
二.架构
1.概述
在理解下面的架构之前,需要理解ALSA存在的意义,就是将codec,platform完全独立实现code的复用。我们以Audio system 1和 和 Audio system 3为例,由codec wm9713和platform s3c6410 构成,AS2由和platform s5p110 构成,而AS3由codec wm9713和platform s5p110 构成。为了实现code的最大利用率就是在AS1中codec驱动和AS2中platform的驱动到AS3还可以使用,不会出现platform与codec有联系的code。而machine则是负责了codec和platform之间的联系,类似于一个管道将codec和platform联系起来,不过这里面是单向管道,对于最基础的两种流capture和playback均有一个管道。关于流的概念我们下面会讲述的。实现代码的最大独立化,这也是linux中为什么对于一个很简单的驱动会划分出许多层。
2.alsa架构
我们还是从上向下理解:
Card->Timer
Seq
PCM->Substream(capture) <- DMA buffer <- platform(pcm_new)
->Substream(playback) <- DMA buffer
对于上面的东西大家也许会很困惑,card是什么,PCM是什么。这个不急听我慢慢道来,card类似一个主管,他负责管理几个组件比如seq(定序器),timer(时钟),PCM(播放以及录音的实例)。其中PCM类似于课长,其负责管理子流,其每一个子流对应着一条通道,如对于最简单的pcm,其就包括两个子流,一个capture一个playback,其对应着两条通道。不过此PCM非彼PCM,此PCM乃是一实例负责管理子流,而彼PCM是指一种音频接口,这切切不可混了。在我们的系统中采用的AC97作为通信接口,即通道实现之接口。
3.设备
在/dev/snd中会有如下几个常见的设备实例controlC0,pcmC0D0p,pcmC0D0c,timer,seq等。而cat /proc/devices时则存在主设备号的116的alsa设备。其在/dev/snd下的设备是主设备号为116而从设备号不同的设备,其均为同一个card下的不同的组件。。