{"version":3,"file":"Filterable.mjs","sources":["../src/Filterable.ts"],"sourcesContent":["import { Filter } from './filters/Filter';\n\n/**\n * Abstract class which SoundNodes and SoundContext\n * both extend. This provides the functionality for adding\n * dynamic filters.\n */\nclass Filterable\n{\n    /** Get the gain node */\n    private _input: AudioNode;\n\n    /** The destination output audio node */\n    private _output: AudioNode;\n\n    /** Collection of filters. */\n    private _filters: Filter[];\n\n    /**\n     * @param input - The source audio node\n     * @param output - The output audio node\n     */\n    constructor(input: AudioNode, output: AudioNode)\n    {\n        this._output = output;\n        this._input = input;\n    }\n\n    /** The destination output audio node */\n    get destination(): AudioNode\n    {\n        return this._input;\n    }\n\n    /** The collection of filters. */\n    get filters(): Filter[]\n    {\n        return this._filters;\n    }\n    set filters(filters: Filter[])\n    {\n        if (this._filters)\n        {\n            this._filters.forEach((filter: Filter) =>\n            {\n                if (filter)\n                {\n                    filter.disconnect();\n                }\n            });\n            this._filters = null;\n            // Reconnect direct path\n            this._input.connect(this._output);\n        }\n\n        if (filters && filters.length)\n        {\n            this._filters = filters.slice(0);\n\n            // Disconnect direct path before inserting filters\n            this._input.disconnect();\n\n            // Connect each filter\n            let prevFilter: Filter = null;\n\n            filters.forEach((filter: Filter) =>\n            {\n                if (prevFilter === null)\n                {\n                    // first filter is the destination\n                    // for the analyser\n                    this._input.connect(filter.destination);\n                }\n                else\n                {\n                    prevFilter.connect(filter.destination);\n                }\n                prevFilter = filter;\n            });\n            prevFilter.connect(this._output);\n        }\n    }\n\n    /** Cleans up. */\n    public destroy(): void\n    {\n        this.filters = null;\n        this._input = null;\n        this._output = null;\n    }\n}\n\nexport { Filterable };\n"],"names":[],"mappings":"AAOA,MAAM,UACN,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcI,WAAA,CAAY,OAAkB,MAC9B,EAAA;AACI,IAAA,IAAA,CAAK,OAAU,GAAA,MAAA,CAAA;AACf,IAAA,IAAA,CAAK,MAAS,GAAA,KAAA,CAAA;AAAA,GAClB;AAAA;AAAA,EAGA,IAAI,WACJ,GAAA;AACI,IAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,GAChB;AAAA;AAAA,EAGA,IAAI,OACJ,GAAA;AACI,IAAA,OAAO,IAAK,CAAA,QAAA,CAAA;AAAA,GAChB;AAAA,EACA,IAAI,QAAQ,OACZ,EAAA;AACI,IAAA,IAAI,KAAK,QACT,EAAA;AACI,MAAK,IAAA,CAAA,QAAA,CAAS,OAAQ,CAAA,CAAC,MACvB,KAAA;AACI,QAAA,IAAI,MACJ,EAAA;AACI,UAAA,MAAA,CAAO,UAAW,EAAA,CAAA;AAAA,SACtB;AAAA,OACH,CAAA,CAAA;AACD,MAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAEhB,MAAK,IAAA,CAAA,MAAA,CAAO,OAAQ,CAAA,IAAA,CAAK,OAAO,CAAA,CAAA;AAAA,KACpC;AAEA,IAAI,IAAA,OAAA,IAAW,QAAQ,MACvB,EAAA;AACI,MAAK,IAAA,CAAA,QAAA,GAAW,OAAQ,CAAA,KAAA,CAAM,CAAC,CAAA,CAAA;AAG/B,MAAA,IAAA,CAAK,OAAO,UAAW,EAAA,CAAA;AAGvB,MAAA,IAAI,UAAqB,GAAA,IAAA,CAAA;AAEzB,MAAQ,OAAA,CAAA,OAAA,CAAQ,CAAC,MACjB,KAAA;AACI,QAAA,IAAI,eAAe,IACnB,EAAA;AAGI,UAAK,IAAA,CAAA,MAAA,CAAO,OAAQ,CAAA,MAAA,CAAO,WAAW,CAAA,CAAA;AAAA,SAG1C,MAAA;AACI,UAAW,UAAA,CAAA,OAAA,CAAQ,OAAO,WAAW,CAAA,CAAA;AAAA,SACzC;AACA,QAAa,UAAA,GAAA,MAAA,CAAA;AAAA,OAChB,CAAA,CAAA;AACD,MAAW,UAAA,CAAA,OAAA,CAAQ,KAAK,OAAO,CAAA,CAAA;AAAA,KACnC;AAAA,GACJ;AAAA;AAAA,EAGO,OACP,GAAA;AACI,IAAA,IAAA,CAAK,OAAU,GAAA,IAAA,CAAA;AACf,IAAA,IAAA,CAAK,MAAS,GAAA,IAAA,CAAA;AACd,IAAA,IAAA,CAAK,OAAU,GAAA,IAAA,CAAA;AAAA,GACnB;AACJ;;;;"}