Skip to content

fix: 修复 WASAPI 独占模式位深协商锁定 16bit - #454

Open
wxs7655 wants to merge 1 commit into
SPlayer-Dev:devfrom
wxs7655:fix/wasapi-exclusive-bit-depth
Open

wxs7655 wants to merge 1 commit into
SPlayer-Dev:devfrom
wxs7655:fix/wasapi-exclusive-bit-depth

Conversation

@wxs7655

@wxs7655 wxs7655 commented Nov 7, 2026 •

Copy link
Copy Markdown

改动类型

  • 缺陷修复(fix)

是否包含破坏性变更

  • 否

改动说明

WASAPI 独占模式位深协商存在候选缺口:24bit 音源只按"24bit 有效位 + 32bit 容器"(24-in-32)探测,且从不为 24bit 音源尝试 32bit 格式。独占格式表只接受打包 24bit(24-in-24)或仅暴露 32-in-32 的设备(大量 USB DAC 如此)会因此所有高格式候选都探测失败,恒定落到 16bit 兜底候选——表现为"设备支持 24/32bit 但音频位深锁定 16bit",且换歌无法恢复(每次重新协商都重复失败)。

主要变更:

  • valid_bits_candidates:24bit 音源补 32bit 候选([24, 32, 16]),16bit 及以下音源补 32bit 兜底,覆盖只暴露 32bit 容器的设备
  • 新增 container_candidates:24bit 有效位深先按 32bit 容器探测(保持既有设备行为不变),再补打包 24bit(24-in-24)
  • pcm.rs:样本写入按"容器位深 - 有效位深"左移补零,支持 3 字节打包容器;convert_sample 改为返回未移位的有效位深样本,容器对齐统一在 fill_buffer 完成
  • 协商优先级:声道 → 有效位深 → 采样率 → 容器(容器只是打包形式,优先级最低,同一有效位深与采样率下先试宽容器)

关联 Issue

无(源于 WASAPI 独占模式位深协商的代码审查与复现)

测试情况

  • 新增单元测试:位深/容器候选表、24-in-24 波形格式(3 字节 nBlockAlign)、fill_buffer 在 24-in-24 / 24-in-32 下的字节布局;同步更新 convert_sample 既有断言以匹配新契约
  • cargo check -p audio-engine --target x86_64-pc-windows-gnu --tests 交叉编译检查通过;rustfmt 校验通过
  • 平台:Windows(WASAPI 独占仅 Windows 生效);新增测试将由 CI test.yml(windows-latest 执行 pnpm test:native)运行
  • 实机验证步骤:外接 DAC 开启 WASAPI 独占模式播放 24bit 音源,"音频信息"面板确认位深不再锁定 16bit

截图 / 录屏

修复后:
player

自查清单

  • 本 PR 只包含一个主要功能 / 修复,没有夹带无关改动
  • 已在本地完整测试通过;AI 生成的代码同样自行测试并审阅过,未做未经验证的提交
  • 已运行 pnpm format,并确认 pnpm typecheck、pnpm lint 通过
  • 改动涉及原生模块时已 pnpm build:native 验证;未手写 native/*/index.d.ts
  • 已向 dev 分支提交

@wxs7655
wxs7655 force-pushed the fix/wasapi-exclusive-bit-depth branch from cf82a8e to 607bdfe Compare November 7, 2026 12:56

This branch has not been deployed

No deployments
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