{"version":3,"file":"WebAudioNodes.mjs","sources":["../../src/webaudio/WebAudioNodes.ts"],"sourcesContent":["import { Filterable } from '../Filterable';\nimport { WebAudioContext } from './WebAudioContext';\nimport { WebAudioUtils } from './WebAudioUtils';\n\n/** Output for cloning source node. */\ninterface SourceClone\n{\n    /** Cloned audio buffer source */\n    source: AudioBufferSourceNode;\n    /** Independent volume control */\n    gain: GainNode;\n}\n\n/**\n * @memberof webaudio\n */\nclass WebAudioNodes extends Filterable\n{\n    /**\n     * The buffer size for script processor, default is `0` which auto-detects. If you plan to use\n     * script node on iOS, you'll need to provide a non-zero amount.\n     * @default 0\n     */\n    public static BUFFER_SIZE = 0;\n\n    /**\n     * Get the buffer source node\n     * @readonly\n     */\n    public bufferSource: AudioBufferSourceNode;\n\n    /**\n     * Get the gain node\n     * @readonly\n     */\n    public gain: GainNode;\n\n    /**\n     * Get the analyser node\n     * @readonly\n     */\n    public analyser: AnalyserNode;\n\n    /**\n     * Reference to the SoundContext\n     * @readonly\n     */\n    public context: WebAudioContext;\n\n    /** Private reference to the script processor node. */\n    private _script: ScriptProcessorNode;\n\n    /**\n     * @param context - The audio context.\n     */\n    constructor(context: WebAudioContext)\n    {\n        const audioContext: AudioContext = context.audioContext;\n\n        const bufferSource: AudioBufferSourceNode = audioContext.createBufferSource();\n        const gain: GainNode = audioContext.createGain();\n        const analyser: AnalyserNode = audioContext.createAnalyser();\n\n        bufferSource.connect(analyser);\n        analyser.connect(gain);\n        gain.connect(context.destination);\n\n        super(analyser, gain);\n\n        this.context = context;\n        this.bufferSource = bufferSource;\n        this.gain = gain;\n        this.analyser = analyser;\n    }\n\n    /**\n     * Get the script processor node.\n     * @readonly\n     */\n    public get script(): ScriptProcessorNode\n    {\n        if (!this._script)\n        {\n            this._script = this.context.audioContext.createScriptProcessor(WebAudioNodes.BUFFER_SIZE);\n            this._script.connect(this.context.destination);\n        }\n\n        return this._script;\n    }\n\n    /** Cleans up. */\n    public destroy(): void\n    {\n        super.destroy();\n\n        this.bufferSource.disconnect();\n        if (this._script)\n        {\n            this._script.disconnect();\n        }\n        this.gain.disconnect();\n        this.analyser.disconnect();\n\n        this.bufferSource = null;\n        this._script = null;\n        this.gain = null;\n        this.analyser = null;\n\n        this.context = null;\n    }\n\n    /**\n     * Clones the bufferSource. Used just before playing a sound.\n     * @returns {SourceClone} The clone AudioBufferSourceNode.\n     */\n    public cloneBufferSource(): SourceClone\n    {\n        const orig: AudioBufferSourceNode = this.bufferSource;\n        const source: AudioBufferSourceNode = this.context.audioContext.createBufferSource();\n\n        source.buffer = orig.buffer;\n        WebAudioUtils.setParamValue(source.playbackRate, orig.playbackRate.value);\n        source.loop = orig.loop;\n\n        const gain: GainNode = this.context.audioContext.createGain();\n\n        source.connect(gain);\n        gain.connect(this.destination);\n\n        return { source, gain };\n    }\n\n    /**\n     * Get buffer size of `ScriptProcessorNode`.\n     * @readonly\n     */\n    get bufferSize(): number\n    {\n        return this.script.bufferSize;\n    }\n}\n\nexport type { SourceClone };\nexport { WebAudioNodes };\n"],"names":[],"mappings":"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"}