Skip to content

feat: 实现下一曲真实预载与双槽位播放 - #319

Merged
imsyy merged 3 commits into
devfrom
feat/audio-preload-dual-slot
Sep 24, 2026
Merged

imsyy merged 3 commits into
devfrom
feat/audio-preload-dual-slot

Conversation

@imsyy

@imsyy imsyy commented Sep 24, 2026 •

Copy link
Copy Markdown
Member

改动类型

  • 新功能(feat)
  • 缺陷修复(fix)
  • 重构 / 优化(不改变对外行为)
  • 文档(docs)
  • 其他

是否包含破坏性变更

  • 是
  • 否

改动说明

开启「预载下一曲」后,应用会提前缓存下一曲音源,并由原生音频引擎解码到备用槽位。正常切歌时优先消费已准备的音频;候选歌曲、音源或播放上下文变化时取消失效的预载,并释放对应的缓存占用。

首次开启预载时,设置页会说明可能增加网络与磁盘占用,并在用户确认后同时开启歌曲缓存和流媒体缓存。预载仍默认关闭。

关联

无直接关联的 Issue

测试情况

  • cargo test -p audio-engine --lib
  • pnpm typecheck
  • pnpm exec vitest run
  • Windows 共享与独占输出下的原生预载、取消和切歌集成测试

截图 / 录屏

设置页沿用现有确认弹窗组件,仅增加预载的缓存依赖提示

自查清单

  • 本 PR 只包含一个主要功能 / 修复,没有夹带无关改动
  • 已在本地测试并审阅本 PR 的改动

Copilot AI balanced review requested due to automatic review settings September 24, 2026 07:26

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

仍有 7 项中等严重度的预载生命周期、资源释放、DSP 一致性及内存占用问题需要修复。

Get a fresh assessment by requesting another Copilot review.

Review effort: Balanced
Findings: 2 Medium severity

Open (2)
What changed in this PR

该 PR 实现下一曲真实预载,通过缓存音源和原生双槽位解码降低切歌延迟。

Changes:

  • 增加下一曲预载调度、缓存租约与取消机制。
  • 增加原生备用解码槽位及预载资源复用。
  • 补充设置确认、IPC、类型及自动化测试。
File Reviewed change / finding
vitest.config.ts 扩展主进程测试配置。
src/​settings/​categories/​player.ts 增加预载缓存确认逻辑。
src/​settings/​categories/​player.spec.ts 测试设置确认流程。
src/​services/​nextTrackPreloader.ts 实现预载调度。**中等:**停止状态未使异步任务失效;解析失败未清理任务状态,导致无法重试。
src/​services/​nextTrackPreloader.spec.ts 测试预载生命周期。
src/​services/​audioSource.ts 扩展缓存下载接口。
src/​i18n/​locales/​zh-CN.json 增加中文预载提示。
src/​i18n/​locales/​en-US.json 增加英文预载提示。
src/​core/​player/​preload.spec.ts 测试切歌消费预载。
src/​core/​player/​index.ts 接入预载槽位加载。
shared/​types/​player.ts 扩展播放器 API 类型。
native/​audio-engine/​tests/​preload.cjs 增加双槽位集成测试。
native/​audio-engine/​src/​player/​transition.rs 支持预载起始位置提交。
native/​audio-engine/​src/​player/​tests/​preload.rs 增加预载单元测试。
native/​audio-engine/​src/​player/​tests/​mod.rs 注册预载测试模块。
native/​audio-engine/​src/​player/​preload.rs 实现原生预载槽。**中等:**提交时 DSP 变化不会重建已处理的 PCM,切歌首段可能使用旧参数。
native/​audio-engine/​src/​player/​mod.rs 管理预载槽生命周期。
native/​audio-engine/​src/​output/​playback.rs 支持复用预载 PCM。
native/​audio-engine/​src/​decoder/​tests/​buffer.rs 测试预载缓冲背压与唤醒。
native/​audio-engine/​src/​decoder/​mod.rs 支持从指定位置预解码。
native/​audio-engine/​src/​decoder/​buffer.rs 增加预载容量与唤醒机制。
native/​audio-engine/​src/​bindings/​player/​types.rs 暴露预载起点元数据。
native/​audio-engine/​src/​bindings/​player/​seek.rs 适配新的加载参数。
native/​audio-engine/​src/​bindings/​player/​preload.rs 暴露原生预载 API。**中等:**预载会长期保留完整内嵌封面和歌词,可能造成较大内存占用。
native/​audio-engine/​src/​bindings/​player/​mod.rs 注册预载绑定模块。
native/​audio-engine/​src/​bindings/​player/​load.rs 消费预载资源并支持降级。
native/​audio-engine/​src/​bindings/​player/​device.rs 适配设备恢复加载。
native/​audio-engine/​src/​bindings/​player/​controls.rs 适配恢复播放加载。
native/​audio-engine/​package.json 串行执行原生集成测试。
native/​audio-engine/​index.d.ts 更新原生模块声明。
electron/​preload/​index.ts 暴露预载与缓存 IPC。
electron/​preload/​index.d.ts 更新 preload 类型声明。
electron/​main/​services/​songCache.ts 实现缓存租约、取消及固定。
electron/​main/​services/​songCache.spec.ts 测试缓存租约生命周期。
electron/​main/​services/​playerPreload.ts 管理主进程预载任务。**中等:**播放器重置未清理强引用及缓存租约。
electron/​main/​ipc/​player.ts 注册预载 IPC。**中等:**部分原生加载/销毁路径未清理预载;下载阶段停止无法取消尚未登记的任务。
electron/​main/​ipc/​cache.ts 传递预载缓存消费者标识。

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

import * as songCache from "@main/services/songCache";
import { store } from "@main/store";

let prepared: { id: string; player: ReturnType<typeof getPlayer> } | null = null;
Comment thread src/services/nextTrackPreloader.ts Outdated
source,
contextKey,
};
if (!source) return;
@imsyy
imsyy merged commit ceb9d72 into dev Sep 24, 2026
9 checks passed
@imsyy
imsyy deleted the feat/audio-preload-dual-slot branch September 24, 2026 08:18
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.

2 participants