diff --git a/src/renderer/services/audioService.ts b/src/renderer/services/audioService.ts index 4981eef..0c230d6 100644 --- a/src/renderer/services/audioService.ts +++ b/src/renderer/services/audioService.ts @@ -682,14 +682,19 @@ class AudioService { if (isHotSwap) { console.log('audioService: 执行无缝切换'); - // 1. 获取当前播放进度 - let currentPos = 0; - if (this.currentSound) { - currentPos = this.currentSound.seek() as number; + // 1. 获取当前播放进度或使用指定的 seekTime + let targetPos = 0; + if (seekTime > 0) { + // 如果有指定的 seekTime(如恢复播放进度),优先使用 + targetPos = seekTime; + console.log(`audioService: 使用指定的 seekTime: ${seekTime}s`); + } else if (this.currentSound) { + // 否则同步当前进度 + targetPos = this.currentSound.seek() as number; } // 2. 同步新音频进度 - newSound.seek(currentPos); + newSound.seek(targetPos); // 3. 初始化新音频的 EQ await this.disposeEQ(true); @@ -711,7 +716,7 @@ class AudioService { this.currentTrack = track; this.pendingSound = null; - console.log(`audioService: 无缝切换完成,进度同步至 ${currentPos}s`); + console.log(`audioService: 无缝切换完成,进度同步至 ${targetPos}s`); } else { // 普通加载逻辑 await this.setupEQ(newSound); diff --git a/src/renderer/services/preloadService.ts b/src/renderer/services/preloadService.ts index 6b21ac9..6985ac4 100644 --- a/src/renderer/services/preloadService.ts +++ b/src/renderer/services/preloadService.ts @@ -113,6 +113,21 @@ class PreloadService { return this.preloadedSounds.get(songId); } + /** + * 消耗(使用)已预加载的音频 + * 从缓存中移除但不 unload(由调用方管理生命周期) + * @returns 预加载的 Howl 实例,如果没有则返回 undefined + */ + public consume(songId: string | number): Howl | undefined { + const sound = this.preloadedSounds.get(songId); + if (sound) { + this.preloadedSounds.delete(songId); + console.log(`[PreloadService] 消耗预加载的歌曲: ${songId}`); + return sound; + } + return undefined; + } + /** * 清理所有预加载资源 */ diff --git a/src/renderer/store/modules/playerCore.ts b/src/renderer/store/modules/playerCore.ts index d36ff8d..4ef2cc4 100644 --- a/src/renderer/store/modules/playerCore.ts +++ b/src/renderer/store/modules/playerCore.ts @@ -337,8 +337,15 @@ export const usePlayerCoreStore = defineStore( // 检查保存的进度 let initialPosition = 0; const savedProgress = JSON.parse(localStorage.getItem('playProgress') || '{}'); + console.log( + '[playAudio] 读取保存的进度:', + savedProgress, + '当前歌曲ID:', + playMusic.value.id + ); if (savedProgress.songId === playMusic.value.id) { initialPosition = savedProgress.progress; + console.log('[playAudio] 恢复播放进度:', initialPosition); } // B站视频URL检查 @@ -371,12 +378,21 @@ export const usePlayerCoreStore = defineStore( } } - // 使用 PreloadService 加载音频 - // 这将确保如果正在进行预加载修复,我们会等待它完成 - // 同时也处理了时长检查和自动修复逻辑 + // 使用 PreloadService 获取音频 + // 优先使用已预加载的 sound(通过 consume 获取并从缓存中移除) + // 如果没有预加载,则进行加载 let sound: Howl; try { - sound = await preloadService.load(playMusic.value); + // 先尝试消耗预加载的 sound + const preloadedSound = preloadService.consume(playMusic.value.id); + if (preloadedSound && preloadedSound.state() === 'loaded') { + console.log(`[playAudio] 使用预加载的音频: ${playMusic.value.name}`); + sound = preloadedSound; + } else { + // 没有预加载或预加载状态不正常,需要加载 + console.log(`[playAudio] 没有预加载,开始加载: ${playMusic.value.name}`); + sound = await preloadService.load(playMusic.value); + } } catch (error) { console.error('PreloadService 加载失败:', error); // 如果 PreloadService 失败,尝试直接播放作为回退