1. ALSA 音频子系统概述
ALSA(Advanced Linux Sound Architecture,高级 Linux 声音架构)是 Linux 内核中用于音频设备驱动的核心子系统。自 Linux 2.6 内核起,ALSA 取代了旧有的 OSS(Open Sound System),成为默认的音频框架。本章从架构、定位和对比三个维度,帮助您建立对 ALSA 的整体认知。
1.1 ALSA 架构简介
ALSA 采用分层模块化设计,从上到下依次为:用户空间 API 库、内核核心层、硬件抽象层和设备驱动层。这种分层结构使得应用开发与硬件适配解耦,驱动开发者只需关注底层寄存器操作,而应用开发者通过统一的 snd_pcm_* 接口即可完成音频播放与录制。
核心设计思想: ALSA 将音频设备抽象为
card(声卡)、device(设备)、subdevice(子设备)三级层次,每个声卡可包含多个 PCM 播放/捕获设备,每个设备又可支持多个独立音频流。
1.2 ALSA 在 Linux 音频栈中的位置
在完整的 Linux 音频软件栈中,ALSA 处于承上启下的关键位置:向下直接操作音频硬件寄存器与 DMA 引擎,向上为 PulseAudio、PipeWire、JACK 等用户态音频服务器提供底层 PCM 接口。应用层通常不直接调用 ALSA 内核 API,而是通过音频服务器间接使用 ALSA。
| 层级 | 组件 | 职责 |
|---|---|---|
| 应用层 | Chrome、Spotify、DAW | 音频播放/录制、音效处理 |
| 音频服务器层 | PulseAudio / PipeWire / JACK | 混音、路由、策略管理、设备热插拔 |
| ALSA 用户空间库 | libasound / alsa-lib | 提供 API 封装、PCM 参数配置、插件机制 |
| ALSA 内核核心 | snd / snd-pcm / snd-control | PCM 流管理、DMA 缓冲区管理、中断处理 |
| 硬件驱动层 | snd-hda-intel / snd-soc-* | 寄存器配置、DMA 传输、编解码器控制 |
| 硬件层 | 音频编解码芯片、DMA 控制器 | 模拟/数字信号转换、数据搬运 |
实践要点: 在嵌入式系统中,许多场景会跳过音频服务器,直接使用 ALSA 的
snd_pcm_writei() / snd_pcm_readi() 接口进行低延迟音频 I/O。此时对 PCM 参数配置和 DMA 传输的理解尤为关键。
1.3 ALSA 与 OSS 的对比
OSS(Open Sound System)是 Linux 早期唯一的音频接口标准,采用 /dev/dsp 设备节点和 ioctl 系统调用。ALSA 在设计上全面超越了 OSS,主要体现在以下方面:
| 对比维度 | ALSA | OSS |
|---|---|---|
| 设备模型 | Card/Device/Subdevice 三级层次 | 单一 /dev/dsp 设备节点 |
| 多音频流支持 | 原生支持多路 PCM 流并发 | 需通过虚拟混音器模拟 |
| PCM 参数配置 | 硬件参数 (hw_params) + 软件参数 (sw_params) 分离 | ioctl 混合配置,粒度较粗 |
| DMA 缓冲区管理 | 环形缓冲区 (ring buffer),支持 mmap 零拷贝 | 线性缓冲区,mmap 支持有限 |
| 设备热插拔 | 通过 udev 自动加载驱动,动态创建设备节点 | 需手动 mknod,热插拔支持差 |
| API 复杂度 | 功能丰富但学习曲线较陡 | 简单直接,但功能受限 |
| 兼容性 | 提供 OSS 模拟层 (snd-pcm-oss) | 无 ALSA 模拟能力 |
迁移注意事项: 虽然 ALSA 已成为 Linux 内核默认音频框架,但部分老旧嵌入式 BSP 仍可能使用 OSS 驱动。在移植到新内核时,务必确认音频驱动已迁移至 ALSA 或 ASoC 框架,否则将无法利用 DMA 环形缓冲区和多流并发能力。