Skip to content

feat: Windows 平台支持 WASAPI 独占模式音频输出 - #233

Open
GLZ-gaoxiaoling wants to merge 1 commit into
SPlayer-Dev:devfrom
GLZ-gaoxiaoling:wasapi-exclusive-mode
Open

feat: Windows 平台支持 WASAPI 独占模式音频输出#233
GLZ-gaoxiaoling wants to merge 1 commit into
SPlayer-Dev:devfrom
GLZ-gaoxiaoling:wasapi-exclusive-mode

Conversation

@GLZ-gaoxiaoling

Copy link
Copy Markdown

Closes #232

功能概述

为 Windows 平台实现 WASAPI 独占模式(Exclusive Mode)音频输出,绕过系统混音器,按音源采样率与位深直通声卡,实现 bit-perfect 回放。

实现要点(对应 Discussion #232 的期望行为)

1. 设置中提供音频输出模式选项

  • 设置 → 播放器 → 输出设备分区新增「音频输出模式」下拉项(共享模式 / WASAPI 独占模式),仅 Windows 显示
  • 配置项 player.audioOutputMode,默认共享模式,持久化到主进程 settings.json

2. 独占模式下按音源采样率与位深自动切换设备格式

  • 新增 native/audio-engine/src/wasapi_exclusive.rs,基于 windows crate 直接实现 WASAPI 独占客户端(复用既有依赖,未引入新包)
  • 格式协商:优先音源原始采样率 + 位深(bit-perfect),失败时按 16/24/32bit 与常见采样率(48k/44.1k/96k/192k)逐级降级尝试,声道数按设备默认 → 立体声回退
  • 事件驱动渲染线程(AUDCLNT_STREAMFLAGS_EVENTCALLBACK),缓冲未对齐时按 AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED 重试标准流程
  • 独占模式仅重写输出层:解码 / 重采样 / EQ / 变速变调 / 归一化 / FFT / 渐入渐出管线全部复用

3. 设备被占用时优雅回退共享模式并提示

  • 协商阶段遇 AUDCLNT_E_DEVICE_IN_USE(设备被其他程序独占)或全部候选格式被拒时,自动回退共享模式继续播放
  • 通过新增 outputFallback 事件携带稳定分类键(deviceBusy / formatUnsupported / unavailable)逐级上报:Rust → 主进程 → 渲染端,按 i18n 弹出 toast 提示

4. 应用内音量调节

  • 独占模式沿用既有的软件音量链路(渲染线程对样本应用 gain),系统音量滑块失效不影响应用内音量、渐入渐出与响度归一化

其他

  • PlaybackHandle 改为枚举分发 cpal 共享流 / WASAPI 独占流,播放控制(play/pause/音量/停止)接口不变
  • NAPI 层新增 setExclusiveMode(enabled),切换后立即重建设备输出
  • 设置变更副作用接入 applyConfigChange,启动时同步已保存的模式到引擎

验证

  • cargo check / cargo clippy(audio-engine)通过(本机无 MSVC/libnode,测试运行依赖 CI Linux 环境)
  • pnpm typecheck(node + web)、pnpm test:web(57 tests)、ESLint、Prettier 全部通过
  • 独占模式需要真实声卡验证,建议在有外接 DAC 的 Windows 设备上实测:44.1k/48k/96k 音源切换、设备被 ASIO 独占时的回退提示

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant