/* * https://github.com/morethanwords/tweb * Copyright (C) 2019-2021 Eduard Kuzmenko * https://github.com/morethanwords/tweb/blob/master/LICENSE */ const ASSETS_PATH = 'assets/audio/'; export default class AudioAssetPlayer { private audio: HTMLAudioElement; private tempId: number; private assetName: AssetName; constructor(private assets: AssetName[]) { this.tempId = 0; } public playSound(name: AssetName, loop = false) { ++this.tempId; this.assetName = name; try { const audio = this.createAudio(); audio.autoplay = true; audio.src = ASSETS_PATH + name; audio.loop = loop; audio.play(); } catch(e) { console.error('playSound', name, e); } } public playSoundIfDifferent(name: AssetName, loop?: boolean) { if(this.assetName !== name) { this.playSound(name, loop); } } public createAudio() { let {audio} = this; if(audio) { return audio; } audio = this.audio = new Audio(); audio.play(); return audio; } public stopSound() { if(!this.audio) { return; } this.audio.pause(); } public cancelDelayedPlay() { ++this.tempId; } public playSoundWithTimeout(name: AssetName, loop: boolean, timeout: number) { // timeout = 0; const tempId = ++this.tempId; setTimeout(() => { if(this.tempId !== tempId) { return; } this.playSound(name, loop); }, timeout); } }