UNPKG

phaser

Version:

A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers.

1,237 lines (958 loc) 33.4 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Phaser Source: sound/SoundManager.js</title> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/sunlight.default.css"> <link type="text/css" rel="stylesheet" href="styles/site.cerulean.css"> </head> <body> <div class="container-fluid"> <div class="navbar navbar-fixed-top navbar-inverse"> <div class="navbar-inner"> <a class="brand" href="index.html">Phaser</a> <ul class="nav"> <li class="dropdown"> <a href="namespaces.list.html" class="dropdown-toggle" data-toggle="dropdown">Namespaces<b class="caret"></b></a> <ul class="dropdown-menu "> <li class="class-depth-0"> <a href="Phaser.html">Phaser</a> </li> </ul> </li> <li class="dropdown"> <a href="classes.list.html" class="dropdown-toggle" data-toggle="dropdown">Classes<b class="caret"></b></a> <ul class="dropdown-menu "> <li class="class-depth-1"> <a href="Phaser.Animation.html">Animation</a> </li> <li class="class-depth-1"> <a href="Phaser.AnimationManager.html">AnimationManager</a> </li> <li class="class-depth-1"> <a href="Phaser.AnimationParser.html">AnimationParser</a> </li> <li class="class-depth-1"> <a href="Phaser.ArrayList.html">ArrayList</a> </li> <li class="class-depth-1"> <a href="Phaser.AudioSprite.html">AudioSprite</a> </li> <li class="class-depth-1"> <a href="Phaser.BitmapData.html">BitmapData</a> </li> <li class="class-depth-1"> <a href="Phaser.BitmapText.html">BitmapText</a> </li> <li class="class-depth-1"> <a href="Phaser.Button.html">Button</a> </li> <li class="class-depth-1"> <a href="Phaser.Cache.html">Cache</a> </li> <li class="class-depth-1"> <a href="Phaser.Camera.html">Camera</a> </li> <li class="class-depth-1"> <a href="Phaser.Canvas.html">Canvas</a> </li> <li class="class-depth-1"> <a href="Phaser.Circle.html">Circle</a> </li> <li class="class-depth-1"> <a href="Phaser.Color.html">Color</a> </li> <li class="class-depth-1"> <a href="Phaser.Device.html">Device</a> </li> <li class="class-depth-1"> <a href="Phaser.Easing.html">Easing</a> </li> <li class="class-depth-2"> <a href="Phaser.Easing.Back.html">Back</a> </li> <li class="class-depth-2"> <a href="Phaser.Easing.Bounce.html">Bounce</a> </li> <li class="class-depth-2"> <a href="Phaser.Easing.Circular.html">Circular</a> </li> <li class="class-depth-2"> <a href="Phaser.Easing.Cubic.html">Cubic</a> </li> <li class="class-depth-2"> <a href="Phaser.Easing.Elastic.html">Elastic</a> </li> <li class="class-depth-2"> <a href="Phaser.Easing.Exponential.html">Exponential</a> </li> <li class="class-depth-2"> <a href="Phaser.Easing.Linear.html">Linear</a> </li> <li class="class-depth-2"> <a href="Phaser.Easing.Quadratic.html">Quadratic</a> </li> <li class="class-depth-2"> <a href="Phaser.Easing.Quartic.html">Quartic</a> </li> <li class="class-depth-2"> <a href="Phaser.Easing.Quintic.html">Quintic</a> </li> <li class="class-depth-2"> <a href="Phaser.Easing.Sinusoidal.html">Sinusoidal</a> </li> <li class="class-depth-1"> <a href="Phaser.Ellipse.html">Ellipse</a> </li> <li class="class-depth-1"> <a href="Phaser.Events.html">Events</a> </li> <li class="class-depth-1"> <a href="Phaser.Filter.html">Filter</a> </li> <li class="class-depth-1"> <a href="Phaser.FlexGrid.html">FlexGrid</a> </li> <li class="class-depth-1"> <a href="Phaser.FlexLayer.html">FlexLayer</a> </li> <li class="class-depth-1"> <a href="Phaser.Frame.html">Frame</a> </li> <li class="class-depth-1"> <a href="Phaser.FrameData.html">FrameData</a> </li> <li class="class-depth-1"> <a href="Phaser.Game.html">Game</a> </li> <li class="class-depth-1"> <a href="Phaser.GameObjectCreator.html">GameObjectCreator</a> </li> <li class="class-depth-1"> <a href="Phaser.GameObjectFactory.html">GameObjectFactory</a> </li> <li class="class-depth-1"> <a href="Phaser.Gamepad.html">Gamepad</a> </li> <li class="class-depth-1"> <a href="Phaser.GamepadButton.html">GamepadButton</a> </li> <li class="class-depth-1"> <a href="Phaser.Graphics.html">Graphics</a> </li> <li class="class-depth-1"> <a href="Phaser.Group.html">Group</a> </li> <li class="class-depth-1"> <a href="Phaser.Image.html">Image</a> </li> <li class="class-depth-1"> <a href="Phaser.Input.html">Input</a> </li> <li class="class-depth-1"> <a href="Phaser.InputHandler.html">InputHandler</a> </li> <li class="class-depth-1"> <a href="Phaser.Key.html">Key</a> </li> <li class="class-depth-1"> <a href="Phaser.Keyboard.html">Keyboard</a> </li> <li class="class-depth-1"> <a href="Phaser.Line.html">Line</a> </li> <li class="class-depth-1"> <a href="Phaser.LinkedList.html">LinkedList</a> </li> <li class="class-depth-1"> <a href="Phaser.Loader.html">Loader</a> </li> <li class="class-depth-1"> <a href="Phaser.LoaderParser.html">LoaderParser</a> </li> <li class="class-depth-1"> <a href="Phaser.Math.html">Math</a> </li> <li class="class-depth-1"> <a href="Phaser.Mouse.html">Mouse</a> </li> <li class="class-depth-1"> <a href="Phaser.MSPointer.html">MSPointer</a> </li> <li class="class-depth-1"> <a href="Phaser.Net.html">Net</a> </li> <li class="class-depth-1"> <a href="Phaser.Particle.html">Particle</a> </li> <li class="class-depth-1"> <a href="Phaser.Particles.html">Particles</a> </li> <li class="class-depth-2"> <a href="Phaser.Particles.Arcade.html">Arcade</a> </li> <li class="class-depth-3"> <a href="Phaser.Particles.Arcade.Emitter.html">Emitter</a> </li> <li class="class-depth-1"> <a href="Phaser.Physics.html">Physics</a> </li> <li class="class-depth-2"> <a href="Phaser.Physics.Arcade.html">Arcade</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.Arcade.Body.html">Body</a> </li> <li class="class-depth-2"> <a href="Phaser.Physics.Ninja.html">Ninja</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.Ninja.AABB.html">AABB</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.Ninja.Body.html">Body</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.Ninja.Circle.html">Circle</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.Ninja.Tile.html">Tile</a> </li> <li class="class-depth-2"> <a href="Phaser.Physics.P2.html">P2</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.P2.Body.html">Body</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.P2.BodyDebug.html">BodyDebug</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.P2.CollisionGroup.html">CollisionGroup</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.P2.ContactMaterial.html">ContactMaterial</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.P2.DistanceConstraint.html">DistanceConstraint</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.P2.FixtureList.html">FixtureList</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.P2.GearConstraint.html">GearConstraint</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.P2.InversePointProxy.html">InversePointProxy</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.P2.LockConstraint.html">LockConstraint</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.P2.Material.html">Material</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.P2.PointProxy.html">PointProxy</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.P2.PrismaticConstraint.html">PrismaticConstraint</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.P2.RevoluteConstraint.html">RevoluteConstraint</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.P2.RotationalSpring.html">RotationalSpring</a> </li> <li class="class-depth-3"> <a href="Phaser.Physics.P2.Spring.html">Spring</a> </li> <li class="class-depth-1"> <a href="Phaser.Plugin.html">Plugin</a> </li> <li class="class-depth-1"> <a href="Phaser.PluginManager.html">PluginManager</a> </li> <li class="class-depth-1"> <a href="Phaser.Point.html">Point</a> </li> <li class="class-depth-1"> <a href="Phaser.Pointer.html">Pointer</a> </li> <li class="class-depth-1"> <a href="Phaser.Polygon.html">Polygon</a> </li> <li class="class-depth-1"> <a href="Phaser.QuadTree.html">QuadTree</a> </li> <li class="class-depth-1"> <a href="Phaser.RandomDataGenerator.html">RandomDataGenerator</a> </li> <li class="class-depth-1"> <a href="Phaser.Rectangle.html">Rectangle</a> </li> <li class="class-depth-1"> <a href="Phaser.RenderTexture.html">RenderTexture</a> </li> <li class="class-depth-1"> <a href="Phaser.RequestAnimationFrame.html">RequestAnimationFrame</a> </li> <li class="class-depth-1"> <a href="Phaser.RetroFont.html">RetroFont</a> </li> <li class="class-depth-1"> <a href="Phaser.Rope.html">Rope</a> </li> <li class="class-depth-1"> <a href="Phaser.ScaleManager.html">ScaleManager</a> </li> <li class="class-depth-1"> <a href="Phaser.Signal.html">Signal</a> </li> <li class="class-depth-1"> <a href="Phaser.SignalBinding.html">SignalBinding</a> </li> <li class="class-depth-1"> <a href="Phaser.SinglePad.html">SinglePad</a> </li> <li class="class-depth-1"> <a href="Phaser.Sound.html">Sound</a> </li> <li class="class-depth-1"> <a href="Phaser.SoundManager.html">SoundManager</a> </li> <li class="class-depth-1"> <a href="Phaser.Sprite.html">Sprite</a> </li> <li class="class-depth-1"> <a href="Phaser.SpriteBatch.html">SpriteBatch</a> </li> <li class="class-depth-1"> <a href="Phaser.Stage.html">Stage</a> </li> <li class="class-depth-1"> <a href="Phaser.State.html">State</a> </li> <li class="class-depth-1"> <a href="Phaser.StateManager.html">StateManager</a> </li> <li class="class-depth-1"> <a href="Phaser.Text.html">Text</a> </li> <li class="class-depth-1"> <a href="Phaser.Tile.html">Tile</a> </li> <li class="class-depth-1"> <a href="Phaser.Tilemap.html">Tilemap</a> </li> <li class="class-depth-1"> <a href="Phaser.TilemapLayer.html">TilemapLayer</a> </li> <li class="class-depth-1"> <a href="Phaser.TilemapParser.html">TilemapParser</a> </li> <li class="class-depth-1"> <a href="Phaser.Tileset.html">Tileset</a> </li> <li class="class-depth-1"> <a href="Phaser.TileSprite.html">TileSprite</a> </li> <li class="class-depth-1"> <a href="Phaser.Time.html">Time</a> </li> <li class="class-depth-1"> <a href="Phaser.Timer.html">Timer</a> </li> <li class="class-depth-1"> <a href="Phaser.TimerEvent.html">TimerEvent</a> </li> <li class="class-depth-1"> <a href="Phaser.Touch.html">Touch</a> </li> <li class="class-depth-1"> <a href="Phaser.Tween.html">Tween</a> </li> <li class="class-depth-1"> <a href="Phaser.TweenManager.html">TweenManager</a> </li> <li class="class-depth-1"> <a href="Phaser.Utils.html">Utils</a> </li> <li class="class-depth-2"> <a href="Phaser.Utils.Debug.html">Debug</a> </li> <li class="class-depth-1"> <a href="Phaser.World.html">World</a> </li> </ul> </li> </ul> </div> </div> <div class="row-fluid"> <div class="span12"> <div id="main"> <h1 class="page-title">Source: sound/SoundManager.js</h1> <section> <article> <pre class="sunlight-highlight-javascript linenums">/** * @author Richard Davey &lt;rich@photonstorm.com> * @copyright 2014 Photon Storm Ltd. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License} */ /** * The Sound Manager is responsible for playing back audio via either the Legacy HTML Audio tag or via Web Audio if the browser supports it. * Note: On Firefox 25+ on Linux if you have media.gstreamer disabled in about:config then it cannot play back mp3 or m4a files. * The audio file type and the encoding of those files are extremely important. Not all browsers can play all audio formats. * There is a good guide to what's supported here: http://hpr.dogphilosophy.net/test/ * * @class Phaser.SoundManager * @constructor * @param {Phaser.Game} game reference to the current game instance. */ Phaser.SoundManager = function (game) { /** * @property {Phaser.Game} game - Local reference to game. */ this.game = game; /** * @property {Phaser.Signal} onSoundDecode - The event dispatched when a sound decodes (typically only for mp3 files) */ this.onSoundDecode = new Phaser.Signal(); /** * @property {boolean} _codeMuted - Internal mute tracking var. * @private * @default */ this._codeMuted = false; /** * @property {boolean} _muted - Internal mute tracking var. * @private * @default */ this._muted = false; /** * @property {Description} _unlockSource - Internal unlock tracking var. * @private * @default */ this._unlockSource = null; /** * @property {number} _volume - The global audio volume. A value between 0 (silence) and 1 (full volume). * @private * @default */ this._volume = 1; /** * @property {array} _sounds - An array containing all the sounds * @private */ this._sounds = []; /** * @property {AudioContext} context - The AudioContext being used for playback. * @default */ this.context = null; /** * @property {boolean} usingWebAudio - true if this sound is being played with Web Audio. * @readonly */ this.usingWebAudio = true; /** * @property {boolean} usingAudioTag - true if the sound is being played via the Audio tag. * @readonly */ this.usingAudioTag = false; /** * @property {boolean} noAudio - Has audio been disabled via the PhaserGlobal object? Useful if you need to use a 3rd party audio library instead. * @default */ this.noAudio = false; /** * @property {boolean} connectToMaster - Used in conjunction with Sound.externalNode this allows you to stop a Sound node being connected to the SoundManager master gain node. * @default */ this.connectToMaster = true; /** * @property {boolean} touchLocked - true if the audio system is currently locked awaiting a touch event. * @default */ this.touchLocked = false; /** * @property {number} channels - The number of audio channels to use in playback. * @default */ this.channels = 32; }; Phaser.SoundManager.prototype = { /** * Initialises the sound manager. * @method Phaser.SoundManager#boot * @protected */ boot: function () { if (this.game.device.iOS && this.game.device.webAudio === false) { this.channels = 1; } if (!this.game.device.cocoonJS && this.game.device.iOS || (window['PhaserGlobal'] && window['PhaserGlobal'].fakeiOSTouchLock)) { this.game.input.touch.callbackContext = this; this.game.input.touch.touchStartCallback = this.unlock; this.game.input.mouse.callbackContext = this; this.game.input.mouse.mouseDownCallback = this.unlock; this.touchLocked = true; } else { this.touchLocked = false; } if (window['PhaserGlobal']) { // Check to see if all audio playback is disabled (i.e. handled by a 3rd party class) if (window['PhaserGlobal'].disableAudio === true) { this.usingWebAudio = false; this.noAudio = true; return; } // Check if the Web Audio API is disabled (for testing Audio Tag playback during development) if (window['PhaserGlobal'].disableWebAudio === true) { this.usingWebAudio = false; this.usingAudioTag = true; this.noAudio = false; return; } } if (!!window['AudioContext']) { try { this.context = new window['AudioContext'](); } catch (error) { this.context = null; this.usingWebAudio = false; this.noAudio = true; } } else if (!!window['webkitAudioContext']) { try { this.context = new window['webkitAudioContext'](); } catch (error) { this.context = null; this.usingWebAudio = false; this.noAudio = true; } } if (!!window['Audio'] && this.context === null) { this.usingWebAudio = false; this.usingAudioTag = true; this.noAudio = false; } if (this.context !== null) { if (typeof this.context.createGain === 'undefined') { this.masterGain = this.context.createGainNode(); } else { this.masterGain = this.context.createGain(); } this.masterGain.gain.value = 1; this.masterGain.connect(this.context.destination); } }, /** * Enables the audio, usually after the first touch. * @method Phaser.SoundManager#unlock */ unlock: function () { if (this.touchLocked === false) { return; } // Global override (mostly for Audio Tag testing) if (this.game.device.webAudio === false || (window['PhaserGlobal'] && window['PhaserGlobal'].disableWebAudio === true)) { // Create an Audio tag? this.touchLocked = false; this._unlockSource = null; this.game.input.touch.callbackContext = null; this.game.input.touch.touchStartCallback = null; this.game.input.mouse.callbackContext = null; this.game.input.mouse.mouseDownCallback = null; } else { // Create empty buffer and play it var buffer = this.context.createBuffer(1, 1, 22050); this._unlockSource = this.context.createBufferSource(); this._unlockSource.buffer = buffer; this._unlockSource.connect(this.context.destination); this._unlockSource.noteOn(0); } }, /** * Stops all the sounds in the game. * * @method Phaser.SoundManager#stopAll */ stopAll: function () { for (var i = 0; i &lt; this._sounds.length; i++) { if (this._sounds[i]) { this._sounds[i].stop(); } } }, /** * Pauses all the sounds in the game. * * @method Phaser.SoundManager#pauseAll */ pauseAll: function () { for (var i = 0; i &lt; this._sounds.length; i++) { if (this._sounds[i]) { this._sounds[i].pause(); } } }, /** * Resumes every sound in the game. * * @method Phaser.SoundManager#resumeAll */ resumeAll: function () { for (var i = 0; i &lt; this._sounds.length; i++) { if (this._sounds[i]) { this._sounds[i].resume(); } } }, /** * Decode a sound by its assets key. * * @method Phaser.SoundManager#decode * @param {string} key - Assets key of the sound to be decoded. * @param {Phaser.Sound} [sound] - Its buffer will be set to decoded data. */ decode: function (key, sound) { sound = sound || null; var soundData = this.game.cache.getSoundData(key); if (soundData) { if (this.game.cache.isSoundDecoded(key) === false) { this.game.cache.updateSound(key, 'isDecoding', true); var that = this; this.context.decodeAudioData(soundData, function (buffer) { that.game.cache.decodedSound(key, buffer); if (sound) { that.onSoundDecode.dispatch(key, sound); } }); } } }, /** * Updates every sound in the game. * * @method Phaser.SoundManager#update */ update: function () { if (this.touchLocked) { if (this.game.device.webAudio && this._unlockSource !== null) { if ((this._unlockSource.playbackState === this._unlockSource.PLAYING_STATE || this._unlockSource.playbackState === this._unlockSource.FINISHED_STATE)) { this.touchLocked = false; this._unlockSource = null; this.game.input.touch.callbackContext = null; this.game.input.touch.touchStartCallback = null; } } } for (var i = 0; i &lt; this._sounds.length; i++) { this._sounds[i].update(); } }, /** * Adds a new Sound into the SoundManager. * * @method Phaser.SoundManager#add * @param {string} key - Asset key for the sound. * @param {number} [volume=1] - Default value for the volume. * @param {boolean} [loop=false] - Whether or not the sound will loop. * @param {boolean} [connect=true] - Controls if the created Sound object will connect to the master gainNode of the SoundManager when running under WebAudio. * @return {Phaser.Sound} The new sound instance. */ add: function (key, volume, loop, connect) { if (typeof volume === 'undefined') { volume = 1; } if (typeof loop === 'undefined') { loop = false; } if (typeof connect === 'undefined') { connect = this.connectToMaster; } var sound = new Phaser.Sound(this.game, key, volume, loop, connect); this._sounds.push(sound); return sound; }, /** * Adds a new AudioSprite into the SoundManager. * * @method Phaser.SoundManager#addSprite * @param {string} key - Asset key for the sound. * @return {Phaser.AudioSprite} The new AudioSprite instance. */ addSprite: function(key) { var audioSprite = new Phaser.AudioSprite(this.game, key); return audioSprite; }, /** * Removes a Sound from the SoundManager. The removed Sound is destroyed before removal. * * @method Phaser.SoundManager#remove * @param {Phaser.Sound} sound - The sound object to remove. * @return {boolean} True if the sound was removed successfully, otherwise false. */ remove: function (sound) { var i = this._sounds.length; while (i--) { if (this._sounds[i] === sound) { this._sounds[i].destroy(false); this._sounds.splice(i, 1); return true; } } return false; }, /** * Removes all Sounds from the SoundManager that have an asset key matching the given value. * The removed Sounds are destroyed before removal. * * @method Phaser.SoundManager#removeByKey * @param {string} key - The key to match when removing sound objects. * @return {number} The number of matching sound objects that were removed. */ removeByKey: function (key) { var i = this._sounds.length; var removed = 0; while (i--) { if (this._sounds[i].key === key) { this._sounds[i].destroy(false); this._sounds.splice(i, 1); removed++; } } return removed; }, /** * Adds a new Sound into the SoundManager and starts it playing. * * @method Phaser.SoundManager#play * @param {string} key - Asset key for the sound. * @param {number} [volume=1] - Default value for the volume. * @param {boolean} [loop=false] - Whether or not the sound will loop. * @return {Phaser.Sound} The new sound instance. */ play: function (key, volume, loop) { var sound = this.add(key, volume, loop); sound.play(); return sound; }, /** * Internal mute handler called automatically by the Sound.mute setter. * * @method Phaser.SoundManager#setMute * @private */ setMute: function () { if (this._muted) { return; } this._muted = true; if (this.usingWebAudio) { this._muteVolume = this.masterGain.gain.value; this.masterGain.gain.value = 0; } // Loop through sounds for (var i = 0; i &lt; this._sounds.length; i++) { if (this._sounds[i].usingAudioTag) { this._sounds[i].mute = true; } } }, /** * Internal mute handler called automatically by the Sound.mute setter. * * @method Phaser.SoundManager#unsetMute * @private */ unsetMute: function () { if (!this._muted || this._codeMuted) { return; } this._muted = false; if (this.usingWebAudio) { this.masterGain.gain.value = this._muteVolume; } // Loop through sounds for (var i = 0; i &lt; this._sounds.length; i++) { if (this._sounds[i].usingAudioTag) { this._sounds[i].mute = false; } } }, /** * Stops all the sounds in the game, then destroys them and finally clears up any callbacks. * * @method Phaser.SoundManager#destroy */ destroy: function () { this.stopAll(); for (var i = 0; i &lt; this._sounds.length; i++) { if (this._sounds[i]) { this._sounds[i].destroy(); } } this._sounds = []; this.onSoundDecode.dispose(); } }; Phaser.SoundManager.prototype.constructor = Phaser.SoundManager; /** * @name Phaser.SoundManager#mute * @property {boolean} mute - Gets or sets the muted state of the SoundManager. This effects all sounds in the game. */ Object.defineProperty(Phaser.SoundManager.prototype, "mute", { get: function () { return this._muted; }, set: function (value) { value = value || null; if (value) { if (this._muted) { return; } this._codeMuted = true; this.setMute(); } else { if (!this._muted) { return; } this._codeMuted = false; this.unsetMute(); } } }); /** * @name Phaser.SoundManager#volume * @property {number} volume - Gets or sets the global volume of the SoundManager, a value between 0 and 1. */ Object.defineProperty(Phaser.SoundManager.prototype, "volume", { get: function () { if (this.usingWebAudio) { return this.masterGain.gain.value; } else { return this._volume; } }, set: function (value) { this._volume = value; if (this.usingWebAudio) { this.masterGain.gain.value = value; } else { // Loop through the sound cache and change the volume of all html audio tags for (var i = 0; i &lt; this._sounds.length; i++) { if (this._sounds[i].usingAudioTag) { this._sounds[i].volume = this._sounds[i].volume * value; } } } } }); </pre> </article> </section> </div> <div class="clearfix"></div> <footer> <span class="copyright"> Phaser Copyright © 2012-2014 Photon Storm Ltd. </span> <br /> <span class="jsdoc-message"> Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.3.0-dev</a> on Thu Oct 09 2014 16:09:45 GMT+0100 (BST) using the <a href="https://github.com/terryweiss/docstrap">DocStrap template</a>. </span> </footer> </div> <br clear="both"> </div> </div> <script src="scripts/sunlight.js"></script> <script src="scripts/sunlight.javascript.js"></script> <script src="scripts/sunlight-plugin.doclinks.js"></script> <script src="scripts/sunlight-plugin.linenumbers.js"></script> <script src="scripts/sunlight-plugin.menu.js"></script> <script src="scripts/jquery.min.js"></script> <script src="scripts/jquery.scrollTo.js"></script> <script src="scripts/jquery.localScroll.js"></script> <script src="scripts/bootstrap-dropdown.js"></script> <script src="scripts/toc.js"></script> <script> Sunlight.highlightAll({lineNumbers:true, showMenu: true, enableDoclinks :true}); </script> <script> $( function () { $( "#toc" ).toc( { anchorName : function(i, heading, prefix) { return $(heading).attr("id") || ( prefix + i ); }, selectors : "h1,h2,h3,h4", showAndHide : false, scrollTo : 60 } ); $( "#toc>ul" ).addClass( "nav nav-pills nav-stacked" ); $( "#main span[id^='toc']" ).addClass( "toc-shim" ); } ); </script> </body> </html>