@goldenratio/wolf 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +18 -0
- package/README.md +33 -0
- package/package.json +44 -0
- package/target/types/howl.d.ts +132 -0
- package/target/types/howler.d.ts +42 -0
- package/target/types/main.d.ts +3 -0
- package/target/types/sound.d.ts +32 -0
- package/target/types/types.d.ts +52 -0
- package/target/types/utils.d.ts +8 -0
- package/target/wolf.js +1606 -0
- package/target/wolf.js.map +7 -0
- package/target/wolf.min.js +2 -0
- package/target/wolf.min.js.map +7 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils.ts", "../src/howler.ts", "../src/sound.ts", "../src/howl.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Howl } from \"./howl.js\";\nimport type { Html5AudioUnlocked, SoundNode } from \"./types.js\";\nimport type { Howler } from \"./howler.js\";\n\ndeclare const webkitAudioContext: typeof AudioContext | undefined;\n\nexport function isHtml5Audio(node: SoundNode): node is Html5AudioUnlocked {\n return \"play\" in node && typeof node.play === \"function\";\n}\n\nexport function loadBuffer(howl: Howl, howler: typeof Howler): void {\n const url = howl._src.toString();\n const cache = howler.cache;\n\n if (cache[url]) {\n howl._duration = cache[url].duration;\n loadSound(howl);\n return;\n }\n\n if (/^data:[^;]+;base64,/.test(url)) {\n const data = atob(url.split(\",\")[1] ?? \"\");\n const dataView = new Uint8Array(data.length);\n for (let i = 0; i < data.length; ++i) {\n dataView[i] = data.charCodeAt(i);\n }\n decodeAudioData(dataView.buffer, howl, howler);\n } else {\n const xhr = new XMLHttpRequest();\n xhr.open(howl._xhr.method, url, true);\n xhr.withCredentials = howl._xhr.withCredentials;\n xhr.responseType = \"arraybuffer\";\n\n if (howl._xhr.headers) {\n Object.keys(howl._xhr.headers).forEach((key) => {\n xhr.setRequestHeader(key, howl._xhr.headers![key]!);\n });\n }\n\n xhr.onload = () => {\n const code = String(xhr.status)[0];\n if (code !== \"0\" && code !== \"2\" && code !== \"3\") {\n howl._emit(\"loaderror\", undefined, `Failed loading audio file with status: ${xhr.status}.`);\n return;\n }\n decodeAudioData(xhr.response, howl, howler);\n };\n\n xhr.onerror = () => {\n if (howl._webAudio) {\n howl._html5 = true;\n howl._webAudio = false;\n howl._sounds = [];\n delete cache[url];\n howl.load();\n }\n };\n\n safeXhrSend(xhr);\n }\n}\n\nexport function safeXhrSend(xhr: XMLHttpRequest): void {\n try {\n xhr.send();\n } catch {\n xhr.onerror?.(new ProgressEvent(\"error\"));\n }\n}\n\nfunction decodeAudioData(arrayBuffer: ArrayBuffer, howl: Howl, howler: typeof Howler): void {\n const error = () => howl._emit(\"loaderror\", undefined, \"Decoding audio data failed.\");\n\n const success = (buffer: AudioBuffer) => {\n if (buffer && howl._sounds.length > 0) {\n howler.cache[howl._src.toString()] = buffer;\n loadSound(howl, buffer);\n } else {\n error();\n }\n };\n\n // Promise form (newer) vs callback form (older)\n if (typeof Promise !== \"undefined\" && howler.ctx?.decodeAudioData.length === 1) {\n howler.ctx.decodeAudioData(arrayBuffer).then(success).catch(error);\n } else {\n howler.ctx?.decodeAudioData(arrayBuffer, success, error);\n }\n}\n\nexport function loadSound(self: Howl, buffer?: AudioBuffer): void {\n if (buffer && !self._duration) self._duration = buffer.duration;\n\n if (Object.keys(self._sprite).length === 0) {\n self._sprite = { \"__default\": [0, self._duration * 1000] };\n }\n\n if (self._state !== \"loaded\") {\n self._state = \"loaded\";\n self._emit(\"load\");\n self._loadQueue();\n }\n}\n\nexport function setupAudioContext(howler: typeof Howler): void {\n if (!howler.usingWebAudio) {\n return;\n }\n\n try {\n if (typeof AudioContext !== \"undefined\") {\n howler.ctx = new AudioContext();\n } else if (typeof webkitAudioContext !== \"undefined\") {\n howler.ctx = new webkitAudioContext();\n } else {\n howler.usingWebAudio = false;\n }\n } catch {\n howler.usingWebAudio = false;\n }\n\n if (!howler.ctx) {\n howler.usingWebAudio = false;\n }\n\n const iOS = /iP(hone|od|ad)/.test(howler._navigator?.platform ?? \"\");\n const appVersion = howler._navigator?.appVersion.match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n const version = appVersion ? parseInt(appVersion[1] ?? \"\", 10) : undefined;\n\n if (iOS && version && version < 9) {\n const safari = /safari/.test((howler._navigator?.userAgent ?? \"\").toLowerCase());\n if (howler._navigator && !safari) {\n howler.usingWebAudio = false;\n }\n }\n\n if (howler.usingWebAudio && howler.ctx) {\n howler.masterGain =\n typeof howler.ctx.createGain === \"undefined\"\n // @ts-expect-error this is type safe\n ? howler.ctx[\"createGainNode\"]()\n : howler.ctx.createGain();\n howler.masterGain?.gain.setValueAtTime(howler._muted ? 0 : howler._volume, howler.ctx.currentTime);\n howler.masterGain?.connect(howler.ctx.destination);\n }\n\n howler._setup();\n}\n", "import type { Howl } from \"./howl.js\";\nimport type { HowlerState, Html5AudioUnlocked } from \"./types.js\";\nimport { isHtml5Audio, setupAudioContext } from \"./utils.js\";\n\nclass HowlerGlobal {\n // Internal\n _counter: number;\n _html5AudioPool: Html5AudioUnlocked[];\n html5PoolSize: number;\n\n _codecs: Record<string, boolean>;\n _howls: Howl[];\n _muted: boolean;\n _volume: number;\n _canPlayEvent: \"canplaythrough\" | \"canplay\";\n readonly _navigator?: Navigator;\n\n _audioUnlocked?: boolean;\n _mobileUnloaded?: boolean;\n _scratchBuffer?: AudioBuffer;\n _suspendTimer?: ReturnType<typeof setTimeout>;\n _resumeAfterSuspend?: boolean;\n\n // Public\n cache: Record<string, AudioBuffer> = {};\n masterGain?: GainNode;\n noAudio = false;\n usingWebAudio = true;\n autoSuspend = true;\n ctx?: AudioContext;\n autoUnlock = true;\n\n state: HowlerState = \"suspended\";\n\n constructor() {\n this._counter = 1000;\n this._html5AudioPool = [];\n this.html5PoolSize = 10;\n\n this._codecs = {};\n this._howls = [];\n this._muted = false;\n this._volume = 1;\n this._canPlayEvent = \"canplaythrough\";\n this._navigator =\n typeof window !== \"undefined\" && window.navigator ? window.navigator : undefined;\n\n this.masterGain = undefined;\n this.noAudio = false;\n this.usingWebAudio = true;\n this.autoSuspend = true;\n this.ctx = undefined;\n\n this.autoUnlock = true;\n\n this._setup();\n }\n\n volume(): number;\n volume(volume: number): this;\n volume(vol?: number): number | this {\n const self = this;\n const parsed = typeof vol === \"undefined\" ? undefined : parseFloat(String(vol));\n\n if (!self.ctx) {\n setupAudioContext(self);\n }\n\n if (typeof parsed !== \"undefined\" && parsed >= 0 && parsed <= 1) {\n self._volume = parsed;\n\n if (self._muted) return self._volume;\n\n if (self.usingWebAudio && self.masterGain && self.ctx) {\n self.masterGain.gain.setValueAtTime(parsed, self.ctx.currentTime);\n }\n\n for (let i = 0; i < self._howls.length; i++) {\n const howl = self._howls[i];\n if (howl && !howl._webAudio) {\n const ids = howl._getSoundIds();\n for (let j = 0; j < ids.length; j++) {\n const soundId = ids[j];\n if (typeof soundId !== \"number\") {\n continue;\n }\n const sound = howl._soundById(soundId);\n if (sound && sound._node && isHtml5Audio(sound._node)) {\n sound._node.volume = sound._volume * parsed;\n }\n }\n }\n }\n\n return self;\n }\n\n return self._volume;\n }\n\n mute(muted: boolean): this {\n const self = this;\n\n if (!self.ctx) {\n setupAudioContext(self);\n }\n\n self._muted = muted;\n\n if (self.usingWebAudio && self.masterGain && self.ctx) {\n self.masterGain.gain.setValueAtTime(\n muted ? 0 : self._volume,\n self.ctx.currentTime,\n );\n }\n\n for (let i = 0; i < self._howls.length; i++) {\n const howl = self._howls[i];\n if (howl && !howl._webAudio) {\n const ids = howl._getSoundIds();\n for (let j = 0; j < ids.length; j++) {\n const soundId = ids[j];\n if (typeof soundId !== \"number\") {\n continue;\n }\n const sound = howl._soundById(soundId);\n if (sound && sound._node && isHtml5Audio(sound._node)) {\n sound._node.muted = muted ? true : sound._muted;\n }\n }\n }\n }\n\n return self;\n }\n\n stop(): this {\n const self = this;\n for (let i = 0; i < self._howls.length; i++) {\n self._howls[i]?.stop();\n }\n return self;\n }\n\n unload(): this {\n const self = this;\n\n for (let i = self._howls.length - 1; i >= 0; i--) {\n self._howls[i]?.unload();\n }\n\n if (self.usingWebAudio && self.ctx && typeof self.ctx.close !== \"undefined\") {\n self.ctx.close();\n self.ctx = undefined;\n setupAudioContext(self);\n }\n return self;\n }\n\n codecs(ext: string): boolean {\n return this._codecs[ext.replace(/^x-/, \"\")] ?? false;\n }\n\n _setup(): void {\n const self = this;\n\n self.state = self.ctx ? ((self.ctx.state as HowlerState) || \"suspended\") : \"suspended\";\n self._autoSuspend();\n\n if (!self.usingWebAudio) {\n if (typeof Audio !== \"undefined\") {\n try {\n const test = new Audio();\n if (typeof test.oncanplaythrough === \"undefined\") {\n self._canPlayEvent = \"canplay\";\n }\n } catch {\n self.noAudio = true;\n }\n } else {\n self.noAudio = true;\n }\n }\n\n try {\n const test = new Audio();\n if (test.muted) self.noAudio = true;\n } catch {\n // ignore\n }\n\n if (!self.noAudio) {\n self._setupCodecs();\n }\n }\n\n _setupCodecs(): void {\n const self = this;\n\n let audioTest: HTMLAudioElement | undefined = undefined;\n try {\n audioTest = typeof Audio !== \"undefined\" ? new Audio() : undefined;\n } catch {\n // no-op\n return;\n }\n\n if (!audioTest || typeof audioTest.canPlayType !== \"function\") {\n // no-op\n return;\n }\n\n const mpegTest = audioTest.canPlayType(\"audio/mpeg;\").replace(/^no$/, \"\");\n\n const ua = self._navigator ? self._navigator.userAgent : \"\";\n const checkOpera = ua.match(/OPR\\/(\\d+)/g);\n const isOldOpera = !!(checkOpera && parseInt((checkOpera[0]?.split(\"/\")[1]) ?? '', 10) < 33);\n const checkSafari = ua.indexOf(\"Safari\") !== -1 && ua.indexOf(\"Chrome\") === -1;\n const safariVersion = ua.match(/Version\\/(.*?) /);\n const isOldSafari = !!(checkSafari && safariVersion && parseInt(safariVersion[1] ?? '', 10) < 15);\n\n self._codecs = {\n \"mp3\": !!(!isOldOpera && (mpegTest || audioTest.canPlayType(\"audio/mp3;\").replace(/^no$/, \"\"))),\n \"mpeg\": !!mpegTest,\n \"opus\": !!audioTest.canPlayType('audio/ogg; codecs=\"opus\"').replace(/^no$/, \"\"),\n \"ogg\": !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, \"\"),\n \"oga\": !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, \"\"),\n \"wav\": !!(\n audioTest.canPlayType('audio/wav; codecs=\"1\"') || audioTest.canPlayType(\"audio/wav\")\n ).replace(/^no$/, \"\"),\n \"aac\": !!audioTest.canPlayType(\"audio/aac;\").replace(/^no$/, \"\"),\n \"caf\": !!audioTest.canPlayType(\"audio/x-caf;\").replace(/^no$/, \"\"),\n \"m4a\": !!(\n audioTest.canPlayType(\"audio/x-m4a;\") ||\n audioTest.canPlayType(\"audio/m4a;\") ||\n audioTest.canPlayType(\"audio/aac;\")\n ).replace(/^no$/, \"\"),\n \"m4b\": !!(\n audioTest.canPlayType(\"audio/x-m4b;\") ||\n audioTest.canPlayType(\"audio/m4b;\") ||\n audioTest.canPlayType(\"audio/aac;\")\n ).replace(/^no$/, \"\"),\n \"mp4\": !!(\n audioTest.canPlayType(\"audio/x-mp4;\") ||\n audioTest.canPlayType(\"audio/mp4;\") ||\n audioTest.canPlayType(\"audio/aac;\")\n ).replace(/^no$/, \"\"),\n \"weba\": !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, \"\")),\n \"webm\": !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, \"\")),\n \"dolby\": !!audioTest.canPlayType('audio/mp4; codecs=\"ec-3\"').replace(/^no$/, \"\"),\n \"flac\": !!(audioTest.canPlayType(\"audio/x-flac;\") || audioTest.canPlayType(\"audio/flac;\")).replace(/^no$/, \"\"),\n };\n }\n\n _unlockAudio(): void {\n const self = this;\n\n if (self._audioUnlocked || !self.ctx) {\n return;\n }\n\n self._audioUnlocked = false;\n self.autoUnlock = false;\n\n if (!self._mobileUnloaded && self.ctx.sampleRate !== 44100) {\n self._mobileUnloaded = true;\n self.unload();\n }\n\n self._scratchBuffer = self.ctx.createBuffer(1, 1, 22050);\n\n const unlock = () => {\n while (self._html5AudioPool.length < self.html5PoolSize) {\n try {\n const audioNode = new Audio() as Html5AudioUnlocked;\n audioNode._unlocked = true;\n self._releaseHtml5Audio(audioNode);\n } catch {\n self.noAudio = true;\n break;\n }\n }\n\n for (let i = 0; i < self._howls.length; i++) {\n const howl = self._howls[i];\n if (howl && !howl._webAudio) {\n const ids = howl._getSoundIds();\n for (let j = 0; j < ids.length; j++) {\n const soundId = ids[j];\n if (typeof soundId !== \"number\") {\n continue;\n }\n const sound = howl._soundById(soundId);\n if (sound && sound._node && isHtml5Audio(sound._node) && !sound._node._unlocked) {\n sound._node._unlocked = true;\n sound._node.load();\n }\n }\n }\n }\n\n self._autoResume();\n\n if (self.ctx) {\n const source = self.ctx.createBufferSource();\n source.buffer = self._scratchBuffer ?? null;\n source.connect(self.ctx.destination);\n\n if (typeof source.start === \"undefined\") {\n if (\"noteOn\" in source && typeof source.noteOn === \"function\") {\n source.noteOn(0);\n }\n } else {\n source.start(0);\n }\n\n if (typeof self.ctx.resume === \"function\") {\n self.ctx.resume();\n }\n source.onended = () => {\n source.disconnect();\n\n self._audioUnlocked = true;\n\n document.removeEventListener(\"touchstart\", unlock, true);\n document.removeEventListener(\"touchend\", unlock, true);\n document.removeEventListener(\"click\", unlock, true);\n document.removeEventListener(\"keydown\", unlock, true);\n\n for (let i = 0; i < self._howls.length; i++) {\n self._howls[i]?._emit(\"unlock\");\n }\n };\n }\n };\n\n document.addEventListener(\"touchstart\", unlock, true);\n document.addEventListener(\"touchend\", unlock, true);\n document.addEventListener(\"click\", unlock, true);\n document.addEventListener(\"keydown\", unlock, true);\n }\n\n _obtainHtml5Audio(): Html5AudioUnlocked {\n const self = this;\n\n if (self._html5AudioPool.length) {\n return self._html5AudioPool.pop()!;\n }\n\n const testPlay = new Audio().play();\n testPlay.catch(() => {\n console.warn(\"HTML5 Audio pool exhausted, returning potentially locked audio object.\");\n });\n return new Audio() as Html5AudioUnlocked;\n }\n\n _releaseHtml5Audio(audio: Html5AudioUnlocked): this {\n const self = this;\n if (audio._unlocked) {\n self._html5AudioPool.push(audio);\n }\n return self;\n }\n\n _autoSuspend(): void {\n const self = this;\n\n if (!self.autoSuspend || !self.ctx || typeof self.ctx.suspend === \"undefined\" || !self.usingWebAudio) {\n return;\n }\n\n for (let i = 0; i < self._howls.length; i++) {\n const howl = self._howls[i];\n if (howl && howl._webAudio) {\n for (let j = 0; j < howl._sounds.length; j++) {\n if (!howl._sounds[j]?._paused) {\n return;\n }\n }\n }\n }\n\n if (self._suspendTimer) {\n clearTimeout(self._suspendTimer);\n }\n\n self._suspendTimer = setTimeout(() => {\n if (!self.autoSuspend) {\n return;\n }\n\n self._suspendTimer = undefined;\n self.state = \"suspending\";\n\n const handleSuspension = () => {\n self.state = \"suspended\";\n if (self._resumeAfterSuspend) {\n delete self._resumeAfterSuspend;\n self._autoResume();\n }\n };\n\n self.ctx?.suspend().then(handleSuspension, handleSuspension);\n }, 30000);\n }\n\n _autoResume(): void {\n const self = this;\n\n if (!self.ctx || typeof self.ctx.resume === \"undefined\" || !self.usingWebAudio) {\n return;\n }\n\n if (self.state === \"running\" && self.ctx.state !== \"interrupted\" && self._suspendTimer) {\n clearTimeout(self._suspendTimer);\n self._suspendTimer = undefined;\n } else if (self.state === \"suspended\" || (self.state === \"running\" && self.ctx.state === \"interrupted\")) {\n self.ctx.resume().then(() => {\n self.state = \"running\";\n for (let i = 0; i < self._howls.length; i++) {\n self._howls[i]?._emit(\"resume\");\n }\n });\n\n if (self._suspendTimer) {\n clearTimeout(self._suspendTimer);\n self._suspendTimer = undefined;\n }\n } else if (self.state === \"suspending\") {\n self._resumeAfterSuspend = true;\n }\n }\n}\n\nexport const Howler = new HowlerGlobal();\n", "import type { Howl } from \"./howl.js\";\nimport type { Html5AudioUnlocked, SoundNode, WebAudioNodeWithSource } from \"./types.js\";\nimport type { Howler } from \"./howler.js\";\n\nexport class Sound {\n private readonly howler: typeof Howler;\n private readonly parent: Howl;\n\n _muted: boolean;\n _loop: boolean;\n _volume: number;\n _rate: number;\n _seek = 0;\n _rateSeek = 0;\n _paused = true;\n _ended = true;\n _sprite: string = \"__default\";\n _id: number;\n\n _node?: SoundNode;\n _panner?: AudioNode;\n\n _start = 0;\n _stop = 0;\n _playStart = 0;\n\n _interval?: ReturnType<typeof setTimeout> = undefined;\n _fadeTo?: number = undefined;\n\n _errorFn?: (ev: Event) => void;\n _loadFn?: (ev: Event) => void;\n _endFn?: (ev: Event) => void;\n\n constructor(parent: Howl, howler: typeof Howler) {\n this.parent = parent;\n this.howler = howler;\n\n this._muted = parent._muted;\n this._loop = parent._loop;\n this._volume = parent._volume;\n this._rate = parent._rate;\n this._seek = 0;\n this._paused = true;\n this._ended = true;\n this._sprite = \"__default\";\n\n this._id = ++howler._counter;\n\n parent._sounds.push(this);\n\n const volume = this.howler._muted || this._muted || parent._muted ? 0 : this._volume;\n\n if (parent._webAudio) {\n const gain =\n typeof this.howler.ctx?.createGain === \"undefined\"\n // @ts-expect-error exception for createGainNode\n ? this.howler.ctx[\"createGainNode\"]()\n : this.howler.ctx.createGain();\n\n this._node = gain as WebAudioNodeWithSource;\n this._node.gain.setValueAtTime(volume, this.howler.ctx?.currentTime ?? 0);\n this._node.paused = true;\n if (this.howler.masterGain) {\n this._node.connect(this.howler.masterGain);\n }\n } else if (!this.howler.noAudio) {\n this._node = this.howler._obtainHtml5Audio();\n\n this._errorFn = this.errorListener.bind(this);\n this._node.addEventListener(\"error\", this._errorFn, false);\n\n this._loadFn = this.loadListener.bind(this);\n this._node.addEventListener(this.howler._canPlayEvent, this._loadFn, false);\n\n this._endFn = this.endListener.bind(this);\n this._node.addEventListener(\"ended\", this._endFn, false);\n\n this._node.src = parent._src.toString();\n\n const preload = parent._preload === true ? \"auto\" : parent._preload;\n this._node.preload = preload === false ? \"\" : preload;\n this._node.volume = volume * this.howler.volume();\n this._node.load();\n }\n }\n\n reset(): this {\n const self = this;\n const parent = self.parent;\n\n self._muted = parent._muted;\n self._loop = parent._loop;\n self._volume = parent._volume;\n self._rate = parent._rate;\n self._seek = 0;\n self._rateSeek = 0;\n self._paused = true;\n self._ended = true;\n self._sprite = \"__default\";\n\n self._id = ++this.howler._counter;\n return self;\n }\n\n private errorListener(): void {\n const self = this;\n const html = self._node as Html5AudioUnlocked;\n self.parent._emit(\"loaderror\", self._id, html.error ? html.error.code.toString() : \"0\");\n html.removeEventListener(\"error\", self._errorFn as EventListener, false);\n }\n\n private loadListener(): void {\n const self = this;\n const parent = self.parent;\n const html = self._node as Html5AudioUnlocked;\n\n parent._duration = Math.ceil(html.duration * 10) / 10;\n\n if (Object.keys(parent._sprite).length === 0) {\n parent._sprite = { \"__default\": [0, parent._duration * 1000] };\n }\n\n if (parent._state !== \"loaded\") {\n parent._state = \"loaded\";\n parent._emit(\"load\");\n parent._loadQueue();\n }\n\n html.removeEventListener(this.howler._canPlayEvent, self._loadFn as EventListener, false);\n }\n\n private endListener(): void {\n const self = this;\n const parent = self.parent;\n const html = self._node as Html5AudioUnlocked;\n\n if (parent._duration === Infinity) {\n parent._duration = Math.ceil(html.duration * 10) / 10;\n const defaultSprite = parent._sprite[\"__default\"];\n if (defaultSprite && defaultSprite[1] === Infinity) {\n defaultSprite[1] = parent._duration * 1000;\n }\n parent._ended(self);\n }\n\n html.removeEventListener(\"ended\", self._endFn as EventListener, false);\n }\n}\n", "import type {\n HowlEventHandler, HowlEventName,\n HowlListener, HowlOptions, HowlState,\n HowlXHR, Html5AudioUnlocked, HowlSpriteMap, WebAudioNodeWithSource\n} from \"./types.js\";\nimport { Howler } from \"./howler.js\";\nimport { Sound } from \"./sound.js\";\nimport { isHtml5Audio, loadBuffer, setupAudioContext } from \"./utils.js\";\n\nexport class Howl {\n private readonly howler: typeof Howler;\n // User-defined\n _autoplay: boolean;\n _format: readonly string[] | undefined;\n _html5: boolean;\n _muted: boolean;\n _loop: boolean;\n _pool: number;\n _preload: boolean | \"metadata\" | \"none\";\n _rate: number;\n _sprite: HowlSpriteMap;\n _src: readonly string[];\n _volume: number;\n _xhr: HowlXHR;\n\n // Internals\n _duration = 0;\n _state: HowlState = \"unloaded\";\n _sounds: Sound[] = [];\n _endTimers: Record<number, ReturnType<typeof setTimeout> | (() => void)> = {};\n _queue: Array<{ event: string; action: () => void }> = [];\n _playLock = false;\n _webAudio: boolean = true;\n\n _onend: HowlListener[];\n _onfade: HowlListener[];\n _onload: HowlListener[];\n _onloaderror: HowlListener[];\n _onplayerror: HowlListener[];\n _onpause: HowlListener[];\n _onplay: HowlListener[];\n _onstop: HowlListener[];\n _onmute: HowlListener[];\n _onvolume: HowlListener[];\n _onrate: HowlListener[];\n _onseek: HowlListener[];\n _onunlock: HowlListener[];\n _onresume: HowlListener[];\n\n constructor(options: HowlOptions) {\n this.howler = Howler;\n if (!this.howler.ctx) {\n setupAudioContext(this.howler);\n }\n\n this._autoplay = options[\"autoplay\"] || false;\n this._format = typeof options[\"format\"] !== \"string\" ? options[\"format\"] : [options[\"format\"]];\n this._html5 = options[\"html5\"] || false;\n this._muted = options[\"mute\"] || false;\n this._loop = options[\"loop\"] || false;\n this._pool = options[\"pool\"] || 5;\n this._preload = typeof options[\"preload\"] === \"boolean\" || options[\"preload\"] === \"metadata\" ? options[\"preload\"] : true;\n this._rate = options[\"rate\"] || 1;\n this._sprite = options[\"sprite\"] || {};\n this._src = typeof options[\"src\"] !== \"string\" ? options[\"src\"] : [options[\"src\"]];\n this._volume = options[\"volume\"] !== undefined ? options[\"volume\"] : 1;\n this._xhr = {\n method: options[\"xhr\"]?.method ?? \"GET\",\n headers: options[\"xhr\"]?.headers ?? undefined,\n withCredentials: options[\"xhr\"]?.withCredentials ?? false,\n };\n\n this._duration = 0;\n this._state = \"unloaded\";\n this._sounds = [];\n this._endTimers = {};\n this._queue = [];\n this._playLock = false;\n\n this[\"_onend\"] = options[\"onend\"] ? [{ fn: options[\"onend\"] }] : [];\n this[\"_onfade\"] = options[\"onfade\"] ? [{ fn: options[\"onfade\"] }] : [];\n this[\"_onload\"] = options[\"onload\"] ? [{ fn: options[\"onload\"] }] : [];\n this[\"_onloaderror\"] = options[\"onloaderror\"] ? [{ fn: options[\"onloaderror\"] }] : [];\n this[\"_onplayerror\"] = options[\"onplayerror\"] ? [{ fn: options[\"onplayerror\"] }] : [];\n this[\"_onpause\"] = options[\"onpause\"] ? [{ fn: options[\"onpause\"] }] : [];\n this[\"_onplay\"] = options[\"onplay\"] ? [{ fn: options[\"onplay\"] }] : [];\n this[\"_onstop\"] = options[\"onstop\"] ? [{ fn: options[\"onstop\"] }] : [];\n this[\"_onmute\"] = options[\"onmute\"] ? [{ fn: options[\"onmute\"] }] : [];\n this[\"_onvolume\"] = options[\"onvolume\"] ? [{ fn: options[\"onvolume\"] }] : [];\n this[\"_onrate\"] = options[\"onrate\"] ? [{ fn: options[\"onrate\"] }] : [];\n this[\"_onseek\"] = options[\"onseek\"] ? [{ fn: options[\"onseek\"] }] : [];\n this[\"_onunlock\"] = options[\"onunlock\"] ? [{ fn: options[\"onunlock\"] }] : [];\n this[\"_onresume\"] = options[\"onresume\"] ? [{ fn: options[\"onresume\"] }] : [];\n\n this._webAudio = this.howler.usingWebAudio && !this._html5;\n\n if (this.howler.ctx && this.howler.autoUnlock) {\n this.howler._unlockAudio();\n }\n\n this.howler._howls.push(this);\n\n if (this._autoplay) {\n this._queue.push({ event: \"play\", action: () => this.play() });\n }\n\n if (this._preload && (this._preload as string) !== \"none\") {\n this.load();\n }\n }\n\n load(): void {\n const self = this;\n\n if (this.howler.noAudio) {\n self._emit(\"loaderror\", undefined, \"No audio support.\");\n return;\n }\n\n let url: string | undefined = undefined;\n\n for (let i = 0; i < self._src.length; i++) {\n let ext: string | undefined;\n let str: string;\n\n if (self._format && self._format[i]) {\n ext = self._format[i];\n } else {\n str = self._src[i] ?? \"\";\n if (typeof str !== \"string\" || str === \"\") {\n self._emit(\"loaderror\", undefined, \"Non-string found in selected audio sources - ignoring.\");\n continue;\n }\n\n const dataExt = /^data:audio\\/([^;,]+);/i.exec(str);\n if (dataExt) ext = dataExt[1]?.toLowerCase();\n else {\n const m = /\\.([^.]+)$/.exec(str.split(\"?\", 1)[0] ?? \"\");\n if (m) {\n ext = m[1]?.toLowerCase();\n }\n }\n }\n\n if (!ext) {\n console.warn('No file extension was found. Consider using the \"format\" property or specify an extension.');\n }\n\n if (ext && this.howler.codecs(ext)) {\n url = self._src[i];\n break;\n }\n }\n\n if (!url) {\n self._emit(\"loaderror\", undefined, \"No codec support for selected audio sources.\");\n return;\n }\n\n self._src = [url];\n self._state = \"loading\";\n\n if (typeof window !== \"undefined\" && window.location.protocol === \"https:\" && url.slice(0, 5) === \"http:\") {\n self._html5 = true;\n self._webAudio = false;\n }\n\n new Sound(self, this.howler);\n\n if (self._webAudio) {\n loadBuffer(self, this.howler);\n }\n }\n\n play(spriteOrId?: string | number, internal?: boolean): number | undefined {\n const self = this;\n let id: number | undefined = undefined;\n\n if (typeof spriteOrId === \"number\") {\n id = spriteOrId;\n spriteOrId = undefined;\n } else if (typeof spriteOrId === \"string\" && self._state === \"loaded\" && !self._sprite[spriteOrId]) {\n return undefined;\n } else if (typeof spriteOrId === \"undefined\") {\n spriteOrId = \"__default\";\n\n if (!self._playLock) {\n let num = 0;\n for (let i = 0; i < self._sounds.length; i++) {\n if (self._sounds[i]?._paused && !self._sounds[i]?._ended) {\n num++;\n id = self._sounds[i]?._id;\n }\n }\n\n if (num === 1) {\n spriteOrId = undefined;\n } else {\n id = undefined;\n }\n }\n }\n\n const sound = id ? self._soundById(id) : self._inactiveSound();\n if (!sound) {\n return undefined;\n }\n\n if (id && !spriteOrId) {\n spriteOrId = sound._sprite || \"__default\";\n }\n\n if (self._state !== \"loaded\") {\n sound._sprite = spriteOrId?.toString() ?? \"__default\";\n sound._ended = false;\n const soundId = sound._id;\n self._queue.push({ event: \"play\", action: () => self.play(soundId) });\n return soundId;\n }\n\n if (id && !sound._paused) {\n if (!internal) self._loadQueue(\"play\");\n return sound._id;\n }\n\n if (self._webAudio) {\n this.howler._autoResume();\n }\n\n const spriteName = (spriteOrId ?? \"__default\") as string;\n const seek = Math.max(0, sound._seek > 0 ? sound._seek : (self._sprite[spriteName]?.[0] ?? 0) / 1000);\n const spriteDef = self._sprite[spriteName];\n\n const duration = spriteDef ? Math.max(\n 0,\n (spriteDef[0] + spriteDef[1]) / 1000 - seek,\n ) : 0;\n const timeout = (duration * 1000) / Math.abs(sound._rate);\n const start = spriteDef ? spriteDef[0] / 1000 : 0;\n const stop = spriteDef ? (spriteDef[0] + spriteDef[1]) / 1000 : 0;\n\n sound._sprite = spriteName;\n sound._ended = false;\n\n const setParams = () => {\n sound._paused = false;\n sound._seek = seek;\n sound._start = start;\n sound._stop = stop;\n sound._loop = !!(sound._loop || (self._sprite[spriteName]?.[2] ?? false));\n };\n\n if (seek >= stop) {\n self._ended(sound);\n return sound._id;\n }\n\n const node = sound._node;\n\n if (self._webAudio) {\n const playWebAudio = () => {\n // console.log(\"current audio context state: \", this.howler.ctx?.state);\n self._playLock = false;\n setParams();\n self._refreshBuffer(sound);\n\n const vol = sound._muted || self._muted ? 0 : sound._volume;\n (node as WebAudioNodeWithSource).gain.setValueAtTime(vol, this.howler.ctx?.currentTime ?? 0);\n sound._playStart = this.howler.ctx?.currentTime ?? 0;\n\n const bs = (node as WebAudioNodeWithSource).bufferSource!;\n if (typeof bs.start === \"undefined\") {\n if (\"noteGrainOn\" in bs && typeof bs.noteGrainOn === \"function\")\n sound._loop ? bs.noteGrainOn(0, seek, 86400) : bs.noteGrainOn(0, seek, duration);\n } else {\n sound._loop ? bs.start(0, seek, 86400) : bs.start(0, seek, duration);\n }\n\n if (timeout !== Infinity) {\n self._endTimers[sound._id] = setTimeout(() => self._ended(sound), timeout);\n }\n\n if (!internal) {\n setTimeout(() => {\n self._emit(\"play\", sound._id);\n self._loadQueue();\n }, 0);\n }\n };\n\n if (this.howler.state === \"running\" && this.howler.ctx?.state !== \"interrupted\") {\n playWebAudio();\n } else {\n self._playLock = true;\n self.once(\"resume\", () => {\n playWebAudio()\n });\n self._clearTimer(sound._id);\n }\n } else {\n const html = node as Html5AudioUnlocked;\n\n const playHtml5 = () => {\n html.currentTime = seek;\n html.muted = sound._muted || self._muted || this.howler._muted || html.muted;\n html.volume = sound._volume * this.howler.volume();\n html.playbackRate = sound._rate;\n\n try {\n const p = html.play();\n\n if (\n p &&\n typeof Promise !== \"undefined\" &&\n (p instanceof Promise || typeof p[\"then\"] === \"function\")\n ) {\n self._playLock = true;\n setParams();\n\n (p as Promise<void>)\n .then(() => {\n self._playLock = false;\n html._unlocked = true;\n if (!internal) self._emit(\"play\", sound._id);\n else self._loadQueue();\n })\n .catch(() => {\n self._playLock = false;\n self._emit(\n \"playerror\",\n sound._id,\n \"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.\",\n );\n sound._ended = true;\n sound._paused = true;\n });\n } else if (!internal) {\n self._playLock = false;\n setParams();\n self._emit(\"play\", sound._id);\n }\n\n html.playbackRate = sound._rate;\n\n if (html.paused) {\n self._emit(\n \"playerror\",\n sound._id,\n \"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.\",\n );\n return;\n }\n\n if (spriteName !== \"__default\" || sound._loop) {\n self._endTimers[sound._id] = setTimeout(() => self._ended(sound), timeout);\n } else {\n self._endTimers[sound._id] = () => {\n self._ended(sound);\n html.removeEventListener(\"ended\", self._endTimers[sound._id] as () => void, false);\n };\n html.addEventListener(\"ended\", self._endTimers[sound._id] as () => void, false);\n }\n } catch (err) {\n self._emit(\"playerror\", sound._id, err as string);\n }\n };\n\n if (\n html.src ===\n \"data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA\"\n ) {\n html.src = self._src.toString();\n html.load();\n }\n\n if (html.readyState >= 3) {\n playHtml5();\n } else {\n self._playLock = true;\n self._state = \"loading\";\n\n const listener = () => {\n self._state = \"loaded\";\n playHtml5();\n html.removeEventListener(this.howler._canPlayEvent, listener, false);\n };\n html.addEventListener(this.howler._canPlayEvent, listener, false);\n self._clearTimer(sound._id);\n }\n }\n\n return sound._id;\n }\n\n state(): HowlState {\n return this._state;\n }\n\n /**\n * Check if a sound (or any sound) is playing.\n */\n playing(id?: number): boolean {\n const self = this;\n\n if (typeof id === \"number\") {\n const sound = self._soundById(id);\n return sound ? !sound._paused : false;\n }\n\n for (let i = 0; i < self._sounds.length; i++) {\n if (!self._sounds[i]?._paused) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Duration of group, or sprite duration if sound id passed.\n */\n duration(id?: number): number {\n const self = this;\n let duration = self._duration;\n\n const sound = typeof id === \"number\" ? self._soundById(id) : undefined;\n if (sound) {\n duration = (self._sprite[sound._sprite]?.[1] ?? 0) / 1000;\n }\n\n return duration;\n }\n\n /**\n * Pause playback and save current position.\n */\n pause(id?: number, internal?: boolean): this {\n const self = this;\n\n if (self._state !== \"loaded\" || self._playLock) {\n self._queue.push({ event: \"pause\", action: () => self.pause(id) });\n return self;\n }\n\n const ids = self._getSoundIds(id);\n for (let i = 0; i < ids.length; i++) {\n self._clearTimer(ids[i] ?? 0);\n\n const sound = self._soundById(ids[i] ?? 0);\n if (sound && !sound._paused) {\n sound._seek = self.seek(ids[i] ?? 0);\n sound._rateSeek = 0;\n sound._paused = true;\n\n self._stopFade(ids[i] ?? 0);\n\n if (sound._node) {\n if (self._webAudio && !isHtml5Audio(sound._node)) {\n const n = sound._node as WebAudioNodeWithSource;\n if (!n.bufferSource) continue;\n\n if (typeof (n.bufferSource as any).stop === \"undefined\") (n.bufferSource as any).noteOff(0);\n else n.bufferSource.stop(0);\n\n self._cleanBuffer(n);\n } else if (isHtml5Audio(sound._node) && (!isNaN(sound._node.duration) || sound._node.duration === Infinity)) {\n sound._node.pause();\n }\n }\n }\n\n if (!internal) {\n self._emit(\"pause\", sound ? sound._id : undefined);\n }\n }\n\n return self;\n }\n\n\n /**\n * Get/set playback rate.\n * rate() -> first sound rate (or group rate fallback)\n * rate(id) -> sound rate\n * rate(rate) -> set group rate\n * rate(rate, id) -> set sound rate\n */\n rate(): number;\n rate(id: number): number;\n rate(rate: number): this;\n rate(rate: number, id: number): this;\n rate(rateOrId?: number, idMaybe?: number): this | number {\n const self = this;\n const argsLen = arguments.length;\n\n let rate: number | undefined;\n let id: number | undefined;\n\n if (argsLen === 0) {\n id = self._sounds[0]?._id;\n } else if (argsLen === 1) {\n const ids = self._getSoundIds();\n const index = ids.indexOf(rateOrId as number);\n if (index >= 0) id = parseInt(String(rateOrId), 10);\n else rate = parseFloat(String(rateOrId));\n } else if (argsLen === 2) {\n rate = parseFloat(String(rateOrId));\n id = parseInt(String(idMaybe), 10);\n }\n\n if (typeof rate === \"number\") {\n if (self._state !== \"loaded\" || self._playLock) {\n const capturedArgs = [...arguments] as any[];\n self._queue.push({\n event: \"rate\",\n action: () => self.rate.apply(self, capturedArgs as any),\n });\n return self;\n }\n\n if (typeof id === \"undefined\") self._rate = rate;\n\n const ids = self._getSoundIds(id);\n for (let i = 0; i < ids.length; i++) {\n const sound = self._soundById(ids[i] ?? 0);\n if (!sound) continue;\n\n if (self.playing(ids[i])) {\n sound._rateSeek = self.seek(ids[i] ?? 0);\n sound._playStart = self._webAudio ? Howler.ctx!.currentTime : sound._playStart;\n }\n\n sound._rate = rate;\n\n if (self._webAudio && sound._node && !isHtml5Audio(sound._node)) {\n const n = sound._node as WebAudioNodeWithSource;\n if (n.bufferSource) n.bufferSource.playbackRate.setValueAtTime(rate, Howler.ctx!.currentTime);\n } else if (sound._node && isHtml5Audio(sound._node)) {\n sound._node.playbackRate = rate;\n }\n\n const seek = self.seek(ids[i] ?? 0);\n const sprite = self._sprite[sound._sprite];\n const duration = sprite ? (sprite[0] + sprite[1]) / 1000 - seek : 0;\n const timeout = (duration * 1000) / Math.abs(sound._rate);\n\n const sId = ids[i];\n if (typeof sId === \"number\" && self._endTimers[sId] || !sound._paused) {\n if (typeof sId === \"number\") {\n self._clearTimer(sId);\n self._endTimers[sId] = setTimeout(() => self._ended(sound), timeout);\n }\n }\n\n self._emit(\"rate\", sound._id);\n }\n\n return self;\n }\n\n const sound = id ? self._soundById(id) : undefined;\n return sound ? sound._rate : self._rate;\n }\n\n /**\n * Get/set seek position.\n * seek() -> first sound seek\n * seek(id) -> sound seek\n * seek(seek) -> set first sound seek\n * seek(seek, id) -> set sound seek\n */\n seek(): number;\n seek(id: number): number;\n seek(seek: number): this;\n seek(seek: number, id: number): this;\n seek(seekOrId?: number, idMaybe?: number): this | number {\n const self = this;\n const argsLen = arguments.length;\n\n let seek: number | undefined = undefined;\n let id: number | undefined = undefined;\n\n if (argsLen === 0) {\n if (self._sounds.length) {\n id = self._sounds[0]?._id;\n }\n } else if (argsLen === 1) {\n const ids = self._getSoundIds();\n const index = ids.indexOf(seekOrId as number);\n if (index >= 0) {\n id = parseInt(String(seekOrId), 10);\n } else if (self._sounds.length) {\n id = self._sounds[0]?._id;\n seek = parseFloat(String(seekOrId));\n }\n } else if (argsLen === 2) {\n seek = parseFloat(String(seekOrId));\n id = parseInt(String(idMaybe), 10);\n }\n\n if (typeof id === \"undefined\") return 0;\n\n if (typeof seek === \"number\" && (self._state !== \"loaded\" || self._playLock)) {\n const capturedArgs = [...arguments] as any[];\n self._queue.push({\n event: \"seek\",\n action: () => self.seek.apply(self, capturedArgs as any),\n });\n return self;\n }\n\n const sound = self._soundById(id);\n if (!sound) {\n return self;\n }\n\n if (typeof seek === \"number\" && seek >= 0) {\n const wasPlaying = self.playing(id);\n if (wasPlaying) {\n self.pause(id, true);\n }\n\n sound._seek = seek;\n sound._ended = false;\n self._clearTimer(id);\n\n if (!self._webAudio && sound._node && isHtml5Audio(sound._node) && !isNaN(sound._node.duration)) {\n sound._node.currentTime = seek;\n }\n\n const seekAndEmit = () => {\n if (wasPlaying) {\n self.play(id, true);\n }\n self._emit(\"seek\", id);\n };\n\n if (wasPlaying && !self._webAudio) {\n const emitSeek = () => {\n if (!self._playLock) seekAndEmit();\n else setTimeout(emitSeek, 0);\n };\n setTimeout(emitSeek, 0);\n } else {\n seekAndEmit();\n }\n\n return self;\n }\n\n // Getter\n if (self._webAudio) {\n const realTime = self.playing(id) ? Howler.ctx!.currentTime - sound._playStart : 0;\n const rateSeek = sound._rateSeek ? sound._rateSeek - sound._seek : 0;\n return sound._seek + (rateSeek + realTime * Math.abs(sound._rate));\n }\n\n if (sound._node && isHtml5Audio(sound._node)) {\n return sound._node.currentTime;\n }\n return 0;\n }\n\n\n stop(id?: number, internal?: boolean): this {\n // You can paste your remaining stop() body here 1:1 (already in your snippet)\n // For now, keep a simple call-through for compatibility:\n if (typeof id === \"undefined\") {\n const ids = this._getSoundIds();\n for (const sid of ids) {\n this.stop(sid, internal);\n }\n return this;\n }\n const sound = this._soundById(id);\n if (sound) {\n this._clearTimer(id);\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n sound._paused = true;\n sound._ended = true;\n if (sound._node) {\n if (this._webAudio) {\n const n = sound._node as WebAudioNodeWithSource;\n if (n.bufferSource) {\n if (typeof n.bufferSource.stop === \"undefined\") {\n if (\"noteOff\" in n.bufferSource && typeof n.bufferSource.noteOff === \"function\") {\n n.bufferSource.noteOff(0);\n }\n }\n else {\n n.bufferSource.stop(0);\n }\n this._cleanBuffer(n);\n }\n } else if (isHtml5Audio(sound._node)) {\n const a = sound._node;\n a.currentTime = sound._start || 0;\n a.pause();\n if (a.duration === Infinity) {\n this._clearSound(a);\n }\n }\n }\n if (!internal) this._emit(\"stop\", sound._id);\n }\n return this;\n }\n\n /**\n * Mute/unmute a single sound or all sounds in this Howl group.\n * @param muted Set to true to mute and false to unmute.\n * @param id The sound ID to update (omit to mute/unmute all).\n */\n mute(muted?: boolean, id?: number): this | boolean {\n const self = this;\n\n // Getter: group mute\n if (typeof id === \"undefined\" && typeof muted !== \"boolean\") {\n return self._muted;\n }\n\n // If the sound hasn't loaded, queue.\n if (self._state !== \"loaded\" || self._playLock) {\n self._queue.push({\n event: \"mute\",\n action: () => {\n self.mute(muted as boolean, id);\n },\n });\n return self;\n }\n\n // Apply group mute.\n if (typeof id === \"undefined\" && typeof muted === \"boolean\") {\n self._muted = muted;\n }\n\n const ids = self._getSoundIds(id);\n for (let i = 0; i < ids.length; i++) {\n const sound = self._soundById(ids[i] ?? 0);\n if (!sound) continue;\n\n sound._muted = muted as boolean;\n\n // Cancel active fade and set end value.\n if (sound._interval) self._stopFade(sound._id);\n\n if (self._webAudio && sound._node && !isHtml5Audio(sound._node)) {\n (sound._node as WebAudioNodeWithSource).gain.setValueAtTime(\n (muted as boolean) ? 0 : sound._volume,\n Howler.ctx!.currentTime,\n );\n } else if (sound._node && isHtml5Audio(sound._node)) {\n sound._node.muted = Howler._muted ? true : (muted as boolean);\n }\n\n self._emit(\"mute\", sound._id);\n }\n\n return self;\n }\n\n /**\n * Get/set the volume of this sound or of the Howl group.\n * volume() -> group volume\n * volume(id) -> sound volume\n * volume(vol) -> set group volume\n * volume(vol, id) -> set sound volume\n */\n volume(): number;\n volume(id: number): number;\n volume(vol: number): this;\n volume(vol: number, id: number): this;\n volume(vol: number, id: number, internal?: boolean): this;\n volume(volOrId?: number, idMaybe?: number, internal?: boolean): this | number {\n const self = this;\n\n const argsLen = arguments.length;\n\n let vol: number | undefined;\n let id: number | undefined;\n\n if (argsLen === 0) {\n return self._volume;\n }\n\n if (argsLen === 1 || (argsLen === 2 && typeof idMaybe === \"undefined\")) {\n const ids = self._getSoundIds();\n const index = ids.indexOf(volOrId as number);\n if (index >= 0) {\n id = parseInt(String(volOrId), 10);\n } else {\n vol = parseFloat(String(volOrId));\n }\n } else if (argsLen >= 2) {\n vol = parseFloat(String(volOrId));\n id = parseInt(String(idMaybe), 10);\n }\n\n // Setter path\n if (typeof vol !== \"undefined\" && vol >= 0 && vol <= 1) {\n if (self._state !== \"loaded\" || self._playLock) {\n const capturedArgs = [...arguments] as any[];\n self._queue.push({\n event: \"volume\",\n action: () => self.volume.apply(self, capturedArgs as any),\n });\n return self;\n }\n\n if (typeof id === \"undefined\") {\n self._volume = vol;\n }\n\n const ids = self._getSoundIds(id);\n for (let i = 0; i < ids.length; i++) {\n const sound = self._soundById(ids[i] ?? 0);\n if (!sound) continue;\n\n sound._volume = vol;\n\n // Stop fades unless internal flag says not to.\n if (!internal) self._stopFade(ids[i] ?? 0);\n\n if (self._webAudio && sound._node && !sound._muted && !isHtml5Audio(sound._node)) {\n (sound._node as WebAudioNodeWithSource).gain.setValueAtTime(vol, Howler.ctx!.currentTime);\n } else if (sound._node && !sound._muted && isHtml5Audio(sound._node)) {\n sound._node.volume = vol * (Howler.volume() as number);\n }\n\n self._emit(\"volume\", sound._id);\n }\n\n return self;\n }\n\n // Getter path\n const sound = id ? self._soundById(id) : self._sounds[0];\n return sound ? sound._volume : 0;\n }\n\n /**\n * Fade a currently playing sound between two volumes (if no id is passed, all sounds will fade).\n */\n fade(from: number, to: number, len: number, id?: number): this {\n const self = this;\n\n if (self._state !== \"loaded\" || self._playLock) {\n self._queue.push({\n event: \"fade\",\n action: () => self.fade(from, to, len, id),\n });\n return self;\n }\n\n from = Math.min(Math.max(0, parseFloat(String(from))), 1);\n to = Math.min(Math.max(0, parseFloat(String(to))), 1);\n len = parseFloat(String(len));\n\n self.volume(from, id as any);\n\n const ids = self._getSoundIds(id);\n for (let i = 0; i < ids.length; i++) {\n const sound = self._soundById(ids[i] ?? 0);\n if (!sound) continue;\n\n if (!id) self._stopFade(ids[i] ?? 0);\n\n if (self._webAudio && !sound._muted && sound._node && !isHtml5Audio(sound._node)) {\n const currentTime = Howler.ctx!.currentTime;\n const end = currentTime + len / 1000;\n sound._volume = from;\n (sound._node as WebAudioNodeWithSource).gain.setValueAtTime(from, currentTime);\n (sound._node as WebAudioNodeWithSource).gain.linearRampToValueAtTime(to, end);\n }\n\n self._startFadeInterval(sound, from, to, len, ids[i] ?? 0, typeof id === \"undefined\");\n }\n\n return self;\n }\n\n /**\n * loop() from your snippet.\n */\n loop(): boolean;\n loop(id: number): boolean;\n loop(loop: boolean): this;\n loop(loop: boolean, id: number): this;\n loop(loopOrId?: boolean | number, idMaybe?: number): this | boolean {\n const self = this;\n const argsLen = arguments.length;\n\n let loopVal: boolean = false;\n let id: number | undefined;\n\n if (argsLen === 0) return self._loop;\n\n if (argsLen === 1) {\n if (typeof loopOrId === \"boolean\") {\n loopVal = loopOrId;\n self._loop = loopVal;\n } else {\n const sound = self._soundById(parseInt(String(loopOrId), 10));\n return sound ? sound._loop : false;\n }\n } else if (argsLen === 2) {\n loopVal = loopOrId as boolean;\n id = parseInt(String(idMaybe), 10);\n }\n\n const ids = self._getSoundIds(id);\n for (let i = 0; i < ids.length; i++) {\n const sound = self._soundById(ids[i] ?? 0);\n if (!sound) continue;\n\n sound._loop = loopVal;\n\n if (self._webAudio && sound._node && !isHtml5Audio(sound._node)) {\n const n = sound._node as WebAudioNodeWithSource;\n if (n.bufferSource) {\n n.bufferSource.loop = loopVal as boolean;\n if (loopVal) {\n n.bufferSource.loopStart = sound._start || 0;\n n.bufferSource.loopEnd = sound._stop;\n\n if (self.playing(ids[i])) {\n self.pause(ids[i], true);\n self.play(ids[i], true);\n }\n }\n }\n }\n }\n\n return self;\n }\n\n\n unload(): void {\n const self = this;\n\n const sounds = self._sounds;\n for (let i = 0; i < sounds.length; i++) {\n if (!sounds[i]?._paused) {\n self.stop(sounds[i]?._id);\n }\n\n const currentNode = sounds[i]?._node;\n if (!self._webAudio && currentNode && isHtml5Audio(currentNode)) {\n self._clearSound(currentNode);\n if (\"_errorFn\" in currentNode) {\n currentNode.removeEventListener(\"error\", currentNode._errorFn as EventListener, false);\n }\n if (\"_loadFn\" in currentNode) {\n currentNode.removeEventListener(this.howler._canPlayEvent, currentNode._loadFn as EventListener, false);\n }\n if (\"_endFn\" in currentNode) {\n currentNode.removeEventListener(\"ended\", currentNode._endFn as EventListener, false);\n }\n this.howler._releaseHtml5Audio(currentNode as Html5AudioUnlocked);\n }\n\n delete sounds[i]?._node;\n self._clearTimer(sounds[i]?._id ?? 0);\n }\n\n const index = this.howler._howls.indexOf(self);\n if (index >= 0) this.howler._howls.splice(index, 1);\n\n let remCache = true;\n for (let i = 0; i < this.howler._howls.length; i++) {\n const hs = this.howler._howls[i]?._src.toString();\n if (hs === self._src.toString() || (hs && self._src.indexOf(hs) >= 0)) {\n remCache = false;\n break;\n }\n }\n\n if (this.howler.cache && remCache) {\n delete this.howler.cache[self._src.toString()];\n }\n\n this.howler.noAudio = false;\n\n self._state = \"unloaded\";\n self._sounds = [];\n }\n\n on(event: HowlEventName, fn: HowlEventHandler, id?: number, once?: boolean): this {\n const eventName = \"_on\" + event;\n // @ts-expect-error TODO fix type\n const events = this[eventName] as HowlListener[];\n if (typeof fn === \"function\") {\n events.push(once ? { id, fn, once } : { id, fn });\n }\n return this;\n }\n\n off(event?: HowlEventName, fn?: HowlEventHandler | number, id?: number): this {\n const self = this;\n\n if (typeof fn === \"number\") {\n id = fn;\n fn = undefined;\n }\n\n if (event) {\n const eventName = \"_on\" + event;\n // @ts-expect-error TODO fix type\n const events = self[eventName] as HowlListener[];\n if (fn || id) {\n for (let i = 0; i < events.length; i++) {\n const isId = id === events[i]?.id;\n if ((fn === events[i]?.fn && isId) || (!fn && isId)) {\n events.splice(i, 1);\n break;\n }\n }\n } else {\n // @ts-expect-error TODO fix type\n self[eventName] = [];\n }\n } else {\n const keys = Object.keys(self);\n for (let i = 0; i < keys.length; i++) {\n // @ts-expect-error TODO fix type\n if (keys[i].indexOf(\"_on\") === 0 && Array.isArray((self)[keys[i]])) {\n // @ts-expect-error TODO fix type\n (self)[keys[i]] = [];\n }\n }\n }\n\n return self;\n }\n\n once(event: HowlEventName, fn: HowlEventHandler, id?: number): this {\n return this.on(event, fn, id, true);\n }\n\n /**\n * Starts the internal interval to fade a sound.\n */\n private _startFadeInterval(\n sound: Sound,\n from: number,\n to: number,\n len: number,\n _id: number,\n isGroup: boolean,\n ): void {\n const self = this;\n let vol = from;\n const diff = to - from;\n const steps = Math.abs(diff / 0.01);\n const stepLen = Math.max(4, steps > 0 ? len / steps : len);\n let lastTick = Date.now();\n\n sound._fadeTo = to;\n\n sound._interval = setInterval(() => {\n const tick = (Date.now() - lastTick) / len;\n lastTick = Date.now();\n vol += diff * tick;\n\n vol = Math.round(vol * 100) / 100;\n\n if (diff < 0) vol = Math.max(to, vol);\n else vol = Math.min(to, vol);\n\n if (self._webAudio) {\n sound._volume = vol;\n } else {\n self.volume(vol, sound._id, true);\n }\n\n if (isGroup) self._volume = vol;\n\n if ((to < from && vol <= to) || (to > from && vol >= to)) {\n clearInterval(sound._interval);\n sound._interval = undefined;\n sound._fadeTo = undefined;\n self.volume(to, sound._id);\n self._emit(\"fade\", sound._id);\n }\n }, stepLen);\n }\n\n /**\n * Stop an active fade.\n */\n private _stopFade(id: number): this {\n const self = this;\n const sound = self._soundById(id);\n\n if (sound && sound._interval) {\n if (self._webAudio && sound._node && !isHtml5Audio(sound._node)) {\n (sound._node as WebAudioNodeWithSource).gain.cancelScheduledValues(Howler.ctx?.currentTime ?? 0);\n }\n\n clearInterval(sound._interval);\n sound._interval = undefined;\n\n if (typeof sound._fadeTo === \"number\") {\n self.volume(sound._fadeTo, id);\n }\n sound._fadeTo = undefined;\n self._emit(\"fade\", id);\n }\n\n return self;\n }\n\n _emit(event: HowlEventName, id?: number, errorMsg?: string): this {\n const self = this;\n const eventType = \"_on\" + event;\n // @ts-expect-error TODO fix type\n const events = (self)[eventType] as HowlListener[];\n\n for (let i = events.length - 1; i >= 0; i--) {\n const currentEvent = events[i];\n if (currentEvent && (!currentEvent.id || currentEvent.id === id || event === \"load\")) {\n setTimeout(() => {\n currentEvent?.fn.call(self, id, errorMsg);\n }, 0);\n\n if (currentEvent.once) {\n self.off(event, currentEvent.fn, currentEvent.id);\n }\n }\n }\n\n self._loadQueue(event);\n return self;\n }\n\n _loadQueue(event?: string): this {\n const self = this;\n if (self._queue.length > 0) {\n const task = self._queue[0];\n if (task) {\n if (event && task.event === event) {\n self._queue.shift();\n self._loadQueue();\n }\n if (!event) {\n task.action();\n }\n }\n }\n return self;\n }\n\n _ended(sound: Sound): this {\n const self = this;\n const sprite = sound._sprite;\n\n if (\n !self._webAudio &&\n sound._node &&\n isHtml5Audio(sound._node) &&\n !sound._node.paused &&\n !sound._node.ended &&\n sound._node.currentTime < sound._stop\n ) {\n setTimeout(() => self._ended(sound), 100);\n return self;\n }\n\n const loop = !!(sound._loop || self._sprite[sprite]?.[2]);\n self._emit(\"end\", sound._id);\n\n if (!self._webAudio && loop) {\n self.stop(sound._id, true).play(sound._id);\n }\n\n if (self._webAudio && loop) {\n self._emit(\"play\", sound._id);\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n sound._playStart = this.howler.ctx?.currentTime ?? 0;\n\n const timeout = ((sound._stop - sound._start) * 1000) / Math.abs(sound._rate);\n self._endTimers[sound._id] = setTimeout(() => self._ended(sound), timeout);\n }\n\n if (self._webAudio && !loop) {\n sound._paused = true;\n sound._ended = true;\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n self._clearTimer(sound._id);\n self._cleanBuffer(sound._node as WebAudioNodeWithSource);\n this.howler._autoSuspend();\n }\n\n if (!self._webAudio && !loop) {\n self.stop(sound._id, true);\n }\n\n return self;\n }\n\n _clearTimer(id: number): this {\n const self = this;\n if (self._endTimers[id]) {\n if (typeof self._endTimers[id] !== \"function\") {\n clearTimeout(self._endTimers[id]);\n } else {\n const sound = self._soundById(id);\n if (sound && sound._node && isHtml5Audio(sound._node)) {\n sound._node.removeEventListener(\"ended\", self._endTimers[id], false);\n }\n }\n delete self._endTimers[id];\n }\n return self;\n }\n\n _soundById(id: number): Sound | undefined {\n for (let i = 0; i < this._sounds.length; i++) {\n if (id === this._sounds[i]?._id) {\n return this._sounds[i];\n }\n }\n return undefined;\n }\n\n _inactiveSound(): Sound {\n this._drain();\n for (let i = 0; i < this._sounds.length; i++) {\n if (this._sounds[i]?._ended) {\n const sound = this._sounds[i]?.reset();\n if (sound) {\n return sound;\n }\n }\n }\n return new Sound(this, this.howler);\n }\n\n _drain(): void {\n const limit = this._pool;\n if (this._sounds.length < limit) return;\n\n let cnt = 0;\n for (let i = 0; i < this._sounds.length; i++) {\n if (this._sounds[i]?._ended) {\n cnt++;\n }\n }\n\n for (let i = this._sounds.length - 1; i >= 0; i--) {\n if (cnt <= limit) {\n return;\n }\n if (this._sounds[i]?._ended) {\n const currentNode = this._sounds[i]?._node;\n if (this._webAudio && currentNode && !isHtml5Audio(currentNode)) {\n currentNode[\"disconnect\"]?.(0);\n }\n this._sounds.splice(i, 1);\n cnt--;\n }\n }\n }\n\n _getSoundIds(id?: number): number[] {\n if (typeof id === \"undefined\") return this._sounds.map((s) => s._id);\n return [id];\n }\n\n _refreshBuffer(sound: Sound): void {\n sound._node = sound._node as WebAudioNodeWithSource;\n sound._node.bufferSource = this.howler.ctx?.createBufferSource();\n\n if (!sound._node?.bufferSource) {\n return;\n }\n\n const bufferSource = sound._node.bufferSource;\n bufferSource.buffer = this.howler.cache[this._src.toString()] ?? null;\n if (sound._panner) {\n bufferSource.connect(sound._panner);\n }\n else {\n bufferSource.connect(sound._node);\n }\n bufferSource.loop = sound._loop;\n if (sound._loop) {\n bufferSource.loopStart = sound._start || 0;\n bufferSource.loopEnd = sound._stop || 0;\n }\n\n bufferSource.playbackRate.setValueAtTime(sound._rate, this.howler.ctx?.currentTime ?? 0);\n }\n\n _cleanBuffer(node: WebAudioNodeWithSource): void {\n const isIOS = !!(this.howler._navigator && this.howler._navigator.vendor.indexOf(\"Apple\") >= 0);\n if (!node.bufferSource) {\n return;\n }\n\n if (this.howler._scratchBuffer && node.bufferSource) {\n node.bufferSource.onended = null;\n node.bufferSource.disconnect(0);\n if (isIOS) {\n try {\n node.bufferSource.buffer = this.howler._scratchBuffer;\n } catch {\n // ignore\n }\n }\n }\n node.bufferSource = undefined;\n }\n\n _clearSound(node: HTMLAudioElement): void {\n const checkIE = this.howler._navigator && /MSIE |Trident\\//.test(this.howler._navigator && this.howler._navigator.userAgent);\n if (!checkIE) {\n node.src =\n \"data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA\";\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["sound"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function f(u){return"play"in u&&typeof u.play=="function"}function T(u,e){let n=u._src.toString(),t=e.cache;if(t[n]){u._duration=t[n].duration,x(u);return}if(/^data:[^;]+;base64,/.test(n)){let i=atob(n.split(",")[1]??""),o=new Uint8Array(i.length);for(let s=0;s<i.length;++s)o[s]=i.charCodeAt(s);k(o.buffer,u,e)}else{let i=new XMLHttpRequest;i.open(u._xhr.method,n,!0),i.withCredentials=u._xhr.withCredentials,i.responseType="arraybuffer",u._xhr.headers&&Object.keys(u._xhr.headers).forEach(o=>{i.setRequestHeader(o,u._xhr.headers[o])}),i.onload=()=>{let o=String(i.status)[0];if(o!=="0"&&o!=="2"&&o!=="3"){u._emit("loaderror",void 0,`Failed loading audio file with status: ${i.status}.`);return}k(i.response,u,e)},i.onerror=()=>{u._webAudio&&(u._html5=!0,u._webAudio=!1,u._sounds=[],delete t[n],u.load())},H(i)}}function H(u){try{u.send()}catch{u.onerror?.(new ProgressEvent("error"))}}function k(u,e,n){let t=()=>e._emit("loaderror",void 0,"Decoding audio data failed."),i=o=>{o&&e._sounds.length>0?(n.cache[e._src.toString()]=o,x(e,o)):t()};typeof Promise<"u"&&n.ctx?.decodeAudioData.length===1?n.ctx.decodeAudioData(u).then(i).catch(t):n.ctx?.decodeAudioData(u,i,t)}function x(u,e){e&&!u._duration&&(u._duration=e.duration),Object.keys(u._sprite).length===0&&(u._sprite={__default:[0,u._duration*1e3]}),u._state!=="loaded"&&(u._state="loaded",u._emit("load"),u._loadQueue())}function A(u){if(!u.usingWebAudio)return;try{typeof AudioContext<"u"?u.ctx=new AudioContext:typeof webkitAudioContext<"u"?u.ctx=new webkitAudioContext:u.usingWebAudio=!1}catch{u.usingWebAudio=!1}u.ctx||(u.usingWebAudio=!1);let e=/iP(hone|od|ad)/.test(u._navigator?.platform??""),n=u._navigator?.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/),t=n?parseInt(n[1]??"",10):void 0;if(e&&t&&t<9){let i=/safari/.test((u._navigator?.userAgent??"").toLowerCase());u._navigator&&!i&&(u.usingWebAudio=!1)}u.usingWebAudio&&u.ctx&&(u.masterGain=typeof u.ctx.createGain>"u"?u.ctx.createGainNode():u.ctx.createGain(),u.masterGain?.gain.setValueAtTime(u._muted?0:u._volume,u.ctx.currentTime),u.masterGain?.connect(u.ctx.destination)),u._setup()}var w=class{_counter;_html5AudioPool;html5PoolSize;_codecs;_howls;_muted;_volume;_canPlayEvent;_navigator;_audioUnlocked;_mobileUnloaded;_scratchBuffer;_suspendTimer;_resumeAfterSuspend;cache={};masterGain;noAudio=!1;usingWebAudio=!0;autoSuspend=!0;ctx;autoUnlock=!0;state="suspended";constructor(){this._counter=1e3,this._html5AudioPool=[],this.html5PoolSize=10,this._codecs={},this._howls=[],this._muted=!1,this._volume=1,this._canPlayEvent="canplaythrough",this._navigator=typeof window<"u"&&window.navigator?window.navigator:void 0,this.masterGain=void 0,this.noAudio=!1,this.usingWebAudio=!0,this.autoSuspend=!0,this.ctx=void 0,this.autoUnlock=!0,this._setup()}volume(e){let n=this,t=typeof e>"u"?void 0:parseFloat(String(e));if(n.ctx||A(n),typeof t<"u"&&t>=0&&t<=1){if(n._volume=t,n._muted)return n._volume;n.usingWebAudio&&n.masterGain&&n.ctx&&n.masterGain.gain.setValueAtTime(t,n.ctx.currentTime);for(let i=0;i<n._howls.length;i++){let o=n._howls[i];if(o&&!o._webAudio){let s=o._getSoundIds();for(let d=0;d<s.length;d++){let r=s[d];if(typeof r!="number")continue;let a=o._soundById(r);a&&a._node&&f(a._node)&&(a._node.volume=a._volume*t)}}}return n}return n._volume}mute(e){let n=this;n.ctx||A(n),n._muted=e,n.usingWebAudio&&n.masterGain&&n.ctx&&n.masterGain.gain.setValueAtTime(e?0:n._volume,n.ctx.currentTime);for(let t=0;t<n._howls.length;t++){let i=n._howls[t];if(i&&!i._webAudio){let o=i._getSoundIds();for(let s=0;s<o.length;s++){let d=o[s];if(typeof d!="number")continue;let r=i._soundById(d);r&&r._node&&f(r._node)&&(r._node.muted=e?!0:r._muted)}}}return n}stop(){let e=this;for(let n=0;n<e._howls.length;n++)e._howls[n]?.stop();return e}unload(){let e=this;for(let n=e._howls.length-1;n>=0;n--)e._howls[n]?.unload();return e.usingWebAudio&&e.ctx&&typeof e.ctx.close<"u"&&(e.ctx.close(),e.ctx=void 0,A(e)),e}codecs(e){return this._codecs[e.replace(/^x-/,"")]??!1}_setup(){let e=this;if(e.state=e.ctx&&e.ctx.state||"suspended",e._autoSuspend(),!e.usingWebAudio)if(typeof Audio<"u")try{typeof new Audio().oncanplaythrough>"u"&&(e._canPlayEvent="canplay")}catch{e.noAudio=!0}else e.noAudio=!0;try{new Audio().muted&&(e.noAudio=!0)}catch{}e.noAudio||e._setupCodecs()}_setupCodecs(){let e=this,n;try{n=typeof Audio<"u"?new Audio:void 0}catch{return}if(!n||typeof n.canPlayType!="function")return;let t=n.canPlayType("audio/mpeg;").replace(/^no$/,""),i=e._navigator?e._navigator.userAgent:"",o=i.match(/OPR\/(\d+)/g),s=!!(o&&parseInt(o[0]?.split("/")[1]??"",10)<33),d=i.indexOf("Safari")!==-1&&i.indexOf("Chrome")===-1,r=i.match(/Version\/(.*?) /),a=!!(d&&r&&parseInt(r[1]??"",10)<15);e._codecs={mp3:!!(!s&&(t||n.canPlayType("audio/mp3;").replace(/^no$/,""))),mpeg:!!t,opus:!!n.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/,""),ogg:!!n.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),oga:!!n.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),wav:!!(n.canPlayType('audio/wav; codecs="1"')||n.canPlayType("audio/wav")).replace(/^no$/,""),aac:!!n.canPlayType("audio/aac;").replace(/^no$/,""),caf:!!n.canPlayType("audio/x-caf;").replace(/^no$/,""),m4a:!!(n.canPlayType("audio/x-m4a;")||n.canPlayType("audio/m4a;")||n.canPlayType("audio/aac;")).replace(/^no$/,""),m4b:!!(n.canPlayType("audio/x-m4b;")||n.canPlayType("audio/m4b;")||n.canPlayType("audio/aac;")).replace(/^no$/,""),mp4:!!(n.canPlayType("audio/x-mp4;")||n.canPlayType("audio/mp4;")||n.canPlayType("audio/aac;")).replace(/^no$/,""),weba:!!(!a&&n.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,"")),webm:!!(!a&&n.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,"")),dolby:!!n.canPlayType('audio/mp4; codecs="ec-3"').replace(/^no$/,""),flac:!!(n.canPlayType("audio/x-flac;")||n.canPlayType("audio/flac;")).replace(/^no$/,"")}}_unlockAudio(){let e=this;if(e._audioUnlocked||!e.ctx)return;e._audioUnlocked=!1,e.autoUnlock=!1,!e._mobileUnloaded&&e.ctx.sampleRate!==44100&&(e._mobileUnloaded=!0,e.unload()),e._scratchBuffer=e.ctx.createBuffer(1,1,22050);let n=()=>{for(;e._html5AudioPool.length<e.html5PoolSize;)try{let t=new Audio;t._unlocked=!0,e._releaseHtml5Audio(t)}catch{e.noAudio=!0;break}for(let t=0;t<e._howls.length;t++){let i=e._howls[t];if(i&&!i._webAudio){let o=i._getSoundIds();for(let s=0;s<o.length;s++){let d=o[s];if(typeof d!="number")continue;let r=i._soundById(d);r&&r._node&&f(r._node)&&!r._node._unlocked&&(r._node._unlocked=!0,r._node.load())}}}if(e._autoResume(),e.ctx){let t=e.ctx.createBufferSource();t.buffer=e._scratchBuffer??null,t.connect(e.ctx.destination),typeof t.start>"u"?"noteOn"in t&&typeof t.noteOn=="function"&&t.noteOn(0):t.start(0),typeof e.ctx.resume=="function"&&e.ctx.resume(),t.onended=()=>{t.disconnect(),e._audioUnlocked=!0,document.removeEventListener("touchstart",n,!0),document.removeEventListener("touchend",n,!0),document.removeEventListener("click",n,!0),document.removeEventListener("keydown",n,!0);for(let i=0;i<e._howls.length;i++)e._howls[i]?._emit("unlock")}}};document.addEventListener("touchstart",n,!0),document.addEventListener("touchend",n,!0),document.addEventListener("click",n,!0),document.addEventListener("keydown",n,!0)}_obtainHtml5Audio(){let e=this;return e._html5AudioPool.length?e._html5AudioPool.pop():(new Audio().play().catch(()=>{}),new Audio)}_releaseHtml5Audio(e){let n=this;return e._unlocked&&n._html5AudioPool.push(e),n}_autoSuspend(){let e=this;if(!(!e.autoSuspend||!e.ctx||typeof e.ctx.suspend>"u"||!e.usingWebAudio)){for(let n=0;n<e._howls.length;n++){let t=e._howls[n];if(t&&t._webAudio){for(let i=0;i<t._sounds.length;i++)if(!t._sounds[i]?._paused)return}}e._suspendTimer&&clearTimeout(e._suspendTimer),e._suspendTimer=setTimeout(()=>{if(!e.autoSuspend)return;e._suspendTimer=void 0,e.state="suspending";let n=()=>{e.state="suspended",e._resumeAfterSuspend&&(delete e._resumeAfterSuspend,e._autoResume())};e.ctx?.suspend().then(n,n)},3e4)}}_autoResume(){let e=this;!e.ctx||typeof e.ctx.resume>"u"||!e.usingWebAudio||(e.state==="running"&&e.ctx.state!=="interrupted"&&e._suspendTimer?(clearTimeout(e._suspendTimer),e._suspendTimer=void 0):e.state==="suspended"||e.state==="running"&&e.ctx.state==="interrupted"?(e.ctx.resume().then(()=>{e.state="running";for(let n=0;n<e._howls.length;n++)e._howls[n]?._emit("resume")}),e._suspendTimer&&(clearTimeout(e._suspendTimer),e._suspendTimer=void 0)):e.state==="suspending"&&(e._resumeAfterSuspend=!0))}},p=new w;var g=class{howler;parent;_muted;_loop;_volume;_rate;_seek=0;_rateSeek=0;_paused=!0;_ended=!0;_sprite="__default";_id;_node;_panner;_start=0;_stop=0;_playStart=0;_interval=void 0;_fadeTo=void 0;_errorFn;_loadFn;_endFn;constructor(e,n){this.parent=e,this.howler=n,this._muted=e._muted,this._loop=e._loop,this._volume=e._volume,this._rate=e._rate,this._seek=0,this._paused=!0,this._ended=!0,this._sprite="__default",this._id=++n._counter,e._sounds.push(this);let t=this.howler._muted||this._muted||e._muted?0:this._volume;if(e._webAudio){let i=typeof this.howler.ctx?.createGain>"u"?this.howler.ctx.createGainNode():this.howler.ctx.createGain();this._node=i,this._node.gain.setValueAtTime(t,this.howler.ctx?.currentTime??0),this._node.paused=!0,this.howler.masterGain&&this._node.connect(this.howler.masterGain)}else if(!this.howler.noAudio){this._node=this.howler._obtainHtml5Audio(),this._errorFn=this.errorListener.bind(this),this._node.addEventListener("error",this._errorFn,!1),this._loadFn=this.loadListener.bind(this),this._node.addEventListener(this.howler._canPlayEvent,this._loadFn,!1),this._endFn=this.endListener.bind(this),this._node.addEventListener("ended",this._endFn,!1),this._node.src=e._src.toString();let i=e._preload===!0?"auto":e._preload;this._node.preload=i===!1?"":i,this._node.volume=t*this.howler.volume(),this._node.load()}}reset(){let e=this,n=e.parent;return e._muted=n._muted,e._loop=n._loop,e._volume=n._volume,e._rate=n._rate,e._seek=0,e._rateSeek=0,e._paused=!0,e._ended=!0,e._sprite="__default",e._id=++this.howler._counter,e}errorListener(){let e=this,n=e._node;e.parent._emit("loaderror",e._id,n.error?n.error.code.toString():"0"),n.removeEventListener("error",e._errorFn,!1)}loadListener(){let e=this,n=e.parent,t=e._node;n._duration=Math.ceil(t.duration*10)/10,Object.keys(n._sprite).length===0&&(n._sprite={__default:[0,n._duration*1e3]}),n._state!=="loaded"&&(n._state="loaded",n._emit("load"),n._loadQueue()),t.removeEventListener(this.howler._canPlayEvent,e._loadFn,!1)}endListener(){let e=this,n=e.parent,t=e._node;if(n._duration===1/0){n._duration=Math.ceil(t.duration*10)/10;let i=n._sprite.__default;i&&i[1]===1/0&&(i[1]=n._duration*1e3),n._ended(e)}t.removeEventListener("ended",e._endFn,!1)}};var S=class{howler;_autoplay;_format;_html5;_muted;_loop;_pool;_preload;_rate;_sprite;_src;_volume;_xhr;_duration=0;_state="unloaded";_sounds=[];_endTimers={};_queue=[];_playLock=!1;_webAudio=!0;_onend;_onfade;_onload;_onloaderror;_onplayerror;_onpause;_onplay;_onstop;_onmute;_onvolume;_onrate;_onseek;_onunlock;_onresume;constructor(e){this.howler=p,this.howler.ctx||A(this.howler),this._autoplay=e.autoplay||!1,this._format=typeof e.format!="string"?e.format:[e.format],this._html5=e.html5||!1,this._muted=e.mute||!1,this._loop=e.loop||!1,this._pool=e.pool||5,this._preload=typeof e.preload=="boolean"||e.preload==="metadata"?e.preload:!0,this._rate=e.rate||1,this._sprite=e.sprite||{},this._src=typeof e.src!="string"?e.src:[e.src],this._volume=e.volume!==void 0?e.volume:1,this._xhr={method:e.xhr?.method??"GET",headers:e.xhr?.headers??void 0,withCredentials:e.xhr?.withCredentials??!1},this._duration=0,this._state="unloaded",this._sounds=[],this._endTimers={},this._queue=[],this._playLock=!1,this._onend=e.onend?[{fn:e.onend}]:[],this._onfade=e.onfade?[{fn:e.onfade}]:[],this._onload=e.onload?[{fn:e.onload}]:[],this._onloaderror=e.onloaderror?[{fn:e.onloaderror}]:[],this._onplayerror=e.onplayerror?[{fn:e.onplayerror}]:[],this._onpause=e.onpause?[{fn:e.onpause}]:[],this._onplay=e.onplay?[{fn:e.onplay}]:[],this._onstop=e.onstop?[{fn:e.onstop}]:[],this._onmute=e.onmute?[{fn:e.onmute}]:[],this._onvolume=e.onvolume?[{fn:e.onvolume}]:[],this._onrate=e.onrate?[{fn:e.onrate}]:[],this._onseek=e.onseek?[{fn:e.onseek}]:[],this._onunlock=e.onunlock?[{fn:e.onunlock}]:[],this._onresume=e.onresume?[{fn:e.onresume}]:[],this._webAudio=this.howler.usingWebAudio&&!this._html5,this.howler.ctx&&this.howler.autoUnlock&&this.howler._unlockAudio(),this.howler._howls.push(this),this._autoplay&&this._queue.push({event:"play",action:()=>this.play()}),this._preload&&this._preload!=="none"&&this.load()}load(){let e=this;if(this.howler.noAudio){e._emit("loaderror",void 0,"No audio support.");return}let n;for(let t=0;t<e._src.length;t++){let i,o;if(e._format&&e._format[t])i=e._format[t];else{if(o=e._src[t]??"",typeof o!="string"||o===""){e._emit("loaderror",void 0,"Non-string found in selected audio sources - ignoring.");continue}let s=/^data:audio\/([^;,]+);/i.exec(o);if(s)i=s[1]?.toLowerCase();else{let d=/\.([^.]+)$/.exec(o.split("?",1)[0]??"");d&&(i=d[1]?.toLowerCase())}}if(i&&this.howler.codecs(i)){n=e._src[t];break}}if(!n){e._emit("loaderror",void 0,"No codec support for selected audio sources.");return}e._src=[n],e._state="loading",typeof window<"u"&&window.location.protocol==="https:"&&n.slice(0,5)==="http:"&&(e._html5=!0,e._webAudio=!1),new g(e,this.howler),e._webAudio&&T(e,this.howler)}play(e,n){let t=this,i;if(typeof e=="number")i=e,e=void 0;else{if(typeof e=="string"&&t._state==="loaded"&&!t._sprite[e])return;if(typeof e>"u"&&(e="__default",!t._playLock)){let _=0;for(let h=0;h<t._sounds.length;h++)t._sounds[h]?._paused&&!t._sounds[h]?._ended&&(_++,i=t._sounds[h]?._id);_===1?e=void 0:i=void 0}}let o=i?t._soundById(i):t._inactiveSound();if(!o)return;if(i&&!e&&(e=o._sprite||"__default"),t._state!=="loaded"){o._sprite=e?.toString()??"__default",o._ended=!1;let _=o._id;return t._queue.push({event:"play",action:()=>t.play(_)}),_}if(i&&!o._paused)return n||t._loadQueue("play"),o._id;t._webAudio&&this.howler._autoResume();let s=e??"__default",d=Math.max(0,o._seek>0?o._seek:(t._sprite[s]?.[0]??0)/1e3),r=t._sprite[s],a=r?Math.max(0,(r[0]+r[1])/1e3-d):0,l=a*1e3/Math.abs(o._rate),c=r?r[0]/1e3:0,y=r?(r[0]+r[1])/1e3:0;o._sprite=s,o._ended=!1;let b=()=>{o._paused=!1,o._seek=d,o._start=c,o._stop=y,o._loop=!!(o._loop||(t._sprite[s]?.[2]??!1))};if(d>=y)return t._ended(o),o._id;let v=o._node;if(t._webAudio){let _=()=>{t._playLock=!1,b(),t._refreshBuffer(o);let h=o._muted||t._muted?0:o._volume;v.gain.setValueAtTime(h,this.howler.ctx?.currentTime??0),o._playStart=this.howler.ctx?.currentTime??0;let m=v.bufferSource;typeof m.start>"u"?"noteGrainOn"in m&&typeof m.noteGrainOn=="function"&&(o._loop?m.noteGrainOn(0,d,86400):m.noteGrainOn(0,d,a)):o._loop?m.start(0,d,86400):m.start(0,d,a),l!==1/0&&(t._endTimers[o._id]=setTimeout(()=>t._ended(o),l)),n||setTimeout(()=>{t._emit("play",o._id),t._loadQueue()},0)};this.howler.state==="running"&&this.howler.ctx?.state!=="interrupted"?_():(t._playLock=!0,t.once("resume",()=>{_()}),t._clearTimer(o._id))}else{let _=v,h=()=>{_.currentTime=d,_.muted=o._muted||t._muted||this.howler._muted||_.muted,_.volume=o._volume*this.howler.volume(),_.playbackRate=o._rate;try{let m=_.play();if(m&&typeof Promise<"u"&&(m instanceof Promise||typeof m.then=="function")?(t._playLock=!0,b(),m.then(()=>{t._playLock=!1,_._unlocked=!0,n?t._loadQueue():t._emit("play",o._id)}).catch(()=>{t._playLock=!1,t._emit("playerror",o._id,"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction."),o._ended=!0,o._paused=!0})):n||(t._playLock=!1,b(),t._emit("play",o._id)),_.playbackRate=o._rate,_.paused){t._emit("playerror",o._id,"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.");return}s!=="__default"||o._loop?t._endTimers[o._id]=setTimeout(()=>t._ended(o),l):(t._endTimers[o._id]=()=>{t._ended(o),_.removeEventListener("ended",t._endTimers[o._id],!1)},_.addEventListener("ended",t._endTimers[o._id],!1))}catch(m){t._emit("playerror",o._id,m)}};if(_.src==="data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA"&&(_.src=t._src.toString(),_.load()),_.readyState>=3)h();else{t._playLock=!0,t._state="loading";let m=()=>{t._state="loaded",h(),_.removeEventListener(this.howler._canPlayEvent,m,!1)};_.addEventListener(this.howler._canPlayEvent,m,!1),t._clearTimer(o._id)}}return o._id}state(){return this._state}playing(e){let n=this;if(typeof e=="number"){let t=n._soundById(e);return t?!t._paused:!1}for(let t=0;t<n._sounds.length;t++)if(!n._sounds[t]?._paused)return!0;return!1}duration(e){let n=this,t=n._duration,i=typeof e=="number"?n._soundById(e):void 0;return i&&(t=(n._sprite[i._sprite]?.[1]??0)/1e3),t}pause(e,n){let t=this;if(t._state!=="loaded"||t._playLock)return t._queue.push({event:"pause",action:()=>t.pause(e)}),t;let i=t._getSoundIds(e);for(let o=0;o<i.length;o++){t._clearTimer(i[o]??0);let s=t._soundById(i[o]??0);if(s&&!s._paused&&(s._seek=t.seek(i[o]??0),s._rateSeek=0,s._paused=!0,t._stopFade(i[o]??0),s._node))if(t._webAudio&&!f(s._node)){let d=s._node;if(!d.bufferSource)continue;typeof d.bufferSource.stop>"u"?d.bufferSource.noteOff(0):d.bufferSource.stop(0),t._cleanBuffer(d)}else f(s._node)&&(!isNaN(s._node.duration)||s._node.duration===1/0)&&s._node.pause();n||t._emit("pause",s?s._id:void 0)}return t}rate(e,n){let t=this,i=arguments.length,o,s;if(i===0?s=t._sounds[0]?._id:i===1?t._getSoundIds().indexOf(e)>=0?s=parseInt(String(e),10):o=parseFloat(String(e)):i===2&&(o=parseFloat(String(e)),s=parseInt(String(n),10)),typeof o=="number"){if(t._state!=="loaded"||t._playLock){let a=[...arguments];return t._queue.push({event:"rate",action:()=>t.rate.apply(t,a)}),t}typeof s>"u"&&(t._rate=o);let r=t._getSoundIds(s);for(let a=0;a<r.length;a++){let l=t._soundById(r[a]??0);if(!l)continue;if(t.playing(r[a])&&(l._rateSeek=t.seek(r[a]??0),l._playStart=t._webAudio?p.ctx.currentTime:l._playStart),l._rate=o,t._webAudio&&l._node&&!f(l._node)){let h=l._node;h.bufferSource&&h.bufferSource.playbackRate.setValueAtTime(o,p.ctx.currentTime)}else l._node&&f(l._node)&&(l._node.playbackRate=o);let c=t.seek(r[a]??0),y=t._sprite[l._sprite],v=(y?(y[0]+y[1])/1e3-c:0)*1e3/Math.abs(l._rate),_=r[a];(typeof _=="number"&&t._endTimers[_]||!l._paused)&&typeof _=="number"&&(t._clearTimer(_),t._endTimers[_]=setTimeout(()=>t._ended(l),v)),t._emit("rate",l._id)}return t}let d=s?t._soundById(s):void 0;return d?d._rate:t._rate}seek(e,n){let t=this,i=arguments.length,o,s;if(i===0?t._sounds.length&&(s=t._sounds[0]?._id):i===1?t._getSoundIds().indexOf(e)>=0?s=parseInt(String(e),10):t._sounds.length&&(s=t._sounds[0]?._id,o=parseFloat(String(e))):i===2&&(o=parseFloat(String(e)),s=parseInt(String(n),10)),typeof s>"u")return 0;if(typeof o=="number"&&(t._state!=="loaded"||t._playLock)){let r=[...arguments];return t._queue.push({event:"seek",action:()=>t.seek.apply(t,r)}),t}let d=t._soundById(s);if(!d)return t;if(typeof o=="number"&&o>=0){let r=t.playing(s);r&&t.pause(s,!0),d._seek=o,d._ended=!1,t._clearTimer(s),!t._webAudio&&d._node&&f(d._node)&&!isNaN(d._node.duration)&&(d._node.currentTime=o);let a=()=>{r&&t.play(s,!0),t._emit("seek",s)};if(r&&!t._webAudio){let l=()=>{t._playLock?setTimeout(l,0):a()};setTimeout(l,0)}else a();return t}if(t._webAudio){let r=t.playing(s)?p.ctx.currentTime-d._playStart:0,a=d._rateSeek?d._rateSeek-d._seek:0;return d._seek+(a+r*Math.abs(d._rate))}return d._node&&f(d._node)?d._node.currentTime:0}stop(e,n){if(typeof e>"u"){let i=this._getSoundIds();for(let o of i)this.stop(o,n);return this}let t=this._soundById(e);if(t){if(this._clearTimer(e),t._seek=t._start||0,t._rateSeek=0,t._paused=!0,t._ended=!0,t._node){if(this._webAudio){let i=t._node;i.bufferSource&&(typeof i.bufferSource.stop>"u"?"noteOff"in i.bufferSource&&typeof i.bufferSource.noteOff=="function"&&i.bufferSource.noteOff(0):i.bufferSource.stop(0),this._cleanBuffer(i))}else if(f(t._node)){let i=t._node;i.currentTime=t._start||0,i.pause(),i.duration===1/0&&this._clearSound(i)}}n||this._emit("stop",t._id)}return this}mute(e,n){let t=this;if(typeof n>"u"&&typeof e!="boolean")return t._muted;if(t._state!=="loaded"||t._playLock)return t._queue.push({event:"mute",action:()=>{t.mute(e,n)}}),t;typeof n>"u"&&typeof e=="boolean"&&(t._muted=e);let i=t._getSoundIds(n);for(let o=0;o<i.length;o++){let s=t._soundById(i[o]??0);s&&(s._muted=e,s._interval&&t._stopFade(s._id),t._webAudio&&s._node&&!f(s._node)?s._node.gain.setValueAtTime(e?0:s._volume,p.ctx.currentTime):s._node&&f(s._node)&&(s._node.muted=p._muted?!0:e),t._emit("mute",s._id))}return t}volume(e,n,t){let i=this,o=arguments.length,s,d;if(o===0)return i._volume;if(o===1||o===2&&typeof n>"u"?i._getSoundIds().indexOf(e)>=0?d=parseInt(String(e),10):s=parseFloat(String(e)):o>=2&&(s=parseFloat(String(e)),d=parseInt(String(n),10)),typeof s<"u"&&s>=0&&s<=1){if(i._state!=="loaded"||i._playLock){let l=[...arguments];return i._queue.push({event:"volume",action:()=>i.volume.apply(i,l)}),i}typeof d>"u"&&(i._volume=s);let a=i._getSoundIds(d);for(let l=0;l<a.length;l++){let c=i._soundById(a[l]??0);c&&(c._volume=s,t||i._stopFade(a[l]??0),i._webAudio&&c._node&&!c._muted&&!f(c._node)?c._node.gain.setValueAtTime(s,p.ctx.currentTime):c._node&&!c._muted&&f(c._node)&&(c._node.volume=s*p.volume()),i._emit("volume",c._id))}return i}let r=d?i._soundById(d):i._sounds[0];return r?r._volume:0}fade(e,n,t,i){let o=this;if(o._state!=="loaded"||o._playLock)return o._queue.push({event:"fade",action:()=>o.fade(e,n,t,i)}),o;e=Math.min(Math.max(0,parseFloat(String(e))),1),n=Math.min(Math.max(0,parseFloat(String(n))),1),t=parseFloat(String(t)),o.volume(e,i);let s=o._getSoundIds(i);for(let d=0;d<s.length;d++){let r=o._soundById(s[d]??0);if(r){if(i||o._stopFade(s[d]??0),o._webAudio&&!r._muted&&r._node&&!f(r._node)){let a=p.ctx.currentTime,l=a+t/1e3;r._volume=e,r._node.gain.setValueAtTime(e,a),r._node.gain.linearRampToValueAtTime(n,l)}o._startFadeInterval(r,e,n,t,s[d]??0,typeof i>"u")}}return o}loop(e,n){let t=this,i=arguments.length,o=!1,s;if(i===0)return t._loop;if(i===1)if(typeof e=="boolean")o=e,t._loop=o;else{let r=t._soundById(parseInt(String(e),10));return r?r._loop:!1}else i===2&&(o=e,s=parseInt(String(n),10));let d=t._getSoundIds(s);for(let r=0;r<d.length;r++){let a=t._soundById(d[r]??0);if(a&&(a._loop=o,t._webAudio&&a._node&&!f(a._node))){let l=a._node;l.bufferSource&&(l.bufferSource.loop=o,o&&(l.bufferSource.loopStart=a._start||0,l.bufferSource.loopEnd=a._stop,t.playing(d[r])&&(t.pause(d[r],!0),t.play(d[r],!0))))}}return t}unload(){let e=this,n=e._sounds;for(let o=0;o<n.length;o++){n[o]?._paused||e.stop(n[o]?._id);let s=n[o]?._node;!e._webAudio&&s&&f(s)&&(e._clearSound(s),"_errorFn"in s&&s.removeEventListener("error",s._errorFn,!1),"_loadFn"in s&&s.removeEventListener(this.howler._canPlayEvent,s._loadFn,!1),"_endFn"in s&&s.removeEventListener("ended",s._endFn,!1),this.howler._releaseHtml5Audio(s)),delete n[o]?._node,e._clearTimer(n[o]?._id??0)}let t=this.howler._howls.indexOf(e);t>=0&&this.howler._howls.splice(t,1);let i=!0;for(let o=0;o<this.howler._howls.length;o++){let s=this.howler._howls[o]?._src.toString();if(s===e._src.toString()||s&&e._src.indexOf(s)>=0){i=!1;break}}this.howler.cache&&i&&delete this.howler.cache[e._src.toString()],this.howler.noAudio=!1,e._state="unloaded",e._sounds=[]}on(e,n,t,i){let o="_on"+e,s=this[o];return typeof n=="function"&&s.push(i?{id:t,fn:n,once:i}:{id:t,fn:n}),this}off(e,n,t){let i=this;if(typeof n=="number"&&(t=n,n=void 0),e){let o="_on"+e,s=i[o];if(n||t)for(let d=0;d<s.length;d++){let r=t===s[d]?.id;if(n===s[d]?.fn&&r||!n&&r){s.splice(d,1);break}}else i[o]=[]}else{let o=Object.keys(i);for(let s=0;s<o.length;s++)o[s].indexOf("_on")===0&&Array.isArray(i[o[s]])&&(i[o[s]]=[])}return i}once(e,n,t){return this.on(e,n,t,!0)}_startFadeInterval(e,n,t,i,o,s){let d=this,r=n,a=t-n,l=Math.abs(a/.01),c=Math.max(4,l>0?i/l:i),y=Date.now();e._fadeTo=t,e._interval=setInterval(()=>{let b=(Date.now()-y)/i;y=Date.now(),r+=a*b,r=Math.round(r*100)/100,a<0?r=Math.max(t,r):r=Math.min(t,r),d._webAudio?e._volume=r:d.volume(r,e._id,!0),s&&(d._volume=r),(t<n&&r<=t||t>n&&r>=t)&&(clearInterval(e._interval),e._interval=void 0,e._fadeTo=void 0,d.volume(t,e._id),d._emit("fade",e._id))},c)}_stopFade(e){let n=this,t=n._soundById(e);return t&&t._interval&&(n._webAudio&&t._node&&!f(t._node)&&t._node.gain.cancelScheduledValues(p.ctx?.currentTime??0),clearInterval(t._interval),t._interval=void 0,typeof t._fadeTo=="number"&&n.volume(t._fadeTo,e),t._fadeTo=void 0,n._emit("fade",e)),n}_emit(e,n,t){let i=this,o="_on"+e,s=i[o];for(let d=s.length-1;d>=0;d--){let r=s[d];r&&(!r.id||r.id===n||e==="load")&&(setTimeout(()=>{r?.fn.call(i,n,t)},0),r.once&&i.off(e,r.fn,r.id))}return i._loadQueue(e),i}_loadQueue(e){let n=this;if(n._queue.length>0){let t=n._queue[0];t&&(e&&t.event===e&&(n._queue.shift(),n._loadQueue()),e||t.action())}return n}_ended(e){let n=this,t=e._sprite;if(!n._webAudio&&e._node&&f(e._node)&&!e._node.paused&&!e._node.ended&&e._node.currentTime<e._stop)return setTimeout(()=>n._ended(e),100),n;let i=!!(e._loop||n._sprite[t]?.[2]);if(n._emit("end",e._id),!n._webAudio&&i&&n.stop(e._id,!0).play(e._id),n._webAudio&&i){n._emit("play",e._id),e._seek=e._start||0,e._rateSeek=0,e._playStart=this.howler.ctx?.currentTime??0;let o=(e._stop-e._start)*1e3/Math.abs(e._rate);n._endTimers[e._id]=setTimeout(()=>n._ended(e),o)}return n._webAudio&&!i&&(e._paused=!0,e._ended=!0,e._seek=e._start||0,e._rateSeek=0,n._clearTimer(e._id),n._cleanBuffer(e._node),this.howler._autoSuspend()),!n._webAudio&&!i&&n.stop(e._id,!0),n}_clearTimer(e){let n=this;if(n._endTimers[e]){if(typeof n._endTimers[e]!="function")clearTimeout(n._endTimers[e]);else{let t=n._soundById(e);t&&t._node&&f(t._node)&&t._node.removeEventListener("ended",n._endTimers[e],!1)}delete n._endTimers[e]}return n}_soundById(e){for(let n=0;n<this._sounds.length;n++)if(e===this._sounds[n]?._id)return this._sounds[n]}_inactiveSound(){this._drain();for(let e=0;e<this._sounds.length;e++)if(this._sounds[e]?._ended){let n=this._sounds[e]?.reset();if(n)return n}return new g(this,this.howler)}_drain(){let e=this._pool;if(this._sounds.length<e)return;let n=0;for(let t=0;t<this._sounds.length;t++)this._sounds[t]?._ended&&n++;for(let t=this._sounds.length-1;t>=0;t--){if(n<=e)return;if(this._sounds[t]?._ended){let i=this._sounds[t]?._node;this._webAudio&&i&&!f(i)&&i.disconnect?.(0),this._sounds.splice(t,1),n--}}}_getSoundIds(e){return typeof e>"u"?this._sounds.map(n=>n._id):[e]}_refreshBuffer(e){if(e._node=e._node,e._node.bufferSource=this.howler.ctx?.createBufferSource(),!e._node?.bufferSource)return;let n=e._node.bufferSource;n.buffer=this.howler.cache[this._src.toString()]??null,e._panner?n.connect(e._panner):n.connect(e._node),n.loop=e._loop,e._loop&&(n.loopStart=e._start||0,n.loopEnd=e._stop||0),n.playbackRate.setValueAtTime(e._rate,this.howler.ctx?.currentTime??0)}_cleanBuffer(e){let n=!!(this.howler._navigator&&this.howler._navigator.vendor.indexOf("Apple")>=0);if(e.bufferSource){if(this.howler._scratchBuffer&&e.bufferSource&&(e.bufferSource.onended=null,e.bufferSource.disconnect(0),n))try{e.bufferSource.buffer=this.howler._scratchBuffer}catch{}e.bufferSource=void 0}}_clearSound(e){this.howler._navigator&&/MSIE |Trident\//.test(this.howler._navigator&&this.howler._navigator.userAgent)||(e.src="data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA")}};export{S as Howl,p as Howler};
|
|
2
|
+
//# sourceMappingURL=wolf.min.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils.ts", "../src/howler.ts", "../src/sound.ts", "../src/howl.ts"],
|
|
4
|
+
"sourcesContent": ["import type { Howl } from \"./howl.js\";\nimport type { Html5AudioUnlocked, SoundNode } from \"./types.js\";\nimport type { Howler } from \"./howler.js\";\n\ndeclare const webkitAudioContext: typeof AudioContext | undefined;\n\nexport function isHtml5Audio(node: SoundNode): node is Html5AudioUnlocked {\n return \"play\" in node && typeof node.play === \"function\";\n}\n\nexport function loadBuffer(howl: Howl, howler: typeof Howler): void {\n const url = howl._src.toString();\n const cache = howler.cache;\n\n if (cache[url]) {\n howl._duration = cache[url].duration;\n loadSound(howl);\n return;\n }\n\n if (/^data:[^;]+;base64,/.test(url)) {\n const data = atob(url.split(\",\")[1] ?? \"\");\n const dataView = new Uint8Array(data.length);\n for (let i = 0; i < data.length; ++i) {\n dataView[i] = data.charCodeAt(i);\n }\n decodeAudioData(dataView.buffer, howl, howler);\n } else {\n const xhr = new XMLHttpRequest();\n xhr.open(howl._xhr.method, url, true);\n xhr.withCredentials = howl._xhr.withCredentials;\n xhr.responseType = \"arraybuffer\";\n\n if (howl._xhr.headers) {\n Object.keys(howl._xhr.headers).forEach((key) => {\n xhr.setRequestHeader(key, howl._xhr.headers![key]!);\n });\n }\n\n xhr.onload = () => {\n const code = String(xhr.status)[0];\n if (code !== \"0\" && code !== \"2\" && code !== \"3\") {\n howl._emit(\"loaderror\", undefined, `Failed loading audio file with status: ${xhr.status}.`);\n return;\n }\n decodeAudioData(xhr.response, howl, howler);\n };\n\n xhr.onerror = () => {\n if (howl._webAudio) {\n howl._html5 = true;\n howl._webAudio = false;\n howl._sounds = [];\n delete cache[url];\n howl.load();\n }\n };\n\n safeXhrSend(xhr);\n }\n}\n\nexport function safeXhrSend(xhr: XMLHttpRequest): void {\n try {\n xhr.send();\n } catch {\n xhr.onerror?.(new ProgressEvent(\"error\"));\n }\n}\n\nfunction decodeAudioData(arrayBuffer: ArrayBuffer, howl: Howl, howler: typeof Howler): void {\n const error = () => howl._emit(\"loaderror\", undefined, \"Decoding audio data failed.\");\n\n const success = (buffer: AudioBuffer) => {\n if (buffer && howl._sounds.length > 0) {\n howler.cache[howl._src.toString()] = buffer;\n loadSound(howl, buffer);\n } else {\n error();\n }\n };\n\n // Promise form (newer) vs callback form (older)\n if (typeof Promise !== \"undefined\" && howler.ctx?.decodeAudioData.length === 1) {\n howler.ctx.decodeAudioData(arrayBuffer).then(success).catch(error);\n } else {\n howler.ctx?.decodeAudioData(arrayBuffer, success, error);\n }\n}\n\nexport function loadSound(self: Howl, buffer?: AudioBuffer): void {\n if (buffer && !self._duration) self._duration = buffer.duration;\n\n if (Object.keys(self._sprite).length === 0) {\n self._sprite = { \"__default\": [0, self._duration * 1000] };\n }\n\n if (self._state !== \"loaded\") {\n self._state = \"loaded\";\n self._emit(\"load\");\n self._loadQueue();\n }\n}\n\nexport function setupAudioContext(howler: typeof Howler): void {\n if (!howler.usingWebAudio) {\n return;\n }\n\n try {\n if (typeof AudioContext !== \"undefined\") {\n howler.ctx = new AudioContext();\n } else if (typeof webkitAudioContext !== \"undefined\") {\n howler.ctx = new webkitAudioContext();\n } else {\n howler.usingWebAudio = false;\n }\n } catch {\n howler.usingWebAudio = false;\n }\n\n if (!howler.ctx) {\n howler.usingWebAudio = false;\n }\n\n const iOS = /iP(hone|od|ad)/.test(howler._navigator?.platform ?? \"\");\n const appVersion = howler._navigator?.appVersion.match(/OS (\\d+)_(\\d+)_?(\\d+)?/);\n const version = appVersion ? parseInt(appVersion[1] ?? \"\", 10) : undefined;\n\n if (iOS && version && version < 9) {\n const safari = /safari/.test((howler._navigator?.userAgent ?? \"\").toLowerCase());\n if (howler._navigator && !safari) {\n howler.usingWebAudio = false;\n }\n }\n\n if (howler.usingWebAudio && howler.ctx) {\n howler.masterGain =\n typeof howler.ctx.createGain === \"undefined\"\n // @ts-expect-error this is type safe\n ? howler.ctx[\"createGainNode\"]()\n : howler.ctx.createGain();\n howler.masterGain?.gain.setValueAtTime(howler._muted ? 0 : howler._volume, howler.ctx.currentTime);\n howler.masterGain?.connect(howler.ctx.destination);\n }\n\n howler._setup();\n}\n", "import type { Howl } from \"./howl.js\";\nimport type { HowlerState, Html5AudioUnlocked } from \"./types.js\";\nimport { isHtml5Audio, setupAudioContext } from \"./utils.js\";\n\nclass HowlerGlobal {\n // Internal\n _counter: number;\n _html5AudioPool: Html5AudioUnlocked[];\n html5PoolSize: number;\n\n _codecs: Record<string, boolean>;\n _howls: Howl[];\n _muted: boolean;\n _volume: number;\n _canPlayEvent: \"canplaythrough\" | \"canplay\";\n readonly _navigator?: Navigator;\n\n _audioUnlocked?: boolean;\n _mobileUnloaded?: boolean;\n _scratchBuffer?: AudioBuffer;\n _suspendTimer?: ReturnType<typeof setTimeout>;\n _resumeAfterSuspend?: boolean;\n\n // Public\n cache: Record<string, AudioBuffer> = {};\n masterGain?: GainNode;\n noAudio = false;\n usingWebAudio = true;\n autoSuspend = true;\n ctx?: AudioContext;\n autoUnlock = true;\n\n state: HowlerState = \"suspended\";\n\n constructor() {\n this._counter = 1000;\n this._html5AudioPool = [];\n this.html5PoolSize = 10;\n\n this._codecs = {};\n this._howls = [];\n this._muted = false;\n this._volume = 1;\n this._canPlayEvent = \"canplaythrough\";\n this._navigator =\n typeof window !== \"undefined\" && window.navigator ? window.navigator : undefined;\n\n this.masterGain = undefined;\n this.noAudio = false;\n this.usingWebAudio = true;\n this.autoSuspend = true;\n this.ctx = undefined;\n\n this.autoUnlock = true;\n\n this._setup();\n }\n\n volume(): number;\n volume(volume: number): this;\n volume(vol?: number): number | this {\n const self = this;\n const parsed = typeof vol === \"undefined\" ? undefined : parseFloat(String(vol));\n\n if (!self.ctx) {\n setupAudioContext(self);\n }\n\n if (typeof parsed !== \"undefined\" && parsed >= 0 && parsed <= 1) {\n self._volume = parsed;\n\n if (self._muted) return self._volume;\n\n if (self.usingWebAudio && self.masterGain && self.ctx) {\n self.masterGain.gain.setValueAtTime(parsed, self.ctx.currentTime);\n }\n\n for (let i = 0; i < self._howls.length; i++) {\n const howl = self._howls[i];\n if (howl && !howl._webAudio) {\n const ids = howl._getSoundIds();\n for (let j = 0; j < ids.length; j++) {\n const soundId = ids[j];\n if (typeof soundId !== \"number\") {\n continue;\n }\n const sound = howl._soundById(soundId);\n if (sound && sound._node && isHtml5Audio(sound._node)) {\n sound._node.volume = sound._volume * parsed;\n }\n }\n }\n }\n\n return self;\n }\n\n return self._volume;\n }\n\n mute(muted: boolean): this {\n const self = this;\n\n if (!self.ctx) {\n setupAudioContext(self);\n }\n\n self._muted = muted;\n\n if (self.usingWebAudio && self.masterGain && self.ctx) {\n self.masterGain.gain.setValueAtTime(\n muted ? 0 : self._volume,\n self.ctx.currentTime,\n );\n }\n\n for (let i = 0; i < self._howls.length; i++) {\n const howl = self._howls[i];\n if (howl && !howl._webAudio) {\n const ids = howl._getSoundIds();\n for (let j = 0; j < ids.length; j++) {\n const soundId = ids[j];\n if (typeof soundId !== \"number\") {\n continue;\n }\n const sound = howl._soundById(soundId);\n if (sound && sound._node && isHtml5Audio(sound._node)) {\n sound._node.muted = muted ? true : sound._muted;\n }\n }\n }\n }\n\n return self;\n }\n\n stop(): this {\n const self = this;\n for (let i = 0; i < self._howls.length; i++) {\n self._howls[i]?.stop();\n }\n return self;\n }\n\n unload(): this {\n const self = this;\n\n for (let i = self._howls.length - 1; i >= 0; i--) {\n self._howls[i]?.unload();\n }\n\n if (self.usingWebAudio && self.ctx && typeof self.ctx.close !== \"undefined\") {\n self.ctx.close();\n self.ctx = undefined;\n setupAudioContext(self);\n }\n return self;\n }\n\n codecs(ext: string): boolean {\n return this._codecs[ext.replace(/^x-/, \"\")] ?? false;\n }\n\n _setup(): void {\n const self = this;\n\n self.state = self.ctx ? ((self.ctx.state as HowlerState) || \"suspended\") : \"suspended\";\n self._autoSuspend();\n\n if (!self.usingWebAudio) {\n if (typeof Audio !== \"undefined\") {\n try {\n const test = new Audio();\n if (typeof test.oncanplaythrough === \"undefined\") {\n self._canPlayEvent = \"canplay\";\n }\n } catch {\n self.noAudio = true;\n }\n } else {\n self.noAudio = true;\n }\n }\n\n try {\n const test = new Audio();\n if (test.muted) self.noAudio = true;\n } catch {\n // ignore\n }\n\n if (!self.noAudio) {\n self._setupCodecs();\n }\n }\n\n _setupCodecs(): void {\n const self = this;\n\n let audioTest: HTMLAudioElement | undefined = undefined;\n try {\n audioTest = typeof Audio !== \"undefined\" ? new Audio() : undefined;\n } catch {\n // no-op\n return;\n }\n\n if (!audioTest || typeof audioTest.canPlayType !== \"function\") {\n // no-op\n return;\n }\n\n const mpegTest = audioTest.canPlayType(\"audio/mpeg;\").replace(/^no$/, \"\");\n\n const ua = self._navigator ? self._navigator.userAgent : \"\";\n const checkOpera = ua.match(/OPR\\/(\\d+)/g);\n const isOldOpera = !!(checkOpera && parseInt((checkOpera[0]?.split(\"/\")[1]) ?? '', 10) < 33);\n const checkSafari = ua.indexOf(\"Safari\") !== -1 && ua.indexOf(\"Chrome\") === -1;\n const safariVersion = ua.match(/Version\\/(.*?) /);\n const isOldSafari = !!(checkSafari && safariVersion && parseInt(safariVersion[1] ?? '', 10) < 15);\n\n self._codecs = {\n \"mp3\": !!(!isOldOpera && (mpegTest || audioTest.canPlayType(\"audio/mp3;\").replace(/^no$/, \"\"))),\n \"mpeg\": !!mpegTest,\n \"opus\": !!audioTest.canPlayType('audio/ogg; codecs=\"opus\"').replace(/^no$/, \"\"),\n \"ogg\": !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, \"\"),\n \"oga\": !!audioTest.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, \"\"),\n \"wav\": !!(\n audioTest.canPlayType('audio/wav; codecs=\"1\"') || audioTest.canPlayType(\"audio/wav\")\n ).replace(/^no$/, \"\"),\n \"aac\": !!audioTest.canPlayType(\"audio/aac;\").replace(/^no$/, \"\"),\n \"caf\": !!audioTest.canPlayType(\"audio/x-caf;\").replace(/^no$/, \"\"),\n \"m4a\": !!(\n audioTest.canPlayType(\"audio/x-m4a;\") ||\n audioTest.canPlayType(\"audio/m4a;\") ||\n audioTest.canPlayType(\"audio/aac;\")\n ).replace(/^no$/, \"\"),\n \"m4b\": !!(\n audioTest.canPlayType(\"audio/x-m4b;\") ||\n audioTest.canPlayType(\"audio/m4b;\") ||\n audioTest.canPlayType(\"audio/aac;\")\n ).replace(/^no$/, \"\"),\n \"mp4\": !!(\n audioTest.canPlayType(\"audio/x-mp4;\") ||\n audioTest.canPlayType(\"audio/mp4;\") ||\n audioTest.canPlayType(\"audio/aac;\")\n ).replace(/^no$/, \"\"),\n \"weba\": !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, \"\")),\n \"webm\": !!(!isOldSafari && audioTest.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, \"\")),\n \"dolby\": !!audioTest.canPlayType('audio/mp4; codecs=\"ec-3\"').replace(/^no$/, \"\"),\n \"flac\": !!(audioTest.canPlayType(\"audio/x-flac;\") || audioTest.canPlayType(\"audio/flac;\")).replace(/^no$/, \"\"),\n };\n }\n\n _unlockAudio(): void {\n const self = this;\n\n if (self._audioUnlocked || !self.ctx) {\n return;\n }\n\n self._audioUnlocked = false;\n self.autoUnlock = false;\n\n if (!self._mobileUnloaded && self.ctx.sampleRate !== 44100) {\n self._mobileUnloaded = true;\n self.unload();\n }\n\n self._scratchBuffer = self.ctx.createBuffer(1, 1, 22050);\n\n const unlock = () => {\n while (self._html5AudioPool.length < self.html5PoolSize) {\n try {\n const audioNode = new Audio() as Html5AudioUnlocked;\n audioNode._unlocked = true;\n self._releaseHtml5Audio(audioNode);\n } catch {\n self.noAudio = true;\n break;\n }\n }\n\n for (let i = 0; i < self._howls.length; i++) {\n const howl = self._howls[i];\n if (howl && !howl._webAudio) {\n const ids = howl._getSoundIds();\n for (let j = 0; j < ids.length; j++) {\n const soundId = ids[j];\n if (typeof soundId !== \"number\") {\n continue;\n }\n const sound = howl._soundById(soundId);\n if (sound && sound._node && isHtml5Audio(sound._node) && !sound._node._unlocked) {\n sound._node._unlocked = true;\n sound._node.load();\n }\n }\n }\n }\n\n self._autoResume();\n\n if (self.ctx) {\n const source = self.ctx.createBufferSource();\n source.buffer = self._scratchBuffer ?? null;\n source.connect(self.ctx.destination);\n\n if (typeof source.start === \"undefined\") {\n if (\"noteOn\" in source && typeof source.noteOn === \"function\") {\n source.noteOn(0);\n }\n } else {\n source.start(0);\n }\n\n if (typeof self.ctx.resume === \"function\") {\n self.ctx.resume();\n }\n source.onended = () => {\n source.disconnect();\n\n self._audioUnlocked = true;\n\n document.removeEventListener(\"touchstart\", unlock, true);\n document.removeEventListener(\"touchend\", unlock, true);\n document.removeEventListener(\"click\", unlock, true);\n document.removeEventListener(\"keydown\", unlock, true);\n\n for (let i = 0; i < self._howls.length; i++) {\n self._howls[i]?._emit(\"unlock\");\n }\n };\n }\n };\n\n document.addEventListener(\"touchstart\", unlock, true);\n document.addEventListener(\"touchend\", unlock, true);\n document.addEventListener(\"click\", unlock, true);\n document.addEventListener(\"keydown\", unlock, true);\n }\n\n _obtainHtml5Audio(): Html5AudioUnlocked {\n const self = this;\n\n if (self._html5AudioPool.length) {\n return self._html5AudioPool.pop()!;\n }\n\n const testPlay = new Audio().play();\n testPlay.catch(() => {\n console.warn(\"HTML5 Audio pool exhausted, returning potentially locked audio object.\");\n });\n return new Audio() as Html5AudioUnlocked;\n }\n\n _releaseHtml5Audio(audio: Html5AudioUnlocked): this {\n const self = this;\n if (audio._unlocked) {\n self._html5AudioPool.push(audio);\n }\n return self;\n }\n\n _autoSuspend(): void {\n const self = this;\n\n if (!self.autoSuspend || !self.ctx || typeof self.ctx.suspend === \"undefined\" || !self.usingWebAudio) {\n return;\n }\n\n for (let i = 0; i < self._howls.length; i++) {\n const howl = self._howls[i];\n if (howl && howl._webAudio) {\n for (let j = 0; j < howl._sounds.length; j++) {\n if (!howl._sounds[j]?._paused) {\n return;\n }\n }\n }\n }\n\n if (self._suspendTimer) {\n clearTimeout(self._suspendTimer);\n }\n\n self._suspendTimer = setTimeout(() => {\n if (!self.autoSuspend) {\n return;\n }\n\n self._suspendTimer = undefined;\n self.state = \"suspending\";\n\n const handleSuspension = () => {\n self.state = \"suspended\";\n if (self._resumeAfterSuspend) {\n delete self._resumeAfterSuspend;\n self._autoResume();\n }\n };\n\n self.ctx?.suspend().then(handleSuspension, handleSuspension);\n }, 30000);\n }\n\n _autoResume(): void {\n const self = this;\n\n if (!self.ctx || typeof self.ctx.resume === \"undefined\" || !self.usingWebAudio) {\n return;\n }\n\n if (self.state === \"running\" && self.ctx.state !== \"interrupted\" && self._suspendTimer) {\n clearTimeout(self._suspendTimer);\n self._suspendTimer = undefined;\n } else if (self.state === \"suspended\" || (self.state === \"running\" && self.ctx.state === \"interrupted\")) {\n self.ctx.resume().then(() => {\n self.state = \"running\";\n for (let i = 0; i < self._howls.length; i++) {\n self._howls[i]?._emit(\"resume\");\n }\n });\n\n if (self._suspendTimer) {\n clearTimeout(self._suspendTimer);\n self._suspendTimer = undefined;\n }\n } else if (self.state === \"suspending\") {\n self._resumeAfterSuspend = true;\n }\n }\n}\n\nexport const Howler = new HowlerGlobal();\n", "import type { Howl } from \"./howl.js\";\nimport type { Html5AudioUnlocked, SoundNode, WebAudioNodeWithSource } from \"./types.js\";\nimport type { Howler } from \"./howler.js\";\n\nexport class Sound {\n private readonly howler: typeof Howler;\n private readonly parent: Howl;\n\n _muted: boolean;\n _loop: boolean;\n _volume: number;\n _rate: number;\n _seek = 0;\n _rateSeek = 0;\n _paused = true;\n _ended = true;\n _sprite: string = \"__default\";\n _id: number;\n\n _node?: SoundNode;\n _panner?: AudioNode;\n\n _start = 0;\n _stop = 0;\n _playStart = 0;\n\n _interval?: ReturnType<typeof setTimeout> = undefined;\n _fadeTo?: number = undefined;\n\n _errorFn?: (ev: Event) => void;\n _loadFn?: (ev: Event) => void;\n _endFn?: (ev: Event) => void;\n\n constructor(parent: Howl, howler: typeof Howler) {\n this.parent = parent;\n this.howler = howler;\n\n this._muted = parent._muted;\n this._loop = parent._loop;\n this._volume = parent._volume;\n this._rate = parent._rate;\n this._seek = 0;\n this._paused = true;\n this._ended = true;\n this._sprite = \"__default\";\n\n this._id = ++howler._counter;\n\n parent._sounds.push(this);\n\n const volume = this.howler._muted || this._muted || parent._muted ? 0 : this._volume;\n\n if (parent._webAudio) {\n const gain =\n typeof this.howler.ctx?.createGain === \"undefined\"\n // @ts-expect-error exception for createGainNode\n ? this.howler.ctx[\"createGainNode\"]()\n : this.howler.ctx.createGain();\n\n this._node = gain as WebAudioNodeWithSource;\n this._node.gain.setValueAtTime(volume, this.howler.ctx?.currentTime ?? 0);\n this._node.paused = true;\n if (this.howler.masterGain) {\n this._node.connect(this.howler.masterGain);\n }\n } else if (!this.howler.noAudio) {\n this._node = this.howler._obtainHtml5Audio();\n\n this._errorFn = this.errorListener.bind(this);\n this._node.addEventListener(\"error\", this._errorFn, false);\n\n this._loadFn = this.loadListener.bind(this);\n this._node.addEventListener(this.howler._canPlayEvent, this._loadFn, false);\n\n this._endFn = this.endListener.bind(this);\n this._node.addEventListener(\"ended\", this._endFn, false);\n\n this._node.src = parent._src.toString();\n\n const preload = parent._preload === true ? \"auto\" : parent._preload;\n this._node.preload = preload === false ? \"\" : preload;\n this._node.volume = volume * this.howler.volume();\n this._node.load();\n }\n }\n\n reset(): this {\n const self = this;\n const parent = self.parent;\n\n self._muted = parent._muted;\n self._loop = parent._loop;\n self._volume = parent._volume;\n self._rate = parent._rate;\n self._seek = 0;\n self._rateSeek = 0;\n self._paused = true;\n self._ended = true;\n self._sprite = \"__default\";\n\n self._id = ++this.howler._counter;\n return self;\n }\n\n private errorListener(): void {\n const self = this;\n const html = self._node as Html5AudioUnlocked;\n self.parent._emit(\"loaderror\", self._id, html.error ? html.error.code.toString() : \"0\");\n html.removeEventListener(\"error\", self._errorFn as EventListener, false);\n }\n\n private loadListener(): void {\n const self = this;\n const parent = self.parent;\n const html = self._node as Html5AudioUnlocked;\n\n parent._duration = Math.ceil(html.duration * 10) / 10;\n\n if (Object.keys(parent._sprite).length === 0) {\n parent._sprite = { \"__default\": [0, parent._duration * 1000] };\n }\n\n if (parent._state !== \"loaded\") {\n parent._state = \"loaded\";\n parent._emit(\"load\");\n parent._loadQueue();\n }\n\n html.removeEventListener(this.howler._canPlayEvent, self._loadFn as EventListener, false);\n }\n\n private endListener(): void {\n const self = this;\n const parent = self.parent;\n const html = self._node as Html5AudioUnlocked;\n\n if (parent._duration === Infinity) {\n parent._duration = Math.ceil(html.duration * 10) / 10;\n const defaultSprite = parent._sprite[\"__default\"];\n if (defaultSprite && defaultSprite[1] === Infinity) {\n defaultSprite[1] = parent._duration * 1000;\n }\n parent._ended(self);\n }\n\n html.removeEventListener(\"ended\", self._endFn as EventListener, false);\n }\n}\n", "import type {\n HowlEventHandler, HowlEventName,\n HowlListener, HowlOptions, HowlState,\n HowlXHR, Html5AudioUnlocked, HowlSpriteMap, WebAudioNodeWithSource\n} from \"./types.js\";\nimport { Howler } from \"./howler.js\";\nimport { Sound } from \"./sound.js\";\nimport { isHtml5Audio, loadBuffer, setupAudioContext } from \"./utils.js\";\n\nexport class Howl {\n private readonly howler: typeof Howler;\n // User-defined\n _autoplay: boolean;\n _format: readonly string[] | undefined;\n _html5: boolean;\n _muted: boolean;\n _loop: boolean;\n _pool: number;\n _preload: boolean | \"metadata\" | \"none\";\n _rate: number;\n _sprite: HowlSpriteMap;\n _src: readonly string[];\n _volume: number;\n _xhr: HowlXHR;\n\n // Internals\n _duration = 0;\n _state: HowlState = \"unloaded\";\n _sounds: Sound[] = [];\n _endTimers: Record<number, ReturnType<typeof setTimeout> | (() => void)> = {};\n _queue: Array<{ event: string; action: () => void }> = [];\n _playLock = false;\n _webAudio: boolean = true;\n\n _onend: HowlListener[];\n _onfade: HowlListener[];\n _onload: HowlListener[];\n _onloaderror: HowlListener[];\n _onplayerror: HowlListener[];\n _onpause: HowlListener[];\n _onplay: HowlListener[];\n _onstop: HowlListener[];\n _onmute: HowlListener[];\n _onvolume: HowlListener[];\n _onrate: HowlListener[];\n _onseek: HowlListener[];\n _onunlock: HowlListener[];\n _onresume: HowlListener[];\n\n constructor(options: HowlOptions) {\n this.howler = Howler;\n if (!this.howler.ctx) {\n setupAudioContext(this.howler);\n }\n\n this._autoplay = options[\"autoplay\"] || false;\n this._format = typeof options[\"format\"] !== \"string\" ? options[\"format\"] : [options[\"format\"]];\n this._html5 = options[\"html5\"] || false;\n this._muted = options[\"mute\"] || false;\n this._loop = options[\"loop\"] || false;\n this._pool = options[\"pool\"] || 5;\n this._preload = typeof options[\"preload\"] === \"boolean\" || options[\"preload\"] === \"metadata\" ? options[\"preload\"] : true;\n this._rate = options[\"rate\"] || 1;\n this._sprite = options[\"sprite\"] || {};\n this._src = typeof options[\"src\"] !== \"string\" ? options[\"src\"] : [options[\"src\"]];\n this._volume = options[\"volume\"] !== undefined ? options[\"volume\"] : 1;\n this._xhr = {\n method: options[\"xhr\"]?.method ?? \"GET\",\n headers: options[\"xhr\"]?.headers ?? undefined,\n withCredentials: options[\"xhr\"]?.withCredentials ?? false,\n };\n\n this._duration = 0;\n this._state = \"unloaded\";\n this._sounds = [];\n this._endTimers = {};\n this._queue = [];\n this._playLock = false;\n\n this[\"_onend\"] = options[\"onend\"] ? [{ fn: options[\"onend\"] }] : [];\n this[\"_onfade\"] = options[\"onfade\"] ? [{ fn: options[\"onfade\"] }] : [];\n this[\"_onload\"] = options[\"onload\"] ? [{ fn: options[\"onload\"] }] : [];\n this[\"_onloaderror\"] = options[\"onloaderror\"] ? [{ fn: options[\"onloaderror\"] }] : [];\n this[\"_onplayerror\"] = options[\"onplayerror\"] ? [{ fn: options[\"onplayerror\"] }] : [];\n this[\"_onpause\"] = options[\"onpause\"] ? [{ fn: options[\"onpause\"] }] : [];\n this[\"_onplay\"] = options[\"onplay\"] ? [{ fn: options[\"onplay\"] }] : [];\n this[\"_onstop\"] = options[\"onstop\"] ? [{ fn: options[\"onstop\"] }] : [];\n this[\"_onmute\"] = options[\"onmute\"] ? [{ fn: options[\"onmute\"] }] : [];\n this[\"_onvolume\"] = options[\"onvolume\"] ? [{ fn: options[\"onvolume\"] }] : [];\n this[\"_onrate\"] = options[\"onrate\"] ? [{ fn: options[\"onrate\"] }] : [];\n this[\"_onseek\"] = options[\"onseek\"] ? [{ fn: options[\"onseek\"] }] : [];\n this[\"_onunlock\"] = options[\"onunlock\"] ? [{ fn: options[\"onunlock\"] }] : [];\n this[\"_onresume\"] = options[\"onresume\"] ? [{ fn: options[\"onresume\"] }] : [];\n\n this._webAudio = this.howler.usingWebAudio && !this._html5;\n\n if (this.howler.ctx && this.howler.autoUnlock) {\n this.howler._unlockAudio();\n }\n\n this.howler._howls.push(this);\n\n if (this._autoplay) {\n this._queue.push({ event: \"play\", action: () => this.play() });\n }\n\n if (this._preload && (this._preload as string) !== \"none\") {\n this.load();\n }\n }\n\n load(): void {\n const self = this;\n\n if (this.howler.noAudio) {\n self._emit(\"loaderror\", undefined, \"No audio support.\");\n return;\n }\n\n let url: string | undefined = undefined;\n\n for (let i = 0; i < self._src.length; i++) {\n let ext: string | undefined;\n let str: string;\n\n if (self._format && self._format[i]) {\n ext = self._format[i];\n } else {\n str = self._src[i] ?? \"\";\n if (typeof str !== \"string\" || str === \"\") {\n self._emit(\"loaderror\", undefined, \"Non-string found in selected audio sources - ignoring.\");\n continue;\n }\n\n const dataExt = /^data:audio\\/([^;,]+);/i.exec(str);\n if (dataExt) ext = dataExt[1]?.toLowerCase();\n else {\n const m = /\\.([^.]+)$/.exec(str.split(\"?\", 1)[0] ?? \"\");\n if (m) {\n ext = m[1]?.toLowerCase();\n }\n }\n }\n\n if (!ext) {\n console.warn('No file extension was found. Consider using the \"format\" property or specify an extension.');\n }\n\n if (ext && this.howler.codecs(ext)) {\n url = self._src[i];\n break;\n }\n }\n\n if (!url) {\n self._emit(\"loaderror\", undefined, \"No codec support for selected audio sources.\");\n return;\n }\n\n self._src = [url];\n self._state = \"loading\";\n\n if (typeof window !== \"undefined\" && window.location.protocol === \"https:\" && url.slice(0, 5) === \"http:\") {\n self._html5 = true;\n self._webAudio = false;\n }\n\n new Sound(self, this.howler);\n\n if (self._webAudio) {\n loadBuffer(self, this.howler);\n }\n }\n\n play(spriteOrId?: string | number, internal?: boolean): number | undefined {\n const self = this;\n let id: number | undefined = undefined;\n\n if (typeof spriteOrId === \"number\") {\n id = spriteOrId;\n spriteOrId = undefined;\n } else if (typeof spriteOrId === \"string\" && self._state === \"loaded\" && !self._sprite[spriteOrId]) {\n return undefined;\n } else if (typeof spriteOrId === \"undefined\") {\n spriteOrId = \"__default\";\n\n if (!self._playLock) {\n let num = 0;\n for (let i = 0; i < self._sounds.length; i++) {\n if (self._sounds[i]?._paused && !self._sounds[i]?._ended) {\n num++;\n id = self._sounds[i]?._id;\n }\n }\n\n if (num === 1) {\n spriteOrId = undefined;\n } else {\n id = undefined;\n }\n }\n }\n\n const sound = id ? self._soundById(id) : self._inactiveSound();\n if (!sound) {\n return undefined;\n }\n\n if (id && !spriteOrId) {\n spriteOrId = sound._sprite || \"__default\";\n }\n\n if (self._state !== \"loaded\") {\n sound._sprite = spriteOrId?.toString() ?? \"__default\";\n sound._ended = false;\n const soundId = sound._id;\n self._queue.push({ event: \"play\", action: () => self.play(soundId) });\n return soundId;\n }\n\n if (id && !sound._paused) {\n if (!internal) self._loadQueue(\"play\");\n return sound._id;\n }\n\n if (self._webAudio) {\n this.howler._autoResume();\n }\n\n const spriteName = (spriteOrId ?? \"__default\") as string;\n const seek = Math.max(0, sound._seek > 0 ? sound._seek : (self._sprite[spriteName]?.[0] ?? 0) / 1000);\n const spriteDef = self._sprite[spriteName];\n\n const duration = spriteDef ? Math.max(\n 0,\n (spriteDef[0] + spriteDef[1]) / 1000 - seek,\n ) : 0;\n const timeout = (duration * 1000) / Math.abs(sound._rate);\n const start = spriteDef ? spriteDef[0] / 1000 : 0;\n const stop = spriteDef ? (spriteDef[0] + spriteDef[1]) / 1000 : 0;\n\n sound._sprite = spriteName;\n sound._ended = false;\n\n const setParams = () => {\n sound._paused = false;\n sound._seek = seek;\n sound._start = start;\n sound._stop = stop;\n sound._loop = !!(sound._loop || (self._sprite[spriteName]?.[2] ?? false));\n };\n\n if (seek >= stop) {\n self._ended(sound);\n return sound._id;\n }\n\n const node = sound._node;\n\n if (self._webAudio) {\n const playWebAudio = () => {\n // console.log(\"current audio context state: \", this.howler.ctx?.state);\n self._playLock = false;\n setParams();\n self._refreshBuffer(sound);\n\n const vol = sound._muted || self._muted ? 0 : sound._volume;\n (node as WebAudioNodeWithSource).gain.setValueAtTime(vol, this.howler.ctx?.currentTime ?? 0);\n sound._playStart = this.howler.ctx?.currentTime ?? 0;\n\n const bs = (node as WebAudioNodeWithSource).bufferSource!;\n if (typeof bs.start === \"undefined\") {\n if (\"noteGrainOn\" in bs && typeof bs.noteGrainOn === \"function\")\n sound._loop ? bs.noteGrainOn(0, seek, 86400) : bs.noteGrainOn(0, seek, duration);\n } else {\n sound._loop ? bs.start(0, seek, 86400) : bs.start(0, seek, duration);\n }\n\n if (timeout !== Infinity) {\n self._endTimers[sound._id] = setTimeout(() => self._ended(sound), timeout);\n }\n\n if (!internal) {\n setTimeout(() => {\n self._emit(\"play\", sound._id);\n self._loadQueue();\n }, 0);\n }\n };\n\n if (this.howler.state === \"running\" && this.howler.ctx?.state !== \"interrupted\") {\n playWebAudio();\n } else {\n self._playLock = true;\n self.once(\"resume\", () => {\n playWebAudio()\n });\n self._clearTimer(sound._id);\n }\n } else {\n const html = node as Html5AudioUnlocked;\n\n const playHtml5 = () => {\n html.currentTime = seek;\n html.muted = sound._muted || self._muted || this.howler._muted || html.muted;\n html.volume = sound._volume * this.howler.volume();\n html.playbackRate = sound._rate;\n\n try {\n const p = html.play();\n\n if (\n p &&\n typeof Promise !== \"undefined\" &&\n (p instanceof Promise || typeof p[\"then\"] === \"function\")\n ) {\n self._playLock = true;\n setParams();\n\n (p as Promise<void>)\n .then(() => {\n self._playLock = false;\n html._unlocked = true;\n if (!internal) self._emit(\"play\", sound._id);\n else self._loadQueue();\n })\n .catch(() => {\n self._playLock = false;\n self._emit(\n \"playerror\",\n sound._id,\n \"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.\",\n );\n sound._ended = true;\n sound._paused = true;\n });\n } else if (!internal) {\n self._playLock = false;\n setParams();\n self._emit(\"play\", sound._id);\n }\n\n html.playbackRate = sound._rate;\n\n if (html.paused) {\n self._emit(\n \"playerror\",\n sound._id,\n \"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.\",\n );\n return;\n }\n\n if (spriteName !== \"__default\" || sound._loop) {\n self._endTimers[sound._id] = setTimeout(() => self._ended(sound), timeout);\n } else {\n self._endTimers[sound._id] = () => {\n self._ended(sound);\n html.removeEventListener(\"ended\", self._endTimers[sound._id] as () => void, false);\n };\n html.addEventListener(\"ended\", self._endTimers[sound._id] as () => void, false);\n }\n } catch (err) {\n self._emit(\"playerror\", sound._id, err as string);\n }\n };\n\n if (\n html.src ===\n \"data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA\"\n ) {\n html.src = self._src.toString();\n html.load();\n }\n\n if (html.readyState >= 3) {\n playHtml5();\n } else {\n self._playLock = true;\n self._state = \"loading\";\n\n const listener = () => {\n self._state = \"loaded\";\n playHtml5();\n html.removeEventListener(this.howler._canPlayEvent, listener, false);\n };\n html.addEventListener(this.howler._canPlayEvent, listener, false);\n self._clearTimer(sound._id);\n }\n }\n\n return sound._id;\n }\n\n state(): HowlState {\n return this._state;\n }\n\n /**\n * Check if a sound (or any sound) is playing.\n */\n playing(id?: number): boolean {\n const self = this;\n\n if (typeof id === \"number\") {\n const sound = self._soundById(id);\n return sound ? !sound._paused : false;\n }\n\n for (let i = 0; i < self._sounds.length; i++) {\n if (!self._sounds[i]?._paused) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Duration of group, or sprite duration if sound id passed.\n */\n duration(id?: number): number {\n const self = this;\n let duration = self._duration;\n\n const sound = typeof id === \"number\" ? self._soundById(id) : undefined;\n if (sound) {\n duration = (self._sprite[sound._sprite]?.[1] ?? 0) / 1000;\n }\n\n return duration;\n }\n\n /**\n * Pause playback and save current position.\n */\n pause(id?: number, internal?: boolean): this {\n const self = this;\n\n if (self._state !== \"loaded\" || self._playLock) {\n self._queue.push({ event: \"pause\", action: () => self.pause(id) });\n return self;\n }\n\n const ids = self._getSoundIds(id);\n for (let i = 0; i < ids.length; i++) {\n self._clearTimer(ids[i] ?? 0);\n\n const sound = self._soundById(ids[i] ?? 0);\n if (sound && !sound._paused) {\n sound._seek = self.seek(ids[i] ?? 0);\n sound._rateSeek = 0;\n sound._paused = true;\n\n self._stopFade(ids[i] ?? 0);\n\n if (sound._node) {\n if (self._webAudio && !isHtml5Audio(sound._node)) {\n const n = sound._node as WebAudioNodeWithSource;\n if (!n.bufferSource) continue;\n\n if (typeof (n.bufferSource as any).stop === \"undefined\") (n.bufferSource as any).noteOff(0);\n else n.bufferSource.stop(0);\n\n self._cleanBuffer(n);\n } else if (isHtml5Audio(sound._node) && (!isNaN(sound._node.duration) || sound._node.duration === Infinity)) {\n sound._node.pause();\n }\n }\n }\n\n if (!internal) {\n self._emit(\"pause\", sound ? sound._id : undefined);\n }\n }\n\n return self;\n }\n\n\n /**\n * Get/set playback rate.\n * rate() -> first sound rate (or group rate fallback)\n * rate(id) -> sound rate\n * rate(rate) -> set group rate\n * rate(rate, id) -> set sound rate\n */\n rate(): number;\n rate(id: number): number;\n rate(rate: number): this;\n rate(rate: number, id: number): this;\n rate(rateOrId?: number, idMaybe?: number): this | number {\n const self = this;\n const argsLen = arguments.length;\n\n let rate: number | undefined;\n let id: number | undefined;\n\n if (argsLen === 0) {\n id = self._sounds[0]?._id;\n } else if (argsLen === 1) {\n const ids = self._getSoundIds();\n const index = ids.indexOf(rateOrId as number);\n if (index >= 0) id = parseInt(String(rateOrId), 10);\n else rate = parseFloat(String(rateOrId));\n } else if (argsLen === 2) {\n rate = parseFloat(String(rateOrId));\n id = parseInt(String(idMaybe), 10);\n }\n\n if (typeof rate === \"number\") {\n if (self._state !== \"loaded\" || self._playLock) {\n const capturedArgs = [...arguments] as any[];\n self._queue.push({\n event: \"rate\",\n action: () => self.rate.apply(self, capturedArgs as any),\n });\n return self;\n }\n\n if (typeof id === \"undefined\") self._rate = rate;\n\n const ids = self._getSoundIds(id);\n for (let i = 0; i < ids.length; i++) {\n const sound = self._soundById(ids[i] ?? 0);\n if (!sound) continue;\n\n if (self.playing(ids[i])) {\n sound._rateSeek = self.seek(ids[i] ?? 0);\n sound._playStart = self._webAudio ? Howler.ctx!.currentTime : sound._playStart;\n }\n\n sound._rate = rate;\n\n if (self._webAudio && sound._node && !isHtml5Audio(sound._node)) {\n const n = sound._node as WebAudioNodeWithSource;\n if (n.bufferSource) n.bufferSource.playbackRate.setValueAtTime(rate, Howler.ctx!.currentTime);\n } else if (sound._node && isHtml5Audio(sound._node)) {\n sound._node.playbackRate = rate;\n }\n\n const seek = self.seek(ids[i] ?? 0);\n const sprite = self._sprite[sound._sprite];\n const duration = sprite ? (sprite[0] + sprite[1]) / 1000 - seek : 0;\n const timeout = (duration * 1000) / Math.abs(sound._rate);\n\n const sId = ids[i];\n if (typeof sId === \"number\" && self._endTimers[sId] || !sound._paused) {\n if (typeof sId === \"number\") {\n self._clearTimer(sId);\n self._endTimers[sId] = setTimeout(() => self._ended(sound), timeout);\n }\n }\n\n self._emit(\"rate\", sound._id);\n }\n\n return self;\n }\n\n const sound = id ? self._soundById(id) : undefined;\n return sound ? sound._rate : self._rate;\n }\n\n /**\n * Get/set seek position.\n * seek() -> first sound seek\n * seek(id) -> sound seek\n * seek(seek) -> set first sound seek\n * seek(seek, id) -> set sound seek\n */\n seek(): number;\n seek(id: number): number;\n seek(seek: number): this;\n seek(seek: number, id: number): this;\n seek(seekOrId?: number, idMaybe?: number): this | number {\n const self = this;\n const argsLen = arguments.length;\n\n let seek: number | undefined = undefined;\n let id: number | undefined = undefined;\n\n if (argsLen === 0) {\n if (self._sounds.length) {\n id = self._sounds[0]?._id;\n }\n } else if (argsLen === 1) {\n const ids = self._getSoundIds();\n const index = ids.indexOf(seekOrId as number);\n if (index >= 0) {\n id = parseInt(String(seekOrId), 10);\n } else if (self._sounds.length) {\n id = self._sounds[0]?._id;\n seek = parseFloat(String(seekOrId));\n }\n } else if (argsLen === 2) {\n seek = parseFloat(String(seekOrId));\n id = parseInt(String(idMaybe), 10);\n }\n\n if (typeof id === \"undefined\") return 0;\n\n if (typeof seek === \"number\" && (self._state !== \"loaded\" || self._playLock)) {\n const capturedArgs = [...arguments] as any[];\n self._queue.push({\n event: \"seek\",\n action: () => self.seek.apply(self, capturedArgs as any),\n });\n return self;\n }\n\n const sound = self._soundById(id);\n if (!sound) {\n return self;\n }\n\n if (typeof seek === \"number\" && seek >= 0) {\n const wasPlaying = self.playing(id);\n if (wasPlaying) {\n self.pause(id, true);\n }\n\n sound._seek = seek;\n sound._ended = false;\n self._clearTimer(id);\n\n if (!self._webAudio && sound._node && isHtml5Audio(sound._node) && !isNaN(sound._node.duration)) {\n sound._node.currentTime = seek;\n }\n\n const seekAndEmit = () => {\n if (wasPlaying) {\n self.play(id, true);\n }\n self._emit(\"seek\", id);\n };\n\n if (wasPlaying && !self._webAudio) {\n const emitSeek = () => {\n if (!self._playLock) seekAndEmit();\n else setTimeout(emitSeek, 0);\n };\n setTimeout(emitSeek, 0);\n } else {\n seekAndEmit();\n }\n\n return self;\n }\n\n // Getter\n if (self._webAudio) {\n const realTime = self.playing(id) ? Howler.ctx!.currentTime - sound._playStart : 0;\n const rateSeek = sound._rateSeek ? sound._rateSeek - sound._seek : 0;\n return sound._seek + (rateSeek + realTime * Math.abs(sound._rate));\n }\n\n if (sound._node && isHtml5Audio(sound._node)) {\n return sound._node.currentTime;\n }\n return 0;\n }\n\n\n stop(id?: number, internal?: boolean): this {\n // You can paste your remaining stop() body here 1:1 (already in your snippet)\n // For now, keep a simple call-through for compatibility:\n if (typeof id === \"undefined\") {\n const ids = this._getSoundIds();\n for (const sid of ids) {\n this.stop(sid, internal);\n }\n return this;\n }\n const sound = this._soundById(id);\n if (sound) {\n this._clearTimer(id);\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n sound._paused = true;\n sound._ended = true;\n if (sound._node) {\n if (this._webAudio) {\n const n = sound._node as WebAudioNodeWithSource;\n if (n.bufferSource) {\n if (typeof n.bufferSource.stop === \"undefined\") {\n if (\"noteOff\" in n.bufferSource && typeof n.bufferSource.noteOff === \"function\") {\n n.bufferSource.noteOff(0);\n }\n }\n else {\n n.bufferSource.stop(0);\n }\n this._cleanBuffer(n);\n }\n } else if (isHtml5Audio(sound._node)) {\n const a = sound._node;\n a.currentTime = sound._start || 0;\n a.pause();\n if (a.duration === Infinity) {\n this._clearSound(a);\n }\n }\n }\n if (!internal) this._emit(\"stop\", sound._id);\n }\n return this;\n }\n\n /**\n * Mute/unmute a single sound or all sounds in this Howl group.\n * @param muted Set to true to mute and false to unmute.\n * @param id The sound ID to update (omit to mute/unmute all).\n */\n mute(muted?: boolean, id?: number): this | boolean {\n const self = this;\n\n // Getter: group mute\n if (typeof id === \"undefined\" && typeof muted !== \"boolean\") {\n return self._muted;\n }\n\n // If the sound hasn't loaded, queue.\n if (self._state !== \"loaded\" || self._playLock) {\n self._queue.push({\n event: \"mute\",\n action: () => {\n self.mute(muted as boolean, id);\n },\n });\n return self;\n }\n\n // Apply group mute.\n if (typeof id === \"undefined\" && typeof muted === \"boolean\") {\n self._muted = muted;\n }\n\n const ids = self._getSoundIds(id);\n for (let i = 0; i < ids.length; i++) {\n const sound = self._soundById(ids[i] ?? 0);\n if (!sound) continue;\n\n sound._muted = muted as boolean;\n\n // Cancel active fade and set end value.\n if (sound._interval) self._stopFade(sound._id);\n\n if (self._webAudio && sound._node && !isHtml5Audio(sound._node)) {\n (sound._node as WebAudioNodeWithSource).gain.setValueAtTime(\n (muted as boolean) ? 0 : sound._volume,\n Howler.ctx!.currentTime,\n );\n } else if (sound._node && isHtml5Audio(sound._node)) {\n sound._node.muted = Howler._muted ? true : (muted as boolean);\n }\n\n self._emit(\"mute\", sound._id);\n }\n\n return self;\n }\n\n /**\n * Get/set the volume of this sound or of the Howl group.\n * volume() -> group volume\n * volume(id) -> sound volume\n * volume(vol) -> set group volume\n * volume(vol, id) -> set sound volume\n */\n volume(): number;\n volume(id: number): number;\n volume(vol: number): this;\n volume(vol: number, id: number): this;\n volume(vol: number, id: number, internal?: boolean): this;\n volume(volOrId?: number, idMaybe?: number, internal?: boolean): this | number {\n const self = this;\n\n const argsLen = arguments.length;\n\n let vol: number | undefined;\n let id: number | undefined;\n\n if (argsLen === 0) {\n return self._volume;\n }\n\n if (argsLen === 1 || (argsLen === 2 && typeof idMaybe === \"undefined\")) {\n const ids = self._getSoundIds();\n const index = ids.indexOf(volOrId as number);\n if (index >= 0) {\n id = parseInt(String(volOrId), 10);\n } else {\n vol = parseFloat(String(volOrId));\n }\n } else if (argsLen >= 2) {\n vol = parseFloat(String(volOrId));\n id = parseInt(String(idMaybe), 10);\n }\n\n // Setter path\n if (typeof vol !== \"undefined\" && vol >= 0 && vol <= 1) {\n if (self._state !== \"loaded\" || self._playLock) {\n const capturedArgs = [...arguments] as any[];\n self._queue.push({\n event: \"volume\",\n action: () => self.volume.apply(self, capturedArgs as any),\n });\n return self;\n }\n\n if (typeof id === \"undefined\") {\n self._volume = vol;\n }\n\n const ids = self._getSoundIds(id);\n for (let i = 0; i < ids.length; i++) {\n const sound = self._soundById(ids[i] ?? 0);\n if (!sound) continue;\n\n sound._volume = vol;\n\n // Stop fades unless internal flag says not to.\n if (!internal) self._stopFade(ids[i] ?? 0);\n\n if (self._webAudio && sound._node && !sound._muted && !isHtml5Audio(sound._node)) {\n (sound._node as WebAudioNodeWithSource).gain.setValueAtTime(vol, Howler.ctx!.currentTime);\n } else if (sound._node && !sound._muted && isHtml5Audio(sound._node)) {\n sound._node.volume = vol * (Howler.volume() as number);\n }\n\n self._emit(\"volume\", sound._id);\n }\n\n return self;\n }\n\n // Getter path\n const sound = id ? self._soundById(id) : self._sounds[0];\n return sound ? sound._volume : 0;\n }\n\n /**\n * Fade a currently playing sound between two volumes (if no id is passed, all sounds will fade).\n */\n fade(from: number, to: number, len: number, id?: number): this {\n const self = this;\n\n if (self._state !== \"loaded\" || self._playLock) {\n self._queue.push({\n event: \"fade\",\n action: () => self.fade(from, to, len, id),\n });\n return self;\n }\n\n from = Math.min(Math.max(0, parseFloat(String(from))), 1);\n to = Math.min(Math.max(0, parseFloat(String(to))), 1);\n len = parseFloat(String(len));\n\n self.volume(from, id as any);\n\n const ids = self._getSoundIds(id);\n for (let i = 0; i < ids.length; i++) {\n const sound = self._soundById(ids[i] ?? 0);\n if (!sound) continue;\n\n if (!id) self._stopFade(ids[i] ?? 0);\n\n if (self._webAudio && !sound._muted && sound._node && !isHtml5Audio(sound._node)) {\n const currentTime = Howler.ctx!.currentTime;\n const end = currentTime + len / 1000;\n sound._volume = from;\n (sound._node as WebAudioNodeWithSource).gain.setValueAtTime(from, currentTime);\n (sound._node as WebAudioNodeWithSource).gain.linearRampToValueAtTime(to, end);\n }\n\n self._startFadeInterval(sound, from, to, len, ids[i] ?? 0, typeof id === \"undefined\");\n }\n\n return self;\n }\n\n /**\n * loop() from your snippet.\n */\n loop(): boolean;\n loop(id: number): boolean;\n loop(loop: boolean): this;\n loop(loop: boolean, id: number): this;\n loop(loopOrId?: boolean | number, idMaybe?: number): this | boolean {\n const self = this;\n const argsLen = arguments.length;\n\n let loopVal: boolean = false;\n let id: number | undefined;\n\n if (argsLen === 0) return self._loop;\n\n if (argsLen === 1) {\n if (typeof loopOrId === \"boolean\") {\n loopVal = loopOrId;\n self._loop = loopVal;\n } else {\n const sound = self._soundById(parseInt(String(loopOrId), 10));\n return sound ? sound._loop : false;\n }\n } else if (argsLen === 2) {\n loopVal = loopOrId as boolean;\n id = parseInt(String(idMaybe), 10);\n }\n\n const ids = self._getSoundIds(id);\n for (let i = 0; i < ids.length; i++) {\n const sound = self._soundById(ids[i] ?? 0);\n if (!sound) continue;\n\n sound._loop = loopVal;\n\n if (self._webAudio && sound._node && !isHtml5Audio(sound._node)) {\n const n = sound._node as WebAudioNodeWithSource;\n if (n.bufferSource) {\n n.bufferSource.loop = loopVal as boolean;\n if (loopVal) {\n n.bufferSource.loopStart = sound._start || 0;\n n.bufferSource.loopEnd = sound._stop;\n\n if (self.playing(ids[i])) {\n self.pause(ids[i], true);\n self.play(ids[i], true);\n }\n }\n }\n }\n }\n\n return self;\n }\n\n\n unload(): void {\n const self = this;\n\n const sounds = self._sounds;\n for (let i = 0; i < sounds.length; i++) {\n if (!sounds[i]?._paused) {\n self.stop(sounds[i]?._id);\n }\n\n const currentNode = sounds[i]?._node;\n if (!self._webAudio && currentNode && isHtml5Audio(currentNode)) {\n self._clearSound(currentNode);\n if (\"_errorFn\" in currentNode) {\n currentNode.removeEventListener(\"error\", currentNode._errorFn as EventListener, false);\n }\n if (\"_loadFn\" in currentNode) {\n currentNode.removeEventListener(this.howler._canPlayEvent, currentNode._loadFn as EventListener, false);\n }\n if (\"_endFn\" in currentNode) {\n currentNode.removeEventListener(\"ended\", currentNode._endFn as EventListener, false);\n }\n this.howler._releaseHtml5Audio(currentNode as Html5AudioUnlocked);\n }\n\n delete sounds[i]?._node;\n self._clearTimer(sounds[i]?._id ?? 0);\n }\n\n const index = this.howler._howls.indexOf(self);\n if (index >= 0) this.howler._howls.splice(index, 1);\n\n let remCache = true;\n for (let i = 0; i < this.howler._howls.length; i++) {\n const hs = this.howler._howls[i]?._src.toString();\n if (hs === self._src.toString() || (hs && self._src.indexOf(hs) >= 0)) {\n remCache = false;\n break;\n }\n }\n\n if (this.howler.cache && remCache) {\n delete this.howler.cache[self._src.toString()];\n }\n\n this.howler.noAudio = false;\n\n self._state = \"unloaded\";\n self._sounds = [];\n }\n\n on(event: HowlEventName, fn: HowlEventHandler, id?: number, once?: boolean): this {\n const eventName = \"_on\" + event;\n // @ts-expect-error TODO fix type\n const events = this[eventName] as HowlListener[];\n if (typeof fn === \"function\") {\n events.push(once ? { id, fn, once } : { id, fn });\n }\n return this;\n }\n\n off(event?: HowlEventName, fn?: HowlEventHandler | number, id?: number): this {\n const self = this;\n\n if (typeof fn === \"number\") {\n id = fn;\n fn = undefined;\n }\n\n if (event) {\n const eventName = \"_on\" + event;\n // @ts-expect-error TODO fix type\n const events = self[eventName] as HowlListener[];\n if (fn || id) {\n for (let i = 0; i < events.length; i++) {\n const isId = id === events[i]?.id;\n if ((fn === events[i]?.fn && isId) || (!fn && isId)) {\n events.splice(i, 1);\n break;\n }\n }\n } else {\n // @ts-expect-error TODO fix type\n self[eventName] = [];\n }\n } else {\n const keys = Object.keys(self);\n for (let i = 0; i < keys.length; i++) {\n // @ts-expect-error TODO fix type\n if (keys[i].indexOf(\"_on\") === 0 && Array.isArray((self)[keys[i]])) {\n // @ts-expect-error TODO fix type\n (self)[keys[i]] = [];\n }\n }\n }\n\n return self;\n }\n\n once(event: HowlEventName, fn: HowlEventHandler, id?: number): this {\n return this.on(event, fn, id, true);\n }\n\n /**\n * Starts the internal interval to fade a sound.\n */\n private _startFadeInterval(\n sound: Sound,\n from: number,\n to: number,\n len: number,\n _id: number,\n isGroup: boolean,\n ): void {\n const self = this;\n let vol = from;\n const diff = to - from;\n const steps = Math.abs(diff / 0.01);\n const stepLen = Math.max(4, steps > 0 ? len / steps : len);\n let lastTick = Date.now();\n\n sound._fadeTo = to;\n\n sound._interval = setInterval(() => {\n const tick = (Date.now() - lastTick) / len;\n lastTick = Date.now();\n vol += diff * tick;\n\n vol = Math.round(vol * 100) / 100;\n\n if (diff < 0) vol = Math.max(to, vol);\n else vol = Math.min(to, vol);\n\n if (self._webAudio) {\n sound._volume = vol;\n } else {\n self.volume(vol, sound._id, true);\n }\n\n if (isGroup) self._volume = vol;\n\n if ((to < from && vol <= to) || (to > from && vol >= to)) {\n clearInterval(sound._interval);\n sound._interval = undefined;\n sound._fadeTo = undefined;\n self.volume(to, sound._id);\n self._emit(\"fade\", sound._id);\n }\n }, stepLen);\n }\n\n /**\n * Stop an active fade.\n */\n private _stopFade(id: number): this {\n const self = this;\n const sound = self._soundById(id);\n\n if (sound && sound._interval) {\n if (self._webAudio && sound._node && !isHtml5Audio(sound._node)) {\n (sound._node as WebAudioNodeWithSource).gain.cancelScheduledValues(Howler.ctx?.currentTime ?? 0);\n }\n\n clearInterval(sound._interval);\n sound._interval = undefined;\n\n if (typeof sound._fadeTo === \"number\") {\n self.volume(sound._fadeTo, id);\n }\n sound._fadeTo = undefined;\n self._emit(\"fade\", id);\n }\n\n return self;\n }\n\n _emit(event: HowlEventName, id?: number, errorMsg?: string): this {\n const self = this;\n const eventType = \"_on\" + event;\n // @ts-expect-error TODO fix type\n const events = (self)[eventType] as HowlListener[];\n\n for (let i = events.length - 1; i >= 0; i--) {\n const currentEvent = events[i];\n if (currentEvent && (!currentEvent.id || currentEvent.id === id || event === \"load\")) {\n setTimeout(() => {\n currentEvent?.fn.call(self, id, errorMsg);\n }, 0);\n\n if (currentEvent.once) {\n self.off(event, currentEvent.fn, currentEvent.id);\n }\n }\n }\n\n self._loadQueue(event);\n return self;\n }\n\n _loadQueue(event?: string): this {\n const self = this;\n if (self._queue.length > 0) {\n const task = self._queue[0];\n if (task) {\n if (event && task.event === event) {\n self._queue.shift();\n self._loadQueue();\n }\n if (!event) {\n task.action();\n }\n }\n }\n return self;\n }\n\n _ended(sound: Sound): this {\n const self = this;\n const sprite = sound._sprite;\n\n if (\n !self._webAudio &&\n sound._node &&\n isHtml5Audio(sound._node) &&\n !sound._node.paused &&\n !sound._node.ended &&\n sound._node.currentTime < sound._stop\n ) {\n setTimeout(() => self._ended(sound), 100);\n return self;\n }\n\n const loop = !!(sound._loop || self._sprite[sprite]?.[2]);\n self._emit(\"end\", sound._id);\n\n if (!self._webAudio && loop) {\n self.stop(sound._id, true).play(sound._id);\n }\n\n if (self._webAudio && loop) {\n self._emit(\"play\", sound._id);\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n sound._playStart = this.howler.ctx?.currentTime ?? 0;\n\n const timeout = ((sound._stop - sound._start) * 1000) / Math.abs(sound._rate);\n self._endTimers[sound._id] = setTimeout(() => self._ended(sound), timeout);\n }\n\n if (self._webAudio && !loop) {\n sound._paused = true;\n sound._ended = true;\n sound._seek = sound._start || 0;\n sound._rateSeek = 0;\n self._clearTimer(sound._id);\n self._cleanBuffer(sound._node as WebAudioNodeWithSource);\n this.howler._autoSuspend();\n }\n\n if (!self._webAudio && !loop) {\n self.stop(sound._id, true);\n }\n\n return self;\n }\n\n _clearTimer(id: number): this {\n const self = this;\n if (self._endTimers[id]) {\n if (typeof self._endTimers[id] !== \"function\") {\n clearTimeout(self._endTimers[id]);\n } else {\n const sound = self._soundById(id);\n if (sound && sound._node && isHtml5Audio(sound._node)) {\n sound._node.removeEventListener(\"ended\", self._endTimers[id], false);\n }\n }\n delete self._endTimers[id];\n }\n return self;\n }\n\n _soundById(id: number): Sound | undefined {\n for (let i = 0; i < this._sounds.length; i++) {\n if (id === this._sounds[i]?._id) {\n return this._sounds[i];\n }\n }\n return undefined;\n }\n\n _inactiveSound(): Sound {\n this._drain();\n for (let i = 0; i < this._sounds.length; i++) {\n if (this._sounds[i]?._ended) {\n const sound = this._sounds[i]?.reset();\n if (sound) {\n return sound;\n }\n }\n }\n return new Sound(this, this.howler);\n }\n\n _drain(): void {\n const limit = this._pool;\n if (this._sounds.length < limit) return;\n\n let cnt = 0;\n for (let i = 0; i < this._sounds.length; i++) {\n if (this._sounds[i]?._ended) {\n cnt++;\n }\n }\n\n for (let i = this._sounds.length - 1; i >= 0; i--) {\n if (cnt <= limit) {\n return;\n }\n if (this._sounds[i]?._ended) {\n const currentNode = this._sounds[i]?._node;\n if (this._webAudio && currentNode && !isHtml5Audio(currentNode)) {\n currentNode[\"disconnect\"]?.(0);\n }\n this._sounds.splice(i, 1);\n cnt--;\n }\n }\n }\n\n _getSoundIds(id?: number): number[] {\n if (typeof id === \"undefined\") return this._sounds.map((s) => s._id);\n return [id];\n }\n\n _refreshBuffer(sound: Sound): void {\n sound._node = sound._node as WebAudioNodeWithSource;\n sound._node.bufferSource = this.howler.ctx?.createBufferSource();\n\n if (!sound._node?.bufferSource) {\n return;\n }\n\n const bufferSource = sound._node.bufferSource;\n bufferSource.buffer = this.howler.cache[this._src.toString()] ?? null;\n if (sound._panner) {\n bufferSource.connect(sound._panner);\n }\n else {\n bufferSource.connect(sound._node);\n }\n bufferSource.loop = sound._loop;\n if (sound._loop) {\n bufferSource.loopStart = sound._start || 0;\n bufferSource.loopEnd = sound._stop || 0;\n }\n\n bufferSource.playbackRate.setValueAtTime(sound._rate, this.howler.ctx?.currentTime ?? 0);\n }\n\n _cleanBuffer(node: WebAudioNodeWithSource): void {\n const isIOS = !!(this.howler._navigator && this.howler._navigator.vendor.indexOf(\"Apple\") >= 0);\n if (!node.bufferSource) {\n return;\n }\n\n if (this.howler._scratchBuffer && node.bufferSource) {\n node.bufferSource.onended = null;\n node.bufferSource.disconnect(0);\n if (isIOS) {\n try {\n node.bufferSource.buffer = this.howler._scratchBuffer;\n } catch {\n // ignore\n }\n }\n }\n node.bufferSource = undefined;\n }\n\n _clearSound(node: HTMLAudioElement): void {\n const checkIE = this.howler._navigator && /MSIE |Trident\\//.test(this.howler._navigator && this.howler._navigator.userAgent);\n if (!checkIE) {\n node.src =\n \"data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA\";\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["isHtml5Audio", "node", "loadBuffer", "howl", "howler", "url", "cache", "loadSound", "data", "dataView", "i", "decodeAudioData", "xhr", "key", "code", "safeXhrSend", "arrayBuffer", "error", "success", "buffer", "self", "setupAudioContext", "iOS", "appVersion", "version", "safari", "HowlerGlobal", "vol", "self", "parsed", "setupAudioContext", "howl", "ids", "j", "soundId", "sound", "isHtml5Audio", "muted", "i", "ext", "audioTest", "mpegTest", "ua", "checkOpera", "isOldOpera", "checkSafari", "safariVersion", "isOldSafari", "unlock", "audioNode", "source", "audio", "handleSuspension", "Howler", "Sound", "parent", "howler", "volume", "gain", "preload", "self", "html", "defaultSprite", "Howl", "options", "Howler", "setupAudioContext", "self", "url", "i", "ext", "str", "dataExt", "m", "Sound", "loadBuffer", "spriteOrId", "internal", "id", "num", "sound", "soundId", "spriteName", "seek", "spriteDef", "duration", "timeout", "start", "stop", "setParams", "node", "playWebAudio", "vol", "bs", "html", "playHtml5", "p", "err", "listener", "ids", "isHtml5Audio", "n", "rateOrId", "idMaybe", "argsLen", "rate", "capturedArgs", "sprite", "sId", "seekOrId", "wasPlaying", "seekAndEmit", "emitSeek", "realTime", "rateSeek", "sid", "a", "muted", "volOrId", "from", "to", "len", "currentTime", "end", "loopOrId", "loopVal", "sounds", "currentNode", "index", "remCache", "hs", "event", "fn", "once", "eventName", "events", "isId", "keys", "_id", "isGroup", "diff", "steps", "stepLen", "lastTick", "tick", "errorMsg", "eventType", "currentEvent", "task", "loop", "limit", "cnt", "s", "bufferSource", "isIOS"]
|
|
7
|
+
}
|