Linux ALSA源码分析(基于Linux 5.18)
Linux ALSA音频驱动框架详细的描述的ALSA驱动框架的分层及各模块的主要作用,现在从源码的角度来分析ALSA驱动。
1、ALSA驱动代码文件结构
在Linux5.18代码树中,Alsa的代码文件结构如下:
linux/sound$ tree -d . ├── ac97 ├── aoa │ ├── codecs │ ├── core │ ├── fabrics │ └── soundbus │ └── i2sbus ├── arm ├── atmel ├── core │ ├── oss │ └── seq │ └── oss ├── drivers │ ├── mpu401 │ ├── opl3 │ ├── opl4 │ ├── pcsp │ └── vx ├── firewire │ ├── bebob │ ├── dice │ ├── digi00x │ ├── fireface │ ├── fireworks │ ├── motu │ ├── oxfw │ └── tascam ├── hda │ └── ext ├── i2c │ └── other ├── isa │ ├── ad1816a │ ├── ad1848 │ ├── cs423x │ ├── es1688 │ ├── galaxy │ ├── gus │ ├── msnd │ ├── opti9xx │ ├── sb │ ├── wavefront │ └── wss ├── mips ├── oss │ └── dmasound ├── parisc ├── pci │ ├── ac97 │ ├── ali5451 │ ├── asihpi │ ├── au88x0 │ ├── aw2 │ ├── ca0106 │ ├── cs46xx │ ├── cs5535audio │ ├── ctxfi │ ├── echoaudio │ ├── emu10k1 │ ├── hda │ ├── ice1712 │ ├── korg1212 │ ├── lola │ ├── lx6464es │ ├── mixart │ ├── nm256 │ ├── oxygen │ ├── pcxhr │ ├── riptide │ ├── rme9652 │ ├── trident │ ├── vx222 │ └── ymfpci ├── pcmcia │ ├── pdaudiocf │ └── vx ├── ppc ├── sh ├── soc │ ├── adi │ ├── amd │ │ ├── acp │ │ ├── include │ │ ├── raven │ │ ├── renoir │ │ ├── vangogh │ │ └── yc │ ├── atmel │ ├── au1x │ ├── bcm │ ├── cirrus │ ├── codecs │ ├── dwc │ ├── fsl │ ├── generic │ ├── hisilicon │ ├── img │ ├── intel │ │ ├── atom │ │ │ └── sst │ │ ├── avs │ │ ├── boards │ │ ├── catpt │ │ ├── common │ │ ├── keembay │ │ └── skylake │ ├── jz4740 │ ├── kirkwood │ ├── mediatek │ │ ├── common │ │ ├── mt2701 │ │ ├── mt6797 │ │ ├── mt8173 │ │ ├── mt8183 │ │ ├── mt8192 │ │ └── mt8195 │ ├── meson │ ├── mxs │ ├── pxa │ ├── qcom │ │ └── qdsp6 │ ├── rockchip │ ├── samsung │ ├── sh │ │ └── rcar │ ├── sof │ │ ├── amd │ │ ├── imx │ │ ├── intel │ │ ├── mediatek │ │ │ ├── mt8186 │ │ │ └── mt8195 │ │ └── xtensa │ ├── spear │ ├── sprd │ ├── sti │ ├── stm │ ├── sunxi │ ├── tegra │ ├── ti │ ├── uniphier │ ├── ux500 │ ├── xilinx │ └── xtensa ├── sparc ├── spi ├── synth │ └── emux ├── usb │ ├── 6fire │ ├── bcd2000 │ ├── caiaq │ ├── hiface │ ├── line6 │ ├── misc │ └── usx2y ├── virtio ├── x86 └── xen
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的代码,与平台无关。
ALSA API可以分解成以下几个主要的接口:
1.声卡和设备管理接口(Management of Cards and Devices):提供管理声卡注册和请求可用设备的通用功能 2.PCM接口:管理数字音频回放(playback)和录音(capture)的接口。本文后续总结重点放在这个接口上,因为它是开发数字音频程序最常用到的接口。 3.Raw MIDI接口:支持MIDI(Musical Instrument Digital Interface),标准的电子乐器。这些API提供对声卡上MIDI总线的访问。这个原始接口基于MIDI事件工作,由程序员负责管理协议以及时间处理。 4.过程信息接口(Proc Info API) 4.定时器(Timer)接口:为同步音频事件提供对声卡上时间处理硬件的访问。 5.时序器(Sequencer)接口 6.混音器(Mixer)接口