##1、linux
Linux中跟音频相关的就是大名鼎鼎的ALSA(Advanced Linux Sound Architecture)了。它是linux上的音频子系统,在kernel space和user space都有相应的代码。kernel space里主要是音频的驱动程序,user space里主要是alsa-lib,也就是提供接口给上层应用程序调用。 User space 和kernel space通过字符设备进行交互。
在kernel space里ALSA相关的叫ASOC(ALSA System On Chip), 它有三大模块组成:板载硬件(Machine)、Soc(Platform)、Codec,如下图所示:
Machine是指某一款具体的产品,由此可以看出Machine几乎是不可重用的,每个Machine上的硬件实现可能都不一样,CPU不一样,Codec不一样,音频的输入、输出设备也不一样,Machine为CPU、Codec、输入输出设备提供了一个载体。Platform一般是指某一个SoC平台,只要指定了SoC,那么我们可以认为它会有一个对应的Platform,它只与SoC相关,与Machine无关,这样我们就可以把Platform抽象出来,使得同一款SoC不用做任何的改动,就可以用在不同的Machine中。Codec和Platform一样,是可重用的部件,同一个Codec可以被不同的Machine使用。
这三个模块都有相应的driver. Platform driver是cpu侧的音频驱动,主要由CPU芯片厂商负责编写,主要作用是完成音频数据的管理,通过CPU的数字音频接口(DAI)把音频数据传送给Codec进行处理,最终由Codec输出驱动耳机或者是喇叭的音信信号。在具体实现上,ASoC把Platform驱动分为两个部分:snd_soc_platform_driver和snd_soc_dai_driver。其中,platform_driver负责管理音频数据,把音频数据通过dma或其他操作传送至cpu dai中,dai_driver则主要完成cpu一侧的dai的参数配置,同时也会通过一定的途径把必要的dma等参数与