{"version":3,"file":"HTMLAudioMedia.mjs","sources":["../../src/htmlaudio/HTMLAudioMedia.ts"],"sourcesContent":["import { EventEmitter } from 'pixi.js';\nimport { Filter } from '../filters/Filter';\nimport { IMedia } from '../interfaces/IMedia';\nimport { LoadedCallback, Sound } from '../Sound';\nimport { HTMLAudioContext } from './HTMLAudioContext';\nimport { HTMLAudioInstance } from './HTMLAudioInstance';\n\n/**\n * The fallback version of Sound which uses `<audio>` instead of WebAudio API.\n * @memberof htmlaudio\n * @extends PIXI.EventEmitter\n */\nclass HTMLAudioMedia extends EventEmitter implements IMedia\n{\n    public parent: Sound;\n    private _source: HTMLAudioElement;\n\n    public init(parent: Sound): void\n    {\n        this.parent = parent;\n        this._source = parent.options.source as HTMLAudioElement || new Audio();\n        if (parent.url)\n        {\n            this._source.src = parent.url;\n        }\n    }\n\n    // Implement create\n    public create(): HTMLAudioInstance\n    {\n        return new HTMLAudioInstance(this);\n    }\n\n    /**\n     * If the audio media is playable (ready).\n     * @readonly\n     */\n    public get isPlayable(): boolean\n    {\n        return !!this._source && this._source.readyState === 4;\n    }\n\n    /**\n     * THe duration of the media in seconds.\n     * @readonly\n     */\n    public get duration(): number\n    {\n        return this._source.duration;\n    }\n\n    /**\n     * Reference to the context.\n     * @readonly\n     */\n    public get context(): HTMLAudioContext\n    {\n        return this.parent.context as HTMLAudioContext;\n    }\n\n    /** The collection of filters, does not apply to HTML Audio. */\n    public get filters(): Filter[]\n    {\n        return null;\n    }\n    public set filters(_filters: Filter[])\n    {\n        console.warn('HTML Audio does not support filters');\n    }\n\n    // Override the destroy\n    public destroy(): void\n    {\n        this.removeAllListeners();\n\n        this.parent = null;\n\n        if (this._source)\n        {\n            this._source.src = '';\n            this._source.load();\n            this._source = null;\n        }\n    }\n\n    /**\n     * Get the audio source element.\n     * @type {HTMLAudioElement}\n     * @readonly\n     */\n    public get source(): HTMLAudioElement\n    {\n        return this._source;\n    }\n\n    // Implement the method to being preloading\n    public load(callback?: LoadedCallback): void\n    {\n        const source = this._source;\n        const sound = this.parent;\n\n        // See if the source is already loaded\n        if (source.readyState === 4)\n        {\n            sound.isLoaded = true;\n            const instance = sound.autoPlayStart();\n\n            if (callback)\n            {\n                setTimeout(() =>\n                {\n                    callback(null, sound, instance);\n                }, 0);\n            }\n\n            return;\n        }\n\n        // If there's no source, we cannot load\n        if (!sound.url)\n        {\n            callback(new Error('sound.url or sound.source must be set'));\n\n            return;\n        }\n\n        // Set the source\n        source.src = sound.url;\n\n        const onLoad = () =>\n        {\n            // eslint-disable-next-line @typescript-eslint/no-use-before-define\n            removeListeners();\n            sound.isLoaded = true;\n            const instance = sound.autoPlayStart();\n\n            if (callback)\n            {\n                callback(null, sound, instance);\n            }\n        };\n\n        const onAbort = () =>\n        {\n            // eslint-disable-next-line @typescript-eslint/no-use-before-define\n            removeListeners();\n            if (callback)\n            {\n                callback(new Error('Sound loading has been aborted'));\n            }\n        };\n\n        const onError = () =>\n        {\n            // eslint-disable-next-line @typescript-eslint/no-use-before-define\n            removeListeners();\n            const message = `Failed to load audio element (code: ${source.error.code})`;\n\n            if (callback)\n            {\n                callback(new Error(message));\n            }\n            else\n            {\n                console.error(message);\n            }\n        };\n\n        // Remove all event listeners\n        const removeListeners = () =>\n        {\n            // Listen for callback\n            source.removeEventListener('canplaythrough', onLoad);\n            source.removeEventListener('load', onLoad);\n            source.removeEventListener('abort', onAbort);\n            source.removeEventListener('error', onError);\n        };\n\n        // Listen for callback\n        source.addEventListener('canplaythrough', onLoad, false);\n        source.addEventListener('load', onLoad, false);\n        source.addEventListener('abort', onAbort, false);\n        source.addEventListener('error', onError, false);\n\n        // Begin the loading\n        source.load();\n    }\n}\n\nexport { HTMLAudioMedia };\n"],"names":[],"mappings":"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"}