| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import { ref } from 'vue' |
| | | |
| | | /** |
| | | * è¯é³ææ¾å
¨å±äºæ¥ |
| | | * |
| | | * 模å级åä¾ï¼å䏿¶å»æå¤åªæä¸æ¡è¯é³å¨æï¼æ°ç¹çè¯é³åææ§ç |
| | | * ä¸å¤å
¥å£å
±äº«åä¸ææ¾æï¼ |
| | | * - MessageBubbleï¼æ°æ³¡ç¹å» toggle å½åæ¡ |
| | | * - MessagePanelï¼åä¼è¯ stop() |
| | | * - MessageHistory / MessageMergeDetailDialogï¼å
³éæ¶ stop() |
| | | * |
| | | * key ç± MessageBubble å¨ setup é Symbol() çæå®ä¾çº§å¯ä¸èº«ä»½ï¼ä¸åæ¥æºï¼ä¸»é¢æ¿ / å岿½å± / |
| | | * å并详æ
ï¼çå䏿¡è¯é³ url å¨ä¸åæ°æ³¡é乿¯ä¸å keyï¼é¿å
ä¸å¤å¸è½½è¯¯åå¦ä¸å¤ä»å¯è§çææ¾ã |
| | | */ |
| | | export type VoiceKey = symbol |
| | | |
| | | interface VoiceTask { |
| | | key: VoiceKey |
| | | url: string |
| | | audio: HTMLAudioElement |
| | | } |
| | | |
| | | const currentTask = ref<null | VoiceTask>(null) |
| | | |
| | | /** |
| | | * æ¾å¼åæ¢ |
| | | * |
| | | * - ä¸ä¼ keyï¼å¼ºåï¼åä¼è¯ / å
³å¼¹çªç¨ï¼ |
| | | * - ä¼ keyï¼ä»
å½å½å task æ¯è¯¥ key æ¶æåï¼æ°æ³¡å¸è½½å
åºç¨ï¼é¿å
误åå«äººï¼ |
| | | */ |
| | | function stop(key?: VoiceKey) { |
| | | const task = currentTask.value |
| | | if (!task) { |
| | | return |
| | | } |
| | | if (key !== undefined && task.key !== key) { |
| | | return |
| | | } |
| | | task.audio.pause() |
| | | // removeAttribute('src') + load() æ¯ W3C æ¨èçéæ¾å§¿å¿ï¼ä¸ä¼è§¦å空 src å 载导è´ç error äºä»¶ï¼ |
| | | // ä¹è½è®©æµè§å¨ç«å³éæ¾åºå± decoder bufferï¼æ¯ audio.src = '' æ´å¹²å |
| | | task.audio.removeAttribute('src') |
| | | task.audio.load() |
| | | currentTask.value = null |
| | | } |
| | | |
| | | /** |
| | | * åæ¢ææ¾ |
| | | * |
| | | * - å key åç¹ï¼åæ |
| | | * - åå°æ° keyï¼åæ§èµ·æ° |
| | | */ |
| | | function play(key: VoiceKey, url: string) { |
| | | if (!url) { |
| | | return |
| | | } |
| | | if (currentTask.value?.key === key) { |
| | | stop(key) |
| | | return |
| | | } |
| | | stop() |
| | | const audio = new Audio(url) |
| | | const task: VoiceTask = { key, url, audio } |
| | | /** ææ¾ç»æ / å¼å¸¸æ¸
æ ï¼åªæ¸
å½åä»»å¡ï¼é¿å
被åç»æ°ä»»å¡çåè°è¯¯æ¸
*/ |
| | | const finalize = () => { |
| | | if (currentTask.value === task) { |
| | | currentTask.value = null |
| | | } |
| | | } |
| | | audio.addEventListener('ended', finalize, { once: true }) |
| | | audio.addEventListener('error', finalize, { once: true }) |
| | | currentTask.value = task |
| | | audio.play().catch(finalize) |
| | | } |
| | | |
| | | export function useVoicePlayer() { |
| | | /** æå® key æ¯å¦æ£å¨ææ¾ */ |
| | | function isPlaying(key: VoiceKey): boolean { |
| | | return currentTask.value?.key === key |
| | | } |
| | | return { isPlaying, play, stop } |
| | | } |