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-osssnd-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 允许多个应用程序同时播放音频,并且提供 amixeraplay 等工具,便于调试和音量控制。


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-osssnd-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 的音频标准,为高效音频管理提供了更强大的支持! 🎵

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32770.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek-R1深度解读

deepseek提出了一种通过强化学习&#xff08;RL&#xff09;激励大语言模型&#xff08;LLMs&#xff09;推理能力的方法&#xff0c;个人认为最让人兴奋的点是&#xff1a;通过RL发现了一个叫“Aha Moment”的现象&#xff0c;这个时刻发生在模型的中间版本中。在这个阶段&…

【鸿蒙开发】Hi3861学习笔记- GPIO之直流电机

00. 目录 文章目录 00. 目录01. GPIO概述02. 直流电机概述03. ULN2003模块概述04. 硬件设计05. 软件设计06. 实验现象07. 附录 01. GPIO概述 GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出。通常&#xff0c;GPIO控制器通过分组的方式管理所有GP…

图的存储--十字链表与邻接多重表

一、十字链表&#xff08;存储有向图&#xff09; (邻接表找顶点的入度不方便 邻接矩阵的时间复杂度高) 用十字链表可以解决查找入度不方便的问题 1.十字链表中对于弧节点总共有4个节点 A、B、C、D、分别指向弧尾顶点的编号、弧头顶点的编号、弧头相同的下一条弧、弧尾相同…

DataEase:一款国产开源数据可视化分析工具

DataEase 是由飞致云开发的一款基于 Web 的数据可视化 BI 工具&#xff0c;支持丰富的数据源连接&#xff0c;能够通过拖拉拽方式快速制作图表&#xff0c;帮助用户快速分析业务数据并洞察其趋势&#xff0c;为企业的业务改进与优化提供支持。 DataEase 的优势在于&#xff1a;…

Matlab:矩阵运算篇——矩阵数学运算

