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