{"version":3,"file":"WebAudioMedia.mjs","sources":["../../src/webaudio/WebAudioMedia.ts"],"sourcesContent":["import { DOMAdapter } from 'pixi.js';\nimport { Filter } from '../filters/Filter';\nimport { IMedia } from '../interfaces/IMedia';\nimport { LoadedCallback, Sound } from '../Sound';\nimport { WebAudioContext } from './WebAudioContext';\nimport { WebAudioInstance } from './WebAudioInstance';\nimport { WebAudioNodes } from './WebAudioNodes';\n\n/**\n * Represents a single sound element. Can be used to play, pause, etc. sound instances.\n * @memberof webaudio\n */\nclass WebAudioMedia implements IMedia\n{\n    /**\n     * Reference to the parent Sound container.\n     * @readonly\n     */\n    public parent: Sound;\n\n    /**\n     * The file buffer to load.\n     * @readonly\n     */\n    public source: ArrayBuffer | AudioBuffer;\n\n    /** Instance of the chain builder. */\n    private _nodes: WebAudioNodes;\n\n    /** Instance of the source node. */\n    private _source: AudioBufferSourceNode;\n\n    /**\n     * Re-initialize without constructing.\n     * @param parent - - Instance of parent Sound container\n     */\n    public init(parent: Sound): void\n    {\n        this.parent = parent;\n        this._nodes = new WebAudioNodes(this.context);\n        this._source = this._nodes.bufferSource;\n        this.source = parent.options.source as ArrayBuffer | AudioBuffer;\n    }\n\n    /** Destructor, safer to use `SoundLibrary.remove(alias)` to remove this sound. */\n    public destroy(): void\n    {\n        this.parent = null;\n        this._nodes.destroy();\n        this._nodes = null;\n        try\n        {\n            this._source.buffer = null;\n        }\n        catch (err)\n        {\n            // try/catch workaround for bug in older Chrome versions\n            console.warn('Failed to set AudioBufferSourceNode.buffer to null:', err);\n        }\n        this._source = null;\n        this.source = null;\n    }\n\n    // Implement create\n    public create(): WebAudioInstance\n    {\n        return new WebAudioInstance(this);\n    }\n\n    // Implement context\n    public get context(): WebAudioContext\n    {\n        return this.parent.context as WebAudioContext;\n    }\n\n    // Implement isPlayable\n    public get isPlayable(): boolean\n    {\n        return !!this._source && !!this._source.buffer;\n    }\n\n    // Implement filters\n    public get filters(): Filter[]\n    {\n        return this._nodes.filters;\n    }\n    public set filters(filters: Filter[])\n    {\n        this._nodes.filters = filters;\n    }\n\n    // Implements duration\n    public get duration(): number\n    {\n        // eslint-disable-next-line no-console\n        console.assert(this.isPlayable, 'Sound not yet playable, no duration');\n\n        return this._source.buffer.duration;\n    }\n\n    /** Gets and sets the buffer. */\n    public get buffer(): AudioBuffer\n    {\n        return this._source.buffer;\n    }\n    public set buffer(buffer: AudioBuffer)\n    {\n        this._source.buffer = buffer;\n    }\n\n    /** Get the current chained nodes object */\n    public get nodes(): WebAudioNodes\n    {\n        return this._nodes;\n    }\n\n    // Implements load\n    public load(callback?: LoadedCallback): void\n    {\n        // Load from the arraybuffer, incase it was loaded outside\n        if (this.source)\n        {\n            this._decode(this.source, callback);\n        }\n        // Load from the file path\n        else if (this.parent.url)\n        {\n            this._loadUrl(callback);\n        }\n        else if (callback)\n        {\n            callback(new Error('sound.url or sound.source must be set'));\n        }\n        else\n        {\n            console.error('sound.url or sound.source must be set');\n        }\n    }\n\n    /** Loads a sound using XHMLHttpRequest object. */\n    private async _loadUrl(callback?: LoadedCallback): Promise<void>\n    {\n        const url: string = this.parent.url;\n        const response = await DOMAdapter.get().fetch(url);\n\n        this._decode(await response.arrayBuffer(), callback);\n    }\n\n    /**\n     * Decodes the array buffer.\n     * @param arrayBuffer - From load.\n     * @param {Function} callback - Callback optional\n     */\n    private _decode(arrayBuffer: ArrayBuffer | AudioBuffer, callback?: LoadedCallback): void\n    {\n        const audioBufferReadyFn = (err: Error, buffer: AudioBuffer) =>\n        {\n            if (err)\n            {\n                if (callback)\n                {\n                    callback(err);\n                }\n            }\n            else\n            {\n                this.parent.isLoaded = true;\n                this.buffer = buffer;\n                const instance = this.parent.autoPlayStart();\n\n                if (callback)\n                {\n                    callback(null, this.parent, instance);\n                }\n            }\n        };\n\n        if (arrayBuffer instanceof AudioBuffer)\n        {\n            audioBufferReadyFn(null, arrayBuffer);\n        }\n        else\n        {\n            const context = this.parent.context as WebAudioContext;\n\n            context.decode(arrayBuffer, audioBufferReadyFn);\n        }\n    }\n}\n\nexport { WebAudioMedia };\n"],"names":[],"mappings":"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"}