ALSA vs OSS:Linux 音频架构的演变与核心区别
在 Linux 音频系统的发展过程中,OSS(Open Sound System) 和 ALSA(Advanced Linux Sound Architecture) 曾分别在不同阶段承担着音频管理的角色。OSS 是 Linux 早期的音频架构,而 ALSA 作为其继任者,自 Linux 2.6 内核起成为默认的音频子系统。那么,ALSA 为什么会取代 OSS?二者在架构、功能、使用方式上有哪些关键区别?本文将深入解析。
1. OSS(Open Sound System)——Linux 早期的音频架构
1.1 什么是 OSS?
OSS(开放式声音系统) 是 Linux 早期(2.4 及更早版本)默认的音频子系统,由 Hannu Savolainen 在 1992 年开发。它提供了最基础的音频设备管理,主要通过 /dev/dsp
和 /dev/mixer
设备文件来与应用程序交互。
1.2 OSS 主要特性
✅ 基于设备文件的访问(/dev/dsp,/dev/mixer)
✅ 简单易用,直接用 read()
和 write()
进行音频操作
✅ 依赖声卡硬件 Mixer 进行音量控制
✅ 默认情况下,一个应用独占 /dev/dsp
,无法多应用同时播放
1.3 OSS 的使用示例
(1)直接写入 /dev/dsp
进行播放
int dsp = open("/dev/dsp", O_WRONLY);
write(dsp, buffer, size);
close(dsp);
(2)使用 sox
进行播放
play -t raw -r 44100 -s -2 -c 2 /dev/dsp
🔹 问题: 由于 /dev/dsp
只能由一个应用程序访问,无法同时播放多个音频流,如果一个应用占用了 /dev/dsp
,其他应用就无法播放声音。
2. ALSA(Advanced Linux Sound Architecture)——现代 Linux 的音频架构
2.1 什么是 ALSA?
ALSA(高级 Linux 音频架构) 是 OSS 的替代方案,由 Jaroslav Kysela 开发,并自 Linux 2.6 内核起成为默认的音频子系统。它提供了更高级的音频管理功能,如多应用同时播放(软件混音 dmix
)、更强的驱动支持、可扩展的 API。
2.2 ALSA 主要特性
✅ 支持多声卡、多应用并行播放(dmix
机制)
✅ 提供 alsa-lib
API,支持更复杂的音频控制
✅ 兼容 OSS(通过 snd-pcm-oss
、snd-mixer-oss
提供 /dev/dsp
模拟)
✅ 适用于桌面、服务器、嵌入式设备(ASoC 支持)
2.3 ALSA 的使用示例
(1)使用 alsa-lib
进行播放
snd_pcm_t *handle;
snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0);
snd_pcm_writei(handle, buffer, frames);
snd_pcm_close(handle);
(2)使用 aplay
播放音频
aplay -D hw:0,0 -f S16_LE -r 44100 test.wav
🔹 优势: ALSA 允许多个应用程序同时播放音频,并且提供 amixer
、aplay
等工具,便于调试和音量控制。
3. ALSA vs OSS 关键区别
特性 | ALSA(Linux 2.6+ 默认) | OSS(Linux 2.4 及更早) |
---|---|---|
驱动模式 | 模块化,支持多声卡 | 每个声卡一个 /dev/dsp 设备 |
多路音频 | 支持多个应用同时播放(软件混音 dmix ) | 默认只支持一个应用占用 /dev/dsp |
音频 API | 提供 alsa-lib ,支持高级音频管理 | 基于 /dev/dsp 的 read/write 操作 |
音量控制 | 支持软件 Mixer | 仅依赖硬件 Mixer |
适用场景 | 桌面、服务器、嵌入式(ASoC) | 早期 PC 声卡 |
支持状态 | Linux 默认音频架构,长期维护 | 大部分 Linux 发行版已废弃 |
4. ALSA 在嵌入式 Linux(ASoC)中的优势
对于嵌入式设备(如 i.MX8MP),ALSA 还提供了 ASoC(ALSA System-on-Chip) 框架,以支持 CPU DAI(I2S 控制器)和 Codec DAI(DAC/ADC)绑定。
设备树示例(绑定 PCM1754 DAC 到 SAI3)
sound-pcm1754 {
compatible = "simple-audio-card";
simple-audio-card,name = "pcm1754-audio";
simple-audio-card,format = "i2s";
simple-audio-card,frame-master = <&pcm1754_cpu>;
simple-audio-card,bitclock-master = <&pcm1754_cpu>;
pcm1754_cpu: simple-audio-card,cpu {
sound-dai = <&sai3>;
};
simple-audio-card,codec {
sound-dai = <&pcm1754>;
};
};
&sai3 {
status = "okay";
};
🔹 OSS 不支持嵌入式 SoC,无法像 ALSA ASoC 那样绑定 I2S 和 DAC。
5. 兼容性:OSS 是否仍然可用?
🔹 虽然 ALSA 取代了 OSS,但 Linux 仍然提供了一些 OSS 兼容性层
snd-pcm-oss
、snd-mixer-oss
内核模块,让/dev/dsp
仍然可用- 某些应用(如
mplayer
)仍然支持 OSS
如果要启用 OSS 兼容性:
modprobe snd-pcm-oss
modprobe snd-mixer-oss
但大多数新软件 默认使用 ALSA 或 PulseAudio,OSS 兼容性逐渐被废弃。
6. 结论:ALSA 为什么取代 OSS?
✅ ALSA 解决了 OSS 的限制,如无法同时播放多个音频流
✅ ALSA 提供了更丰富的 API,支持更复杂的音频控制
✅ ALSA 适用于嵌入式(ASoC 框架),OSS 仅适用于老旧 PC
✅ 现代 Linux 发行版都默认使用 ALSA,OSS 已基本淘汰
7. 总结
💡 OSS 是 Linux 早期的音频系统,简单但功能有限,已被 ALSA 取代。
💡 ALSA 更强大,支持多设备、多应用同时播放,适用于桌面和嵌入式。
💡 如果你在开发 Linux 音频系统,建议直接使用 ALSA,而不是 OSS!
🚀 ALSA 是现代 Linux 的音频标准,为高效音频管理提供了更强大的支持! 🎵