From ec8a07576f85d168051b04b65dd958b89203fdfd Mon Sep 17 00:00:00 2001 From: alger Date: Thu, 12 Mar 2026 18:07:20 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E5=B9=B6=E5=8F=91=E6=8E=A7=E5=88=B6=E6=AD=BB=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=81shallowRef=E5=93=8D=E5=BA=94=E5=BC=8F=E3=80=81?= =?UTF-8?q?=E6=AD=8C=E8=AF=8DIPC=E9=AB=98=E9=A2=91=E8=B0=83=E7=94=A8=20(H-?= =?UTF-8?q?005/H-006/H-009)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - H-005: 删除 playerCore.ts 中无效的 playInProgress 局部变量 - H-006: fetchSongs 修改 shallowRef 元素后添加 triggerRef 触发更新 - H-009: sendLyricToWin 从每秒20次全量发送改为每秒5次轻量更新 --- src/renderer/hooks/MusicHook.ts | 18 ++++++++++++++++-- src/renderer/store/modules/playerCore.ts | 10 ---------- src/renderer/store/modules/playlist.ts | 4 +++- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/renderer/hooks/MusicHook.ts b/src/renderer/hooks/MusicHook.ts index b062198..4e5498b 100644 --- a/src/renderer/hooks/MusicHook.ts +++ b/src/renderer/hooks/MusicHook.ts @@ -402,6 +402,7 @@ const setupAudioListeners = () => { let interval: any = null; // 播放状态恢复定时器:当 interval 因异常被清除时,自动恢复 let recoveryTimer: any = null; + let lyricThrottleCounter = 0; const clearInterval = () => { if (interval) { @@ -457,8 +458,21 @@ const setupAudioListeners = () => { sendLyricToWin(); } } - if (isElectron && isLyricWindowOpen.value) { - sendLyricToWin(); + // 节流发送轻量歌词进度更新(每 ~200ms / 约每 4 个 tick) + lyricThrottleCounter++; + if (isElectron && isLyricWindowOpen.value && lyricThrottleCounter % 4 === 0) { + try { + window.api.sendLyric( + JSON.stringify({ + type: 'update', + nowIndex: nowIndex.value, + nowTime: nowTime.value, + isPlay: getPlayerStore().play + }) + ); + } catch { + // 忽略发送失败 + } } } catch (error) { console.error('进度更新 interval 出错:', error); diff --git a/src/renderer/store/modules/playerCore.ts b/src/renderer/store/modules/playerCore.ts index bd19583..afc28c9 100644 --- a/src/renderer/store/modules/playerCore.ts +++ b/src/renderer/store/modules/playerCore.ts @@ -335,17 +335,8 @@ export const usePlayerCoreStore = defineStore( console.warn('预加载触发失败(可能是依赖未加载或循环依赖),已忽略:', e); } - let playInProgress = false; - try { - if (playInProgress) { - console.warn('播放操作正在进行中,避免重复调用'); - return true; - } - - playInProgress = true; const result = await playAudio(requestId); - playInProgress = false; if (result) { playbackRequestManager.completeRequest(requestId); @@ -356,7 +347,6 @@ export const usePlayerCoreStore = defineStore( } } catch (error) { console.error('自动播放音频失败:', error); - playInProgress = false; playbackRequestManager.failRequest(requestId); return false; } diff --git a/src/renderer/store/modules/playlist.ts b/src/renderer/store/modules/playlist.ts index 2f7e706..f396111 100644 --- a/src/renderer/store/modules/playlist.ts +++ b/src/renderer/store/modules/playlist.ts @@ -1,7 +1,7 @@ import { useThrottleFn } from '@vueuse/core'; import { createDiscreteApi } from 'naive-ui'; import { defineStore, storeToRefs } from 'pinia'; -import { computed, ref, shallowRef } from 'vue'; +import { computed, ref, shallowRef, triggerRef } from 'vue'; import i18n from '@/../i18n/renderer'; import { useSongDetail } from '@/hooks/usePlayerHooks'; @@ -83,6 +83,8 @@ export const usePlaylistStore = defineStore( playList.value[startIndex + index] = song; } }); + // 触发 shallowRef 响应式更新(直接修改元素不会自动触发) + triggerRef(playList); // 预加载下一首歌曲的音频和封面 if (nextSong) {