1. ALSA 概述

ALSA(Advanced Linux Sound Architecture,高级 Linux 音频架构)是当前 Linux 内核中标准的音频子系统。它取代了早期的 OSS(Open Sound System),为音频设备驱动开发、用户空间音频应用以及中间件(如 PulseAudio、PipeWire)提供了统一的底层接口。

1.1 ALSA 的历史

ALSA 项目由 Jaroslav Kysela 于 1998 年发起,最初是为了支持 Gravis Ultrasound 声卡。2002 年,ALSA 被合并进 Linux 2.5 内核主线,并在 Linux 2.6 中完全取代 OSS 成为默认音频框架。其发展历程中的关键节点如下:

时间 事件 意义
1998 Jaroslav Kysela 启动 ALSA 项目 为 Gravis Ultrasound 提供驱动,目标替代 OSS
2002 ALSA 进入 Linux 2.5 内核 开始与 OSS 并存,提供更现代的 API
2005 OSS 被标记为废弃 ALSA 成为 Linux 内核官方推荐音频框架
2010+ ALSA 持续演进 支持 USB Audio Class 2.0、HDMI/DP 音频、DSP 拓扑
开发者视角: 虽然 PulseAudio 和 PipeWire 在桌面环境中更常见,但它们底层仍然通过 ALSA 的 alsa-lib 与内核驱动交互。理解 ALSA 是调试音频问题的基本功。

1.2 ALSA 在 Linux 音频栈中的位置

ALSA 位于 Linux 音频栈的中间层,向上对接用户空间音频服务,向下控制硬件声卡。下图展示了 ALSA 在整个音频栈中的核心位置:

Linux 音频栈架构图 应用层 Audacity / VLC / 游戏 / 专业 DAW 中间件层 PulseAudio / PipeWire / JACK ALSA 用户空间库 (alsa-lib) PCM / Mixer / MIDI / 控制接口 API 系统调用层 (ioctl / mmap / read / write) ALSA 内核框架 (snd 核心 + 声卡驱动) PCM 设备 / 控制设备 / MIDI 设备 / 定时器 硬件层 (声卡 / Codec / DSP / USB 音频设备)
关键理解: ALSA 内核框架直接与硬件交互,通过 /dev/snd/ 下的设备文件暴露给用户空间。用户空间的 alsa-lib 封装了这些设备文件的 ioctl 操作,提供更友好的 API 给中间件和应用程序。

1.3 ALSA 与 OSS 的对比

OSS(Open Sound System)是 Linux 早期唯一的音频接口,采用 /dev/dsp 和 /dev/mixer 等字符设备。ALSA 在设计理念、API 复杂度和功能丰富度上都有显著提升。下表从多个维度对比两者:

对比维度 OSS ALSA
设备模型 单一 /dev/dsp 设备,多应用需通过虚拟混音器 每个声卡独立设备文件(/dev/snd/pcmC0D0p),支持多设备
API 复杂度 简单,基于 open/read/write/ioctl 复杂但灵活,提供 PCM、Mixer、MIDI、Timer、Control 等子 API
硬件抽象 弱,驱动直接暴露硬件寄存器 强,通过 snd_card、snd_pcm 等内核对象抽象
多音频流 不支持原生多流,需 dmix 等外部插件 原生支持多 PCM 设备,通过 dmix 插件实现软件混音
MIDI 支持 有限,通过 /dev/midi 原始设备 完善的 ALSA Sequencer,支持 MIDI 路由和合成
热插拔 不支持,需手动加载驱动 原生支持 USB 音频设备热插拔,通过 udev 自动加载
内核集成度 部分开源,部分商业授权 完全开源,GPL 许可,深度集成于内核
兼容性说明: 虽然 ALSA 已完全取代 OSS,但内核仍保留 snd-pcm-oss 和 snd-mixer-oss 兼容模块,用于运行依赖 OSS 接口的旧版应用程序。这些模块将 OSS 的 ioctl 调用转换为 ALSA 内核调用。

从开发者角度看,ALSA 相比 OSS 最大的优势在于其分层设计和插件机制。ALSA 的 alsa-lib 提供了 PCM 插件链(如 plug、dmix、dsnoop、rate、softvol),允许在不修改应用代码的情况下实现采样率转换、软件混音、音量控制等功能。这种设计使得 ALSA 能够适应从嵌入式设备到专业音频工作站的各种场景。

嵌入式系统提示: 在资源受限的嵌入式 Linux 系统中,通常直接使用 ALSA 的 alsa-lib 编写音频应用,跳过 PulseAudio 等中间件以减少内存占用和延迟。此时,理解 ALSA 的 PCM 参数配置(采样率、格式、周期大小)至关重要。