目录 1.矩阵的加法运算 实例——验证加法法则 实例——矩阵求和 实例——矩阵求差 2.矩阵的乘法运算 1.数乘运算 2.乘运算 3.点乘运算 实例——矩阵乘法运算 3.矩阵的除法运算 1.左除运算 实例——验证矩阵的除法 2.右除运算 实例——矩阵的除法 ヾ(&#xffe3;…

学习率调整策略

学习率衰减策略是深度学习优化过程中的一个关键因素&#xff0c;它决定了训练过程中学习率的调整方式&#xff0c;从而影响模型收敛的速度和效果。不同的衰减策略在不同的任务和模型上可能有不同的表现&#xff0c;下面从我用到过的几个衰减策略进行记录&#xff0c;后续慢慢跟…

BIG_EVENT

环境准备: 开发: 跨域问题: 只有浏览器才存在跨域问题, 此时浏览器的地址和前端服务一致,所以不存在跨域问题, 但是当浏览器中的js代码需要向8080发送请求时就会由于存在跨域问题而失败. 简单的说前端和浏览器的地址端口是一致的,浏览器只能向前端服务发送请求, 所以可以使用配…

STM32定时器配置1毫秒中断

在STM32中配置定时器以产生1毫秒中断的步骤如下&#xff1a; 1. 确定定时器时钟频率 假设系统主频为72MHz&#xff0c;定时器挂载在APB1总线&#xff08;如TIM2&#xff09;&#xff0c;且APB1预分频系数为1&#xff0c;则定时器时钟为72MHz。 2. 计算预分频器和自动重载值&…

『Rust』Rust运行环境搭建

文章目录 rust编译工具rustupVisual Studio VS Code测试编译手动编译VSCode编译配置 参考完 rust编译工具rustup https://www.rust-lang.org/zh-CN/tools/install 换源 RUSTUP_DIST_SERVER https://rsproxy.cn RUSTUP_UPDATE_ROOT https://rsproxy.cn修改rustup和cargo的安…

Flutter桌面开发(二、隐藏顶部状态栏)

使用windowManager // 确保在其他 window 相关操作之前初始化await windowManager.ensureInitialized();WindowOptions windowOptions WindowOptions(minimumSize: Size(800, 600),size: Size(1280, 980),center: true,backgroundColor: Colors.transparent,skipTaskbar: fals…

蓝桥备赛(18)- 红黑树和 set 与 map(上)

对于二叉搜索树 &#xff0c; 平衡二叉树 &#xff0c; 以及红黑树 &#xff0c; 目前只需要了解背后的原理 &#xff0c; 不做代码实现的要求 &#xff0c; 重要的就是了解各种操作的时间复杂度即可 &#xff0c; 为set 与 map 做铺垫 一、二叉搜索树 1.1 基本概念 相较与于堆…

【实战-解决方案】Webpack 打包后很多js方法报错:not defined

问题分析 在不打包的情况下&#xff0c;方法&#xff08;如 checkLoginStatus、filterSites、initProgressBar 等&#xff09;可以正常运行&#xff0c;而经过 Webpack 打包后报 is not defined 错误&#xff0c;通常有以下几个可能的原因&#xff1a; 全局变量丢失 在 Webpac…

ESP32芯片模组方案,设备物联网无线通信,WiFi蓝牙交互控制应用

在当下&#xff0c;物联网正以前所未有的速度席卷全球&#xff0c;从繁华都市的智能建筑&#xff0c;到宁静乡村的智慧农业&#xff0c;从人们日常使用的可穿戴设备&#xff0c;到工业领域复杂精密的自动化生产线&#xff0c;物联网的触角已深入到生活与生产的每一个角落。 而…

Unity开发的抖音小游戏接入抖音开放平台中的流量主(抖音小游戏接入广告)

前言:作者在进行小游戏审核版本的过程中,碰到了下列问题,所以对这个抖音小游戏接入广告研究了下。 还有就是作者的TTSDK版本号是6.2.6,使用的Unity版本是Unity2022.3.29f1,最好和作者的两个版本号保持一致,因为我发现TTSDK旧版的很多函数在新版中就已经无法正常使用了,必…

Java高频面试之集合-11

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;详细说说hashmap的put和get操作 HashMap 的 put 和 get 操作是核心功能&#xff0c;其底层通过 数组链表/红黑树 实现&a…

【计算机网络】第八版和第七版的主要区别,附PDF

「《计算机网络》(... 谢希仁」&#xff0c;https://pan.quark.cn/s/7c2147cb48f7 1. 新增内容 - 软件定义网络&#xff08;SDN&#xff09;&#xff1a;第八版在网络层章节中新增了对SDN的简介&#xff08;第4章&#xff09;&#xff0c;介绍了其基本原理和应用。 - Wi-Fi代…

批量将 Excel 文档中的图片提取到文件夹

前面我们介绍过如何批量删除 Excel 文档中的所有图片或者指定的图片&#xff0c;其中就需要用到批量提取 Excel 文档中图片的操作。我们如何才能够将 Excel 文档中的图片快速的提取出来呢&#xff1f;其实单个 Excel 文档中的图片提取到文件夹中是有多种方法可以完成的&#xf…

批量删除或替换 Excel 的 Sheet 工作表

在一个 Excel 文档中通常会包含一个或者多个 Sheet 工作表。我们通常也可以自定义的添加或者删除某些工作表。比如我们想要将某个 Excel 的第一个工作表删除&#xff0c;那我们就需要先通过工具打开 Excel 文档&#xff0c;然后再进行删除操作。单个文件我们这样处理是没有问题…

跟踪napi_gro_receive_entry时IP头信息缺失的分析

问题描述 在使用eBPF程序跟踪napi_gro_receive_entry内核跟踪点时&#xff0c;发现获取到的IP头部字段&#xff08;如saddr、daddr、protocol&#xff09;为空值。 代码如下&#xff1a; /* 自定义结构体来映射 napi_gro_receive_entry tracepoint 的 format */ struct napi…

【Golang】第五弹----函数

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;Golang &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一、函数 1.1基本介绍…