因为音频的播放和管理很复杂,涉及到不同的编解码芯片和不同平台对音频的支持功能(可支持哪些设备、几路输入、输出、采样率范围…),所以我们需要一个统一的思路或者说框架方法来组织管理音频设备,控制输入输出,同时又要求芯片端(soc)和编解码芯片端的牵连(耦合)尽量少,提高兼容性和可移植性。
我们大概介绍一下:
1、相关文件目录及功能介绍
kernel/sound:
core 该目录包含了ALSA驱动的中间层,它是整个ALSA驱动的核心部分
core/oss 包含模拟旧的OSS架构的PCM和Mixer模块
core/seq 有关音序器相关的代码
include ALSA驱动的公共头文件目录,该目录的头文件需要导出给用户空间的应用程序使用,通常,驱动模块私有的头文件不应放置在这里
drivers 放置一些与CPU、BUS架构无关的公用代码
i2c ALSA自己的I2C控制代码
pci pci声卡的顶层目录,子目录包含各种pci声卡的代码
isa isa声卡的顶层目录,子目录包含各种isa声卡的代码
soc 针对system-on-chip体系的中间层代码
soc/codecs 针对soc体系的各种codec的代码,与平台无关
2、alsa驱动框架
alsa驱动是由Machine(板载硬件)、platform(soc,可以理解为即cpu的audio模块部分)、codec(音频编解码模块)三部分组成,其中platform和codec通过DAI相连接,构建了音频数据通路。
连接示意图如下:
Machine:是一款含有音频模块的产品,例如手机、开发板等,不同的设备可能由不同型号的cpu、codec、不同的输入输出设备组成,Machine为音频的输入输出提供了支持,所以Machine包含的信息基本是不可重用的,这部分是由芯片方案商和开发者根据板子的具体信息来制定的。
platform:一般指某个SOC平台,比如三星、mtk、展讯等等,虽然他们是不同的生产商的芯片,但是在音频模块有一些共同的特点,比如DMA、IIS/PCM、音频时钟的设置和操作方法,但是不同系列的SOC之间涉及具体的操作及参数设置是由差异的,所以不同厂商的pla