From a4c05bcc163d49b2f0b77cddd676a2f59bba351f Mon Sep 17 00:00:00 2001 From: kts of kettek Date: Sun, 30 Jan 2022 02:27:32 -0800 Subject: [PATCH] Add audio caching to prevent the browser from imploding --- Engine/src/shared/audio.ts | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Engine/src/shared/audio.ts b/Engine/src/shared/audio.ts index 5c56093..00221e5 100644 --- a/Engine/src/shared/audio.ts +++ b/Engine/src/shared/audio.ts @@ -41,6 +41,8 @@ for (let [key, value] of (Object.entries(audio))) { audio.src = value } +let audioCache: HTMLAudioElement[] = [] + let playingSongAudio: HTMLAudioElement export function playSong(name: string) { if (!enabled) return @@ -88,14 +90,23 @@ export function playSong(name: string) { } } -export function playSound(name: string, volume: number): HTMLAudioElement { - let s = new Audio() - if (!enabled) return s +export function playSound(name: string, volume: number): HTMLAudioElement|undefined { + if (!enabled) return + let s = audioCache.pop() + if (!s) { + s = new Audio() + s.autoplay = true + s.preload = '' + s.addEventListener('ended', () => { + audioCache.push(s as HTMLAudioElement) + }) + } else { + console.log('reused') + } + s.src = audio[name] s.volume = volume - s.autoplay = true - s.preload = '' let promise = s.play() if (promise !== undefined) { promise.then(() => {