2018-01-08 18:25:11 +00:00
|
|
|
var Class = require('../../utils/Class');
|
|
|
|
var BaseSoundManager = require('../BaseSoundManager');
|
2018-01-08 18:26:32 +00:00
|
|
|
var HTML5AudioSound = require('./HTML5AudioSound');
|
2018-01-08 18:25:11 +00:00
|
|
|
var HTML5AudioSoundManager = new Class({
|
|
|
|
Extends: BaseSoundManager,
|
|
|
|
initialize: function HTML5AudioSoundManager(game) {
|
2018-01-11 15:50:50 +00:00
|
|
|
/**
|
2018-01-11 16:32:49 +00:00
|
|
|
* Flag indicating whether if there are no idle instances of HTML5 Audio tag,
|
|
|
|
* for any particular sound, if one of the used tags should be stopped and used
|
|
|
|
* for succeeding playback or if succeeding Phaser.Sound.HTML5AudioSound#play
|
|
|
|
* call should be ignored.
|
2018-01-11 15:50:50 +00:00
|
|
|
*
|
|
|
|
* @property {boolean} override
|
|
|
|
* @default true
|
|
|
|
*/
|
|
|
|
this.override = true;
|
2018-01-14 14:29:27 +00:00
|
|
|
/**
|
|
|
|
* Value representing time difference in seconds between calling
|
|
|
|
* play method on an audio tag and when it actually starts playing.
|
|
|
|
* It is used to achieve more accurate delayed sound playback.
|
|
|
|
*
|
|
|
|
* You might need to tweak this value to get the desired results
|
|
|
|
* since audio play delay varies depending on the browser/platform.
|
|
|
|
*
|
|
|
|
* @property {number} audioPlayDelay
|
|
|
|
* @default 0.1
|
|
|
|
*/
|
|
|
|
this.audioPlayDelay = 0.1;
|
2018-01-14 14:31:24 +00:00
|
|
|
/**
|
|
|
|
* A value by which we should offset the loop end marker of the looping sound to compensate
|
|
|
|
* for lag, caused by changing audio tag position, in order to achieve gapless looping.
|
|
|
|
*
|
|
|
|
* You might need to tweak this value to get the desired results
|
|
|
|
* since loop lag varies depending on the browser/platform.
|
|
|
|
*
|
|
|
|
* @property {number} loopEndOffset
|
|
|
|
* @default 0.05
|
|
|
|
*/
|
|
|
|
this.loopEndOffset = 0.05;
|
2018-01-08 18:34:23 +00:00
|
|
|
/**
|
|
|
|
* An array for keeping track of all the sounds
|
|
|
|
* that were paused when game lost focus.
|
|
|
|
*
|
|
|
|
* @private
|
|
|
|
* @property {Phaser.Sound.HTML5AudioSound[]} onBlurPausedSounds
|
|
|
|
* @default []
|
|
|
|
*/
|
2018-01-08 18:27:44 +00:00
|
|
|
this.onBlurPausedSounds = [];
|
2018-01-17 16:27:28 +00:00
|
|
|
/**
|
|
|
|
* HTML5 Audio streams cannot be loaded unless triggered by explicit user interaction, such as a tap.
|
|
|
|
* True if the audio system is currently locked awaiting user interaction.
|
|
|
|
*
|
|
|
|
* @private
|
|
|
|
* @property {boolean} touchLocked
|
|
|
|
*/
|
|
|
|
this.touchLocked = 'ontouchstart' in window;
|
2018-01-17 16:27:59 +00:00
|
|
|
/**
|
|
|
|
* Flag used for indicating when the audio has been unlocked,
|
|
|
|
* if there ever was a need for it.
|
|
|
|
*
|
|
|
|
* @private
|
|
|
|
* @type {boolean}
|
|
|
|
* @default false
|
|
|
|
*/
|
|
|
|
this.touchUnlocked = false;
|
2018-01-08 18:34:41 +00:00
|
|
|
/**
|
|
|
|
* Property that actually holds the value of global mute
|
|
|
|
* for HTML5 Audio sound manager implementation.
|
|
|
|
*
|
|
|
|
* @private
|
|
|
|
* @property {boolean} _mute
|
|
|
|
* @default false
|
|
|
|
*/
|
2018-01-08 18:30:42 +00:00
|
|
|
this._mute = false;
|
2018-01-08 18:34:55 +00:00
|
|
|
/**
|
|
|
|
* Property that actually holds the value of global volume
|
|
|
|
* for HTML5 Audio sound manager implementation.
|
|
|
|
*
|
|
|
|
* @private
|
|
|
|
* @property {boolean} _volume
|
|
|
|
* @default 1
|
|
|
|
*/
|
2018-01-08 18:32:41 +00:00
|
|
|
this._volume = 1;
|
2018-01-08 18:25:11 +00:00
|
|
|
BaseSoundManager.call(this, game);
|
2018-01-08 18:26:32 +00:00
|
|
|
},
|
|
|
|
add: function (key, config) {
|
|
|
|
var sound = new HTML5AudioSound(this, key, config);
|
|
|
|
this.sounds.push(sound);
|
|
|
|
return sound;
|
2018-01-08 18:28:21 +00:00
|
|
|
},
|
2018-01-17 13:12:04 +00:00
|
|
|
unlock: function () {
|
|
|
|
var _this = this;
|
2018-01-17 16:29:18 +00:00
|
|
|
if (this.touchLocked) {
|
2018-01-17 13:12:04 +00:00
|
|
|
var unlock_1 = function () {
|
|
|
|
document.body.removeEventListener('touchend', unlock_1);
|
2018-01-17 16:31:01 +00:00
|
|
|
var allTags = [];
|
2018-01-17 13:12:04 +00:00
|
|
|
_this.game.cache.audio.entries.each(function (key, tags) {
|
|
|
|
for (var i = 0; i < tags.length; i++) {
|
2018-01-17 16:31:01 +00:00
|
|
|
allTags.push(tags[i]);
|
2018-01-17 13:12:04 +00:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
});
|
2018-01-17 16:31:56 +00:00
|
|
|
var lastTag = allTags[allTags.length - 1];
|
|
|
|
lastTag.oncanplaythrough = function () {
|
|
|
|
lastTag.oncanplaythrough = null;
|
|
|
|
_this.touchUnlocked = true;
|
|
|
|
};
|
2018-01-17 16:31:01 +00:00
|
|
|
allTags.forEach(function (tag) {
|
|
|
|
tag.load();
|
2018-01-17 13:13:44 +00:00
|
|
|
});
|
2018-01-17 13:12:04 +00:00
|
|
|
};
|
|
|
|
document.body.addEventListener('touchend', unlock_1, false);
|
|
|
|
}
|
|
|
|
},
|
2018-01-08 18:28:21 +00:00
|
|
|
onBlur: function () {
|
|
|
|
this.forEachActiveSound(function (sound) {
|
|
|
|
if (sound.isPlaying) {
|
|
|
|
this.onBlurPausedSounds.push(sound);
|
2018-01-14 14:36:39 +00:00
|
|
|
sound.onBlur();
|
2018-01-08 18:28:21 +00:00
|
|
|
}
|
|
|
|
});
|
2018-01-08 18:29:01 +00:00
|
|
|
},
|
|
|
|
onFocus: function () {
|
|
|
|
this.onBlurPausedSounds.forEach(function (sound) {
|
2018-01-14 14:38:11 +00:00
|
|
|
sound.onFocus();
|
2018-01-08 18:29:01 +00:00
|
|
|
});
|
|
|
|
this.onBlurPausedSounds.length = 0;
|
2018-01-08 18:29:16 +00:00
|
|
|
},
|
2018-01-17 16:32:41 +00:00
|
|
|
update: function () {
|
|
|
|
if (this.touchUnlocked) {
|
|
|
|
this.touchUnlocked = false;
|
|
|
|
this.touchLocked = false;
|
2018-01-17 16:35:08 +00:00
|
|
|
var allSoundsTouchLockedActionQueue_1 = [];
|
|
|
|
this.forEachActiveSound(function (sound) {
|
|
|
|
sound.touchLockedActionQueue.forEach(function (touchLockedAction) {
|
|
|
|
allSoundsTouchLockedActionQueue_1.push(touchLockedAction);
|
|
|
|
});
|
|
|
|
});
|
2018-01-17 16:35:33 +00:00
|
|
|
allSoundsTouchLockedActionQueue_1.sort(function (tla1, tla2) {
|
|
|
|
return tla1.time - tla2.time;
|
|
|
|
});
|
2018-01-17 16:35:08 +00:00
|
|
|
allSoundsTouchLockedActionQueue_1.forEach(function (touchLockedAction) {
|
|
|
|
switch (touchLockedAction.type) {
|
|
|
|
case 'method':
|
|
|
|
touchLockedAction.sound[touchLockedAction.name].apply(touchLockedAction.sound, touchLockedAction.value || []);
|
|
|
|
break;
|
|
|
|
case 'property':
|
|
|
|
touchLockedAction.sound[touchLockedAction.name] = touchLockedAction.value;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
});
|
2018-01-17 16:32:41 +00:00
|
|
|
}
|
|
|
|
BaseSoundManager.prototype.update.call(this);
|
|
|
|
},
|
2018-01-08 18:29:16 +00:00
|
|
|
destroy: function () {
|
|
|
|
BaseSoundManager.prototype.destroy.call(this);
|
|
|
|
this.onBlurPausedSounds.length = 0;
|
|
|
|
this.onBlurPausedSounds = null;
|
2018-01-08 18:25:11 +00:00
|
|
|
}
|
|
|
|
});
|
2018-01-08 18:35:13 +00:00
|
|
|
/**
|
|
|
|
* Global mute setting.
|
|
|
|
*
|
|
|
|
* @name Phaser.Sound.HTML5AudioSoundManager#mute
|
|
|
|
* @property {boolean} mute
|
|
|
|
*/
|
2018-01-08 18:31:26 +00:00
|
|
|
Object.defineProperty(HTML5AudioSoundManager.prototype, 'mute', {
|
|
|
|
get: function () {
|
2018-01-08 18:32:09 +00:00
|
|
|
return this._mute;
|
2018-01-08 18:31:26 +00:00
|
|
|
},
|
|
|
|
set: function (value) {
|
2018-01-08 18:32:20 +00:00
|
|
|
this._mute = value;
|
|
|
|
this.forEachActiveSound(function (sound) {
|
|
|
|
sound.setMute();
|
|
|
|
});
|
2018-01-14 15:53:48 +00:00
|
|
|
this.emit('mute', this, value);
|
2018-01-08 18:31:26 +00:00
|
|
|
}
|
|
|
|
});
|
2018-01-08 18:35:29 +00:00
|
|
|
/**
|
|
|
|
* Global volume setting.
|
|
|
|
*
|
|
|
|
* @name Phaser.Sound.HTML5AudioSoundManager#volume
|
|
|
|
* @property {number} volume
|
|
|
|
*/
|
2018-01-08 18:33:10 +00:00
|
|
|
Object.defineProperty(HTML5AudioSoundManager.prototype, 'volume', {
|
|
|
|
get: function () {
|
2018-01-08 18:33:23 +00:00
|
|
|
return this._volume;
|
2018-01-08 18:33:10 +00:00
|
|
|
},
|
|
|
|
set: function (value) {
|
2018-01-08 18:33:43 +00:00
|
|
|
this._volume = value;
|
|
|
|
this.forEachActiveSound(function (sound) {
|
|
|
|
sound.setVolume();
|
|
|
|
});
|
2018-01-14 15:54:11 +00:00
|
|
|
this.emit('volume', this, value);
|
2018-01-08 18:33:10 +00:00
|
|
|
}
|
|
|
|
});
|
2018-01-08 18:25:11 +00:00
|
|
|
module.exports = HTML5AudioSoundManager;
|