|
|
@@ -198,6 +198,8 @@ const broadcastAudio = ref(null)
|
|
|
const lastPlayedBroadcastKey = ref('')
|
|
|
// 播报开始时缓存一份 snapshot,结束时 ack 用(避免 markBroadcastFinishedLocally 清空后读取不到)
|
|
|
const lastBroadcastSnapshot = ref(null)
|
|
|
+// 标记播报处理状态,避免 onerror 和 onended 重复触发
|
|
|
+const isBroadcastProcessed = ref(false)
|
|
|
|
|
|
const actualMode = computed(() => screenStore.actualIdleMode)
|
|
|
|
|
|
@@ -483,6 +485,9 @@ watch(actualMode, (newMode) => {
|
|
|
const playBroadcastAudio = (audioUrl) => {
|
|
|
if (!audioUrl) return
|
|
|
|
|
|
+ // 重置处理标志
|
|
|
+ isBroadcastProcessed.value = false
|
|
|
+
|
|
|
// 停止之前的音频
|
|
|
stopBroadcastAudio()
|
|
|
|
|
|
@@ -520,6 +525,8 @@ const playBroadcastAudio = (audioUrl) => {
|
|
|
*/
|
|
|
const stopBroadcastAudio = () => {
|
|
|
if (broadcastAudio.value) {
|
|
|
+ broadcastAudio.value.onended = null
|
|
|
+ broadcastAudio.value.onerror = null
|
|
|
broadcastAudio.value.pause()
|
|
|
broadcastAudio.value.src = ''
|
|
|
broadcastAudio.value = null
|
|
|
@@ -530,6 +537,13 @@ const stopBroadcastAudio = () => {
|
|
|
* 播报音频播放结束
|
|
|
*/
|
|
|
const onBroadcastEnded = () => {
|
|
|
+ // 防止 onerror 和 onended 同时触发导致的重复处理
|
|
|
+ if (isBroadcastProcessed.value) {
|
|
|
+ console.log('[Broadcast] 播报已处理完毕,忽略重复的 onended')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ isBroadcastProcessed.value = true
|
|
|
+
|
|
|
console.log('[Broadcast] onBroadcastEnded 触发,准备恢复素材', {
|
|
|
actualMode: actualMode.value,
|
|
|
mediaType: currentMedia.value?.type,
|
|
|
@@ -555,6 +569,13 @@ const onBroadcastEnded = () => {
|
|
|
* 播报音频播放失败
|
|
|
*/
|
|
|
const onBroadcastError = () => {
|
|
|
+ // 防止 onerror 和 onended 同时触发导致的重复处理
|
|
|
+ if (isBroadcastProcessed.value) {
|
|
|
+ console.log('[Broadcast] 播报已处理完毕,忽略重复的 onerror')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ isBroadcastProcessed.value = true
|
|
|
+
|
|
|
console.warn('[Broadcast] onBroadcastError 触发,准备恢复素材', {
|
|
|
actualMode: actualMode.value,
|
|
|
mediaType: currentMedia.value?.type,
|