import assets from 'url:../../../Assets/Audio/**/*.ogg' export const audio: Record = assets export let enabled = true export function enableSound() { enabled = true if (playingSongAudio) { playingSongAudio.play() } } export function disableSound() { enabled = false if (playingSongAudio) { playingSongAudio.pause() } } // Preload 'em for (let [key, value] of (Object.entries(assets) as [string,string][])) { let audio = new Audio() audio.addEventListener('canplaythrough', () => { console.log('preloaded audio', key) }) audio.preload = '' audio.src = value } let playingSongAudio: HTMLAudioElement export function playSong(name: string) { if (!enabled) return // Replace old audio and start crossfading. if (playingSongAudio && !playingSongAudio.paused) { ;((playingSongAudio: HTMLAudioElement) => { let cl = setInterval(() => { if (Number(playingSongAudio.volume.toFixed(1)) > 0) { playingSongAudio.volume -= 0.1 } else { clearInterval(cl) } }, 100) })(playingSongAudio) } playingSongAudio = new Audio() playingSongAudio.autoplay = true playingSongAudio.preload = '' playingSongAudio.loop = true playingSongAudio.volume = 0 // Start fade in. ;((playingSongAudio: HTMLAudioElement) => { let cl = setInterval(() => { if (playingSongAudio.paused) { clearInterval(cl) return } if (Number(playingSongAudio.volume.toFixed(1)) < 1.0) { playingSongAudio.volume += 0.1 } else { clearInterval(cl) } }, 100) })(playingSongAudio) playingSongAudio.src = audio[name] let promise = playingSongAudio.play() if (promise !== undefined) { promise.then(() => { // ok }).catch((error: any) => { //console.error(error) }) } } export function playSound(name: string): HTMLAudioElement { let s = new Audio() if (!enabled) return s s.src = audio[name] s.autoplay = true s.preload = '' ;(async () => { await s.play() })() return s }