Linux ALSA音频驱动框架详细的描述的ALSA驱动框架的分层及各模块的主要作用,现在从源码的角度来分析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)接口