{"version":3,"file":"SoundLibrary.mjs","sources":["../src/SoundLibrary.ts"],"sourcesContent":["import { Filter } from './filters/Filter';\nimport { HTMLAudioContext } from './htmlaudio/HTMLAudioContext';\nimport { IMediaContext } from './interfaces/IMediaContext';\nimport { IMediaInstance } from './interfaces/IMediaInstance';\nimport { CompleteCallback, Options, PlayOptions, Sound } from './Sound';\nimport { WebAudioContext } from './webaudio/WebAudioContext';\n\ntype SoundSourceMap = Record<string, Options | string | ArrayBuffer | AudioBuffer | HTMLAudioElement>;\ntype SoundMap = Record<string, Sound>;\n\n/**\n * Manages the playback of sounds. This is the main class for PixiJS Sound. If you're\n * using the browser-based bundled this is `PIXI.sound`. Otherwise, you can do this:\n * @example\n * import { sound } from '@pixi/sound';\n *\n * // sound is an instance of SoundLibrary\n * sound.add('my-sound', 'path/to/file.mp3');\n * sound.play('my-sound');\n */\nclass SoundLibrary\n{\n    /**\n     * For legacy approach for Audio. Instead of using WebAudio API\n     * for playback of sounds, it will use HTML5 `<audio>` element.\n     */\n    private _useLegacy: boolean;\n\n    /** The global context to use. */\n    private _context: IMediaContext;\n\n    /** The WebAudio specific context */\n    private _webAudioContext: WebAudioContext;\n\n    /** The HTML Audio (legacy) context. */\n    private _htmlAudioContext: HTMLAudioContext;\n\n    /** The map of all sounds by alias. */\n    private _sounds: SoundMap;\n\n    constructor()\n    {\n        this.init();\n    }\n\n    /**\n     * Re-initialize the sound library, this will\n     * recreate the AudioContext. If there's a hardware-failure\n     * call `close` and then `init`.\n     * @return Sound instance\n     */\n    public init(): this\n    {\n        if (this.supported)\n        {\n            this._webAudioContext = new WebAudioContext();\n        }\n        this._htmlAudioContext = new HTMLAudioContext();\n        this._sounds = {};\n        this.useLegacy = !this.supported;\n\n        return this;\n    }\n\n    /**\n     * The global context to use.\n     * @readonly\n     */\n    public get context(): IMediaContext\n    {\n        return this._context;\n    }\n\n    /**\n     * Apply filters to all sounds. Can be useful\n     * for setting global planning or global effects.\n     * **Only supported with WebAudio.**\n     * @example\n     * import { sound, filters } from '@pixi/sound';\n     * // Adds a filter to pan all output left\n     * sound.filtersAll = [\n     *     new filters.StereoFilter(-1)\n     * ];\n     */\n    public get filtersAll(): Filter[]\n    {\n        if (!this.useLegacy)\n        {\n            return this._context.filters;\n        }\n\n        return [];\n    }\n    public set filtersAll(filtersAll: Filter[])\n    {\n        if (!this.useLegacy)\n        {\n            this._context.filters = filtersAll;\n        }\n    }\n\n    /**\n     * `true` if WebAudio is supported on the current browser.\n     */\n    public get supported(): boolean\n    {\n        return WebAudioContext.AudioContext !== null;\n    }\n\n    /**\n     * Register an existing sound with the library cache.\n     * @method add\n     * @instance\n     * @param {string} alias - The sound alias reference.\n     * @param {Sound} sound - Sound reference to use.\n     * @return {Sound} Instance of the Sound object.\n     */\n\n    /**\n     * Adds a new sound by alias.\n     * @param alias - The sound alias reference.\n     * @param {ArrayBuffer|AudioBuffer|String|Options|HTMLAudioElement} options - Either the path or url to the source file.\n     *        or the object of options to use.\n     * @return Instance of the Sound object.\n     */\n    public add(alias: string, options: Options | string | ArrayBuffer | AudioBuffer | HTMLAudioElement | Sound): Sound;\n\n    /**\n     * Adds multiple sounds at once.\n     * @param map - Map of sounds to add, the key is the alias, the value is the\n     *        `string`, `ArrayBuffer`, `AudioBuffer`, `HTMLAudioElement` or the list of options\n     *        (see {@link Options} for full options).\n     * @param globalOptions - The default options for all sounds.\n     *        if a property is defined, it will use the local property instead.\n     * @return Instance to the Sound object.\n     */\n    public add(map: SoundSourceMap, globalOptions?: Options): SoundMap;\n\n    /**\n     * @ignore\n     */\n    public add(source: string | SoundSourceMap,\n        sourceOptions?: Options | string | ArrayBuffer | AudioBuffer | HTMLAudioElement | Sound): any\n    {\n        if (typeof source === 'object')\n        {\n            const results: SoundMap = {};\n\n            for (const alias in source)\n            {\n                const options: Options = this._getOptions(\n                    source[alias],\n                    sourceOptions as Options,\n                );\n\n                results[alias] = this.add(alias, options);\n            }\n\n            return results;\n        }\n\n        // eslint-disable-next-line no-console\n        console.assert(!this._sounds[source], `Sound with alias ${source} already exists.`);\n\n        if (sourceOptions instanceof Sound)\n        {\n            this._sounds[source] = sourceOptions;\n\n            return sourceOptions;\n        }\n\n        const options: Options = this._getOptions(sourceOptions);\n        const sound: Sound = Sound.from(options);\n\n        this._sounds[source] = sound;\n\n        return sound;\n    }\n\n    /**\n     * Internal methods for getting the options object\n     * @private\n     * @param source - The source options\n     * @param overrides - Override default options\n     * @return The construction options\n     */\n    private _getOptions(source: string | ArrayBuffer | AudioBuffer | HTMLAudioElement | Options,\n        overrides?: Options): Options\n    {\n        let options: Options;\n\n        if (typeof source === 'string')\n        {\n            options = { url: source };\n        }\n        else if (Array.isArray(source))\n        {\n            options = { url: source };\n        }\n        else if (source instanceof ArrayBuffer || source instanceof AudioBuffer || source instanceof HTMLAudioElement)\n        {\n            options = { source };\n        }\n        else\n        {\n            options = source as Options;\n        }\n        options = { ...options, ...(overrides || {}) };\n\n        return options;\n    }\n\n    /**\n     * Do not use WebAudio, force the use of legacy. This **must** be called before loading any files.\n     */\n    public get useLegacy(): boolean\n    {\n        return this._useLegacy;\n    }\n    public set useLegacy(legacy: boolean)\n    {\n        this._useLegacy = legacy;\n\n        // Set the context to use\n        this._context = (!legacy && this.supported)\n            ? this._webAudioContext\n            : this._htmlAudioContext;\n    }\n\n    /**\n     * This disables auto-pause all playback when the window blurs (WebAudio only).\n     * This is helpful to keep from playing sounds when the user switches tabs.\n     * However, if you're running content within an iframe, this may be undesirable\n     * and you should disable (set to `true`) this behavior.\n     * @default false\n     */\n    public get disableAutoPause(): boolean\n    {\n        return !this._webAudioContext.autoPause;\n    }\n    public set disableAutoPause(autoPause: boolean)\n    {\n        this._webAudioContext.autoPause = !autoPause;\n    }\n\n    /**\n     * Removes a sound by alias.\n     * @param alias - The sound alias reference.\n     * @return Instance for chaining.\n     */\n    public remove(alias: string): this\n    {\n        this.exists(alias, true);\n        this._sounds[alias].destroy();\n        delete this._sounds[alias];\n\n        return this;\n    }\n\n    /**\n     * Set the global volume for all sounds. To set per-sound volume see {@link SoundLibrary#volume}.\n     */\n    public get volumeAll(): number\n    {\n        return this._context.volume;\n    }\n    public set volumeAll(volume: number)\n    {\n        this._context.volume = volume;\n        this._context.refresh();\n    }\n\n    /**\n     * Set the global speed for all sounds. To set per-sound speed see {@link SoundLibrary#speed}.\n     */\n    public get speedAll(): number\n    {\n        return this._context.speed;\n    }\n    public set speedAll(speed: number)\n    {\n        this._context.speed = speed;\n        this._context.refresh();\n    }\n\n    /**\n     * Toggle paused property for all sounds.\n     * @return `true` if all sounds are paused.\n     */\n    public togglePauseAll(): boolean\n    {\n        return this._context.togglePause();\n    }\n\n    /**\n     * Pauses any playing sounds.\n     * @return Instance for chaining.\n     */\n    public pauseAll(): this\n    {\n        this._context.paused = true;\n        this._context.refreshPaused();\n\n        return this;\n    }\n\n    /**\n     * Resumes any sounds.\n     * @return Instance for chaining.\n     */\n    public resumeAll(): this\n    {\n        this._context.paused = false;\n        this._context.refreshPaused();\n\n        return this;\n    }\n\n    /**\n     * Toggle muted property for all sounds.\n     * @return `true` if all sounds are muted.\n     */\n    public toggleMuteAll(): boolean\n    {\n        return this._context.toggleMute();\n    }\n\n    /**\n     * Mutes all playing sounds.\n     * @return Instance for chaining.\n     */\n    public muteAll(): this\n    {\n        this._context.muted = true;\n        this._context.refresh();\n\n        return this;\n    }\n\n    /**\n     * Unmutes all playing sounds.\n     * @return Instance for chaining.\n     */\n    public unmuteAll(): this\n    {\n        this._context.muted = false;\n        this._context.refresh();\n\n        return this;\n    }\n\n    /**\n     * Stops and removes all sounds. They cannot be used after this.\n     * @return Instance for chaining.\n     */\n    public removeAll(): this\n    {\n        for (const alias in this._sounds)\n        {\n            this._sounds[alias].destroy();\n            delete this._sounds[alias];\n        }\n\n        return this;\n    }\n\n    /**\n     * Stops all sounds.\n     * @return Instance for chaining.\n     */\n    public stopAll(): this\n    {\n        for (const alias in this._sounds)\n        {\n            this._sounds[alias].stop();\n        }\n\n        return this;\n    }\n\n    /**\n     * Checks if a sound by alias exists.\n     * @param alias - Check for alias.\n     * @param assert - Whether enable console.assert.\n     * @return true if the sound exists.\n     */\n    public exists(alias: string, assert = false): boolean\n    {\n        const exists = !!this._sounds[alias];\n\n        if (assert)\n        {\n            // eslint-disable-next-line no-console\n            console.assert(exists, `No sound matching alias '${alias}'.`);\n        }\n\n        return exists;\n    }\n\n    /**\n     * Convenience function to check to see if any sound is playing.\n     * @returns `true` if any sound is currently playing.\n     */\n    public isPlaying(): boolean\n    {\n        for (const alias in this._sounds)\n        {\n            if (this._sounds[alias].isPlaying)\n            {\n                return true;\n            }\n        }\n\n        return false;\n    }\n\n    /**\n     * Find a sound by alias.\n     * @param alias - The sound alias reference.\n     * @return Sound object.\n     */\n    public find(alias: string): Sound\n    {\n        this.exists(alias, true);\n\n        return this._sounds[alias];\n    }\n\n    /**\n     * Plays a sound.\n     * @method play\n     * @instance\n     * @param {string} alias - The sound alias reference.\n     * @param {string} sprite - The alias of the sprite to play.\n     * @return {IMediaInstance|null} The sound instance, this cannot be reused\n     *         after it is done playing. Returns `null` if the sound has not yet loaded.\n     */\n\n    /**\n     * Plays a sound.\n     * @param alias - The sound alias reference.\n     * @param {PlayOptions|Function} options - The options or callback when done.\n     * @return The sound instance,\n     *        this cannot be reused after it is done playing. Returns a Promise if the sound\n     *        has not yet loaded.\n     */\n    public play(\n        alias: string,\n        options?: PlayOptions | CompleteCallback | string): IMediaInstance | Promise<IMediaInstance>\n    {\n        return this.find(alias).play(options);\n    }\n\n    /**\n     * Stops a sound.\n     * @param alias - The sound alias reference.\n     * @return Sound object.\n     */\n    public stop(alias: string): Sound\n    {\n        return this.find(alias).stop();\n    }\n\n    /**\n     * Pauses a sound.\n     * @param alias - The sound alias reference.\n     * @return Sound object.\n     */\n    public pause(alias: string): Sound\n    {\n        return this.find(alias).pause();\n    }\n\n    /**\n     * Resumes a sound.\n     * @param alias - The sound alias reference.\n     * @return Instance for chaining.\n     */\n    public resume(alias: string): Sound\n    {\n        return this.find(alias).resume();\n    }\n\n    /**\n     * Get or set the volume for a sound.\n     * @param alias - The sound alias reference.\n     * @param volume - Optional current volume to set.\n     * @return The current volume.\n     */\n    public volume(alias: string, volume?: number): number\n    {\n        const sound = this.find(alias);\n\n        if (volume !== undefined)\n        {\n            sound.volume = volume;\n        }\n\n        return sound.volume;\n    }\n\n    /**\n     * Get or set the speed for a sound.\n     * @param alias - The sound alias reference.\n     * @param speed - Optional current speed to set.\n     * @return The current speed.\n     */\n    public speed(alias: string, speed?: number): number\n    {\n        const sound = this.find(alias);\n\n        if (speed !== undefined)\n        {\n            sound.speed = speed;\n        }\n\n        return sound.speed;\n    }\n\n    /**\n     * Get the length of a sound in seconds.\n     * @param alias - The sound alias reference.\n     * @return The current duration in seconds.\n     */\n    public duration(alias: string): number\n    {\n        return this.find(alias).duration;\n    }\n\n    /**\n     * Closes the sound library. This will release/destroy\n     * the AudioContext(s). Can be used safely if you want to\n     * initialize the sound library later. Use `init` method.\n     */\n    public close(): this\n    {\n        this.removeAll();\n        this._sounds = null;\n        if (this._webAudioContext)\n        {\n            this._webAudioContext.destroy();\n            this._webAudioContext = null;\n        }\n        if (this._htmlAudioContext)\n        {\n            this._htmlAudioContext.destroy();\n            this._htmlAudioContext = null;\n        }\n        this._context = null;\n\n        return this;\n    }\n}\n\nexport { SoundLibrary };\nexport type { SoundMap, SoundSourceMap };\n"],"names":["options"],"mappings":"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"}