Skip to content

fix: 修复低音量段无声与进度跳转时的音量突增 - #419

Open
foragedysetour wants to merge 1 commit into
SPlayer-Dev:devfrom
foragedysetour:fix/low-volume-silence
Open

foragedysetour wants to merge 1 commit into
SPlayer-Dev:devfrom
foragedysetour:fix/low-volume-silence

Conversation

@foragedysetour

@foragedysetour foragedysetour commented Oct 25, 2026 •

Copy link
Copy Markdown

改动类型

  • 新功能(feat)
  • 缺陷修复(fix)
  • 重构 / 优化(不改变对外行为)
  • 文档(docs)
  • 其他(请在「改动说明」中注明)

是否包含破坏性变更

  • 是(请在「改动说明」中详细描述)
  • 否

改动说明

问题出在增益换算层:src/utils/volume.ts 使用 gain = position³,导致 10% 位置仅 -60 dB,5% 仅 -78 dB,低音量区几乎无声;滚轮每格固定 5%,但响度步进严重不均——底部一格约 18 dB,顶部仅 1.3 dB。

pr-volume-curve-old

现改为位置与 dB 线性:整条滑块覆盖 0 至 -60 dB,每 1% 约 0.6 dB,滚轮每格约 3 dB;1% 约 -59.4 dB,50% 为 -30 dB,100% 仍为 0 dB。代价是中段输出比旧版低约 12 dB,50% 从 -18.1 dB 变为 -30 dB,但低段可用、步进可预期。

静音从公式中拆出:位置 0 为静音档(gain = 0),工具栏静音按钮单独记录 lastVolume,取消静音时恢复原值(无记录时回到 0.7)。

输出层在 cpal_stream.rs、wasapi/pcm.rs 中于每个回调缓冲内做 10–20 ms 线性增益过渡,避免拖动音量或切静音产生 click。增益状态改为 Option<f32>:新流、暂停恢复后的首个缓冲直接采用目标值,仅播放中的变化才渐变,避免 seek 后首缓冲满音量爆音。

改动清单

  • src/utils/volume.ts:MIN_VOLUME_DB = -60,正反变换改为 dB 线性,位置保留 6 位小数
  • src/utils/volume.spec.ts(新增):静音、最低档、dB 线性、逆变换、满音量,共 7 例
  • src/components/player/Toolbar.spec.ts:按新曲线更新期望值
  • native/audio-engine/src/output/:cpal_stream.rs、wasapi/pcm.rs、wasapi/mod.rs 的增益过渡与首缓冲对齐

关联 Issue

Closes #416

测试情况

  • pnpm exec vitest run:64 个文件全部通过
  • pnpm typecheck、pnpm lint 通过;改动文件已通过 prettier --check
  • cargo check --all-targets、cargo fmt --check 通过
  • Windows 环境手动导出验证通过

复现:滑块拖到 5%–10%,旧版几乎无声,新版可听到轻微连续声音;连续拖动进度条时,旧版(加渐变后)会在起播瞬间顶到满音量。

自查清单

  • 本 PR 只包含一个主要修复,无无关改动
  • 已在本地完整测试通过;AI 生成代码已测试并审阅
  • 已运行 pnpm format,pnpm typecheck、pnpm lint 通过
  • 原生模块改动已 pnpm build:native 验证;未手写 native/*/index.d.ts
  • 已向 dev 分支提交

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.

[BUG] 当音量低于10%时声音过小

1 participant