Linux ALSA源码分析(基于Linux 5.18)
原创
©著作权归作者所有:来自51CTO博客作者Coder个人博客的原创作品,请联系作者获取转载授权,否则将追究法律责任
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)接口