返回资讯中心
外部精选
软件工程
#开发者实时流

开发者用 Rust 和 egui 复刻 WinAMP/XMMS 风格播放器 Eleven

来源标题:Eleven: a Rust/EGUI Implementation of WinAMP/XMMS

一款名为 Eleven 的 XMMS 风格音频播放器发布,用 Rust 编写、基于 egui,支持 Linux 和 macOS。它复原了经典的三合一 275 像素窗口布局,含 10 段均衡器和播放列表,并支持 MP3、FLAC、Ogg Vorbis 等格式及 Icecast 网络电台。音量刻度特意做成 0–11。

Hacker News 最新itgoestoeleven2026/11/13 · 今天15 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

用 Rust 和 egui 写的 XMMS 风格音频播放器,支持 Linux 和 macOS。音量能开到 11。

经典布局。主窗口、10 段均衡器和播放列表编辑器,全部停靠在一个 275 像素宽的窗口里。每个区域都可以单独显示或隐藏。还支持双倍大小、卷帘模式、窗口置顶,以及自绘标题栏,拖动它即可移动窗口。

主窗口。7 段数码时钟(点击可在已播放时间和剩余时间之间切换)、滚动标题、kbps/kHz 与单声道/立体声指示、频谱分析仪或示波器(点击循环切换)、进度条、音量与平衡滑块。音量提示文字按 0–11 的刻度显示。O/A/I/D/V 快捷栏可打开选项菜单,并切换置顶、文件信息、双倍大小和可视化模式。

格式。支持 MP3、FLAC、Ogg Vorbis、WAV、AIFF,以及 MP4/M4A 中的 AAC/ALAC,由 symphonia 解码。需要时会重采样到设备采样率。

网络电台。支持 HTTP 和 Icecast/Shoutcast 流,可显示流内曲目标题(StreamTitle),支持缓冲,以及 M3U/PLS 文件中的流 URL。

均衡器。10 个频段(60 Hz – 16 kHz,±12 dB),外加前级放大和实时响应曲线图。内置预设,也可以保存自己的预设。AUTO 会为每首曲目加载已保存的预设(Presets → Save auto-preset)。

播放列表。 添加文件、文件夹(递归)或 URL,也可以直接拖放进来。 用 Ctrl/Cmd 和 Shift 多选。 排序、反转、随机、裁剪。 跳转到文件(J)。 加载和保存 M3U/EXTM3U 和 PLS。 随机播放与循环播放。 总时长与选中项播放时长。 标签在后台读取。

皮肤。内置原创外观,另支持经典 Winamp 2 / XMMS 的 .wsz 皮肤。如果皮肤缺少均衡器或播放列表的图,这些区域会回退到内置外观。加载器还兼容一些常见怪癖:大写文件名、文件放在子目录里,以及过短的 viscolor.txt 调色板。已用 Winamp Skin Museum 的五款皮肤做过验证。

系统集成。媒体键与「正在播放」(Linux 上走 MPRIS,macOS 上走 Now Playing)、原生文件对话框,以及沿用 XMMS 习惯的键盘快捷键。

持久化。设置、EQ 预设、播放列表和当前曲目在多次运行之间保存。

构建与运行 Rust 工具链版本固定在 rust-toolchain.toml 中;rustup 会自动安装。 make run # release 构建并运行 cargo run -p eleven --release -- ~/Music/album some.mp3 http://radio.example/stream make bundle-macos # macOS:生成 dist/eleven.app 命令行参数(文件、文件夹、播放列表、URL)会加入播放列表,并开始播放第一个。

install -Dm755 target/release/eleven ~/.local/bin/eleven install -Dm644 packaging/linux/eleven.desktop ~/.local/share/applications/eleven.desktop install -Dm644 packaging/icon-256.png ~/.local/share/icons/hicolor/256x256/apps/eleven.png

发布 推送版本标签会构建并发布 GitHub release(.github/workflows/release.yml):

先在 Cargo.toml 中提升 version;标签必须与之匹配

git tag v0.2.0 && git push origin v0.2.0

平台 产物 macOS 11+ 通用二进制(Apple Silicon + Intel)的 eleven.app,提供 .dmg 和 .zip Linux x86_64 和 ARM64 面向 Debian/Ubuntu 的 .deb,以及 .tar.gz(在 Ubuntu 22.04、glibc 2.35+ 上构建)

还会附带一个 SHA256SUMS.txt。带连字符的标签(v0.2.0-beta.1)会成为预发布版本。在 Actions 标签页手动运行 workflow 只构建包、不发布。本地执行 make dist-macos 和 make dist-linux 会在 dist/ 下生成同样的文件。

macOS 应用是 ad-hoc 签名的,没有公证,所以 Gatekeeper 会阻止首次启动:右键点击并选择「打开」。公证需要把 Apple Developer ID 证书存为仓库 secret。

文件位于 Linux 上的 ~/.config/eleven/ 和 macOS 上的 ~/Library/Application Support/eleven/。可设置 ELEVEN_CONFIG_DIR 覆盖该位置。

不附带任何皮肤素材。想在没有皮肤的情况下测试皮肤管线,可运行 cargo run -p eleven-skin --example synthetic -- test.wsz。它会写出一款占位皮肤,每个 sprite sheet 只有一种纯色。

UI 线程 ──命令──▶ 引擎线程:解码 ─▶ 重采样 ─▶ EQ ─▶ rtrb 环形缓冲 ─▶ 输出回调 ▲ (音量、平衡、位置、 └────────────── 事件(started / finished / error / 流标题) ◀── 可视化抽头) 音量、平衡和位置是无锁原子量,所以响应即时。 跳转和停止通过带确认的 epoch 计数器冲刷环形缓冲区。 UI 从不直接接触音频。它调用 Controller,Controller 通过 trait 与引擎、标签扫描器、媒体键和文件对话框通信。每个 trait 都有用于测试的 fake 实现。 内置外观和皮肤实现同一个 Look trait,绘制到相同的矩形区域,因此命中测试和无障碍标签是共享的。

测试 make test # 约 200 个测试:单元、属性(proptest)、集成和 UI make lint # rustfmt --check + clippy -D warnings make cov # 通过 cargo-llvm-cov 统计行覆盖率,门槛 90 %

领域 测试方式 核心逻辑 单元测试,外加用 proptest 验证播放列表不变量、M3U/PLS 往返、任意分块下的 ICY 解复用,以及时钟数字。EQ 设计对照其解析频率响应进行校验。 音频 为每种格式提交了 1 秒的固定测试样本(由 make fixtures 配合 ffmpeg 生成),覆盖解码和采样精确的跳转。DSP 输出对照设计响应测量。引擎通过快速静音输出端到端运行。流从进程内的 HTTP/Icecast 服务器播放,无需网络。 UI egui_kittest 无头驱动真实 UI:播放控制、快捷键、滑块、播放列表选择、双击和菜单、对话框、预设、皮肤、卷帘/双倍大小、拖放。

行覆盖率约为 94%。不计入门槛的是 cpal_out.rs(需要声卡)、media_keys.rs(需要 D-Bus 或 macOS 会话)和 main.rs。

CI(.github/workflows/ci.yml)在 Ubuntu 和 macOS 上运行。两个平台都跑 fmt、clippy 和测试,Linux 上跑覆盖率,macOS 上构建 .app 包。

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →