@pixi/sound
Version:
WebAudio API playback library with filters
1 lines • 8.18 kB
Source Map (JSON)
{"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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"}