给普通键盘加机械轴声音:一路掉进 Linux 音频栈
来源:dev.to — 2026-11-06
📋 概述
作者喜欢 Mac 上的 Klicky 打字音效,但自己跑的是 Arch + Omarchy,于是接手这个 Rust 项目,从 Omarchy 扩到整个 Linux,再到 Windows。关键设计是把耗时工作前置:加载音效包时就解码 OGG、切好每个键的片段、做响度归一化(85% 峰值目标、最多 6 倍放大),按键时只从已运行的混音器里取准备好的音频,因此多个键音可以重叠。但代码跑得快,声音依然听着迟:事件分发只有 0.241ms,p95 0.56ms,而音频设备协商出的缓冲是 44.1kHz 下 1102 帧,约 25ms——快的一端喂着一个巨大的缓冲。换成 Rodio 0.22 并请求更小缓冲后,PipeWire 上协商到 256 帧约 5.8ms,延迟感消失。
🔑 核心要点
- 把解码、切片、归一化都放到音效包加载时完成,按键路径只剩取缓冲这一个动作。
- 延迟不在代码里而在设备缓冲:分发 0.24ms 的路径后面挂着 25ms 的环形缓冲。
- 把缓冲从 1102 帧降到 256 帧,听觉上的滞后才真正消失,而不是继续优化已经很快的部分。
- 调试要带上设备本身:笔记本扬声器几乎即时,AirPods 有明显延迟,那是蓝牙链路的问题。
💡 金句
“The code was fast. The sound still felt late.”
译:代码已经很快了,可声音听起来还是迟。
👍 0
👎 0
← 返回 dev.to 首页