diff --git a/README.md b/README.md
index b504c49e..24dacc1d 100644
--- a/README.md
+++ b/README.md
@@ -60,3 +60,16 @@ register this plugin.
## [Documentation and examples](http://createjs.com/Docs/SoundJS/)
Have a look at the included examples and API documentation for more in-depth information.
+
+
+## Changes for SpringRoll
+* The FlashAudioPlugin as3 class uses startSound() a little differently to support proper resuming of looped audio.
+* The FlashAudioPlugin as3 class allows all domains to embed it.
+* The FlashAudioPlugin as3 class plays infinitely looping audio differently to allow it to play gaplessly - this prevents notification when a loop completes in that case.
+* FlashAudioPlugin can handle changing the master volume before the swf is loaded.
+* Changed how FlashAudioPlugin handles loaded files to avoid reloading files each time you play a sound.
+* Sound gets the extension and filename differently from the url so that assets retrieved via PHP service don't break it.
+* Added global pause() and resume() to Sound.
+* Added _volume as a property to AbstractPlugin so it wouldn't be undefined before setVolume() was called
+* Made a small change to XHRRequest's _checkError() to be more Cordova friendly.
+* Added a check in WebAudioSoundInstance to avoid having negative sound durations, which throws errors.
diff --git a/bower.json b/bower.json
index a38c18a8..d7e61fa9 100644
--- a/bower.json
+++ b/bower.json
@@ -1,6 +1,6 @@
{
"name": "SoundJS",
- "version": "0.6.2",
+ "version": "0.6.6",
"homepage": "https://github.com/CreateJS/SoundJS",
"authors": [
"lannymcnie",
@@ -9,7 +9,7 @@
"wdamien"
],
"description": "A Javascript library for working with Audio. Features a simple interface as the front end to multiple audio APIs via a plugin model. Currently supports WebAudio, HTML5 Audio, and a Flash fallback. Part of the CreateJS suite of libraries.",
- "main": "lib/soundjs-0.6.2.combined.js",
+ "main": "lib/soundjs.combined.js",
"keywords": [
"sound",
"audio",
diff --git a/build/Gruntfile.js b/build/Gruntfile.js
index 46a38642..24a4b17b 100644
--- a/build/Gruntfile.js
+++ b/build/Gruntfile.js
@@ -11,7 +11,7 @@ module.exports = function (grunt) {
name: 'soundjs',
// Setup doc names / paths.
- docsName: '<%= pkg.name %>_docs-<%= version %>',
+ docsName: '<%= pkg.name %>_docs',
docsZip: "<%= docsName %>.zip",
// Setup Uglify for JS minification.
@@ -30,9 +30,9 @@ module.exports = function (grunt) {
},
build: {
files: {
- 'output/<%= pkg.name.toLowerCase() %>-<%= version %>.min.js': getConfigValue('source'),
- 'output/flashaudioplugin-<%= version %>.min.js': getConfigValue('flashaudioplugin_source'),
- 'output/cordovaaudioplugin-<%= version %>.min.js': getConfigValue('cordovaaudioplugin_source'),
+ 'output/<%= pkg.name.toLowerCase() %>.min.js': getConfigValue('source'),
+ 'output/flashaudioplugin.min.js': getConfigValue('flashaudioplugin_source'),
+ 'output/cordovaaudioplugin.min.js': getConfigValue('cordovaaudioplugin_source'),
}
}
},
@@ -71,13 +71,13 @@ module.exports = function (grunt) {
},
build: {
files: {
- 'output/<%= pkg.name.toLowerCase() %>-<%= version %>.combined.js': combineSource([
+ 'output/<%= pkg.name.toLowerCase() %>.combined.js': combineSource([
{cwd: '', config:'config.json', source:'source'}
]),
- 'output/flashaudioplugin-<%= version %>.combined.js': combineSource([
+ 'output/flashaudioplugin.combined.js': combineSource([
{cwd: '', config:'config.json', source:'flashaudioplugin_source'}
]),
- 'output/cordovaaudioplugin-<%= version %>.combined.js': combineSource([
+ 'output/cordovaaudioplugin.combined.js': combineSource([
{cwd: '', config:'config.json', source:'cordovaaudioplugin_source'}
])
}
@@ -135,7 +135,8 @@ module.exports = function (grunt) {
},
src: {
files: [
- {expand: true, cwd:'./output/', src: '*<%=version %>*.js', dest: '../lib/'}
+ {expand: true, cwd:'./output/', src: '**.js', dest: '../lib/'},
+ {expand: true, cwd:'../src/soundjs/flashaudio/', src: '**.swf', dest: '../lib/'}
]
}
},
diff --git a/build/package.json b/build/package.json
index 068507f5..761eb66e 100644
--- a/build/package.json
+++ b/build/package.json
@@ -1,19 +1,19 @@
{
"name": "SoundJS",
- "version": "0.6.2",
+ "version": "0.6.6",
"description": "SoundJS Docs",
"url": "http://www.createjs.com/soundjs",
"logo": "assets/docs-icon-SoundJS.png",
"repository": "git@github.com:CreateJS/SoundJS.git",
"devDependencies": {
"grunt": "~0.4.5",
+ "grunt-contrib-clean": "^0.4.0",
+ "grunt-contrib-compress": "~0.12.0",
"grunt-contrib-concat": "~0.5.0",
+ "grunt-contrib-copy": "^0.7.0",
+ "grunt-contrib-sass": "^0.9.2",
"grunt-contrib-uglify": "~0.6.0",
"grunt-contrib-yuidoc": "~0.5.2",
- "grunt-contrib-compress": "~0.12.0",
- "grunt-contrib-copy": "^0.7.0",
- "grunt-contrib-sass": "^0.8.1",
- "grunt-contrib-clean":"^0.4.0",
"grunt-mxmlc": "~0.5.2",
"lodash": "~0.9.2"
},
diff --git a/dev/com/createjs/soundjs/FlashAudioPlugin.as b/dev/com/createjs/soundjs/FlashAudioPlugin.as
index 7d4b6ace..18baa802 100644
--- a/dev/com/createjs/soundjs/FlashAudioPlugin.as
+++ b/dev/com/createjs/soundjs/FlashAudioPlugin.as
@@ -11,6 +11,7 @@
import flash.utils.Dictionary;
import flash.utils.Timer;
import flash.events.TimerEvent;
+ import flash.system.Security;
public class FlashAudioPlugin extends Sprite {
@@ -42,6 +43,7 @@
protected var playbackTimer:Timer = new Timer(50);
public var masterVolume:Number = 1;
public var soundDurationHash:Object;
+ public var soundHash:Object;
// UI Elements:
// ** AUTO-UI ELEMENTS **
@@ -49,6 +51,7 @@
// Initialization:
public function FlashAudioPlugin() {
+ Security.allowDomain("*");
configUI();
initializeInterface();
}
@@ -57,6 +60,7 @@
lookup = {};
preloadHash = {};
soundDurationHash = {};
+ soundHash = {};
preloadLookup = new Dictionary();
}
@@ -89,7 +93,7 @@
getDurationBySrc: handleGetDurationBySrc,
setLoop: handleSetLoop,
- setMasterVolume: handleSetMasterVolume,
+ setMasterVolume: handleSetMasterVolume,
command: handleCommand
};
@@ -104,7 +108,7 @@
for (var n:String in map) {
ExternalInterface.addCallback(n, map[n]);
}
- // NOTE this is in an ENTER_FRAME to deal with a race issue in IE caused by caching
+ // NOTE this is in an ENTER_FRAME to deal with a race issue in IE caused by caching
this.addEventListener(Event.ENTER_FRAME, handleReady, false, 0, true);
} catch (e:*) {
handleError(e);
@@ -171,12 +175,17 @@
protected function handleLoadComplete(event:Event):void {
var id = preloadLookup[event.target];
- ExternalInterface.call(PRELOAD_CALLBACK, id, "handleComplete");
delete preloadLookup[event.target];
- delete preloadHash[id];
var src = soundDurationHash[id];
+ var sound = preloadHash[id];
+ sound.removeEventListener(ProgressEvent.PROGRESS, handleLoadProgress, false);
+ sound.removeEventListener(Event.COMPLETE, handleLoadComplete, false);
+ sound.removeEventListener(IOErrorEvent.IO_ERROR, handleLoadError, false);
+ soundHash[src] = sound;
+ delete preloadHash[id];
soundDurationHash[src] = event.target.length;
delete soundDurationHash[id];
+ ExternalInterface.call(PRELOAD_CALLBACK, id, "handleComplete");
log("Preload Complete", id);
}
@@ -205,7 +214,7 @@
lookup[id] = wrapper;
wrapper.addEventListener(Event.SOUND_COMPLETE, handleSoundFinished, false, 0, true);
- wrapper.addEventListener("loop", handleSoundLoop, false, 0, true);
+ wrapper.addEventListener("loop", handleSoundLoop, false, 0, true);
wrapper.addEventListener("interrupt", handleSoundInterrupt, false, 0, true);
log("Play Sound", id, src, "o:",offset, "l:",loop, "v:",volume, "p:",pan, "sT:",startTime, "d:",duration, "mv:",masterVolume);
return id;
@@ -220,14 +229,14 @@
log("Complete", wrapper.id, "Remaining:", activeSoundCount);
}
- // An instance loop callback.
- protected function handleSoundLoop(event:Event):void {
- var wrapper:SoundWrapper = event.target as SoundWrapper;
- ExternalInterface.call(SOUND_CALLBACK, wrapper.id, "handleSoundLoop");
- log("Loop", wrapper.id, "Remaining:", wrapper.loop);
- }
+ // An instance loop callback.
+ protected function handleSoundLoop(event:Event):void {
+ var wrapper:SoundWrapper = event.target as SoundWrapper;
+ ExternalInterface.call(SOUND_CALLBACK, wrapper.id, "handleSoundLoop");
+ log("Loop", wrapper.id, "Remaining:", wrapper.loop);
+ }
- protected function handleSoundInterrupt(id:String):void {
+ protected function handleSoundInterrupt(id:String):void {
var wrapper:SoundWrapper = getWrapper(id, true);
if (wrapper != null) {
log("Interrupted", wrapper.id);
@@ -475,11 +484,18 @@ class SoundWrapper extends EventDispatcher {
this._startTime = startTime;
this._duration = duration;
this.owner = owner;
-
- sound = new Sound();
- sound.addEventListener(IOErrorEvent.IO_ERROR, handleSoundError, false, 0, true);
- sound.addEventListener(SecurityErrorEvent.SECURITY_ERROR, handleSoundError, false, 0, true);
- sound.addEventListener(Event.COMPLETE, handleSoundLoaded, false, 0, true);
+
+ if(owner.soundHash[src])
+ {
+ sound = owner.soundHash[src];
+ }
+ else
+ {
+ sound = new Sound();
+ sound.addEventListener(IOErrorEvent.IO_ERROR, handleSoundError, false, 0, true);
+ sound.addEventListener(SecurityErrorEvent.SECURITY_ERROR, handleSoundError, false, 0, true);
+ sound.addEventListener(Event.COMPLETE, handleSoundLoaded, false, 0, true);
+ }
}
/**
@@ -495,8 +511,14 @@ class SoundWrapper extends EventDispatcher {
this.loop = loop;
this._volume = volume;
this._pan = pan;
- this.updateVolume();
- sound.load(new URLRequest(src));
+ if(sound.bytesTotal > 0 && sound.bytesTotal == sound.bytesLoaded)
+ {
+ startSound(offset);
+ }
+ else
+ {
+ sound.load(new URLRequest(src));
+ }
}
/**
@@ -540,7 +562,7 @@ class SoundWrapper extends EventDispatcher {
*/
public function resume():void {
_paused = false;
- startSound(offset);
+ startSound(offset, true);
}
/**
@@ -550,7 +572,7 @@ class SoundWrapper extends EventDispatcher {
if (channel != null) {
channel.stop();
}
- offset = 0;
+ offset = 0;
destroy();
}
@@ -581,17 +603,17 @@ class SoundWrapper extends EventDispatcher {
/** Get/Set the playhead position. */
public function get position():Number {
- if (channel != null && !_paused) {
- return channel.position - this._startTime;
- }
- return offset;
- }
+ if (channel != null && !_paused) {
+ return channel.position - this._startTime;
+ }
+ return offset;
+ }
/** @private */
public function set position(value:Number):void {
- if (channel != null) {
- channel.stop();
- }
+ if (channel != null) {
+ channel.stop();
+ }
startSound(value);
}
@@ -601,7 +623,7 @@ class SoundWrapper extends EventDispatcher {
}
// Begin playing the sound at a certain position.
- protected function startSound(startAt:Number):void {
+ protected function startSound(startAt:Number, isResuming:Boolean = false):void {
startAt += this._startTime;
if (startAt > sound.length) {
owner.log("Can not play, out of range");
@@ -609,11 +631,20 @@ class SoundWrapper extends EventDispatcher {
return;
}
if (!_paused) {
- channel = sound.play(startAt);
- channel.addEventListener(Event.SOUND_COMPLETE, handleSoundComplete, false, 0, true);
+ //fixed resuming of looping audio, also made audio loop gaplessly if it will loop
+ //infinitely anyway
+ channel = sound.play(startAt, (loop == -1 && !isResuming) ? int.MAX_VALUE : 0);
+ //fixed null ref errors from invalid audio or a lack of sound channels
+ if(channel)
+ channel.addEventListener(Event.SOUND_COMPLETE, handleSoundComplete, false, 0, true);
+ else
+ {
+ owner.log("Error - could not play sound: " + id);
+ dispatchEvent(new Event(Event.SOUND_COMPLETE));
+ }
} else {
- offset = startAt - this._startTime; // allows you to set position on a paused or stopped sound
- }
+ offset = startAt - this._startTime; // allows you to set position on a paused or stopped sound
+ }
updateVolume();
}
@@ -642,16 +673,17 @@ class SoundWrapper extends EventDispatcher {
// Sound playback has completed.
protected function handleSoundComplete(event:Event):void {
- offset = 0; // have to set this as it can be set by pause during playback
- if (loop != 0) {
- loop--; // NOTE this introduces a theoretical limit on loops = float max size x 2 - 1
+ offset = 0; // have to set this as it can be set by pause during playback
+ if (loop != 0) {
+ //only decrement loop if it is not -1
+ if(loop > 0) loop--; // NOTE this introduces a theoretical limit on loops = float max size x 2 - 1
- startSound(offset);
+ startSound(offset);
- dispatchEvent(new Event("loop"));
- } else {
- dispatchEvent(event);
- }
+ dispatchEvent(new Event("loop"));
+ } else {
+ dispatchEvent(event);
+ }
}
// An error has occurred.
diff --git a/docs/SoundJS_docs-0.6.2.zip b/docs/SoundJS_docs-0.6.2.zip
deleted file mode 100644
index 1a99854d..00000000
Binary files a/docs/SoundJS_docs-0.6.2.zip and /dev/null differ
diff --git a/docs/SoundJS_docs.zip b/docs/SoundJS_docs.zip
new file mode 100644
index 00000000..0797fe8f
Binary files /dev/null and b/docs/SoundJS_docs.zip differ
diff --git a/docs/soundjs_docs-NEXT.zip b/docs/soundjs_docs-NEXT.zip
deleted file mode 100644
index 43e35e1f..00000000
Binary files a/docs/soundjs_docs-NEXT.zip and /dev/null differ
diff --git a/lib/FlashAudioPlugin.swf b/lib/FlashAudioPlugin.swf
new file mode 100644
index 00000000..64ea45ca
Binary files /dev/null and b/lib/FlashAudioPlugin.swf differ
diff --git a/lib/cordovaaudioplugin-0.6.2.combined.js b/lib/cordovaaudioplugin-0.6.2.combined.js
deleted file mode 100644
index 594f8456..00000000
--- a/lib/cordovaaudioplugin-0.6.2.combined.js
+++ /dev/null
@@ -1,570 +0,0 @@
-/*!
-* SoundJS
-* Visit http://createjs.com/ for documentation, updates and examples.
-*
-* Copyright (c) 2010 gskinner.com, inc.
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-* OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-
-//##############################################################################
-// CordovaAudioLoader.js
-//##############################################################################
-
-this.createjs = this.createjs || {};
-
-(function () {
- "use strict";
-
- /**
- * Loader provides a mechanism to preload Cordova audio content via PreloadJS or internally. Instances are returned to
- * the preloader, and the load method is called when the asset needs to be requested.
- * Currently files are assumed to be local and no loading actually takes place. This class exists to more easily support
- * the existing architecture.
- *
- * @class CordovaAudioLoader
- * @param {String} loadItem The item to be loaded
- * @extends XHRRequest
- * @protected
- */
- function Loader(loadItem) {
- this.AbstractLoader_constructor(loadItem, true, createjs.AbstractLoader.SOUND);
-
- /**
- * A Media object used to determine if src exists and to get duration
- * @property _media
- * @type {Media}
- * @protected
- */
- this._media = null;
-
- /**
- * A time counter that triggers timeout if loading takes too long
- * @property _loadTime
- * @type {number}
- * @protected
- */
- this._loadTime = 0;
-
- /**
- * The frequency to fire the loading timer until duration can be retrieved
- * @property _TIMER_FREQUENCY
- * @type {number}
- * @protected
- */
- this._TIMER_FREQUENCY = 100;
- };
- var p = createjs.extend(Loader, createjs.AbstractLoader);
-
-
-// public methods
- p.load = function() {
- this._media = new Media(this._item.src, null, createjs.proxy(this._mediaErrorHandler,this));
- this._media.seekTo(0); // needed to get duration
-
- this._getMediaDuration();
- };
-
- p.toString = function () {
- return "[CordovaAudioLoader]";
- };
-
-
-// private methods
- /**
- * Fires if audio cannot seek, indicating that src does not exist.
- * @method _mediaErrorHandler
- * @param error
- * @protected
- */
- p._mediaErrorHandler = function(error) {
- this._media.release();
- this._sendError();
- };
-
- /**
- * will attempt to get duration of audio until successful or time passes this._item.loadTimeout
- * @method _getMediaDuration
- * @protected
- */
- p._getMediaDuration = function() {
- this._result = this._media.getDuration() * 1000;
- if (this._result < 0) {
- this._loadTime += this._TIMER_FREQUENCY;
- if (this._loadTime > this._item.loadTimeout) {
- this.handleEvent({type:"timeout"});
- } else {
- setTimeout(createjs.proxy(this._getMediaDuration, this), this._TIMER_FREQUENCY);
- }
- } else {
- this._media.release();
- this._sendComplete();
- }
- };
-
- createjs.CordovaAudioLoader = createjs.promote(Loader, "AbstractLoader");
-}());
-
-//##############################################################################
-// CordovaAudioSoundInstance.js
-//##############################################################################
-
-this.createjs = this.createjs || {};
-
-(function () {
- "use strict";
-
- /**
- * CordovaAudioSoundInstance extends the base api of {{#crossLink "AbstractSoundInstance"}}{{/crossLink}} and is used by
- * {{#crossLink "CordovaAudioPlugin"}}{{/crossLink}}.
- *
- * @param {String} src The path to and file name of the sound.
- * @param {Number} startTime Audio sprite property used to apply an offset, in milliseconds.
- * @param {Number} duration Audio sprite property used to set the time the clip plays for, in milliseconds.
- * @param {Object} playbackResource Any resource needed by plugin to support audio playback.
- * @class CordovaAudioSoundInstance
- * @extends AbstractSoundInstance
- * @constructor
- */
- function CordovaAudioSoundInstance(src, startTime, duration, playbackResource) {
- this.AbstractSoundInstance_constructor(src, startTime, duration, playbackResource);
-
-// Public Properties
- /**
- * Sets the playAudioWhenScreenIsLocked property for play calls on iOS devices.
- * @property playWhenScreenLocked
- * @type {boolean}
- */
- this.playWhenScreenLocked = null;
-
-// Private Properties
- /**
- * Used to approximate the playback position by storing the number of milliseconds elapsed since
- * 1 January 1970 00:00:00 UTC when playing
- * Note that if js clock is out of sync with Media playback, this will become increasingly inaccurate.
- * @property _playStartTime
- * @type {Number}
- * @protected
- */
- this._playStartTime = null;
-
- /**
- * A TimeOut used to trigger the end and possible loop of audio sprites.
- * @property _audioSpriteTimeout
- * @type {null}
- * @protected
- */
- this._audioSpriteTimeout = null;
-
- /**
- * Boolean value that indicates if we are using an audioSprite
- * @property _audioSprite
- * @type {boolean}
- * @protected
- */
- this._audioSprite = false;
-
- // Proxies, make removing listeners easier.
- this._audioSpriteEndHandler = createjs.proxy(this._handleAudioSpriteComplete, this);
- this._mediaPlayFinishedHandler = createjs.proxy(this._handleSoundComplete, this);
- this._mediaErrorHandler = createjs.proxy(this._handleMediaError, this);
- this._mediaProgressHandler = createjs.proxy(this._handleMediaProgress, this);
-
- this._playbackResource = new Media(src, this._mediaPlayFinishedHandler, this._mediaErrorHandler, this._mediaProgressHandler);
-
- if (duration) {
- this._audioSprite = true;
- } else {
- this._setDurationFromSource();
- }
- }
- var p = createjs.extend(CordovaAudioSoundInstance, createjs.AbstractSoundInstance);
-
-
-// Public Methods
- /**
- * Called by {{#crossLink "Sound"}}{{/crossLink}} when plugin does not handle master volume.
- * undoc'd because it is not meant to be used outside of Sound
- * #method setMasterVolume
- * @param value
- */
- p.setMasterVolume = function (value) {
- this._updateVolume();
- };
-
- /**
- * Called by {{#crossLink "Sound"}}{{/crossLink}} when plugin does not handle master mute.
- * undoc'd because it is not meant to be used outside of Sound
- * #method setMasterMute
- * @param value
- */
- p.setMasterMute = function (isMuted) {
- this._updateVolume();
- };
-
- p.destroy = function() {
- // call parent function, then release
- this.AbstractSoundInstance_destroy();
- this._playbackResource.release();
- };
-
- /**
- * Maps to Media.getCurrentPosition,
- * which is curiously asynchronus and requires a callback.
- * @method getCurrentPosition
- * @param {Method} mediaSuccess The callback that is passed the current position in seconds.
- * @param {Method} [mediaError=null] (Optional) The callback to execute if an error occurs.
- */
- p.getCurrentPosition = function (mediaSuccess, mediaError) {
- this._playbackResource.getCurrentPosition(mediaSuccess, mediaError);
- };
-
- p.toString = function () {
- return "[CordovaAudioSoundInstance]";
- };
-
-//Private Methods
- /**
- * media object has failed and likely will never work
- * @method _handleMediaError
- * @param error
- * @private
- */
- p._handleMediaError = function(error) {
- clearTimeout(this.delayTimeoutId); // clear timeout that plays delayed sound
-
- this.playState = createjs.Sound.PLAY_FAILED;
- this._sendEvent("failed");
- };
-
- p._handleMediaProgress = function(state) {
- // do nothing
- };
-
- p._handleAudioSpriteComplete = function() {
- this._playbackResource.pause();
- this._handleSoundComplete();
- };
- /* don't need these for current looping approach
- p._removeLooping = function() {
- };
-
- p._addLooping = function() {
- };
- */
-
- p._handleCleanUp = function () {
- clearTimeout(this._audioSpriteTimeout);
- this._playbackResource.pause(); // OJR cannot use .stop as it prevents .seekTo from working
- // todo consider media.release
- };
-
- p._handleSoundReady = function (event) {
- this._playbackResource.seekTo(this._startTime + this._position);
-
- if (this._audioSprite) {
- this._audioSpriteTimeout = setTimeout(this._audioSpriteEndHandler, this._duration - this._position)
- }
-
- this._playbackResource.play({playAudioWhenScreenIsLocked: this.playWhenScreenLocked});
- this._playStartTime = Date.now();
- };
-
- p._pause = function () {
- clearTimeout(this._audioSpriteTimeout);
- this._playbackResource.pause();
- if (this._playStartTime) {
- this._position = Date.now() - this._playStartTime;
- this._playStartTime = null;
- }
- this._playbackResource.getCurrentPosition(createjs.proxy(this._updatePausePos, this));
- };
-
- /**
- * Synchronizes the best guess position with the actual current position.
- * @method _updatePausePos
- * @param {Number} pos The current position in seconds
- * @private
- */
- p._updatePausePos = function (pos) {
- this._position = pos * 1000 - this._startTime;
- if(this._playStartTime) {
- this._playStartTime = Date.now();
- }
- };
-
- p._resume = function () {
- if (this._audioSprite) {
- this._audioSpriteTimeout = setTimeout(this._audioSpriteEndHandler, this._duration - this._position)
- }
-
- this._playbackResource.play({playAudioWhenScreenIsLocked: this.playWhenScreenLocked});
- this._playStartTime = Date.now();
- };
-
- p._handleStop = function() {
- clearTimeout(this._audioSpriteTimeout);
- this._playbackResource.pause(); // cannot use .stop because it prevents .seekTo from working
- this._playbackResource.seekTo(this._startTime);
- if (this._playStartTime) {
- this._position = 0;
- this._playStartTime = null;
- }
- };
-
- p._updateVolume = function () {
- var newVolume = (this._muted || createjs.Sound._masterMute) ? 0 : this._volume * createjs.Sound._masterVolume;
- this._playbackResource.setVolume(newVolume);
- };
-
- p._calculateCurrentPosition = function() {
- // return best guess position.
- // Note if Media and js clock are out of sync, this value will become increasingly inaccurate over time
- if (this._playStartTime) {
- this._position = Date.now() - this._playStartTime + this._position;
- this._playStartTime = Date.now();
- }
- return this._position;
- };
-
- p._updatePosition = function() {
- this._playbackResource.seekTo(this._startTime + this._position);
- this._playStartTime = Date.now();
- if (this._audioSprite) {
- clearTimeout(this._audioSpriteTimeout);
- this._audioSpriteTimeout = setTimeout(this._audioSpriteEndHandler, this._duration - this._position)
- }
- };
-
- p._handleLoop = function (event) {
- this._handleSoundReady();
- };
-
- p._updateStartTime = function () {
- this._audioSprite = true;
-
- if(this.playState == createjs.Sound.PLAY_SUCCEEDED) {
- // do nothing
- }
- };
-
- p._updateDuration = function () {
- this._audioSprite
-
- if(this.playState == createjs.Sound.PLAY_SUCCEEDED) {
- clearTimeout(this._audioSpriteTimeout);
- this._audioSpriteTimeout = setTimeout(this._audioSpriteEndHandler, this._duration - this.position)
- }
- };
-
- p._setDurationFromSource = function () {
- this._duration = createjs.Sound.activePlugin.getSrcDuration(this.src); // TODO find a better way to do this that does not break flow
- };
-
- createjs.CordovaAudioSoundInstance = createjs.promote(CordovaAudioSoundInstance, "AbstractSoundInstance");
-}());
-
-//##############################################################################
-// CordovaAudioPlugin.js
-//##############################################################################
-
-this.createjs = this.createjs || {};
-
-(function () {
-
- "use strict";
-
- /**
- * Play sounds using Cordova Media plugin, which will work with a Cordova app and tools that utilize Cordova such as PhoneGap or Ionic.
- * This plugin is not used by default, and must be registered manually in {{#crossLink "Sound"}}{{/crossLink}}
- * using the {{#crossLink "Sound/registerPlugins"}}{{/crossLink}} method.
- * This plugin is recommended when building a Cordova based app, but is not required.
- *
- * NOTE the Cordova Media plugin is required
- *
- * cordova plugin add org.apache.cordova.media
- *
- *
Known Issues
- * Audio Position
- *
Audio position is calculated asynchronusly by Media. The SoundJS solution to this problem is two-fold:
- *
Provide {{#crossLink "CordovaAudioSoundInstance/getCurrentPosition"}}{{/crossLink}} that maps directly to media.getCurrentPosition.
- *
Provide a best guess position based on elapsed time since playback started, which is synchronized with actual position when the audio is paused or stopped.
- * Testing showed this to be fairly reliable within 200ms.
- *
- *
- * @class CordovaAudioPlugin
- * @extends AbstractPlugin
- * @constructor
- */
- function CordovaAudioPlugin() {
- this.AbstractPlugin_constructor();
-
- this._capabilities = s._capabilities;
-
- this._loaderClass = createjs.CordovaAudioLoader;
- this._soundInstanceClass = createjs.CordovaAudioSoundInstance;
-
- this._srcDurationHash = {};
- }
-
- var p = createjs.extend(CordovaAudioPlugin, createjs.AbstractPlugin);
- var s = CordovaAudioPlugin;
-
-
-// Static Properties
- /**
- * Sets a default playAudioWhenScreenIsLocked property for play calls on iOS devices.
- * Individual SoundInstances can alter the default with {{#crossLink "CordovaAudioSoundInstance/playWhenScreenLocked"}}{{/crossLink}}.
- * @property playWhenScreenLocked
- * @type {boolean}
- * @static
- */
- s.playWhenScreenLocked = false;
-
- /**
- * The capabilities of the plugin. This is generated via the {{#crossLink "CordovaAudioPlugin/_generateCapabilities"}}{{/crossLink}}
- * method. Please see the Sound {{#crossLink "Sound/getCapabilities"}}{{/crossLink}} method for an overview of all
- * of the available properties.
- * @property _capabilities
- * @type {Object}
- * @protected
- * @static
- */
- s._capabilities = null;
-
-
-// Static Methods
- /**
- * Determine if the plugin can be used in the current browser/OS. Note that HTML audio is available in most modern
- * browsers, but is disabled in iOS because of its limitations.
- * @method isSupported
- * @return {Boolean} If the plugin can be initialized.
- * @static
- */
- s.isSupported = function () {
- s._generateCapabilities();
- return (s._capabilities != null);
- };
-
- /**
- * Determine the capabilities of the plugin. Used internally. Please see the Sound API {{#crossLink "Sound/getCapabilities"}}{{/crossLink}}
- * method for an overview of plugin capabilities.
- * @method _generateCapabilities
- * @static
- * @protected
- */
- s._generateCapabilities = function () {
- if (s._capabilities != null || !(window.cordova || window.PhoneGap || window.phonegap) || !window.Media) {return;}
-
- // OJR my best guess is that Cordova will have the same limits on playback that the audio tag has, but this could be wrong
- var t = document.createElement("audio");
- if (t.canPlayType == null) {return null;}
-
- s._capabilities = {
- panning:false,
- volume:true,
- tracks:-1
- };
-
- // determine which extensions our browser supports for this plugin by iterating through Sound.SUPPORTED_EXTENSIONS
- var supportedExtensions = createjs.Sound.SUPPORTED_EXTENSIONS;
- var extensionMap = createjs.Sound.EXTENSION_MAP;
- for (var i = 0, l = supportedExtensions.length; i < l; i++) {
- var ext = supportedExtensions[i];
- var playType = extensionMap[ext] || ext;
- s._capabilities[ext] = (t.canPlayType("audio/" + ext) != "no" && t.canPlayType("audio/" + ext) != "") || (t.canPlayType("audio/" + playType) != "no" && t.canPlayType("audio/" + playType) != "");
- } // OJR another way to do this might be canPlayType:"m4a", codex: mp4
- };
-
-
-// public methods
- p.create = function (src, startTime, duration) {
- var si = this.AbstractPlugin_create(src, startTime, duration);
- si.playWhenScreenLocked = this.playWhenScreenLocked;
- return si;
- };
-
- p.toString = function () {
- return "[CordovaAudioPlugin]";
- };
-
- // plugin does not support these
- p.setVolume = p.getVolume = p.setMute = null;
-
- /**
- * Get the duration for a src. Intended for internal use by CordovaAudioSoundInstance.
- * @method getSrcDuration
- * @param src
- * @returns {Number} The duration of the src or null if it does not exist
- */
- p.getSrcDuration = function(src) {
- return this._srcDurationHash[src];
- };
-
-// Private Methods
- p._handlePreloadComplete = function (event) {
- var src = event.target.getItem().src;
- this._srcDurationHash[src] = event.result;
- this._audioSources[src] = event.result;
- //this.AbstractPlugin__handlePreloadComplete(event); // we don't want to do the rest of this
- };
-
- p.removeSound = function (src) {
- delete(this._srcDurationHash[src]);
- this.AbstractPlugin_removeSound(src);
- };
-
- createjs.CordovaAudioPlugin = createjs.promote(CordovaAudioPlugin, "AbstractPlugin");
-}());
-
-//##############################################################################
-// version_cordovaplugin.js
-//##############################################################################
-
-this.createjs = this.createjs || {};
-
-(function () {
-
- var s = createjs.CordovaAudioPlugin = createjs.CordovaAudioPlugin || {};
-
- /**
- * The version string for this release.
- * @for CordovaAudioPlugin
- * @property version
- * @type String
- * @static
- **/
- s.version = /*=version*/"0.6.2"; // injected by build process
-
- /**
- * The build date for this release in UTC format.
- * @for CordovaAudioPlugin
- * @property buildDate
- * @type String
- * @static
- **/
- s.buildDate = /*=date*/"Thu, 26 Nov 2015 20:44:31 GMT"; // injected by build process
-
-})();
\ No newline at end of file
diff --git a/lib/cordovaaudioplugin-0.6.2.min.js b/lib/cordovaaudioplugin-0.6.2.min.js
deleted file mode 100644
index 26f80cc9..00000000
--- a/lib/cordovaaudioplugin-0.6.2.min.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/*!
-* @license SoundJS
-* Visit http://createjs.com/ for documentation, updates and examples.
-*
-* Copyright (c) 2011-2015 gskinner.com, inc.
-*
-* Distributed under the terms of the MIT license.
-* http://www.opensource.org/licenses/mit-license.html
-*
-* This notice shall be included in all copies or substantial portions of the Software.
-*/
-
-/**!
- * SoundJS FlashAudioPlugin also includes swfobject (http://code.google.com/p/swfobject/)
- */
-
-this.createjs=this.createjs||{},function(){"use strict";function a(a){this.AbstractLoader_constructor(a,!0,createjs.AbstractLoader.SOUND),this._media=null,this._loadTime=0,this._TIMER_FREQUENCY=100}var b=createjs.extend(a,createjs.AbstractLoader);b.load=function(){this._media=new Media(this._item.src,null,createjs.proxy(this._mediaErrorHandler,this)),this._media.seekTo(0),this._getMediaDuration()},b.toString=function(){return"[CordovaAudioLoader]"},b._mediaErrorHandler=function(){this._media.release(),this._sendError()},b._getMediaDuration=function(){this._result=1e3*this._media.getDuration(),this._result<0?(this._loadTime+=this._TIMER_FREQUENCY,this._loadTime>this._item.loadTimeout?this.handleEvent({type:"timeout"}):setTimeout(createjs.proxy(this._getMediaDuration,this),this._TIMER_FREQUENCY)):(this._media.release(),this._sendComplete())},createjs.CordovaAudioLoader=createjs.promote(a,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function CordovaAudioSoundInstance(a,b,c,d){this.AbstractSoundInstance_constructor(a,b,c,d),this.playWhenScreenLocked=null,this._playStartTime=null,this._audioSpriteTimeout=null,this._audioSprite=!1,this._audioSpriteEndHandler=createjs.proxy(this._handleAudioSpriteComplete,this),this._mediaPlayFinishedHandler=createjs.proxy(this._handleSoundComplete,this),this._mediaErrorHandler=createjs.proxy(this._handleMediaError,this),this._mediaProgressHandler=createjs.proxy(this._handleMediaProgress,this),this._playbackResource=new Media(a,this._mediaPlayFinishedHandler,this._mediaErrorHandler,this._mediaProgressHandler),c?this._audioSprite=!0:this._setDurationFromSource()}var a=createjs.extend(CordovaAudioSoundInstance,createjs.AbstractSoundInstance);a.setMasterVolume=function(){this._updateVolume()},a.setMasterMute=function(){this._updateVolume()},a.destroy=function(){this.AbstractSoundInstance_destroy(),this._playbackResource.release()},a.getCurrentPosition=function(a,b){this._playbackResource.getCurrentPosition(a,b)},a.toString=function(){return"[CordovaAudioSoundInstance]"},a._handleMediaError=function(){clearTimeout(this.delayTimeoutId),this.playState=createjs.Sound.PLAY_FAILED,this._sendEvent("failed")},a._handleMediaProgress=function(){},a._handleAudioSpriteComplete=function(){this._playbackResource.pause(),this._handleSoundComplete()},a._handleCleanUp=function(){clearTimeout(this._audioSpriteTimeout),this._playbackResource.pause()},a._handleSoundReady=function(){this._playbackResource.seekTo(this._startTime+this._position),this._audioSprite&&(this._audioSpriteTimeout=setTimeout(this._audioSpriteEndHandler,this._duration-this._position)),this._playbackResource.play({playAudioWhenScreenIsLocked:this.playWhenScreenLocked}),this._playStartTime=Date.now()},a._pause=function(){clearTimeout(this._audioSpriteTimeout),this._playbackResource.pause(),this._playStartTime&&(this._position=Date.now()-this._playStartTime,this._playStartTime=null),this._playbackResource.getCurrentPosition(createjs.proxy(this._updatePausePos,this))},a._updatePausePos=function(a){this._position=1e3*a-this._startTime,this._playStartTime&&(this._playStartTime=Date.now())},a._resume=function(){this._audioSprite&&(this._audioSpriteTimeout=setTimeout(this._audioSpriteEndHandler,this._duration-this._position)),this._playbackResource.play({playAudioWhenScreenIsLocked:this.playWhenScreenLocked}),this._playStartTime=Date.now()},a._handleStop=function(){clearTimeout(this._audioSpriteTimeout),this._playbackResource.pause(),this._playbackResource.seekTo(this._startTime),this._playStartTime&&(this._position=0,this._playStartTime=null)},a._updateVolume=function(){var a=this._muted||createjs.Sound._masterMute?0:this._volume*createjs.Sound._masterVolume;this._playbackResource.setVolume(a)},a._calculateCurrentPosition=function(){return this._playStartTime&&(this._position=Date.now()-this._playStartTime+this._position,this._playStartTime=Date.now()),this._position},a._updatePosition=function(){this._playbackResource.seekTo(this._startTime+this._position),this._playStartTime=Date.now(),this._audioSprite&&(clearTimeout(this._audioSpriteTimeout),this._audioSpriteTimeout=setTimeout(this._audioSpriteEndHandler,this._duration-this._position))},a._handleLoop=function(){this._handleSoundReady()},a._updateStartTime=function(){this._audioSprite=!0,this.playState==createjs.Sound.PLAY_SUCCEEDED},a._updateDuration=function(){this._audioSprite,this.playState==createjs.Sound.PLAY_SUCCEEDED&&(clearTimeout(this._audioSpriteTimeout),this._audioSpriteTimeout=setTimeout(this._audioSpriteEndHandler,this._duration-this.position))},a._setDurationFromSource=function(){this._duration=createjs.Sound.activePlugin.getSrcDuration(this.src)},createjs.CordovaAudioSoundInstance=createjs.promote(CordovaAudioSoundInstance,"AbstractSoundInstance")}(),this.createjs=this.createjs||{},function(){"use strict";function CordovaAudioPlugin(){this.AbstractPlugin_constructor(),this._capabilities=b._capabilities,this._loaderClass=createjs.CordovaAudioLoader,this._soundInstanceClass=createjs.CordovaAudioSoundInstance,this._srcDurationHash={}}var a=createjs.extend(CordovaAudioPlugin,createjs.AbstractPlugin),b=CordovaAudioPlugin;b.playWhenScreenLocked=!1,b._capabilities=null,b.isSupported=function(){return b._generateCapabilities(),null!=b._capabilities},b._generateCapabilities=function(){if(null==b._capabilities&&(window.cordova||window.PhoneGap||window.phonegap)&&window.Media){var a=document.createElement("audio");if(null==a.canPlayType)return null;b._capabilities={panning:!1,volume:!0,tracks:-1};for(var c=createjs.Sound.SUPPORTED_EXTENSIONS,d=createjs.Sound.EXTENSION_MAP,e=0,f=c.length;f>e;e++){var g=c[e],h=d[g]||g;b._capabilities[g]="no"!=a.canPlayType("audio/"+g)&&""!=a.canPlayType("audio/"+g)||"no"!=a.canPlayType("audio/"+h)&&""!=a.canPlayType("audio/"+h)}}},a.create=function(a,b,c){var d=this.AbstractPlugin_create(a,b,c);return d.playWhenScreenLocked=this.playWhenScreenLocked,d},a.toString=function(){return"[CordovaAudioPlugin]"},a.setVolume=a.getVolume=a.setMute=null,a.getSrcDuration=function(a){return this._srcDurationHash[a]},a._handlePreloadComplete=function(a){var b=a.target.getItem().src;this._srcDurationHash[b]=a.result,this._audioSources[b]=a.result},a.removeSound=function(a){delete this._srcDurationHash[a],this.AbstractPlugin_removeSound(a)},createjs.CordovaAudioPlugin=createjs.promote(CordovaAudioPlugin,"AbstractPlugin")}(),this.createjs=this.createjs||{},function(){var a=createjs.CordovaAudioPlugin=createjs.CordovaAudioPlugin||{};a.version="0.6.2",a.buildDate="Thu, 26 Nov 2015 20:44:31 GMT"}();
\ No newline at end of file
diff --git a/lib/cordovaaudioplugin-NEXT.min.js b/lib/cordovaaudioplugin-NEXT.min.js
deleted file mode 100644
index ef27c7f2..00000000
--- a/lib/cordovaaudioplugin-NEXT.min.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/*!
-* @license SoundJS
-* Visit http://createjs.com/ for documentation, updates and examples.
-*
-* Copyright (c) 2011-2015 gskinner.com, inc.
-*
-* Distributed under the terms of the MIT license.
-* http://www.opensource.org/licenses/mit-license.html
-*
-* This notice shall be included in all copies or substantial portions of the Software.
-*/
-
-/**!
- * SoundJS FlashAudioPlugin also includes swfobject (http://code.google.com/p/swfobject/)
- */
-
-this.createjs=this.createjs||{},function(){"use strict";function a(a){this.AbstractLoader_constructor(a,!0,createjs.AbstractLoader.SOUND),this._media=null,this._loadTime=0,this._TIMER_FREQUENCY=100}var b=createjs.extend(a,createjs.AbstractLoader);b.load=function(){this._media=new Media(this._item.src,null,createjs.proxy(this._mediaErrorHandler,this)),this._media.seekTo(0),this._getMediaDuration()},b.toString=function(){return"[CordovaAudioLoader]"},b._mediaErrorHandler=function(a){this._media.release(),this._sendError()},b._getMediaDuration=function(){this._result=1e3*this._media.getDuration(),this._result<0?(this._loadTime+=this._TIMER_FREQUENCY,this._loadTime>this._item.loadTimeout?this.handleEvent({type:"timeout"}):setTimeout(createjs.proxy(this._getMediaDuration,this),this._TIMER_FREQUENCY)):(this._media.release(),this._sendComplete())},createjs.CordovaAudioLoader=createjs.promote(a,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function CordovaAudioSoundInstance(a,b,c,d){this.AbstractSoundInstance_constructor(a,b,c,d),this.playWhenScreenLocked=null,this._playStartTime=null,this._audioSpriteTimeout=null,this._audioSprite=!1,this._audioSpriteEndHandler=createjs.proxy(this._handleAudioSpriteComplete,this),this._mediaPlayFinishedHandler=createjs.proxy(this._handleSoundComplete,this),this._mediaErrorHandler=createjs.proxy(this._handleMediaError,this),this._mediaProgressHandler=createjs.proxy(this._handleMediaProgress,this),this._playbackResource=new Media(a,this._mediaPlayFinishedHandler,this._mediaErrorHandler,this._mediaProgressHandler),c?this._audioSprite=!0:this._setDurationFromSource()}var a=createjs.extend(CordovaAudioSoundInstance,createjs.AbstractSoundInstance);a.setMasterVolume=function(a){this._updateVolume()},a.setMasterMute=function(a){this._updateVolume()},a.destroy=function(){this.AbstractSoundInstance_destroy(),this._playbackResource.release()},a.getCurrentPosition=function(a,b){this._playbackResource.getCurrentPosition(a,b)},a.toString=function(){return"[CordovaAudioSoundInstance]"},a._handleMediaError=function(a){clearTimeout(this.delayTimeoutId),this.playState=createjs.Sound.PLAY_FAILED,this._sendEvent("failed")},a._handleMediaProgress=function(a){},a._handleAudioSpriteComplete=function(){this._playbackResource.pause(),this._handleSoundComplete()},a._handleCleanUp=function(){clearTimeout(this._audioSpriteTimeout),this._playbackResource.pause()},a._handleSoundReady=function(a){this._playbackResource.seekTo(this._startTime+this._position),this._audioSprite&&(this._audioSpriteTimeout=setTimeout(this._audioSpriteEndHandler,this._duration-this._position)),this._playbackResource.play({playAudioWhenScreenIsLocked:this.playWhenScreenLocked}),this._playStartTime=Date.now()},a._pause=function(){clearTimeout(this._audioSpriteTimeout),this._playbackResource.pause(),this._playStartTime&&(this._position=Date.now()-this._playStartTime,this._playStartTime=null),this._playbackResource.getCurrentPosition(createjs.proxy(this._updatePausePos,this))},a._updatePausePos=function(a){this._position=1e3*a-this._startTime,this._playStartTime&&(this._playStartTime=Date.now())},a._resume=function(){this._audioSprite&&(this._audioSpriteTimeout=setTimeout(this._audioSpriteEndHandler,this._duration-this._position)),this._playbackResource.play({playAudioWhenScreenIsLocked:this.playWhenScreenLocked}),this._playStartTime=Date.now()},a._handleStop=function(){clearTimeout(this._audioSpriteTimeout),this._playbackResource.pause(),this._playbackResource.seekTo(this._startTime),this._playStartTime&&(this._position=0,this._playStartTime=null)},a._updateVolume=function(){var a=this._muted||createjs.Sound._masterMute?0:this._volume*createjs.Sound._masterVolume;this._playbackResource.setVolume(a)},a._calculateCurrentPosition=function(){return this._playStartTime&&(this._position=Date.now()-this._playStartTime+this._position,this._playStartTime=Date.now()),this._position},a._updatePosition=function(){this._playbackResource.seekTo(this._startTime+this._position),this._playStartTime=Date.now(),this._audioSprite&&(clearTimeout(this._audioSpriteTimeout),this._audioSpriteTimeout=setTimeout(this._audioSpriteEndHandler,this._duration-this._position))},a._handleLoop=function(a){this._handleSoundReady()},a._updateStartTime=function(){this._audioSprite=!0,this.playState==createjs.Sound.PLAY_SUCCEEDED},a._updateDuration=function(){this._audioSprite,this.playState==createjs.Sound.PLAY_SUCCEEDED&&(clearTimeout(this._audioSpriteTimeout),this._audioSpriteTimeout=setTimeout(this._audioSpriteEndHandler,this._duration-this.position))},a._setDurationFromSource=function(){this._duration=createjs.Sound.activePlugin.getSrcDuration(this.src)},createjs.CordovaAudioSoundInstance=createjs.promote(CordovaAudioSoundInstance,"AbstractSoundInstance")}(),this.createjs=this.createjs||{},function(){"use strict";function CordovaAudioPlugin(){this.AbstractPlugin_constructor(),this._capabilities=b._capabilities,this._loaderClass=createjs.CordovaAudioLoader,this._soundInstanceClass=createjs.CordovaAudioSoundInstance,this._srcDurationHash={}}var a=createjs.extend(CordovaAudioPlugin,createjs.AbstractPlugin),b=CordovaAudioPlugin;b.playWhenScreenLocked=!1,b._capabilities=null,b.isSupported=function(){return b._generateCapabilities(),null!=b._capabilities},b._generateCapabilities=function(){if(null==b._capabilities&&(window.cordova||window.PhoneGap||window.phonegap)&&window.Media){var a=document.createElement("audio");if(null==a.canPlayType)return null;b._capabilities={panning:!1,volume:!0,tracks:-1};for(var c=createjs.Sound.SUPPORTED_EXTENSIONS,d=createjs.Sound.EXTENSION_MAP,e=0,f=c.length;f>e;e++){var g=c[e],h=d[g]||g;b._capabilities[g]="no"!=a.canPlayType("audio/"+g)&&""!=a.canPlayType("audio/"+g)||"no"!=a.canPlayType("audio/"+h)&&""!=a.canPlayType("audio/"+h)}}},a.create=function(a,b,c){var d=this.AbstractPlugin_create(a,b,c);return d.playWhenScreenLocked=this.playWhenScreenLocked,d},a.toString=function(){return"[CordovaAudioPlugin]"},a.setVolume=a.getVolume=a.setMute=null,a.getSrcDuration=function(a){return this._srcDurationHash[a]},a._handlePreloadComplete=function(a){var b=a.target.getItem().src;this._srcDurationHash[b]=a.result,this._audioSources[b]=a.result},a.removeSound=function(a){delete this._srcDurationHash[a],this.AbstractPlugin_removeSound(a)},createjs.CordovaAudioPlugin=createjs.promote(CordovaAudioPlugin,"AbstractPlugin")}(),this.createjs=this.createjs||{},function(){var a=createjs.CordovaAudioPlugin=createjs.CordovaAudioPlugin||{};a.version="NEXT",a.buildDate="Mon, 14 Sep 2015 19:11:47 GMT"}();
\ No newline at end of file
diff --git a/lib/cordovaaudioplugin-NEXT.combined.js b/lib/cordovaaudioplugin.combined.js
similarity index 94%
rename from lib/cordovaaudioplugin-NEXT.combined.js
rename to lib/cordovaaudioplugin.combined.js
index 07567f09..68f03de6 100644
--- a/lib/cordovaaudioplugin-NEXT.combined.js
+++ b/lib/cordovaaudioplugin.combined.js
@@ -79,7 +79,17 @@ this.createjs = this.createjs || {};
// public methods
p.load = function() {
- this._media = new Media(this._item.src, null, createjs.proxy(this._mediaErrorHandler,this));
+
+ var cordovaMedia = window.Media || window.top.Media || null;
+
+ if (cordovaMedia) {
+ this._media = new cordovaMedia(this._item.src, null, createjs.proxy(this._mediaErrorHandler,this));
+ } else {
+ //Could not find Media Object
+ this.handleEvent({type:"error"});
+ return;
+ }
+
this._media.seekTo(0); // needed to get duration
this._getMediaDuration();
@@ -109,6 +119,7 @@ this.createjs = this.createjs || {};
*/
p._getMediaDuration = function() {
this._result = this._media.getDuration() * 1000;
+
if (this._result < 0) {
this._loadTime += this._TIMER_FREQUENCY;
if (this._loadTime > this._item.loadTimeout) {
@@ -190,7 +201,12 @@ this.createjs = this.createjs || {};
this._mediaErrorHandler = createjs.proxy(this._handleMediaError, this);
this._mediaProgressHandler = createjs.proxy(this._handleMediaProgress, this);
- this._playbackResource = new Media(src, this._mediaPlayFinishedHandler, this._mediaErrorHandler, this._mediaProgressHandler);
+
+ var cordovaMedia = window.Media || window.top.Media || null;
+
+ if (cordovaMedia) {
+ this._playbackResource = new cordovaMedia(src, this._mediaPlayFinishedHandler, this._mediaErrorHandler, this._mediaProgressHandler);
+ }
if (duration) {
this._audioSprite = true;
@@ -243,7 +259,7 @@ this.createjs = this.createjs || {};
return "[CordovaAudioSoundInstance]";
};
-//Private Methods
+ //Private Methods
/**
* media object has failed and likely will never work
* @method _handleMediaError
@@ -276,7 +292,7 @@ this.createjs = this.createjs || {};
p._handleCleanUp = function () {
clearTimeout(this._audioSpriteTimeout);
this._playbackResource.pause(); // OJR cannot use .stop as it prevents .seekTo from working
- // todo consider media.release
+ this._playbackResource.release();
};
p._handleSoundReady = function (event) {
@@ -464,6 +480,7 @@ this.createjs = this.createjs || {};
* @static
*/
s.isSupported = function () {
+ // # feature/sound-fix
s._generateCapabilities();
return (s._capabilities != null);
};
@@ -476,7 +493,14 @@ this.createjs = this.createjs || {};
* @protected
*/
s._generateCapabilities = function () {
- if (s._capabilities != null || !(window.cordova || window.PhoneGap || window.phonegap) || !window.Media) {return;}
+ var cordovaObj = window.cordova || window.top.cordova || null;
+ var phoneGapObj = window.PhoneGap || window.top.PhoneGap || null;
+ var pgObj = window.phonegap || window.top.phonegap || null;
+ var cordovaMedia = window.Media || window.top.Media || null;
+
+ if (s._capabilities != null || !(cordovaObj || phoneGapObj || pgObj) || !cordovaMedia) {
+ return;
+ }
// OJR my best guess is that Cordova will have the same limits on playback that the audio tag has, but this could be wrong
var t = document.createElement("audio");
@@ -523,8 +547,9 @@ this.createjs = this.createjs || {};
return this._srcDurationHash[src];
};
-// Private Methods
+ // Private Methods
p._handlePreloadComplete = function (event) {
+
var src = event.target.getItem().src;
this._srcDurationHash[src] = event.result;
this._audioSources[src] = event.result;
@@ -532,6 +557,7 @@ this.createjs = this.createjs || {};
};
p.removeSound = function (src) {
+ // #/feature/sound-fx
delete(this._srcDurationHash[src]);
this.AbstractPlugin_removeSound(src);
};
@@ -556,7 +582,7 @@ this.createjs = this.createjs || {};
* @type String
* @static
**/
- s.version = /*=version*/"NEXT"; // injected by build process
+ s.version = /*=version*/"0.6.5"; // injected by build process
/**
* The build date for this release in UTC format.
@@ -565,6 +591,6 @@ this.createjs = this.createjs || {};
* @type String
* @static
**/
- s.buildDate = /*=date*/"Mon, 14 Sep 2015 19:11:47 GMT"; // injected by build process
+ s.buildDate = /*=date*/"Fri, 07 Apr 2017 15:14:47 GMT"; // injected by build process
})();
\ No newline at end of file
diff --git a/lib/cordovaaudioplugin.min.js b/lib/cordovaaudioplugin.min.js
new file mode 100644
index 00000000..ca72060a
--- /dev/null
+++ b/lib/cordovaaudioplugin.min.js
@@ -0,0 +1,17 @@
+/*!
+* @license SoundJS
+* Visit http://createjs.com/ for documentation, updates and examples.
+*
+* Copyright (c) 2011-2015 gskinner.com, inc.
+*
+* Distributed under the terms of the MIT license.
+* http://www.opensource.org/licenses/mit-license.html
+*
+* This notice shall be included in all copies or substantial portions of the Software.
+*/
+
+/**!
+ * SoundJS FlashAudioPlugin also includes swfobject (http://code.google.com/p/swfobject/)
+ */
+
+this.createjs=this.createjs||{},function(){"use strict";function a(a){this.AbstractLoader_constructor(a,!0,createjs.AbstractLoader.SOUND),this._media=null,this._loadTime=0,this._TIMER_FREQUENCY=100}var b=createjs.extend(a,createjs.AbstractLoader);b.load=function(){var a=window.Media||window.top.Media||null;return a?(this._media=new a(this._item.src,null,createjs.proxy(this._mediaErrorHandler,this)),this._media.seekTo(0),void this._getMediaDuration()):void this.handleEvent({type:"error"})},b.toString=function(){return"[CordovaAudioLoader]"},b._mediaErrorHandler=function(a){this._media.release(),this._sendError()},b._getMediaDuration=function(){this._result=1e3*this._media.getDuration(),this._result<0?(this._loadTime+=this._TIMER_FREQUENCY,this._loadTime>this._item.loadTimeout?this.handleEvent({type:"timeout"}):setTimeout(createjs.proxy(this._getMediaDuration,this),this._TIMER_FREQUENCY)):(this._media.release(),this._sendComplete())},createjs.CordovaAudioLoader=createjs.promote(a,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function CordovaAudioSoundInstance(a,b,c,d){this.AbstractSoundInstance_constructor(a,b,c,d),this.playWhenScreenLocked=null,this._playStartTime=null,this._audioSpriteTimeout=null,this._audioSprite=!1,this._audioSpriteEndHandler=createjs.proxy(this._handleAudioSpriteComplete,this),this._mediaPlayFinishedHandler=createjs.proxy(this._handleSoundComplete,this),this._mediaErrorHandler=createjs.proxy(this._handleMediaError,this),this._mediaProgressHandler=createjs.proxy(this._handleMediaProgress,this);var e=window.Media||window.top.Media||null;e&&(this._playbackResource=new e(a,this._mediaPlayFinishedHandler,this._mediaErrorHandler,this._mediaProgressHandler)),c?this._audioSprite=!0:this._setDurationFromSource()}var a=createjs.extend(CordovaAudioSoundInstance,createjs.AbstractSoundInstance);a.setMasterVolume=function(a){this._updateVolume()},a.setMasterMute=function(a){this._updateVolume()},a.destroy=function(){this.AbstractSoundInstance_destroy(),this._playbackResource.release()},a.getCurrentPosition=function(a,b){this._playbackResource.getCurrentPosition(a,b)},a.toString=function(){return"[CordovaAudioSoundInstance]"},a._handleMediaError=function(a){clearTimeout(this.delayTimeoutId),this.playState=createjs.Sound.PLAY_FAILED,this._sendEvent("failed")},a._handleMediaProgress=function(a){},a._handleAudioSpriteComplete=function(){this._playbackResource.pause(),this._handleSoundComplete()},a._handleCleanUp=function(){clearTimeout(this._audioSpriteTimeout),this._playbackResource.pause(),this._playbackResource.release()},a._handleSoundReady=function(a){this._playbackResource.seekTo(this._startTime+this._position),this._audioSprite&&(this._audioSpriteTimeout=setTimeout(this._audioSpriteEndHandler,this._duration-this._position)),this._playbackResource.play({playAudioWhenScreenIsLocked:this.playWhenScreenLocked}),this._playStartTime=Date.now()},a._pause=function(){clearTimeout(this._audioSpriteTimeout),this._playbackResource.pause(),this._playStartTime&&(this._position=Date.now()-this._playStartTime,this._playStartTime=null),this._playbackResource.getCurrentPosition(createjs.proxy(this._updatePausePos,this))},a._updatePausePos=function(a){this._position=1e3*a-this._startTime,this._playStartTime&&(this._playStartTime=Date.now())},a._resume=function(){this._audioSprite&&(this._audioSpriteTimeout=setTimeout(this._audioSpriteEndHandler,this._duration-this._position)),this._playbackResource.play({playAudioWhenScreenIsLocked:this.playWhenScreenLocked}),this._playStartTime=Date.now()},a._handleStop=function(){clearTimeout(this._audioSpriteTimeout),this._playbackResource.pause(),this._playbackResource.seekTo(this._startTime),this._playStartTime&&(this._position=0,this._playStartTime=null)},a._updateVolume=function(){var a=this._muted||createjs.Sound._masterMute?0:this._volume*createjs.Sound._masterVolume;this._playbackResource.setVolume(a)},a._calculateCurrentPosition=function(){return this._playStartTime&&(this._position=Date.now()-this._playStartTime+this._position,this._playStartTime=Date.now()),this._position},a._updatePosition=function(){this._playbackResource.seekTo(this._startTime+this._position),this._playStartTime=Date.now(),this._audioSprite&&(clearTimeout(this._audioSpriteTimeout),this._audioSpriteTimeout=setTimeout(this._audioSpriteEndHandler,this._duration-this._position))},a._handleLoop=function(a){this._handleSoundReady()},a._updateStartTime=function(){this._audioSprite=!0,this.playState==createjs.Sound.PLAY_SUCCEEDED},a._updateDuration=function(){this._audioSprite,this.playState==createjs.Sound.PLAY_SUCCEEDED&&(clearTimeout(this._audioSpriteTimeout),this._audioSpriteTimeout=setTimeout(this._audioSpriteEndHandler,this._duration-this.position))},a._setDurationFromSource=function(){this._duration=createjs.Sound.activePlugin.getSrcDuration(this.src)},createjs.CordovaAudioSoundInstance=createjs.promote(CordovaAudioSoundInstance,"AbstractSoundInstance")}(),this.createjs=this.createjs||{},function(){"use strict";function CordovaAudioPlugin(){this.AbstractPlugin_constructor(),this._capabilities=b._capabilities,this._loaderClass=createjs.CordovaAudioLoader,this._soundInstanceClass=createjs.CordovaAudioSoundInstance,this._srcDurationHash={}}var a=createjs.extend(CordovaAudioPlugin,createjs.AbstractPlugin),b=CordovaAudioPlugin;b.playWhenScreenLocked=!1,b._capabilities=null,b.isSupported=function(){return b._generateCapabilities(),null!=b._capabilities},b._generateCapabilities=function(){var a=window.cordova||window.top.cordova||null,c=window.PhoneGap||window.top.PhoneGap||null,d=window.phonegap||window.top.phonegap||null,e=window.Media||window.top.Media||null;if(null==b._capabilities&&(a||c||d)&&e){var f=document.createElement("audio");if(null==f.canPlayType)return null;b._capabilities={panning:!1,volume:!0,tracks:-1};for(var g=createjs.Sound.SUPPORTED_EXTENSIONS,h=createjs.Sound.EXTENSION_MAP,i=0,j=g.length;i
- is released under the MIT License
-*/
-var swfobject=function(){function a(){if(!R){try{var a=K.getElementsByTagName("body")[0].appendChild(q("span"));a.parentNode.removeChild(a)}catch(b){return}R=!0;for(var c=N.length,d=0;c>d;d++)N[d]()}}function b(a){R?a():N[N.length]=a}function c(a){if(typeof J.addEventListener!=C)J.addEventListener("load",a,!1);else if(typeof K.addEventListener!=C)K.addEventListener("load",a,!1);else if(typeof J.attachEvent!=C)r(J,"onload",a);else if("function"==typeof J.onload){var b=J.onload;J.onload=function(){b(),a()}}else J.onload=a}function d(){M?e():f()}function e(){var a=K.getElementsByTagName("body")[0],b=q(D);b.setAttribute("type",G);var c=a.appendChild(b);if(c){var d=0;!function(){if(typeof c.GetVariable!=C){var e=c.GetVariable("$version");e&&(e=e.split(" ")[1].split(","),U.pv=[parseInt(e[0],10),parseInt(e[1],10),parseInt(e[2],10)])}else if(10>d)return d++,void setTimeout(arguments.callee,10);a.removeChild(b),c=null,f()}()}else f()}function f(){var a=O.length;if(a>0)for(var b=0;a>b;b++){var c=O[b].id,d=O[b].callbackFn,e={success:!1,id:c};if(U.pv[0]>0){var f=p(c);if(f)if(!s(O[b].swfVersion)||U.wk&&U.wk<312)if(O[b].expressInstall&&h()){var k={};k.data=O[b].expressInstall,k.width=f.getAttribute("width")||"0",k.height=f.getAttribute("height")||"0",f.getAttribute("class")&&(k.styleclass=f.getAttribute("class")),f.getAttribute("align")&&(k.align=f.getAttribute("align"));for(var l={},m=f.getElementsByTagName("param"),n=m.length,o=0;n>o;o++)"movie"!=m[o].getAttribute("name").toLowerCase()&&(l[m[o].getAttribute("name")]=m[o].getAttribute("value"));i(k,l,c,d)}else j(f),d&&d(e);else u(c,!0),d&&(e.success=!0,e.ref=g(c),d(e))}else if(u(c,!0),d){var q=g(c);q&&typeof q.SetVariable!=C&&(e.success=!0,e.ref=q),d(e)}}}function g(a){var b=null,c=p(a);if(c&&"OBJECT"==c.nodeName)if(typeof c.SetVariable!=C)b=c;else{var d=c.getElementsByTagName(D)[0];d&&(b=d)}return b}function h(){return!S&&s("6.0.65")&&(U.win||U.mac)&&!(U.wk&&U.wk<312)}function i(a,b,c,d){S=!0,y=d||null,z={success:!1,id:c};var e=p(c);if(e){"OBJECT"==e.nodeName?(w=k(e),x=null):(w=e,x=c),a.id=H,(typeof a.width==C||!/%$/.test(a.width)&&parseInt(a.width,10)<310)&&(a.width="310"),(typeof a.height==C||!/%$/.test(a.height)&&parseInt(a.height,10)<137)&&(a.height="137"),K.title=K.title.slice(0,47)+" - Flash Player Installation";var f=U.ie&&U.win?"ActiveX":"PlugIn",g="MMredirectURL="+encodeURI(window.location).toString().replace(/&/g,"%26")+"&MMplayerType="+f+"&MMdoctitle="+K.title;if(typeof b.flashvars!=C?b.flashvars+="&"+g:b.flashvars=g,U.ie&&U.win&&4!=e.readyState){var h=q("div");c+="SWFObjectNew",h.setAttribute("id",c),e.parentNode.insertBefore(h,e),e.style.display="none",function(){4==e.readyState?e.parentNode.removeChild(e):setTimeout(arguments.callee,10)}()}l(a,b,c)}}function j(a){if(U.ie&&U.win&&4!=a.readyState){var b=q("div");a.parentNode.insertBefore(b,a),b.parentNode.replaceChild(k(a),b),a.style.display="none",function(){4==a.readyState?a.parentNode.removeChild(a):setTimeout(arguments.callee,10)}()}else a.parentNode.replaceChild(k(a),a)}function k(a){var b=q("div");if(U.win&&U.ie)b.innerHTML=a.innerHTML;else{var c=a.getElementsByTagName(D)[0];if(c){var d=c.childNodes;if(d)for(var e=d.length,f=0;e>f;f++)1==d[f].nodeType&&"PARAM"==d[f].nodeName||8==d[f].nodeType||b.appendChild(d[f].cloneNode(!0))}}return b}function l(a,b,c){var d,e=p(c);if(U.wk&&U.wk<312)return d;if(e)if(typeof a.id==C&&(a.id=c),U.ie&&U.win){var f="";for(var g in a)a[g]!=Object.prototype[g]&&("data"==g.toLowerCase()?b.movie=a[g]:"styleclass"==g.toLowerCase()?f+=' class="'+a[g]+'"':"classid"!=g.toLowerCase()&&(f+=" "+g+'="'+a[g]+'"'));var h="";for(var i in b)b[i]!=Object.prototype[i]&&(h+='');e.outerHTML='",P[P.length]=a.id,d=p(a.id)}else{var j=q(D);j.setAttribute("type",G);for(var k in a)a[k]!=Object.prototype[k]&&("styleclass"==k.toLowerCase()?j.setAttribute("class",a[k]):"classid"!=k.toLowerCase()&&j.setAttribute(k,a[k]));for(var l in b)b[l]!=Object.prototype[l]&&"movie"!=l.toLowerCase()&&m(j,l,b[l]);e.parentNode.replaceChild(j,e),d=j}return d}function m(a,b,c){var d=q("param");d.setAttribute("name",b),d.setAttribute("value",c),a.appendChild(d)}function n(a){var b=p(a);b&&"OBJECT"==b.nodeName&&(U.ie&&U.win?(b.style.display="none",function(){4==b.readyState?o(a):setTimeout(arguments.callee,10)}()):b.parentNode.removeChild(b))}function o(a){var b=p(a);if(b){for(var c in b)"function"==typeof b[c]&&(b[c]=null);b.parentNode.removeChild(b)}}function p(a){var b=null;try{b=K.getElementById(a)}catch(c){}return b}function q(a){return K.createElement(a)}function r(a,b,c){a.attachEvent(b,c),Q[Q.length]=[a,b,c]}function s(a){var b=U.pv,c=a.split(".");return c[0]=parseInt(c[0],10),c[1]=parseInt(c[1],10)||0,c[2]=parseInt(c[2],10)||0,b[0]>c[0]||b[0]==c[0]&&b[1]>c[1]||b[0]==c[0]&&b[1]==c[1]&&b[2]>=c[2]?!0:!1}function t(a,b,c,d){if(!U.ie||!U.mac){var e=K.getElementsByTagName("head")[0];if(e){var f=c&&"string"==typeof c?c:"screen";if(d&&(A=null,B=null),!A||B!=f){var g=q("style");g.setAttribute("type","text/css"),g.setAttribute("media",f),A=e.appendChild(g),U.ie&&U.win&&typeof K.styleSheets!=C&&K.styleSheets.length>0&&(A=K.styleSheets[K.styleSheets.length-1]),B=f}U.ie&&U.win?A&&typeof A.addRule==D&&A.addRule(a,b):A&&typeof K.createTextNode!=C&&A.appendChild(K.createTextNode(a+" {"+b+"}"))}}}function u(a,b){if(T){var c=b?"visible":"hidden";R&&p(a)?p(a).style.visibility=c:t("#"+a,"visibility:"+c)}}function v(a){var b=/[\\\"<>\.;]/,c=null!=b.exec(a);return c&&typeof encodeURIComponent!=C?encodeURIComponent(a):a}{var w,x,y,z,A,B,C="undefined",D="object",E="Shockwave Flash",F="ShockwaveFlash.ShockwaveFlash",G="application/x-shockwave-flash",H="SWFObjectExprInst",I="onreadystatechange",J=window,K=document,L=navigator,M=!1,N=[d],O=[],P=[],Q=[],R=!1,S=!1,T=!0,U=function(){var a=typeof K.getElementById!=C&&typeof K.getElementsByTagName!=C&&typeof K.createElement!=C,b=L.userAgent.toLowerCase(),c=L.platform.toLowerCase(),d=/win/.test(c?c:b),e=/mac/.test(c?c:b),f=/webkit/.test(b)?parseFloat(b.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):!1,g=!1,h=[0,0,0],i=null;if(typeof L.plugins!=C&&typeof L.plugins[E]==D)i=L.plugins[E].description,!i||typeof L.mimeTypes!=C&&L.mimeTypes[G]&&!L.mimeTypes[G].enabledPlugin||(M=!0,g=!1,i=i.replace(/^.*\s+(\S+\s+\S+$)/,"$1"),h[0]=parseInt(i.replace(/^(.*)\..*$/,"$1"),10),h[1]=parseInt(i.replace(/^.*\.(.*)\s.*$/,"$1"),10),h[2]=/[a-zA-Z]/.test(i)?parseInt(i.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0);else if(typeof J.ActiveXObject!=C)try{var j=new ActiveXObject(F);j&&(i=j.GetVariable("$version"),i&&(g=!0,i=i.split(" ")[1].split(","),h=[parseInt(i[0],10),parseInt(i[1],10),parseInt(i[2],10)]))}catch(k){}return{w3:a,pv:h,wk:f,ie:g,win:d,mac:e}}();!function(){U.w3&&((typeof K.readyState!=C&&"complete"==K.readyState||typeof K.readyState==C&&(K.getElementsByTagName("body")[0]||K.body))&&a(),R||(typeof K.addEventListener!=C&&K.addEventListener("DOMContentLoaded",a,!1),U.ie&&U.win&&(K.attachEvent(I,function(){"complete"==K.readyState&&(K.detachEvent(I,arguments.callee),a())}),J==top&&!function(){if(!R){try{K.documentElement.doScroll("left")}catch(b){return void setTimeout(arguments.callee,0)}a()}}()),U.wk&&!function(){return R?void 0:/loaded|complete/.test(K.readyState)?void a():void setTimeout(arguments.callee,0)}(),c(a)))}(),function(){U.ie&&U.win&&window.attachEvent("onunload",function(){for(var a=Q.length,b=0;a>b;b++)Q[b][0].detachEvent(Q[b][1],Q[b][2]);for(var c=P.length,d=0;c>d;d++)n(P[d]);for(var e in U)U[e]=null;U=null;for(var f in swfobject)swfobject[f]=null;swfobject=null})}()}return{registerObject:function(a,b,c,d){if(U.w3&&a&&b){var e={};e.id=a,e.swfVersion=b,e.expressInstall=c,e.callbackFn=d,O[O.length]=e,u(a,!1)}else d&&d({success:!1,id:a})},getObjectById:function(a){return U.w3?g(a):void 0},embedSWF:function(a,c,d,e,f,g,j,k,m,n){var o={success:!1,id:c};U.w3&&!(U.wk&&U.wk<312)&&a&&c&&d&&e&&f?(u(c,!1),b(function(){d+="",e+="";var b={};if(m&&typeof m===D)for(var p in m)b[p]=m[p];b.data=a,b.width=d,b.height=e;var q={};if(k&&typeof k===D)for(var r in k)q[r]=k[r];if(j&&typeof j===D)for(var t in j)typeof q.flashvars!=C?q.flashvars+="&"+t+"="+j[t]:q.flashvars=t+"="+j[t];if(s(f)){var v=l(b,q,c);b.id==c&&u(c,!0),o.success=!0,o.ref=v}else{if(g&&h())return b.data=g,void i(b,q,c,n);u(c,!0)}n&&n(o)})):n&&n(o)},switchOffAutoHideShow:function(){T=!1},ua:U,getFlashPlayerVersion:function(){return{major:U.pv[0],minor:U.pv[1],release:U.pv[2]}},hasFlashPlayerVersion:s,createSWF:function(a,b,c){return U.w3?l(a,b,c):void 0},showExpressInstall:function(a,b,c,d){U.w3&&h()&&i(a,b,c,d)},removeSWF:function(a){U.w3&&n(a)},createCSS:function(a,b,c,d){U.w3&&t(a,b,c,d)},addDomLoadEvent:b,addLoadEvent:c,getQueryParamValue:function(a){var b=K.location.search||K.location.hash;if(b){if(/\?/.test(b)&&(b=b.split("?")[1]),null==a)return v(b);for(var c=b.split("&"),d=0;de;e++)d.push(arguments[e]);try{0==d.length?c[b]():c[b].apply(c,d)}catch(g){}}},a.handlePreloadEvent=function(a,b){var c=this._flashPreloadInstances[a];if(null!=c){for(var d=[],e=2,f=arguments.length;f>e;e++)d.push(arguments[e]);try{0==d.length?c[b]():c[b].apply(c,d)}catch(g){}}},a.handleEvent=function(a){switch(a){case"ready":this._handleFlashReady()}},a.handleErrorEvent=function(){},createjs.FlashAudioPlugin=createjs.promote(FlashAudioPlugin,"AbstractPlugin")}(),this.createjs=this.createjs||{},function(){var a=createjs.FlashAudioPlugin=createjs.FlashAudioPlugin||{};a.version="0.6.2",a.buildDate="Thu, 26 Nov 2015 20:44:31 GMT"}();
\ No newline at end of file
diff --git a/lib/flashaudioplugin-NEXT.combined.js b/lib/flashaudioplugin-NEXT.combined.js
deleted file mode 100644
index 8d20e128..00000000
--- a/lib/flashaudioplugin-NEXT.combined.js
+++ /dev/null
@@ -1,1604 +0,0 @@
-/*!
-* SoundJS
-* Visit http://createjs.com/ for documentation, updates and examples.
-*
-* Copyright (c) 2010 gskinner.com, inc.
-*
-* Permission is hereby granted, free of charge, to any person
-* obtaining a copy of this software and associated documentation
-* files (the "Software"), to deal in the Software without
-* restriction, including without limitation the rights to use,
-* copy, modify, merge, publish, distribute, sublicense, and/or sell
-* copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following
-* conditions:
-*
-* The above copyright notice and this permission notice shall be
-* included in all copies or substantial portions of the Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-* OTHER DEALINGS IN THE SOFTWARE.
-*/
-
-
-//##############################################################################
-// swfobject.js
-//##############################################################################
-
-/*! SWFObject v2.2
- is released under the MIT License
-*/
-
-var swfobject = function() {
-
- var UNDEF = "undefined",
- OBJECT = "object",
- SHOCKWAVE_FLASH = "Shockwave Flash",
- SHOCKWAVE_FLASH_AX = "ShockwaveFlash.ShockwaveFlash",
- FLASH_MIME_TYPE = "application/x-shockwave-flash",
- EXPRESS_INSTALL_ID = "SWFObjectExprInst",
- ON_READY_STATE_CHANGE = "onreadystatechange",
-
- win = window,
- doc = document,
- nav = navigator,
-
- plugin = false,
- domLoadFnArr = [main],
- regObjArr = [],
- objIdArr = [],
- listenersArr = [],
- storedAltContent,
- storedAltContentId,
- storedCallbackFn,
- storedCallbackObj,
- isDomLoaded = false,
- isExpressInstallActive = false,
- dynamicStylesheet,
- dynamicStylesheetMedia,
- autoHideShow = true,
-
- /* Centralized function for browser feature detection
- - User agent string detection is only used when no good alternative is possible
- - Is executed directly for optimal performance
- */
- ua = function() {
- var w3cdom = typeof doc.getElementById != UNDEF && typeof doc.getElementsByTagName != UNDEF && typeof doc.createElement != UNDEF,
- u = nav.userAgent.toLowerCase(),
- p = nav.platform.toLowerCase(),
- windows = p ? /win/.test(p) : /win/.test(u),
- mac = p ? /mac/.test(p) : /mac/.test(u),
- webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, // returns either the webkit version or false if not webkit
- ie = !+"\v1", // feature detection based on Andrea Giammarchi's solution: http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
- playerVersion = [0,0,0],
- d = null;
- if (typeof nav.plugins != UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] == OBJECT) {
- d = nav.plugins[SHOCKWAVE_FLASH].description;
- if (d && !(typeof nav.mimeTypes != UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && !nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) { // navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+
- plugin = true;
- ie = false; // cascaded feature detection for Internet Explorer
- d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
- playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
- playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
- playerVersion[2] = /[a-zA-Z]/.test(d) ? parseInt(d.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0;
- }
- }
- else if (typeof win.ActiveXObject != UNDEF) {
- try {
- var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);
- if (a) { // a will return null when ActiveX is disabled
- d = a.GetVariable("$version");
- if (d) {
- ie = true; // cascaded feature detection for Internet Explorer
- d = d.split(" ")[1].split(",");
- playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
- }
- }
- }
- catch(e) {}
- }
- return { w3:w3cdom, pv:playerVersion, wk:webkit, ie:ie, win:windows, mac:mac };
- }(),
-
- /* Cross-browser onDomLoad
- - Will fire an event as soon as the DOM of a web page is loaded
- - Internet Explorer workaround based on Diego Perini's solution: http://javascript.nwbox.com/IEContentLoaded/
- - Regular onload serves as fallback
- */
- onDomLoad = function() {
- if (!ua.w3) { return; }
- if ((typeof doc.readyState != UNDEF && doc.readyState == "complete") || (typeof doc.readyState == UNDEF && (doc.getElementsByTagName("body")[0] || doc.body))) { // function is fired after onload, e.g. when script is inserted dynamically
- callDomLoadFunctions();
- }
- if (!isDomLoaded) {
- if (typeof doc.addEventListener != UNDEF) {
- doc.addEventListener("DOMContentLoaded", callDomLoadFunctions, false);
- }
- if (ua.ie && ua.win) {
- doc.attachEvent(ON_READY_STATE_CHANGE, function() {
- if (doc.readyState == "complete") {
- doc.detachEvent(ON_READY_STATE_CHANGE, arguments.callee);
- callDomLoadFunctions();
- }
- });
- if (win == top) { // if not inside an iframe
- (function(){
- if (isDomLoaded) { return; }
- try {
- doc.documentElement.doScroll("left");
- }
- catch(e) {
- setTimeout(arguments.callee, 0);
- return;
- }
- callDomLoadFunctions();
- })();
- }
- }
- if (ua.wk) {
- (function(){
- if (isDomLoaded) { return; }
- if (!/loaded|complete/.test(doc.readyState)) {
- setTimeout(arguments.callee, 0);
- return;
- }
- callDomLoadFunctions();
- })();
- }
- addLoadEvent(callDomLoadFunctions);
- }
- }();
-
- function callDomLoadFunctions() {
- if (isDomLoaded) { return; }
- try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early
- var t = doc.getElementsByTagName("body")[0].appendChild(createElement("span"));
- t.parentNode.removeChild(t);
- }
- catch (e) { return; }
- isDomLoaded = true;
- var dl = domLoadFnArr.length;
- for (var i = 0; i < dl; i++) {
- domLoadFnArr[i]();
- }
- }
-
- function addDomLoadEvent(fn) {
- if (isDomLoaded) {
- fn();
- }
- else {
- domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
- }
- }
-
- /* Cross-browser onload
- - Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
- - Will fire an event as soon as a web page including all of its assets are loaded
- */
- function addLoadEvent(fn) {
- if (typeof win.addEventListener != UNDEF) {
- win.addEventListener("load", fn, false);
- }
- else if (typeof doc.addEventListener != UNDEF) {
- doc.addEventListener("load", fn, false);
- }
- else if (typeof win.attachEvent != UNDEF) {
- addListener(win, "onload", fn);
- }
- else if (typeof win.onload == "function") {
- var fnOld = win.onload;
- win.onload = function() {
- fnOld();
- fn();
- };
- }
- else {
- win.onload = fn;
- }
- }
-
- /* Main function
- - Will preferably execute onDomLoad, otherwise onload (as a fallback)
- */
- function main() {
- if (plugin) {
- testPlayerVersion();
- }
- else {
- matchVersions();
- }
- }
-
- /* Detect the Flash Player version for non-Internet Explorer browsers
- - Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:
- a. Both release and build numbers can be detected
- b. Avoid wrong descriptions by corrupt installers provided by Adobe
- c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports
- - Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available
- */
- function testPlayerVersion() {
- var b = doc.getElementsByTagName("body")[0];
- var o = createElement(OBJECT);
- o.setAttribute("type", FLASH_MIME_TYPE);
- var t = b.appendChild(o);
- if (t) {
- var counter = 0;
- (function(){
- if (typeof t.GetVariable != UNDEF) {
- var d = t.GetVariable("$version");
- if (d) {
- d = d.split(" ")[1].split(",");
- ua.pv = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
- }
- }
- else if (counter < 10) {
- counter++;
- setTimeout(arguments.callee, 10);
- return;
- }
- b.removeChild(o);
- t = null;
- matchVersions();
- })();
- }
- else {
- matchVersions();
- }
- }
-
- /* Perform Flash Player and SWF version matching; static publishing only
- */
- function matchVersions() {
- var rl = regObjArr.length;
- if (rl > 0) {
- for (var i = 0; i < rl; i++) { // for each registered object element
- var id = regObjArr[i].id;
- var cb = regObjArr[i].callbackFn;
- var cbObj = {success:false, id:id};
- if (ua.pv[0] > 0) {
- var obj = getElementById(id);
- if (obj) {
- if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { // Flash Player version >= published SWF version: Houston, we have a match!
- setVisibility(id, true);
- if (cb) {
- cbObj.success = true;
- cbObj.ref = getObjectById(id);
- cb(cbObj);
- }
- }
- else if (regObjArr[i].expressInstall && canExpressInstall()) { // show the Adobe Express Install dialog if set by the web page author and if supported
- var att = {};
- att.data = regObjArr[i].expressInstall;
- att.width = obj.getAttribute("width") || "0";
- att.height = obj.getAttribute("height") || "0";
- if (obj.getAttribute("class")) { att.styleclass = obj.getAttribute("class"); }
- if (obj.getAttribute("align")) { att.align = obj.getAttribute("align"); }
- // parse HTML object param element's name-value pairs
- var par = {};
- var p = obj.getElementsByTagName("param");
- var pl = p.length;
- for (var j = 0; j < pl; j++) {
- if (p[j].getAttribute("name").toLowerCase() != "movie") {
- par[p[j].getAttribute("name")] = p[j].getAttribute("value");
- }
- }
- showExpressInstall(att, par, id, cb);
- }
- else { // Flash Player and SWF version mismatch or an older Webkit engine that ignores the HTML object element's nested param elements: display alternative content instead of SWF
- displayAltContent(obj);
- if (cb) { cb(cbObj); }
- }
- }
- }
- else { // if no Flash Player is installed or the fp version cannot be detected we let the HTML object element do its job (either show a SWF or alternative content)
- setVisibility(id, true);
- if (cb) {
- var o = getObjectById(id); // test whether there is an HTML object element or not
- if (o && typeof o.SetVariable != UNDEF) {
- cbObj.success = true;
- cbObj.ref = o;
- }
- cb(cbObj);
- }
- }
- }
- }
- }
-
- function getObjectById(objectIdStr) {
- var r = null;
- var o = getElementById(objectIdStr);
- if (o && o.nodeName == "OBJECT") {
- if (typeof o.SetVariable != UNDEF) {
- r = o;
- }
- else {
- var n = o.getElementsByTagName(OBJECT)[0];
- if (n) {
- r = n;
- }
- }
- }
- return r;
- }
-
- /* Requirements for Adobe Express Install
- - only one instance can be active at a time
- - fp 6.0.65 or higher
- - Win/Mac OS only
- - no Webkit engines older than version 312
- */
- function canExpressInstall() {
- return !isExpressInstallActive && hasPlayerVersion("6.0.65") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312);
- }
-
- /* Show the Adobe Express Install dialog
- - Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
- */
- function showExpressInstall(att, par, replaceElemIdStr, callbackFn) {
- isExpressInstallActive = true;
- storedCallbackFn = callbackFn || null;
- storedCallbackObj = {success:false, id:replaceElemIdStr};
- var obj = getElementById(replaceElemIdStr);
- if (obj) {
- if (obj.nodeName == "OBJECT") { // static publishing
- storedAltContent = abstractAltContent(obj);
- storedAltContentId = null;
- }
- else { // dynamic publishing
- storedAltContent = obj;
- storedAltContentId = replaceElemIdStr;
- }
- att.id = EXPRESS_INSTALL_ID;
- if (typeof att.width == UNDEF || (!/%$/.test(att.width) && parseInt(att.width, 10) < 310)) { att.width = "310"; }
- if (typeof att.height == UNDEF || (!/%$/.test(att.height) && parseInt(att.height, 10) < 137)) { att.height = "137"; }
- doc.title = doc.title.slice(0, 47) + " - Flash Player Installation";
- var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn",
- fv = "MMredirectURL=" + encodeURI(window.location).toString().replace(/&/g,"%26") + "&MMplayerType=" + pt + "&MMdoctitle=" + doc.title;
- if (typeof par.flashvars != UNDEF) {
- par.flashvars += "&" + fv;
- }
- else {
- par.flashvars = fv;
- }
- // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,
- // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
- if (ua.ie && ua.win && obj.readyState != 4) {
- var newObj = createElement("div");
- replaceElemIdStr += "SWFObjectNew";
- newObj.setAttribute("id", replaceElemIdStr);
- obj.parentNode.insertBefore(newObj, obj); // insert placeholder div that will be replaced by the object element that loads expressinstall.swf
- obj.style.display = "none";
- (function(){
- if (obj.readyState == 4) {
- obj.parentNode.removeChild(obj);
- }
- else {
- setTimeout(arguments.callee, 10);
- }
- })();
- }
- createSWF(att, par, replaceElemIdStr);
- }
- }
-
- /* Functions to abstract and display alternative content
- */
- function displayAltContent(obj) {
- if (ua.ie && ua.win && obj.readyState != 4) {
- // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,
- // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
- var el = createElement("div");
- obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the alternative content
- el.parentNode.replaceChild(abstractAltContent(obj), el);
- obj.style.display = "none";
- (function(){
- if (obj.readyState == 4) {
- obj.parentNode.removeChild(obj);
- }
- else {
- setTimeout(arguments.callee, 10);
- }
- })();
- }
- else {
- obj.parentNode.replaceChild(abstractAltContent(obj), obj);
- }
- }
-
- function abstractAltContent(obj) {
- var ac = createElement("div");
- if (ua.win && ua.ie) {
- ac.innerHTML = obj.innerHTML;
- }
- else {
- var nestedObj = obj.getElementsByTagName(OBJECT)[0];
- if (nestedObj) {
- var c = nestedObj.childNodes;
- if (c) {
- var cl = c.length;
- for (var i = 0; i < cl; i++) {
- if (!(c[i].nodeType == 1 && c[i].nodeName == "PARAM") && !(c[i].nodeType == 8)) {
- ac.appendChild(c[i].cloneNode(true));
- }
- }
- }
- }
- }
- return ac;
- }
-
- /* Cross-browser dynamic SWF creation
- */
- function createSWF(attObj, parObj, id) {
- var r, el = getElementById(id);
- if (ua.wk && ua.wk < 312) { return r; }
- if (el) {
- if (typeof attObj.id == UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
- attObj.id = id;
- }
- if (ua.ie && ua.win) { // Internet Explorer + the HTML object element + W3C DOM methods do not combine: fall back to outerHTML
- var att = "";
- for (var i in attObj) {
- if (attObj[i] != Object.prototype[i]) { // filter out prototype additions from other potential libraries
- if (i.toLowerCase() == "data") {
- parObj.movie = attObj[i];
- }
- else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
- att += ' class="' + attObj[i] + '"';
- }
- else if (i.toLowerCase() != "classid") {
- att += ' ' + i + '="' + attObj[i] + '"';
- }
- }
- }
- var par = "";
- for (var j in parObj) {
- if (parObj[j] != Object.prototype[j]) { // filter out prototype additions from other potential libraries
- par += '';
- }
- }
- el.outerHTML = '';
- objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only)
- r = getElementById(attObj.id);
- }
- else { // well-behaving browsers
- var o = createElement(OBJECT);
- o.setAttribute("type", FLASH_MIME_TYPE);
- for (var m in attObj) {
- if (attObj[m] != Object.prototype[m]) { // filter out prototype additions from other potential libraries
- if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
- o.setAttribute("class", attObj[m]);
- }
- else if (m.toLowerCase() != "classid") { // filter out IE specific attribute
- o.setAttribute(m, attObj[m]);
- }
- }
- }
- for (var n in parObj) {
- if (parObj[n] != Object.prototype[n] && n.toLowerCase() != "movie") { // filter out prototype additions from other potential libraries and IE specific param element
- createObjParam(o, n, parObj[n]);
- }
- }
- el.parentNode.replaceChild(o, el);
- r = o;
- }
- }
- return r;
- }
-
- function createObjParam(el, pName, pValue) {
- var p = createElement("param");
- p.setAttribute("name", pName);
- p.setAttribute("value", pValue);
- el.appendChild(p);
- }
-
- /* Cross-browser SWF removal
- - Especially needed to safely and completely remove a SWF in Internet Explorer
- */
- function removeSWF(id) {
- var obj = getElementById(id);
- if (obj && obj.nodeName == "OBJECT") {
- if (ua.ie && ua.win) {
- obj.style.display = "none";
- (function(){
- if (obj.readyState == 4) {
- removeObjectInIE(id);
- }
- else {
- setTimeout(arguments.callee, 10);
- }
- })();
- }
- else {
- obj.parentNode.removeChild(obj);
- }
- }
- }
-
- function removeObjectInIE(id) {
- var obj = getElementById(id);
- if (obj) {
- for (var i in obj) {
- if (typeof obj[i] == "function") {
- obj[i] = null;
- }
- }
- obj.parentNode.removeChild(obj);
- }
- }
-
- /* Functions to optimize JavaScript compression
- */
- function getElementById(id) {
- var el = null;
- try {
- el = doc.getElementById(id);
- }
- catch (e) {}
- return el;
- }
-
- function createElement(el) {
- return doc.createElement(el);
- }
-
- /* Updated attachEvent function for Internet Explorer
- - Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks
- */
- function addListener(target, eventType, fn) {
- target.attachEvent(eventType, fn);
- listenersArr[listenersArr.length] = [target, eventType, fn];
- }
-
- /* Flash Player and SWF content version matching
- */
- function hasPlayerVersion(rv) {
- var pv = ua.pv, v = rv.split(".");
- v[0] = parseInt(v[0], 10);
- v[1] = parseInt(v[1], 10) || 0; // supports short notation, e.g. "9" instead of "9.0.0"
- v[2] = parseInt(v[2], 10) || 0;
- return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;
- }
-
- /* Cross-browser dynamic CSS creation
- - Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php
- */
- function createCSS(sel, decl, media, newStyle) {
- if (ua.ie && ua.mac) { return; }
- var h = doc.getElementsByTagName("head")[0];
- if (!h) { return; } // to also support badly authored HTML pages that lack a head element
- var m = (media && typeof media == "string") ? media : "screen";
- if (newStyle) {
- dynamicStylesheet = null;
- dynamicStylesheetMedia = null;
- }
- if (!dynamicStylesheet || dynamicStylesheetMedia != m) {
- // create dynamic stylesheet + get a global reference to it
- var s = createElement("style");
- s.setAttribute("type", "text/css");
- s.setAttribute("media", m);
- dynamicStylesheet = h.appendChild(s);
- if (ua.ie && ua.win && typeof doc.styleSheets != UNDEF && doc.styleSheets.length > 0) {
- dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1];
- }
- dynamicStylesheetMedia = m;
- }
- // add style rule
- if (ua.ie && ua.win) {
- if (dynamicStylesheet && typeof dynamicStylesheet.addRule == OBJECT) {
- dynamicStylesheet.addRule(sel, decl);
- }
- }
- else {
- if (dynamicStylesheet && typeof doc.createTextNode != UNDEF) {
- dynamicStylesheet.appendChild(doc.createTextNode(sel + " {" + decl + "}"));
- }
- }
- }
-
- function setVisibility(id, isVisible) {
- if (!autoHideShow) { return; }
- var v = isVisible ? "visible" : "hidden";
- if (isDomLoaded && getElementById(id)) {
- getElementById(id).style.visibility = v;
- }
- else {
- createCSS("#" + id, "visibility:" + v);
- }
- }
-
- /* Filter to avoid XSS attacks
- */
- function urlEncodeIfNecessary(s) {
- var regex = /[\\\"<>\.;]/;
- var hasBadChars = regex.exec(s) != null;
- return hasBadChars && typeof encodeURIComponent != UNDEF ? encodeURIComponent(s) : s;
- }
-
- /* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only)
- */
- var cleanup = function() {
- if (ua.ie && ua.win) {
- window.attachEvent("onunload", function() {
- // remove listeners to avoid memory leaks
- var ll = listenersArr.length;
- for (var i = 0; i < ll; i++) {
- listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);
- }
- // cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect
- var il = objIdArr.length;
- for (var j = 0; j < il; j++) {
- removeSWF(objIdArr[j]);
- }
- // cleanup library's main closures to avoid memory leaks
- for (var k in ua) {
- ua[k] = null;
- }
- ua = null;
- for (var l in swfobject) {
- swfobject[l] = null;
- }
- swfobject = null;
- });
- }
- }();
-
- return {
- /* Public API
- - Reference: http://code.google.com/p/swfobject/wiki/documentation
- */
- registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) {
- if (ua.w3 && objectIdStr && swfVersionStr) {
- var regObj = {};
- regObj.id = objectIdStr;
- regObj.swfVersion = swfVersionStr;
- regObj.expressInstall = xiSwfUrlStr;
- regObj.callbackFn = callbackFn;
- regObjArr[regObjArr.length] = regObj;
- setVisibility(objectIdStr, false);
- }
- else if (callbackFn) {
- callbackFn({success:false, id:objectIdStr});
- }
- },
-
- getObjectById: function(objectIdStr) {
- if (ua.w3) {
- return getObjectById(objectIdStr);
- }
- },
-
- embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {
- var callbackObj = {success:false, id:replaceElemIdStr};
- if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {
- setVisibility(replaceElemIdStr, false);
- addDomLoadEvent(function() {
- widthStr += ""; // auto-convert to string
- heightStr += "";
- var att = {};
- if (attObj && typeof attObj === OBJECT) {
- for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs
- att[i] = attObj[i];
- }
- }
- att.data = swfUrlStr;
- att.width = widthStr;
- att.height = heightStr;
- var par = {};
- if (parObj && typeof parObj === OBJECT) {
- for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs
- par[j] = parObj[j];
- }
- }
- if (flashvarsObj && typeof flashvarsObj === OBJECT) {
- for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs
- if (typeof par.flashvars != UNDEF) {
- par.flashvars += "&" + k + "=" + flashvarsObj[k];
- }
- else {
- par.flashvars = k + "=" + flashvarsObj[k];
- }
- }
- }
- if (hasPlayerVersion(swfVersionStr)) { // create SWF
- var obj = createSWF(att, par, replaceElemIdStr);
- if (att.id == replaceElemIdStr) {
- setVisibility(replaceElemIdStr, true);
- }
- callbackObj.success = true;
- callbackObj.ref = obj;
- }
- else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install
- att.data = xiSwfUrlStr;
- showExpressInstall(att, par, replaceElemIdStr, callbackFn);
- return;
- }
- else { // show alternative content
- setVisibility(replaceElemIdStr, true);
- }
- if (callbackFn) { callbackFn(callbackObj); }
- });
- }
- else if (callbackFn) { callbackFn(callbackObj); }
- },
-
- switchOffAutoHideShow: function() {
- autoHideShow = false;
- },
-
- ua: ua,
-
- getFlashPlayerVersion: function() {
- return { major:ua.pv[0], minor:ua.pv[1], release:ua.pv[2] };
- },
-
- hasFlashPlayerVersion: hasPlayerVersion,
-
- createSWF: function(attObj, parObj, replaceElemIdStr) {
- if (ua.w3) {
- return createSWF(attObj, parObj, replaceElemIdStr);
- }
- else {
- return undefined;
- }
- },
-
- showExpressInstall: function(att, par, replaceElemIdStr, callbackFn) {
- if (ua.w3 && canExpressInstall()) {
- showExpressInstall(att, par, replaceElemIdStr, callbackFn);
- }
- },
-
- removeSWF: function(objElemIdStr) {
- if (ua.w3) {
- removeSWF(objElemIdStr);
- }
- },
-
- createCSS: function(selStr, declStr, mediaStr, newStyleBoolean) {
- if (ua.w3) {
- createCSS(selStr, declStr, mediaStr, newStyleBoolean);
- }
- },
-
- addDomLoadEvent: addDomLoadEvent,
-
- addLoadEvent: addLoadEvent,
-
- getQueryParamValue: function(param) {
- var q = doc.location.search || doc.location.hash;
- if (q) {
- if (/\?/.test(q)) { q = q.split("?")[1]; } // strip question mark
- if (param == null) {
- return urlEncodeIfNecessary(q);
- }
- var pairs = q.split("&");
- for (var i = 0; i < pairs.length; i++) {
- if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
- return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf("=") + 1)));
- }
- }
- }
- return "";
- },
-
- // For internal usage only
- expressInstallCallback: function() {
- if (isExpressInstallActive) {
- var obj = getElementById(EXPRESS_INSTALL_ID);
- if (obj && storedAltContent) {
- obj.parentNode.replaceChild(storedAltContent, obj);
- if (storedAltContentId) {
- setVisibility(storedAltContentId, true);
- if (ua.ie && ua.win) { storedAltContent.style.display = "block"; }
- }
- if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); }
- }
- isExpressInstallActive = false;
- }
- }
- };
-}();
-
-//##############################################################################
-// FlashAudioLoader.js
-//##############################################################################
-
-this.createjs = this.createjs || {};
-
-(function () {
- "use strict";
-
- /**
- * Loader provides a mechanism to preload Flash content via PreloadJS or internally. Instances are returned to
- * the preloader, and the load method is called when the asset needs to be requested.
- *
- * @class FlashAudioLoader
- * @param {String} loadItem The item to be loaded
- * @param {Object} flash The flash instance that will do the preloading.
- * @extends AbstractLoader
- * @protected
- */
- function Loader(loadItem) {
- this.AbstractLoader_constructor(loadItem, false, createjs.AbstractLoader.SOUND);
-
-
-// Public properties
- /**
- * ID used to facilitate communication with flash.
- * Not doc'd because this should not be altered externally
- * @property flashId
- * @type {String}
- */
- this.flashId = null;
-
- }
- var p = createjs.extend(Loader, createjs.AbstractLoader);
-
- // TODO: deprecated
- // p.initialize = function() {}; // searchable for devs wondering where it is. REMOVED. See docs for details.
-
-
-// Static Properties
- var s = Loader;
- /**
- * A reference to the Flash instance that gets created.
- * @property flash
- * @type {Object | Embed}
- * @protected
- */
- s._flash = null;
-
- /**
- * A list of loader instances that tried to load before _flash was set
- * @property _preloadInstances
- * @type {Array}
- * @protected
- */
- s._preloadInstances = [];
-
- /**
- * Set the Flash instance on the class, and start loading on any instances that had load called
- * before flash was ready
- * @method setFlash
- * @param flash Flash instance that handles loading and playback
- */
- s.setFlash = function(flash) {
- s._flash = flash;
- for(var i = s._preloadInstances.length; i--; ) {
- var loader = s._preloadInstances.pop();
- loader.load();
- }
- };
-
-// public methods
- p.load = function () {
- if (s._flash == null) {
- // register for future preloading
- s._preloadInstances.push(this);
- return;
- }
-
- this.flashId = s._flash.preload(this._item.src);
- // Associate this preload instance with the FlashID, so callbacks can route here.
- var e = new createjs.Event(createjs.FlashAudioPlugin._REG_FLASHID);
- this.dispatchEvent(e);
- };
-
- /**
- * called from flash when loading has progress
- * @method handleProgress
- * @param loaded
- * @param total
- * @protected
- */
- p.handleProgress = function (loaded, total) {
- this._sendProgress(loaded/total);
- };
-
- /**
- * Called from Flash when sound is loaded. Set our ready state and fire callbacks / events
- * @method handleComplete
- * @protected
- */
- p.handleComplete = function () {
- this._result = this._item.src;
- this._sendComplete();
- };
-
- /**
- * Receive error event from flash and pass it to callback.
- * @method handleError
- * @param {Event} error
- * @protected
- */
- p.handleError = function (error) {
- this._handleError(error);
- };
-
- p.destroy = function () {
- var e = new createjs.Event(createjs.FlashAudioPlugin._UNREG_FLASHID);
- this.dispatchEvent(e);
- this.AbstractLoader_destroy();
- };
-
- p.toString = function () {
- return "[FlashAudioLoader]";
- };
-
- createjs.FlashAudioLoader = createjs.promote(Loader, "AbstractLoader");
-
-}());
-
-//##############################################################################
-// FlashAudioSoundInstance.js
-//##############################################################################
-
-this.createjs = this.createjs || {};
-
-(function () {
- "use strict";
-
- /**
- * FlashAudioSoundInstance extends the base api of {{#crossLink "AbstractSoundInstance"}}{{/crossLink}} and is used by
- * {{#crossLink "FlashAudioPlugin"}}{{/crossLink}}.
- *
- * NOTE audio control is shuttled to a flash player instance via the flash reference.
- *
- * @param {String} src The path to and file name of the sound.
- * @param {Number} startTime Audio sprite property used to apply an offset, in milliseconds.
- * @param {Number} duration Audio sprite property used to set the time the clip plays for, in milliseconds.
- * @param {Object} playbackResource Any resource needed by plugin to support audio playback.
- * @class FlashAudioSoundInstance
- * @extends AbstractSoundInstance
- * @constructor
- */
- function FlashAudioSoundInstance(src, startTime, duration, playbackResource) {
- this.AbstractSoundInstance_constructor(src, startTime, duration, playbackResource);
-
-
-// Public Properties
- /**
- * ID used to facilitate communication with flash.
- * Not doc'd because this should not be altered externally
- * #property flashId
- * @type {String}
- */
- this.flashId = null; // To communicate with Flash
-
- if(s._flash == null) { s._instances.push(this); }
- };
- var p = createjs.extend(FlashAudioSoundInstance, createjs.AbstractSoundInstance);
-
- // TODO: deprecated
- // p.initialize = function() {}; // searchable for devs wondering where it is. REMOVED. See docs for details.
-
-
-// Static Propeties
- var s = FlashAudioSoundInstance;
- /**
- * A reference to the Flash instance that gets created.
- * #property flash
- * @type {Object | Embed}
- */
- s._flash = null;
-
- /**
- * A list of loader instances that tried to load before _flash was set
- * #property _preloadInstances
- * @type {Array}
- * @private
- */
- s._instances = [];
-
- /**
- * Set the Flash instance on the class, and start loading on any instances that had load called
- * before flash was ready
- * #method setFlash
- * @param flash Flash instance that handles loading and playback
- */
- s.setFlash = function(flash) {
- s._flash = flash;
- for(var i = s._instances.length; i--; ) {
- var o = s._instances.pop();
- o._setDurationFromSource();
- }
- };
-
-
-// Public Methods
- // TODO change flash.setLoop to mimic remove and add??
- p.setLoop = function (value) {
- if(this.flashId!= null) {
- s._flash.setLoop(this.flashId, value);
- }
- this._loop = value;
- };
-
- p.toString = function () {
- return "[FlashAudioSoundInstance]"
- };
-
-
-// Private Methods
- p._updateVolume = function() {
- if (this.flashId == null) { return; }
- s._flash.setVolume(this.flashId, this._volume)
- };
-
- p._updatePan = function () {
- if (this.flashId == null) { return; }
- s._flash.setPan(this.flashId, this._pan);
- };
-
- p._setDurationFromSource = function() {
- this._duration = s._flash.getDurationBySrc(this.src);
- };
-
- p._interrupt = function () {
- if(this.flashId == null) { return; }
- s._flash.interrupt(this.flashId); // OJR this is redundant, cleanup calls stop that does the same thing anyway
- this.AbstractSoundInstance__interrupt();
- };
-
- p._handleCleanUp = function () {
- s._flash.stopSound(this.flashId);
-
- this._sendEvent(createjs.FlashAudioPlugin._UNREG_FLASHID);
- this.flashId = null;
- };
-
- p._beginPlaying = function (playProps) {
- if (s._flash == null) { return false; }
-
- this.setPosition(playProps.offset);
- this.setLoop(playProps.loop);
- this.setVolume(playProps.volume);
- this.setPan(playProps.pan);
- if (playProps.startTime != null) {
- this.setStartTime(playProps.startTime);
- this.setDuration(playProps.duration);
- }
- this._paused = false;
-
- this.flashId = s._flash.playSound(this.src, this._position, this._loop, this._volume, this._pan, this._startTime, this._duration);
- if (this.flashId == null) {
- this._playFailed();
- return false;
- }
-
- if (this._muted) {this.setMute(true);}
- this._sendEvent(createjs.FlashAudioPlugin._REG_FLASHID);
-
- this.playState = createjs.Sound.PLAY_SUCCEEDED;
- this._sendEvent("succeeded");
- return true;
- };
-
- p._pause = function () {
- if(this.flashId == null) { return; }
- this._position = this._calculateCurrentPosition();
- s._flash.pauseSound(this.flashId);
- };
-
- p._resume = function () {
- if(this.flashId == null) { return; }
- s._flash.resumeSound(this.flashId);
- };
-
- p._handleStop = function () {
- if(this.flashId == null) { return; }
- s._flash.stopSound(this.flashId);
- };
-
- p._updateVolume = function () {
- var newVolume = this._muted ? 0 : this._volume;
- s._flash.setVolume(this.flashId, newVolume);
- };
- // TODO remove unused .muteSound and .unmuteSound from Flash
-
- p._calculateCurrentPosition = function() {
- return s._flash.getPosition(this.flashId);
- };
-
- p._updatePosition = function() {
- if(this.flashId == null) { return; }
- s._flash.setPosition(this.flashId, this._position);
- };
-
-// Flash callbacks, only exist in FlashAudioPlugin
- /**
- * Called from Flash. Lets us know flash has finished playing a sound.
- * #method handleSoundFinished
- * @protected
- */
- p.handleSoundFinished = function () {
- this._loop = 0;
- this._handleSoundComplete();
- };
-
- /**
- * Called from Flash. Lets us know that flash has played a sound to completion and is looping it.
- * #method handleSoundLoop
- * @protected
- */
- p.handleSoundLoop = function () {
- this._loop--;
- this._sendEvent("loop");
- };
-
- createjs.FlashAudioSoundInstance = createjs.promote(FlashAudioSoundInstance, "AbstractSoundInstance");
-}());
-
-//##############################################################################
-// FlashAudioPlugin.js
-//##############################################################################
-
-this.createjs = this.createjs || {};
-
-(function () {
-
- "use strict";
-
- /**
- * Play sounds using a Flash instance. This plugin is not used by default, and must be registered manually in
- * {{#crossLink "Sound"}}{{/crossLink}} using the {{#crossLink "Sound/registerPlugins"}}{{/crossLink}} method. This
- * plugin is recommended to be included if sound support is required in older browsers such as IE8.
- *
- * This plugin requires FlashAudioPlugin.swf and swfObject.js, which is compiled
- * into the minified FlashAudioPlugin-X.X.X.min.js file. You must ensure that {{#crossLink "FlashAudioPlugin/swfPath:property"}}{{/crossLink}}
- * is set when using this plugin, so that the script can find the swf.
- *
- *
Example
- *
- * createjs.FlashAudioPlugin.swfPath = "../src/soundjs/flashaudio";
- * createjs.Sound.registerPlugins([createjs.WebAudioPlugin, createjs.HTMLAudioPlugin, createjs.FlashAudioPlugin]);
- * // Adds FlashAudioPlugin as a fallback if WebAudio and HTMLAudio do not work.
- *
- * Note that the SWF is embedded into a container DIV (with an id and classname of "SoundJSFlashContainer"), and
- * will have an id of "flashAudioContainer". The container DIV is positioned 1 pixel off-screen to the left to avoid
- * showing the 1x1 pixel white square.
- *
- *
Known Browser and OS issues for Flash Audio
- * All browsers
- *
There can be a delay in flash player starting playback of audio. This has been most noticeable in Firefox.
- * Unfortunely this is an issue with the flash player and the browser and therefore cannot be addressed by SoundJS.
- *
- * // Remove all listeners
- * displayObject.removeAllEventListeners();
- *
- * // Remove all click listeners
- * displayObject.removeAllEventListeners("click");
- *
- * @method removeAllEventListeners
- * @param {String} [type] The string type of the event. If omitted, all listeners for all types will be removed.
- **/
- p.removeAllEventListeners = function(type) {
- if (!type) { this._listeners = this._captureListeners = null; }
- else {
- if (this._listeners) { delete(this._listeners[type]); }
- if (this._captureListeners) { delete(this._captureListeners[type]); }
- }
- };
-
- /**
- * Dispatches the specified event to all listeners.
- *
- *
Example
- *
- * // Use a string event
- * this.dispatchEvent("complete");
- *
- * // Use an Event instance
- * var event = new createjs.Event("progress");
- * this.dispatchEvent(event);
- *
- * @method dispatchEvent
- * @param {Object | String | Event} eventObj An object with a "type" property, or a string type.
- * While a generic object will work, it is recommended to use a CreateJS Event instance. If a string is used,
- * dispatchEvent will construct an Event instance if necessary with the specified type. This latter approach can
- * be used to avoid event object instantiation for non-bubbling events that may not have any listeners.
- * @param {Boolean} [bubbles] Specifies the `bubbles` value when a string was passed to eventObj.
- * @param {Boolean} [cancelable] Specifies the `cancelable` value when a string was passed to eventObj.
- * @return {Boolean} Returns false if `preventDefault()` was called on a cancelable event, true otherwise.
- **/
- p.dispatchEvent = function(eventObj, bubbles, cancelable) {
- if (typeof eventObj == "string") {
- // skip everything if there's no listeners and it doesn't bubble:
- var listeners = this._listeners;
- if (!bubbles && (!listeners || !listeners[eventObj])) { return true; }
- eventObj = new createjs.Event(eventObj, bubbles, cancelable);
- } else if (eventObj.target && eventObj.clone) {
- // redispatching an active event object, so clone it:
- eventObj = eventObj.clone();
- }
-
- // TODO: it would be nice to eliminate this. Maybe in favour of evtObj instanceof Event? Or !!evtObj.createEvent
- try { eventObj.target = this; } catch (e) {} // try/catch allows redispatching of native events
-
- if (!eventObj.bubbles || !this.parent) {
- this._dispatchEvent(eventObj, 2);
- } else {
- var top=this, list=[top];
- while (top.parent) { list.push(top = top.parent); }
- var i, l=list.length;
-
- // capture & atTarget
- for (i=l-1; i>=0 && !eventObj.propagationStopped; i--) {
- list[i]._dispatchEvent(eventObj, 1+(i==0));
- }
- // bubbling
- for (i=1; iExample
+ * Add EventDispatcher capabilities to the "MyClass" class.
+ *
+ * EventDispatcher.initialize(MyClass.prototype);
+ *
+ * Add an event (see {{#crossLink "EventDispatcher/addEventListener"}}{{/crossLink}}).
+ *
+ * instance.addEventListener("eventName", handlerMethod);
+ * function handlerMethod(event) {
+ * console.log(event.target + " Was Clicked");
+ * }
+ *
+ * Maintaining proper scope
+ * Scope (ie. "this") can be be a challenge with events. Using the {{#crossLink "EventDispatcher/on"}}{{/crossLink}}
+ * method to subscribe to events simplifies this.
+ *
+ * instance.addEventListener("click", function(event) {
+ * console.log(instance == this); // false, scope is ambiguous.
+ * });
+ *
+ * instance.on("click", function(event) {
+ * console.log(instance == this); // true, "on" uses dispatcher scope by default.
+ * });
+ *
+ * If you want to use addEventListener instead, you may want to use function.bind() or a similar proxy to manage
+ * scope.
+ *
+ * Browser support
+ * The event model in CreateJS can be used separately from the suite in any project, however the inheritance model
+ * requires modern browsers (IE9+).
+ *
+ *
+ * @class EventDispatcher
+ * @constructor
+ **/
+ function EventDispatcher() {
+
+
+ // private properties:
+ /**
+ * @protected
+ * @property _listeners
+ * @type Object
+ **/
+ this._listeners = null;
+
+ /**
+ * @protected
+ * @property _captureListeners
+ * @type Object
+ **/
+ this._captureListeners = null;
+ }
+ var p = EventDispatcher.prototype;
+
+ /**
+ * REMOVED. Removed in favor of using `MySuperClass_constructor`.
+ * See {{#crossLink "Utility Methods/extend"}}{{/crossLink}} and {{#crossLink "Utility Methods/promote"}}{{/crossLink}}
+ * for details.
+ *
+ * There is an inheritance tutorial distributed with EaselJS in /tutorials/Inheritance.
+ *
+ * @method initialize
+ * @protected
+ * @deprecated
+ */
+ // p.initialize = function() {}; // searchable for devs wondering where it is.
+
+
+// static public methods:
+ /**
+ * Static initializer to mix EventDispatcher methods into a target object or prototype.
+ *
+ * EventDispatcher.initialize(MyClass.prototype); // add to the prototype of the class
+ * EventDispatcher.initialize(myObject); // add to a specific instance
+ *
+ * @method initialize
+ * @static
+ * @param {Object} target The target object to inject EventDispatcher methods into. This can be an instance or a
+ * prototype.
+ **/
+ EventDispatcher.initialize = function(target) {
+ target.addEventListener = p.addEventListener;
+ target.on = p.on;
+ target.removeEventListener = target.off = p.removeEventListener;
+ target.removeAllEventListeners = p.removeAllEventListeners;
+ target.hasEventListener = p.hasEventListener;
+ target.dispatchEvent = p.dispatchEvent;
+ target._dispatchEvent = p._dispatchEvent;
+ target.willTrigger = p.willTrigger;
+ };
+
+
+// public methods:
+ /**
+ * Adds the specified event listener. Note that adding multiple listeners to the same function will result in
+ * multiple callbacks getting fired.
+ *
+ *
Example
+ *
+ * displayObject.addEventListener("click", handleClick);
+ * function handleClick(event) {
+ * // Click happened.
+ * }
+ *
+ * @method addEventListener
+ * @param {String} type The string type of the event.
+ * @param {Function | Object} listener An object with a handleEvent method, or a function that will be called when
+ * the event is dispatched.
+ * @param {Boolean} [useCapture] For events that bubble, indicates whether to listen for the event in the capture or bubbling/target phase.
+ * @return {Function | Object} Returns the listener for chaining or assignment.
+ **/
+ p.addEventListener = function(type, listener, useCapture) {
+ var listeners;
+ if (useCapture) {
+ listeners = this._captureListeners = this._captureListeners||{};
+ } else {
+ listeners = this._listeners = this._listeners||{};
+ }
+ var arr = listeners[type];
+ if (arr) { this.removeEventListener(type, listener, useCapture); }
+ arr = listeners[type]; // remove may have deleted the array
+ if (!arr) { listeners[type] = [listener]; }
+ else { arr.push(listener); }
+ return listener;
+ };
+
+ /**
+ * A shortcut method for using addEventListener that makes it easier to specify an execution scope, have a listener
+ * only run once, associate arbitrary data with the listener, and remove the listener.
+ *
+ * This method works by creating an anonymous wrapper function and subscribing it with addEventListener.
+ * The wrapper function is returned for use with `removeEventListener` (or `off`).
+ *
+ * IMPORTANT: To remove a listener added with `on`, you must pass in the returned wrapper function as the listener, or use
+ * {{#crossLink "Event/remove"}}{{/crossLink}}. Likewise, each time you call `on` a NEW wrapper function is subscribed, so multiple calls
+ * to `on` with the same params will create multiple listeners.
+ *
+ *
Example
+ *
+ * var listener = myBtn.on("click", handleClick, null, false, {count:3});
+ * function handleClick(evt, data) {
+ * data.count -= 1;
+ * console.log(this == myBtn); // true - scope defaults to the dispatcher
+ * if (data.count == 0) {
+ * alert("clicked 3 times!");
+ * myBtn.off("click", listener);
+ * // alternately: evt.remove();
+ * }
+ * }
+ *
+ * @method on
+ * @param {String} type The string type of the event.
+ * @param {Function | Object} listener An object with a handleEvent method, or a function that will be called when
+ * the event is dispatched.
+ * @param {Object} [scope] The scope to execute the listener in. Defaults to the dispatcher/currentTarget for function listeners, and to the listener itself for object listeners (ie. using handleEvent).
+ * @param {Boolean} [once=false] If true, the listener will remove itself after the first time it is triggered.
+ * @param {*} [data] Arbitrary data that will be included as the second parameter when the listener is called.
+ * @param {Boolean} [useCapture=false] For events that bubble, indicates whether to listen for the event in the capture or bubbling/target phase.
+ * @return {Function} Returns the anonymous function that was created and assigned as the listener. This is needed to remove the listener later using .removeEventListener.
+ **/
+ p.on = function(type, listener, scope, once, data, useCapture) {
+ if (listener.handleEvent) {
+ scope = scope||listener;
+ listener = listener.handleEvent;
+ }
+ scope = scope||this;
+ return this.addEventListener(type, function(evt) {
+ listener.call(scope, evt, data);
+ once&&evt.remove();
+ }, useCapture);
+ };
+
+ /**
+ * Removes the specified event listener.
+ *
+ * Important Note: that you must pass the exact function reference used when the event was added. If a proxy
+ * function, or function closure is used as the callback, the proxy/closure reference must be used - a new proxy or
+ * closure will not work.
+ *
+ *
Example
+ *
+ * displayObject.removeEventListener("click", handleClick);
+ *
+ * @method removeEventListener
+ * @param {String} type The string type of the event.
+ * @param {Function | Object} listener The listener function or object.
+ * @param {Boolean} [useCapture] For events that bubble, indicates whether to listen for the event in the capture or bubbling/target phase.
+ **/
+ p.removeEventListener = function(type, listener, useCapture) {
+ var listeners = useCapture ? this._captureListeners : this._listeners;
+ if (!listeners) { return; }
+ var arr = listeners[type];
+ if (!arr) { return; }
+ for (var i=0,l=arr.length; iIMPORTANT: To remove a listener added with `on`, you must pass in the returned wrapper function as the listener. See
+ * {{#crossLink "EventDispatcher/on"}}{{/crossLink}} for an example.
+ *
+ * @method off
+ * @param {String} type The string type of the event.
+ * @param {Function | Object} listener The listener function or object.
+ * @param {Boolean} [useCapture] For events that bubble, indicates whether to listen for the event in the capture or bubbling/target phase.
+ **/
+ p.off = p.removeEventListener;
+
+ /**
+ * Removes all listeners for the specified type, or all listeners of all types.
+ *
+ *
Example
+ *
+ * // Remove all listeners
+ * displayObject.removeAllEventListeners();
+ *
+ * // Remove all click listeners
+ * displayObject.removeAllEventListeners("click");
+ *
+ * @method removeAllEventListeners
+ * @param {String} [type] The string type of the event. If omitted, all listeners for all types will be removed.
+ **/
+ p.removeAllEventListeners = function(type) {
+ if (!type) { this._listeners = this._captureListeners = null; }
+ else {
+ if (this._listeners) { delete(this._listeners[type]); }
+ if (this._captureListeners) { delete(this._captureListeners[type]); }
+ }
+ };
+
+ /**
+ * Dispatches the specified event to all listeners.
+ *
+ *
Example
+ *
+ * // Use a string event
+ * this.dispatchEvent("complete");
+ *
+ * // Use an Event instance
+ * var event = new createjs.Event("progress");
+ * this.dispatchEvent(event);
+ *
+ * @method dispatchEvent
+ * @param {Object | String | Event} eventObj An object with a "type" property, or a string type.
+ * While a generic object will work, it is recommended to use a CreateJS Event instance. If a string is used,
+ * dispatchEvent will construct an Event instance if necessary with the specified type. This latter approach can
+ * be used to avoid event object instantiation for non-bubbling events that may not have any listeners.
+ * @param {Boolean} [bubbles] Specifies the `bubbles` value when a string was passed to eventObj.
+ * @param {Boolean} [cancelable] Specifies the `cancelable` value when a string was passed to eventObj.
+ * @return {Boolean} Returns false if `preventDefault()` was called on a cancelable event, true otherwise.
+ **/
+ p.dispatchEvent = function(eventObj, bubbles, cancelable) {
+ if (typeof eventObj == "string") {
+ // skip everything if there's no listeners and it doesn't bubble:
+ var listeners = this._listeners;
+ if (!bubbles && (!listeners || !listeners[eventObj])) { return true; }
+ eventObj = new createjs.Event(eventObj, bubbles, cancelable);
+ } else if (eventObj.target && eventObj.clone) {
+ // redispatching an active event object, so clone it:
+ eventObj = eventObj.clone();
+ }
+
+ // TODO: it would be nice to eliminate this. Maybe in favour of evtObj instanceof Event? Or !!evtObj.createEvent
+ try { eventObj.target = this; } catch (e) {} // try/catch allows redispatching of native events
+
+ if (!eventObj.bubbles || !this.parent) {
+ this._dispatchEvent(eventObj, 2);
+ } else {
+ var top=this, list=[top];
+ while (top.parent) { list.push(top = top.parent); }
+ var i, l=list.length;
+
+ // capture & atTarget
+ for (i=l-1; i>=0 && !eventObj.propagationStopped; i--) {
+ list[i]._dispatchEvent(eventObj, 1+(i==0));
+ }
+ // bubbling
+ for (i=1; i= 0) {
+ name = match[4];
+ origExt = ext = match[5];
+ } else if (s.SUPPORTED_EXTENSIONS.indexOf(match[8]) >= 0) {
+ name = match[7];
+ origExt = ext = match[8];
+ } else {
+ return null;
+ }
- var name = match[4];
- var ext = match[5];
var c = s.capabilities;
var i = 0;
while (!c[ext]) {
ext = s.alternateExtensions[i++];
if (i > s.alternateExtensions.length) { return null;} // no extensions are supported
}
- value = value.replace("."+match[5], "."+ext);
+ value = value.replace("."+origExt, "."+ext);
var ret = {name:name, src:value, extension:ext};
return ret;
@@ -4909,6 +4928,38 @@ this.createjs = this.createjs || {};
return s._defaultPlayPropsHash[s._parsePath(src.src).src];
};
+ /**
+ * Pauses all audio (global pause on existing audio).
+ *
+ *
Example
+ * createjs.Sound.pause();
+ *
+ * @method pause
+ * @static
+ */
+ s.pause = function () {
+ var instances = this.instances;
+ for (var i = instances.length; i--; ) {
+ instances[i].paused = true;
+ }
+ };
+
+ /**
+ * Resumes all audio (global resume on existing audio).
+ *
+ *
Example
+ * createjs.Sound.resume();
+ *
+ * @method resume
+ * @static
+ */
+ s.resume = function () {
+ var instances = this.instances;
+ for (var i = instances.length; i--; ) {
+ instances[i].paused = false;
+ }
+ };
+
/* ---------------
Internal methods
@@ -4999,6 +5050,12 @@ this.createjs = this.createjs || {};
SoundChannel.remove(instance);
var index = createjs.indexOf(this._instances, instance);
if (index > -1) {this._instances.splice(index, 1);} // OJR this will always be > -1, there is no way for an instance to exist without being added to this._instances
+ //MMB 9/2015: sounds were being removed from _instances, but not from activePlugin._soundInstances
+ var soundInstances = s.activePlugin._soundInstances;
+ if (soundInstances[instance.src] && soundInstances[instance.src].indexOf(instance) > -1)
+ {
+ soundInstances[instance.src].splice(soundInstances[instance.src].indexOf(instance), 1);
+ }
};
createjs.Sound = Sound;
@@ -5212,6 +5269,12 @@ this.createjs = this.createjs || {};
* return false.
*/
p._remove = function (instance) {
+ //MMB 9/2015: sounds were being removed from _instances, but not from activePlugin._soundInstances
+ var soundInstances = s.activePlugin._soundInstances;
+ if (soundInstances[instance.src] && soundInstances[instance.src].indexOf(instance) > -1)
+ {
+ soundInstances[instance.src].splice(soundInstances[instance.src].indexOf(instance), 1);
+ }
var index = createjs.indexOf(this._instances, instance);
if (index == -1) {return false;}
this._instances.splice(index, 1);
@@ -6276,6 +6339,14 @@ this.createjs = this.createjs || {};
* @protected;
*/
this._soundInstanceClass;
+
+ /**
+ * The master volume of the plugin, which affects all SoundInstances.
+ * Default is 1.
+ * @type {Number}
+ * @protected
+ */
+ this._volume = 1;
};
var p = AbstractPlugin.prototype;
@@ -6810,6 +6881,8 @@ this.createjs = this.createjs || {};
audioNode.buffer = this.playbackResource;
audioNode.connect(this.panNode);
var dur = this._duration * 0.001;
+ if(offset > dur)
+ offset = dur - 0.001;
audioNode.startTime = startTime + dur;
audioNode.start(audioNode.startTime, offset+(this._startTime*0.001), dur - offset);
return audioNode;
@@ -7077,6 +7150,11 @@ this.createjs = this.createjs || {};
source.buffer = s._scratchBuffer;
source.connect(s.context.destination);
source.start(0, 0, 0);
+
+ //Chrome 55 fix
+ if (source.context.state === 'suspended') {
+ source.context.resume();
+ }
};
@@ -7135,6 +7213,13 @@ this.createjs = this.createjs || {};
} else {
return null;
}
+
+ // fix for chrome 66 autoplay issue: https://developers.google.com/web/updates/2017/09/autoplay-policy-changes#webaudio
+ document.addEventListener('click', function() {
+ if(s.context.state === 'suspended') {
+ s.context.resume();
+ }
+ });
}
if (s._scratchBuffer == null) {
s._scratchBuffer = s.context.createBuffer(1, 1, 22050);
@@ -7146,6 +7231,7 @@ this.createjs = this.createjs || {};
if ("ontouchstart" in window && s.context.state != "running") {
s._unlock(); // When played inside of a touch event, this will enable audio on iOS immediately.
document.addEventListener("mousedown", s._unlock, true);
+ document.addEventListener("touchstart", s._unlock, true);
document.addEventListener("touchend", s._unlock, true);
}
@@ -7213,11 +7299,17 @@ this.createjs = this.createjs || {};
* @private
*/
s._unlock = function() {
+
+ if(s.context.state === 'suspended') {
+ s.context.resume();
+ }
+
if (s._unlocked) { return; }
s.playEmptySound();
if (s.context.state == "running") {
document.removeEventListener("mousedown", s._unlock, true);
document.removeEventListener("touchend", s._unlock, true);
+ document.removeEventListener("touchstart", s._unlock, true);
s._unlocked = true;
}
};
diff --git a/lib/soundjs.min.js b/lib/soundjs.min.js
new file mode 100644
index 00000000..69d6a520
--- /dev/null
+++ b/lib/soundjs.min.js
@@ -0,0 +1,18 @@
+/*!
+* @license SoundJS
+* Visit http://createjs.com/ for documentation, updates and examples.
+*
+* Copyright (c) 2011-2015 gskinner.com, inc.
+*
+* Distributed under the terms of the MIT license.
+* http://www.opensource.org/licenses/mit-license.html
+*
+* This notice shall be included in all copies or substantial portions of the Software.
+*/
+
+/**!
+ * SoundJS FlashAudioPlugin also includes swfobject (http://code.google.com/p/swfobject/)
+ */
+
+this.createjs=this.createjs||{},function(){var a=createjs.SoundJS=createjs.SoundJS||{};a.version="0.6.6",a.buildDate="Thu, 10 May 2018 18:47:59 GMT"}(),this.createjs=this.createjs||{},createjs.extend=function(a,b){"use strict";function c(){this.constructor=a}return c.prototype=b.prototype,a.prototype=new c},this.createjs=this.createjs||{},createjs.promote=function(a,b){"use strict";var c=a.prototype,d=Object.getPrototypeOf&&Object.getPrototypeOf(c)||c.__proto__;if(d){c[(b+="_")+"constructor"]=d.constructor;for(var e in d)c.hasOwnProperty(e)&&"function"==typeof d[e]&&(c[b+e]=d[e])}return a},this.createjs=this.createjs||{},createjs.indexOf=function(a,b){"use strict";for(var c=0,d=a.length;c-1||a.indexOf("Windows Phone")>-1,BrowserDetect.isFirefox=a.indexOf("Firefox")>-1,BrowserDetect.isOpera=null!=window.opera,BrowserDetect.isChrome=a.indexOf("Chrome")>-1,BrowserDetect.isIOS=(a.indexOf("iPod")>-1||a.indexOf("iPhone")>-1||a.indexOf("iPad")>-1)&&!BrowserDetect.isWindowPhone,BrowserDetect.isAndroid=a.indexOf("Android")>-1&&!BrowserDetect.isWindowPhone,BrowserDetect.isBlackberry=a.indexOf("Blackberry")>-1,createjs.BrowserDetect=BrowserDetect}(),this.createjs=this.createjs||{},function(){"use strict";function EventDispatcher(){this._listeners=null,this._captureListeners=null}var a=EventDispatcher.prototype;EventDispatcher.initialize=function(b){b.addEventListener=a.addEventListener,b.on=a.on,b.removeEventListener=b.off=a.removeEventListener,b.removeAllEventListeners=a.removeAllEventListeners,b.hasEventListener=a.hasEventListener,b.dispatchEvent=a.dispatchEvent,b._dispatchEvent=a._dispatchEvent,b.willTrigger=a.willTrigger},a.addEventListener=function(a,b,c){var d;d=c?this._captureListeners=this._captureListeners||{}:this._listeners=this._listeners||{};var e=d[a];return e&&this.removeEventListener(a,b,c),e=d[a],e?e.push(b):d[a]=[b],b},a.on=function(a,b,c,d,e,f){return b.handleEvent&&(c=c||b,b=b.handleEvent),c=c||this,this.addEventListener(a,function(a){b.call(c,a,e),d&&a.remove()},f)},a.removeEventListener=function(a,b,c){var d=c?this._captureListeners:this._listeners;if(d){var e=d[a];if(e)for(var f=0,g=e.length;f=0&&!a.propagationStopped;g--)f[g]._dispatchEvent(a,1+(0==g));for(g=1;g-1&&(b=b.substr(0,d));var e;return a.ABSOLUTE_PATT.test(b)?c.absolute=!0:a.RELATIVE_PATT.test(b)&&(c.relative=!0),(e=b.match(a.EXTENSION_PATT))&&(c.extension=e[1].toLowerCase()),c},a.formatQueryString=function(a,b){if(null==a)throw new Error("You must specify data.");var c=[];for(var d in a)c.push(d+"="+escape(a[d]));return b&&(c=c.concat(b)),c.join("&")},a.buildPath=function(a,b){if(null==b)return a;var c=[],d=a.indexOf("?");if(-1!=d){var e=a.slice(d+1);c=c.concat(e.split("&"))}return-1!=d?a.slice(0,d)+"?"+this.formatQueryString(b,c):a+"?"+this.formatQueryString(b,c)},a.isCrossDomain=function(a){var b=document.createElement("a");b.href=a.src;var c=document.createElement("a");return c.href=location.href,""!=b.hostname&&(b.port!=c.port||b.protocol!=c.protocol||b.hostname!=c.hostname)},a.isLocal=function(a){var b=document.createElement("a");return b.href=a.src,""==b.hostname&&"file:"==b.protocol},a.isBinary=function(a){switch(a){case createjs.AbstractLoader.IMAGE:case createjs.AbstractLoader.BINARY:return!0;default:return!1}},a.isImageTag=function(a){return a instanceof HTMLImageElement},a.isAudioTag=function(a){return!!window.HTMLAudioElement&&a instanceof HTMLAudioElement},a.isVideoTag=function(a){return!!window.HTMLVideoElement&&a instanceof HTMLVideoElement},a.isText=function(a){switch(a){case createjs.AbstractLoader.TEXT:case createjs.AbstractLoader.JSON:case createjs.AbstractLoader.MANIFEST:case createjs.AbstractLoader.XML:case createjs.AbstractLoader.CSS:case createjs.AbstractLoader.SVG:case createjs.AbstractLoader.JAVASCRIPT:case createjs.AbstractLoader.SPRITESHEET:return!0;default:return!1}},a.getTypeByExtension=function(a){if(null==a)return createjs.AbstractLoader.TEXT;switch(a.toLowerCase()){case"jpeg":case"jpg":case"gif":case"png":case"webp":case"bmp":return createjs.AbstractLoader.IMAGE;case"ogg":case"mp3":case"webm":return createjs.AbstractLoader.SOUND;case"mp4":case"webm":case"ts":return createjs.AbstractLoader.VIDEO;case"json":return createjs.AbstractLoader.JSON;case"xml":return createjs.AbstractLoader.XML;case"css":return createjs.AbstractLoader.CSS;case"js":return createjs.AbstractLoader.JAVASCRIPT;case"svg":return createjs.AbstractLoader.SVG;default:return createjs.AbstractLoader.TEXT}},createjs.RequestUtils=a}(),this.createjs=this.createjs||{},function(){"use strict";function AbstractLoader(a,b,c){this.EventDispatcher_constructor(),this.loaded=!1,this.canceled=!1,this.progress=0,this.type=c,this.resultFormatter=null,this._item=a?createjs.LoadItem.create(a):null,this._preferXHR=b,this._result=null,this._rawResult=null,this._loadedItems=null,this._tagSrcAttribute=null,this._tag=null}var a=createjs.extend(AbstractLoader,createjs.EventDispatcher),b=AbstractLoader;b.POST="POST",b.GET="GET",b.BINARY="binary",b.CSS="css",b.IMAGE="image",b.JAVASCRIPT="javascript",b.JSON="json",b.JSONP="jsonp",b.MANIFEST="manifest",b.SOUND="sound",b.VIDEO="video",b.SPRITESHEET="spritesheet",b.SVG="svg",b.TEXT="text",b.XML="xml",a.getItem=function(){return this._item},a.getResult=function(a){return a?this._rawResult:this._result},a.getTag=function(){return this._tag},a.setTag=function(a){this._tag=a},a.load=function(){this._createRequest(),this._request.on("complete",this,this),this._request.on("progress",this,this),this._request.on("loadStart",this,this),this._request.on("abort",this,this),this._request.on("timeout",this,this),this._request.on("error",this,this);var a=new createjs.Event("initialize");a.loader=this._request,this.dispatchEvent(a),this._request.load()},a.cancel=function(){this.canceled=!0,this.destroy()},a.destroy=function(){this._request&&(this._request.removeAllEventListeners(),this._request.destroy()),this._request=null,this._item=null,this._rawResult=null,this._result=null,this._loadItems=null,this.removeAllEventListeners()},a.getLoadedItems=function(){return this._loadedItems},a._createRequest=function(){this._preferXHR?this._request=new createjs.XHRRequest(this._item):this._request=new createjs.TagRequest(this._item,this._tag||this._createTag(),this._tagSrcAttribute)},a._createTag=function(a){return null},a._sendLoadStart=function(){this._isCanceled()||this.dispatchEvent("loadstart")},a._sendProgress=function(a){if(!this._isCanceled()){var b=null;"number"==typeof a?(this.progress=a,b=new createjs.ProgressEvent(this.progress)):(b=a,this.progress=a.loaded/a.total,b.progress=this.progress,(isNaN(this.progress)||this.progress==1/0)&&(this.progress=0)),this.hasEventListener("progress")&&this.dispatchEvent(b)}},a._sendComplete=function(){if(!this._isCanceled()){this.loaded=!0;var a=new createjs.Event("complete");a.rawResult=this._rawResult,null!=this._result&&(a.result=this._result),this.dispatchEvent(a)}},a._sendError=function(a){!this._isCanceled()&&this.hasEventListener("error")&&(null==a&&(a=new createjs.ErrorEvent("PRELOAD_ERROR_EMPTY")),this.dispatchEvent(a))},a._isCanceled=function(){return!(null!=window.createjs&&!this.canceled)},a.resultFormatter=null,a.handleEvent=function(a){switch(a.type){case"complete":this._rawResult=a.target._response;var b=this.resultFormatter&&this.resultFormatter(this);b instanceof Function?b.call(this,createjs.proxy(this._resultFormatSuccess,this),createjs.proxy(this._resultFormatFailed,this)):(this._result=b||this._rawResult,this._sendComplete());break;case"progress":this._sendProgress(a);break;case"error":this._sendError(a);break;case"loadstart":this._sendLoadStart();break;case"abort":case"timeout":this._isCanceled()||this.dispatchEvent(new createjs.ErrorEvent("PRELOAD_"+a.type.toUpperCase()+"_ERROR"))}},a._resultFormatSuccess=function(a){this._result=a,this._sendComplete()},a._resultFormatFailed=function(a){this._sendError(a)},a.buildPath=function(a,b){return createjs.RequestUtils.buildPath(a,b)},a.toString=function(){return"[PreloadJS AbstractLoader]"},createjs.AbstractLoader=createjs.promote(AbstractLoader,"EventDispatcher")}(),this.createjs=this.createjs||{},function(){"use strict";function AbstractMediaLoader(a,b,c){this.AbstractLoader_constructor(a,b,c),this.resultFormatter=this._formatResult,this._tagSrcAttribute="src",this.on("initialize",this._updateXHR,this)}var a=createjs.extend(AbstractMediaLoader,createjs.AbstractLoader);a.load=function(){this._tag||(this._tag=this._createTag(this._item.src)),this._tag.preload="auto",this._tag.load(),this.AbstractLoader_load()},a._createTag=function(){},a._createRequest=function(){this._preferXHR?this._request=new createjs.XHRRequest(this._item):this._request=new createjs.MediaTagRequest(this._item,this._tag||this._createTag(),this._tagSrcAttribute)},a._updateXHR=function(a){a.loader.setResponseType&&a.loader.setResponseType("blob")},a._formatResult=function(a){if(this._tag.removeEventListener&&this._tag.removeEventListener("canplaythrough",this._loadedHandler),this._tag.onstalled=null,this._preferXHR){var b=window.URL||window.webkitURL,c=a.getResult(!0);a.getTag().src=b.createObjectURL(c)}return a.getTag()},createjs.AbstractMediaLoader=createjs.promote(AbstractMediaLoader,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";var AbstractRequest=function(a){this._item=a},a=createjs.extend(AbstractRequest,createjs.EventDispatcher);a.load=function(){},a.destroy=function(){},a.cancel=function(){},createjs.AbstractRequest=createjs.promote(AbstractRequest,"EventDispatcher")}(),this.createjs=this.createjs||{},function(){"use strict";function TagRequest(a,b,c){this.AbstractRequest_constructor(a),this._tag=b,this._tagSrcAttribute=c,this._loadedHandler=createjs.proxy(this._handleTagComplete,this),this._addedToDOM=!1,this._startTagVisibility=null}var a=createjs.extend(TagRequest,createjs.AbstractRequest);a.load=function(){this._tag.onload=createjs.proxy(this._handleTagComplete,this),this._tag.onreadystatechange=createjs.proxy(this._handleReadyStateChange,this),this._tag.onerror=createjs.proxy(this._handleError,this);var a=new createjs.Event("initialize");a.loader=this._tag,this.dispatchEvent(a),this._hideTag(),this._loadTimeout=setTimeout(createjs.proxy(this._handleTimeout,this),this._item.loadTimeout),this._tag[this._tagSrcAttribute]=this._item.src,null==this._tag.parentNode&&(window.document.body.appendChild(this._tag),this._addedToDOM=!0)},a.destroy=function(){this._clean(),this._tag=null,this.AbstractRequest_destroy()},a._handleReadyStateChange=function(){clearTimeout(this._loadTimeout);var a=this._tag;"loaded"!=a.readyState&&"complete"!=a.readyState||this._handleTagComplete()},a._handleError=function(){this._clean(),this.dispatchEvent("error")},a._handleTagComplete=function(){this._rawResult=this._tag,this._result=this.resultFormatter&&this.resultFormatter(this)||this._rawResult,this._clean(),this._showTag(),this.dispatchEvent("complete")},a._handleTimeout=function(){this._clean(),this.dispatchEvent(new createjs.Event("timeout"))},a._clean=function(){this._tag.onload=null,this._tag.onreadystatechange=null,this._tag.onerror=null,this._addedToDOM&&null!=this._tag.parentNode&&this._tag.parentNode.removeChild(this._tag),clearTimeout(this._loadTimeout)},a._hideTag=function(){this._startTagVisibility=this._tag.style.visibility,this._tag.style.visibility="hidden"},a._showTag=function(){this._tag.style.visibility=this._startTagVisibility},a._handleStalled=function(){},createjs.TagRequest=createjs.promote(TagRequest,"AbstractRequest")}(),this.createjs=this.createjs||{},function(){"use strict";function MediaTagRequest(a,b,c){this.AbstractRequest_constructor(a),this._tag=b,this._tagSrcAttribute=c,this._loadedHandler=createjs.proxy(this._handleTagComplete,this)}var a=createjs.extend(MediaTagRequest,createjs.TagRequest);a.load=function(){var a=createjs.proxy(this._handleStalled,this);this._stalledCallback=a;var b=createjs.proxy(this._handleProgress,this);this._handleProgress=b,this._tag.addEventListener("stalled",a),this._tag.addEventListener("progress",b),this._tag.addEventListener&&this._tag.addEventListener("canplaythrough",this._loadedHandler,!1),this.TagRequest_load()},a._handleReadyStateChange=function(){clearTimeout(this._loadTimeout);var a=this._tag;"loaded"!=a.readyState&&"complete"!=a.readyState||this._handleTagComplete()},a._handleStalled=function(){},a._handleProgress=function(a){if(a&&!(a.loaded>0&&0==a.total)){var b=new createjs.ProgressEvent(a.loaded,a.total);this.dispatchEvent(b)}},a._clean=function(){this._tag.removeEventListener&&this._tag.removeEventListener("canplaythrough",this._loadedHandler),this._tag.removeEventListener("stalled",this._stalledCallback),this._tag.removeEventListener("progress",this._progressCallback),this.TagRequest__clean()},createjs.MediaTagRequest=createjs.promote(MediaTagRequest,"TagRequest")}(),this.createjs=this.createjs||{},function(){"use strict";function XHRRequest(a){this.AbstractRequest_constructor(a),this._request=null,this._loadTimeout=null,this._xhrLevel=1,this._response=null,this._rawResponse=null,this._canceled=!1,this._handleLoadStartProxy=createjs.proxy(this._handleLoadStart,this),this._handleProgressProxy=createjs.proxy(this._handleProgress,this),this._handleAbortProxy=createjs.proxy(this._handleAbort,this),this._handleErrorProxy=createjs.proxy(this._handleError,this),this._handleTimeoutProxy=createjs.proxy(this._handleTimeout,this),this._handleLoadProxy=createjs.proxy(this._handleLoad,this),this._handleReadyStateChangeProxy=createjs.proxy(this._handleReadyStateChange,this),this._createXHR(a)}var a=createjs.extend(XHRRequest,createjs.AbstractRequest);XHRRequest.ACTIVEX_VERSIONS=["Msxml2.XMLHTTP.6.0","Msxml2.XMLHTTP.5.0","Msxml2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"],a.getResult=function(a){return a&&this._rawResponse?this._rawResponse:this._response},a.cancel=function(){this.canceled=!0,this._clean(),this._request.abort()},a.load=function(){if(null==this._request)return void this._handleError();null!=this._request.addEventListener?(this._request.addEventListener("loadstart",this._handleLoadStartProxy,!1),this._request.addEventListener("progress",this._handleProgressProxy,!1),this._request.addEventListener("abort",this._handleAbortProxy,!1),this._request.addEventListener("error",this._handleErrorProxy,!1),this._request.addEventListener("timeout",this._handleTimeoutProxy,!1),this._request.addEventListener("load",this._handleLoadProxy,!1),this._request.addEventListener("readystatechange",this._handleReadyStateChangeProxy,!1)):(this._request.onloadstart=this._handleLoadStartProxy,this._request.onprogress=this._handleProgressProxy,this._request.onabort=this._handleAbortProxy,this._request.onerror=this._handleErrorProxy,this._request.ontimeout=this._handleTimeoutProxy,this._request.onload=this._handleLoadProxy,this._request.onreadystatechange=this._handleReadyStateChangeProxy),1==this._xhrLevel&&(this._loadTimeout=setTimeout(createjs.proxy(this._handleTimeout,this),this._item.loadTimeout));try{this._item.values&&this._item.method!=createjs.AbstractLoader.GET?this._item.method==createjs.AbstractLoader.POST&&this._request.send(createjs.RequestUtils.formatQueryString(this._item.values)):this._request.send()}catch(a){this.dispatchEvent(new createjs.ErrorEvent("XHR_SEND",null,a))}},a.setResponseType=function(a){"blob"===a&&(a=window.URL?"blob":"arraybuffer",this._responseType=a),this._request.responseType=a},a.getAllResponseHeaders=function(){return this._request.getAllResponseHeaders instanceof Function?this._request.getAllResponseHeaders():null},a.getResponseHeader=function(a){return this._request.getResponseHeader instanceof Function?this._request.getResponseHeader(a):null},a._handleProgress=function(a){if(a&&!(a.loaded>0&&0==a.total)){var b=new createjs.ProgressEvent(a.loaded,a.total);this.dispatchEvent(b)}},a._handleLoadStart=function(a){clearTimeout(this._loadTimeout),this.dispatchEvent("loadstart")},a._handleAbort=function(a){this._clean(),this.dispatchEvent(new createjs.ErrorEvent("XHR_ABORTED",null,a))},a._handleError=function(a){this._clean(),this.dispatchEvent(new createjs.ErrorEvent(a.message))},a._handleReadyStateChange=function(a){4==this._request.readyState&&this._handleLoad()},a._handleLoad=function(a){if(!this.loaded){this.loaded=!0;var b=this._checkError();if(b)return void this._handleError(b);if(this._response=this._getResponse(),"arraybuffer"===this._responseType)try{this._response=new Blob([this._response])}catch(a){if(window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,"TypeError"===a.name&&window.BlobBuilder){var c=new BlobBuilder;c.append(this._response),this._response=c.getBlob()}}this._clean(),this.dispatchEvent(new createjs.Event("complete"))}},a._handleTimeout=function(a){this._clean(),this.dispatchEvent(new createjs.ErrorEvent("PRELOAD_TIMEOUT",null,a))},a._checkError=function(){var a=parseInt(this._request.status);switch(a){case 404:return new Error(a);case 0:return this._getResponse()?null:new Error(a)}return null},a._getResponse=function(){if(null!=this._response)return this._response;if(null!=this._request.response)return this._request.response;try{if(null!=this._request.responseText)return this._request.responseText}catch(a){}try{if(null!=this._request.responseXML)return this._request.responseXML}catch(a){}return null},a._createXHR=function(a){var b=createjs.RequestUtils.isCrossDomain(a),c={},d=null;if(window.XMLHttpRequest)d=new XMLHttpRequest,b&&void 0===d.withCredentials&&window.XDomainRequest&&(d=new XDomainRequest);else{for(var e=0,f=s.ACTIVEX_VERSIONS.length;e=0)d=c[4],f=e=c[5];else{if(!(b.SUPPORTED_EXTENSIONS.indexOf(c[8])>=0))return null;d=c[7],f=e=c[8]}for(var g=b.capabilities,h=0;!g[e];)if(e=b.alternateExtensions[h++],h>b.alternateExtensions.length)return null;return a=a.replace("."+f,"."+e),{name:d,src:a,extension:e}},b._parseSrc=function(a){var c={name:void 0,src:void 0,extension:void 0},d=b.capabilities;for(var e in a)if(a.hasOwnProperty(e)&&d[e]){c.src=a[e],c.extension=e;break}if(!c.src)return!1;var f=c.src.lastIndexOf("/");return c.name=-1!=f?c.src.slice(f+1):c.src,c},b.play=function(a,c,d,e,f,g,h,i,j){var k;k=c instanceof Object||c instanceof createjs.PlayPropsConfig?createjs.PlayPropsConfig.create(c):createjs.PlayPropsConfig.create({interrupt:c,delay:d,offset:e,loop:f,volume:g,pan:h,startTime:i,duration:j})
+;var l=b.createInstance(a,k.startTime,k.duration);return b._playInstance(l,k)||l._playFailed(),l},b.createInstance=function(c,d,e){if(!b.initializeDefaultPlugins())return new createjs.DefaultSoundInstance(c,d,e);var f=b._defaultPlayPropsHash[c];c=b._getSrcById(c);var g=b._parsePath(c.src),h=null;return null!=g&&null!=g.src?(a.create(g.src),null==d&&(d=c.startTime),h=b.activePlugin.create(g.src,d,e||c.duration),(f=f||b._defaultPlayPropsHash[g.src])&&h.applyPlayProps(f)):h=new createjs.DefaultSoundInstance(c,d,e),h.uniqueId=b._lastID++,h},b.stop=function(){for(var a=this._instances,b=a.length;b--;)a[b].stop()},b.setVolume=function(a){if(null==Number(a))return!1;if(a=Math.max(0,Math.min(1,a)),b._masterVolume=a,!this.activePlugin||!this.activePlugin.setVolume||!this.activePlugin.setVolume(a))for(var c=this._instances,d=0,e=c.length;d-1&&this._instances.splice(d,1),!1}return!0},b._getSrcById=function(a){return b._idHash[a]||{src:a}},b._playFinished=function(c){a.remove(c);var d=createjs.indexOf(this._instances,c);d>-1&&this._instances.splice(d,1);var e=b.activePlugin._soundInstances;e[c.src]&&e[c.src].indexOf(c)>-1&&e[c.src].splice(e[c.src].indexOf(c),1)},createjs.Sound=Sound,a.channels={},a.create=function(b,c){return null==a.get(b)&&(a.channels[b]=new a(b,c),!0)},a.removeSrc=function(b){var c=a.get(b);return null!=c&&(c._removeAll(),delete a.channels[b],!0)},a.removeAll=function(){for(var b in a.channels)a.channels[b]._removeAll();a.channels={}},a.add=function(b,c){var d=a.get(b.src);return null!=d&&d._add(b,c)},a.remove=function(b){var c=a.get(b.src);return null!=c&&(c._remove(b),!0)},a.maxPerChannel=function(){return c.maxDefault},a.get=function(b){return a.channels[b]};var c=a.prototype;c.constructor=a,c.src=null,c.max=null,c.maxDefault=100,c.length=0,c.init=function(a,b){this.src=a,this.max=b||this.maxDefault,-1==this.max&&(this.max=this.maxDefault),this._instances=[]},c._get=function(a){return this._instances[a]},c._add=function(a,b){return!!this._getSlot(b,a)&&(this._instances.push(a),this.length++,!0)},c._remove=function(a){var c=b.activePlugin._soundInstances;c[a.src]&&c[a.src].indexOf(a)>-1&&c[a.src].splice(c[a.src].indexOf(a),1);var d=createjs.indexOf(this._instances,a);return-1!=d&&(this._instances.splice(d,1),this.length--,!0)},c._removeAll=function(){for(var a=this.length-1;a>=0;a--)this._instances[a].stop()},c._getSlot=function(a,b){var c,d;if(a!=Sound.INTERRUPT_NONE&&null==(d=this._get(0)))return!0;for(var e=0,f=this.max;ed.getPosition())&&(d=c))}return null!=d&&(d._interrupt(),this._remove(d),!0)},c.toString=function(){return"[Sound SoundChannel]"}}(),this.createjs=this.createjs||{},function(){"use strict";var AbstractSoundInstance=function(a,b,c,d){this.EventDispatcher_constructor(),this.src=a,this.uniqueId=-1,this.playState=null,this.delayTimeoutId=null,this._volume=1,Object.defineProperty(this,"volume",{get:this.getVolume,set:this.setVolume}),this._pan=0,Object.defineProperty(this,"pan",{get:this.getPan,set:this.setPan}),this._startTime=Math.max(0,b||0),Object.defineProperty(this,"startTime",{get:this.getStartTime,set:this.setStartTime}),this._duration=Math.max(0,c||0),Object.defineProperty(this,"duration",{get:this.getDuration,set:this.setDuration}),this._playbackResource=null,Object.defineProperty(this,"playbackResource",{get:this.getPlaybackResource,set:this.setPlaybackResource}),!1!==d&&!0!==d&&this.setPlaybackResource(d),this._position=0,Object.defineProperty(this,"position",{get:this.getPosition,set:this.setPosition}),this._loop=0,Object.defineProperty(this,"loop",{get:this.getLoop,set:this.setLoop}),this._muted=!1,Object.defineProperty(this,"muted",{get:this.getMuted,set:this.setMuted}),this._paused=!1,Object.defineProperty(this,"paused",{get:this.getPaused,set:this.setPaused})},a=createjs.extend(AbstractSoundInstance,createjs.EventDispatcher);a.play=function(a,b,c,d,e,f){var g;return g=a instanceof Object||a instanceof createjs.PlayPropsConfig?createjs.PlayPropsConfig.create(a):createjs.PlayPropsConfig.create({interrupt:a,delay:b,offset:c,loop:d,volume:e,pan:f}),this.playState==createjs.Sound.PLAY_SUCCEEDED?(this.applyPlayProps(g),void(this._paused&&this.setPaused(!1))):(this._cleanUp(),createjs.Sound._playInstance(this,g),this)},a.stop=function(){return this._position=0,this._paused=!1,this._handleStop(),this._cleanUp(),this.playState=createjs.Sound.PLAY_FINISHED,this},a.destroy=function(){this._cleanUp(),this.src=null,this.playbackResource=null,this.removeAllEventListeners()},a.applyPlayProps=function(a){return null!=a.offset&&this.setPosition(a.offset),null!=a.loop&&this.setLoop(a.loop),null!=a.volume&&this.setVolume(a.volume),null!=a.pan&&this.setPan(a.pan),null!=a.startTime&&(this.setStartTime(a.startTime),this.setDuration(a.duration)),this},a.toString=function(){return"[AbstractSoundInstance]"},a.getPaused=function(){return this._paused},a.setPaused=function(a){if(!(!0!==a&&!1!==a||this._paused==a||1==a&&this.playState!=createjs.Sound.PLAY_SUCCEEDED))return this._paused=a,a?this._pause():this._resume(),clearTimeout(this.delayTimeoutId),this},a.setVolume=function(a){return a==this._volume?this:(this._volume=Math.max(0,Math.min(1,a)),this._muted||this._updateVolume(),this)},a.getVolume=function(){return this._volume},a.setMuted=function(a){if(!0===a||!1===a)return this._muted=a,this._updateVolume(),this},a.getMuted=function(){return this._muted},a.setPan=function(a){return a==this._pan?this:(this._pan=Math.max(-1,Math.min(1,a)),this._updatePan(),this)},a.getPan=function(){return this._pan},a.getPosition=function(){return this._paused||this.playState!=createjs.Sound.PLAY_SUCCEEDED||(this._position=this._calculateCurrentPosition()),this._position},a.setPosition=function(a){return this._position=Math.max(0,a),this.playState==createjs.Sound.PLAY_SUCCEEDED&&this._updatePosition(),this},a.getStartTime=function(){return this._startTime},a.setStartTime=function(a){return a==this._startTime?this:(this._startTime=Math.max(0,a||0),this._updateStartTime(),this)},a.getDuration=function(){return this._duration},a.setDuration=function(a){return a==this._duration?this:(this._duration=Math.max(0,a||0),this._updateDuration(),this)},a.setPlaybackResource=function(a){return this._playbackResource=a,0==this._duration&&this._setDurationFromSource(),this},a.getPlaybackResource=function(){return this._playbackResource},a.getLoop=function(){return this._loop},a.setLoop=function(a){null!=this._playbackResource&&(0!=this._loop&&0==a?this._removeLooping(a):0==this._loop&&0!=a&&this._addLooping(a)),this._loop=a},a._sendEvent=function(a){var b=new createjs.Event(a);this.dispatchEvent(b)},a._cleanUp=function(){clearTimeout(this.delayTimeoutId),this._handleCleanUp(),this._paused=!1,createjs.Sound._playFinished(this)},a._interrupt=function(){this._cleanUp(),this.playState=createjs.Sound.PLAY_INTERRUPTED,this._sendEvent("interrupted")},a._beginPlaying=function(a){return this.setPosition(a.offset),this.setLoop(a.loop),this.setVolume(a.volume),this.setPan(a.pan),null!=a.startTime&&(this.setStartTime(a.startTime),this.setDuration(a.duration)),null!=this._playbackResource&&this._positionc&&(d=c),this.sourceNode=this._createAndPlayAudioNode(b.context.currentTime-c,d),this._playbackStartTime=this.sourceNode.startTime-d,this._soundCompleteTimeout=setTimeout(this._endedHandler,1e3*(c-d)),0!=this._loop&&(this._sourceNodeNext=this._createAndPlayAudioNode(this._playbackStartTime,0))},a._createAndPlayAudioNode=function(a,c){var d=b.context.createBufferSource();d.buffer=this.playbackResource,d.connect(this.panNode);var e=.001*this._duration;return c>e&&(c=e-.001),d.startTime=a+e,d.start(d.startTime,c+.001*this._startTime,e-c),d},a._pause=function(){this._position=1e3*(b.context.currentTime-this._playbackStartTime),this.sourceNode=this._cleanUpAudioNode(this.sourceNode),this._sourceNodeNext=this._cleanUpAudioNode(this._sourceNodeNext),0!=this.gainNode.numberOfOutputs&&this.gainNode.disconnect(0),clearTimeout(this._soundCompleteTimeout)},a._resume=function(){this._handleSoundReady()},a._updateVolume=function(){var a=this._muted?0:this._volume;a!=this.gainNode.gain.value&&(this.gainNode.gain.value=a)},a._calculateCurrentPosition=function(){return 1e3*(b.context.currentTime-this._playbackStartTime)},a._updatePosition=function(){this.sourceNode=this._cleanUpAudioNode(this.sourceNode),this._sourceNodeNext=this._cleanUpAudioNode(this._sourceNodeNext),clearTimeout(this._soundCompleteTimeout),this._paused||this._handleSoundReady()},a._handleLoop=function(){this._cleanUpAudioNode(this.sourceNode),this.sourceNode=this._sourceNodeNext,this._playbackStartTime=this.sourceNode.startTime,this._sourceNodeNext=this._createAndPlayAudioNode(this._playbackStartTime,0),this._soundCompleteTimeout=setTimeout(this._endedHandler,this._duration)},a._updateDuration=function(){this.playState==createjs.Sound.PLAY_SUCCEEDED&&(this._pause(),this._resume())},createjs.WebAudioSoundInstance=createjs.promote(WebAudioSoundInstance,"AbstractSoundInstance")}(),this.createjs=this.createjs||{},function(){"use strict";function WebAudioPlugin(){this.AbstractPlugin_constructor(),this._panningModel=b._panningModel,this.context=b.context,this.dynamicsCompressorNode=this.context.createDynamicsCompressor(),this.dynamicsCompressorNode.connect(this.context.destination),this.gainNode=this.context.createGain(),this.gainNode.connect(this.dynamicsCompressorNode),createjs.WebAudioSoundInstance.destinationNode=this.gainNode,this._capabilities=b._capabilities,this._loaderClass=createjs.WebAudioLoader,this._soundInstanceClass=createjs.WebAudioSoundInstance,this._addPropsToClasses()}var a=createjs.extend(WebAudioPlugin,createjs.AbstractPlugin),b=WebAudioPlugin;b._capabilities=null,b._panningModel="equalpower",b.context=null,b._scratchBuffer=null,b._unlocked=!1,b.isSupported=function(){var a=createjs.BrowserDetect.isIOS||createjs.BrowserDetect.isAndroid||createjs.BrowserDetect.isBlackberry;return!("file:"==location.protocol&&!a&&!this._isFileXHRSupported())&&(b._generateCapabilities(),null!=b.context)},b.playEmptySound=function(){if(null!=b.context){var a=b.context.createBufferSource();a.buffer=b._scratchBuffer,a.connect(b.context.destination),a.start(0,0,0),"suspended"===a.context.state&&a.context.resume()}},b._isFileXHRSupported=function(){var a=!0,b=new XMLHttpRequest;try{b.open("GET","WebAudioPluginTest.fail",!1)}catch(b){return a=!1}b.onerror=function(){a=!1},b.onload=function(){a=404==this.status||200==this.status||0==this.status&&""!=this.response};try{b.send()}catch(b){a=!1}return a},b._generateCapabilities=function(){if(null==b._capabilities){var a=document.createElement("audio");if(null==a.canPlayType)return null;if(null==b.context){if(window.AudioContext)b.context=new AudioContext;else{if(!window.webkitAudioContext)return null;b.context=new webkitAudioContext}document.addEventListener("click",function(){"suspended"===b.context.state&&b.context.resume()})}null==b._scratchBuffer&&(b._scratchBuffer=b.context.createBuffer(1,1,22050)),b._compatibilitySetUp(),"ontouchstart"in window&&"running"!=b.context.state&&(b._unlock(),document.addEventListener("mousedown",b._unlock,!0),document.addEventListener("touchstart",b._unlock,!0),document.addEventListener("touchend",b._unlock,!0)),b._capabilities={panning:!0,volume:!0,tracks:-1};for(var c=createjs.Sound.SUPPORTED_EXTENSIONS,d=createjs.Sound.EXTENSION_MAP,e=0,f=c.length;e
+8 error or email it to:
+8 error
+9 error System Darwin 12.5.0
+10 error command "node" "/usr/local/bin/npm" "install"
+11 error cwd /LocalStorage/AndrewStart/Projects/JSLibs/CreateJS/SoundJS
+12 error node -v v0.10.1
+13 error npm -v 1.2.15
+14 error path /LocalStorage/AndrewStart/Projects/JSLibs/CreateJS/SoundJS/package.json
+15 error code ENOENT
+16 error errno 34
+17 verbose exit [ 34, true ]
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..e9cf33cd
--- /dev/null
+++ b/package.json
@@ -0,0 +1,26 @@
+{
+ "name": "soundjs",
+ "version": "1.0.0",
+ "description": "SoundJS is a library to make working with audio on the web easier. It provides a consistent API for playing audio in\r different browsers, including using a target plugin model to provide an easy way to provide additional audio plugins\r like a Flash fallback. A mechanism has been provided for easily tying in audio preloading to\r [PreloadJS](http://preloadjs.com).",
+ "main": "soundjs.combined.js",
+ "directories": {
+ "doc": "docs",
+ "example": "examples",
+ "lib": "lib",
+ "test": "tests"
+ },
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/SpringRoll/SoundJS.git"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/SpringRoll/SoundJS/issues"
+ },
+ "homepage": "https://github.com/SpringRoll/SoundJS#readme"
+}
diff --git a/lib/soundjs-NEXT.combined.js b/soundjs.combined.js
similarity index 98%
rename from lib/soundjs-NEXT.combined.js
rename to soundjs.combined.js
index 141f6adf..4521224d 100644
--- a/lib/soundjs-NEXT.combined.js
+++ b/soundjs.combined.js
@@ -49,7 +49,7 @@ this.createjs = this.createjs || {};
* @type String
* @static
**/
- s.version = /*=version*/"NEXT"; // injected by build process
+ s.version = /*=version*/"0.6.4"; // injected by build process
/**
* The build date for this release in UTC format.
@@ -57,7 +57,7 @@ this.createjs = this.createjs || {};
* @type String
* @static
**/
- s.buildDate = /*=date*/"Fri, 04 Dec 2015 17:24:04 GMT"; // injected by build process
+ s.buildDate = /*=date*/"Thu, 21 Jan 2016 20:52:35 GMT"; // injected by build process
})();
@@ -3044,8 +3044,9 @@ this.createjs = this.createjs || {};
switch (status) {
case 404: // Not Found
- case 0: // Not Loaded
return new Error(status);
+ case 0: // Not Loaded
+ return this._getResponse() ? null : new Error(status);
}
return null;
};
@@ -4129,7 +4130,11 @@ this.createjs = this.createjs || {};
*/
s._handleLoadComplete = function(event) {
var src = event.target.getItem().src;
- if (!s._preloadHash[src]) {return;}
+ if (!s.preloadHash[src]) {
+ //set this to true so it is still valid to detect if the audio has been loaded
+ //s.preloadHash[src] = [true];
+ return;
+ }
for (var i = 0, l = s._preloadHash[src].length; i < l; i++) {
var item = s._preloadHash[src][i];
@@ -4630,18 +4635,32 @@ this.createjs = this.createjs || {};
s._parsePath = function (value) {
if (typeof(value) != "string") {value = value.toString();}
- var match = value.match(s.FILE_PATTERN);
+ /*var match = value.match(s.FILE_PATTERN);
if (match == null) {return false;}
var name = match[4];
- var ext = match[5];
+ var ext = match[5];*/
+ //Changed how extensions and filenames are grabbed from the url to add simple support for
+ //urls that use php services & query string params to specify the file
+ var ext, name, origExt;
+ if(value.indexOf(".") >= 0)
+ {
+ ext = value.substr(value.lastIndexOf(".")+1);
+ if(ext.indexOf("?") > 0)
+ ext = ext.substring(0, ext.indexOf("?"));
+ name = value.substring(0, value.lastIndexOf("."));
+ if(name.indexOf("/") >= 0)
+ name = name.substr(name.lastIndexOf("/")+1);
+ origExt = ext;
+ }
+
var c = s.capabilities;
var i = 0;
while (!c[ext]) {
ext = s.alternateExtensions[i++];
if (i > s.alternateExtensions.length) { return null;} // no extensions are supported
}
- value = value.replace("."+match[5], "."+ext);
+ value = value.replace("."+origExt, "."+ext);
var ret = {name:name, src:value, extension:ext};
return ret;
@@ -4909,6 +4928,38 @@ this.createjs = this.createjs || {};
return s._defaultPlayPropsHash[s._parsePath(src.src).src];
};
+ /**
+ * Pauses all audio (global pause on existing audio).
+ *
+ *
Example
+ * createjs.Sound.pause();
+ *
+ * @method pause
+ * @static
+ */
+ s.pause = function () {
+ var instances = this.instances;
+ for (var i = instances.length; i--; ) {
+ instances[i].paused = true;
+ }
+ };
+
+ /**
+ * Resumes all audio (global resume on existing audio).
+ *
+ *
Example
+ * createjs.Sound.resume();
+ *
+ * @method resume
+ * @static
+ */
+ s.resume = function () {
+ var instances = this.instances;
+ for (var i = instances.length; i--; ) {
+ instances[i].paused = false;
+ }
+ };
+
/* ---------------
Internal methods
@@ -4999,6 +5050,12 @@ this.createjs = this.createjs || {};
SoundChannel.remove(instance);
var index = createjs.indexOf(this._instances, instance);
if (index > -1) {this._instances.splice(index, 1);} // OJR this will always be > -1, there is no way for an instance to exist without being added to this._instances
+ //MMB 9/2015: sounds were being removed from _instances, but not from activePlugin._soundInstances
+ var soundInstances = s.activePlugin._soundInstances;
+ if (soundInstances[instance.src] && soundInstances[instance.src].indexOf(instance) > -1)
+ {
+ soundInstances[instance.src].splice(soundInstances[instance.src].indexOf(instance), 1);
+ }
};
createjs.Sound = Sound;
@@ -5212,6 +5269,12 @@ this.createjs = this.createjs || {};
* return false.
*/
p._remove = function (instance) {
+ //MMB 9/2015: sounds were being removed from _instances, but not from activePlugin._soundInstances
+ var soundInstances = s.activePlugin._soundInstances;
+ if (soundInstances[instance.src] && soundInstances[instance.src].indexOf(instance) > -1)
+ {
+ soundInstances[instance.src].splice(soundInstances[instance.src].indexOf(instance), 1);
+ }
var index = createjs.indexOf(this._instances, instance);
if (index == -1) {return false;}
this._instances.splice(index, 1);
@@ -6276,6 +6339,14 @@ this.createjs = this.createjs || {};
* @protected;
*/
this._soundInstanceClass;
+
+ /**
+ * The master volume of the plugin, which affects all SoundInstances.
+ * Default is 1.
+ * @type {Number}
+ * @protected
+ */
+ this._volume = 1;
};
var p = AbstractPlugin.prototype;
@@ -6810,6 +6881,8 @@ this.createjs = this.createjs || {};
audioNode.buffer = this.playbackResource;
audioNode.connect(this.panNode);
var dur = this._duration * 0.001;
+ if(offset > dur)
+ offset = dur - 0.001;
audioNode.startTime = startTime + dur;
audioNode.start(audioNode.startTime, offset+(this._startTime*0.001), dur - offset);
return audioNode;
diff --git a/soundjs.min.js b/soundjs.min.js
new file mode 100644
index 00000000..261d6791
--- /dev/null
+++ b/soundjs.min.js
@@ -0,0 +1,18 @@
+/*!
+* @license SoundJS
+* Visit http://createjs.com/ for documentation, updates and examples.
+*
+* Copyright (c) 2011-2015 gskinner.com, inc.
+*
+* Distributed under the terms of the MIT license.
+* http://www.opensource.org/licenses/mit-license.html
+*
+* This notice shall be included in all copies or substantial portions of the Software.
+*/
+
+/**!
+ * SoundJS FlashAudioPlugin also includes swfobject (http://code.google.com/p/swfobject/)
+ */
+
+this.createjs=this.createjs||{},function(){var a=createjs.SoundJS=createjs.SoundJS||{};a.version="0.6.4",a.buildDate="Thu, 21 Jan 2016 20:52:35 GMT"}(),this.createjs=this.createjs||{},createjs.extend=function(a,b){"use strict";function c(){this.constructor=a}return c.prototype=b.prototype,a.prototype=new c},this.createjs=this.createjs||{},createjs.promote=function(a,b){"use strict";var c=a.prototype,d=Object.getPrototypeOf&&Object.getPrototypeOf(c)||c.__proto__;if(d){c[(b+="_")+"constructor"]=d.constructor;for(var e in d)c.hasOwnProperty(e)&&"function"==typeof d[e]&&(c[b+e]=d[e])}return a},this.createjs=this.createjs||{},createjs.indexOf=function(a,b){"use strict";for(var c=0,d=a.length;d>c;c++)if(b===a[c])return c;return-1},this.createjs=this.createjs||{},function(){"use strict";createjs.proxy=function(a,b){var c=Array.prototype.slice.call(arguments,2);return function(){return a.apply(b,Array.prototype.slice.call(arguments,0).concat(c))}}}(),this.createjs=this.createjs||{},function(){"use strict";function BrowserDetect(){throw"BrowserDetect cannot be instantiated"}var a=BrowserDetect.agent=window.navigator.userAgent;BrowserDetect.isWindowPhone=a.indexOf("IEMobile")>-1||a.indexOf("Windows Phone")>-1,BrowserDetect.isFirefox=a.indexOf("Firefox")>-1,BrowserDetect.isOpera=null!=window.opera,BrowserDetect.isChrome=a.indexOf("Chrome")>-1,BrowserDetect.isIOS=(a.indexOf("iPod")>-1||a.indexOf("iPhone")>-1||a.indexOf("iPad")>-1)&&!BrowserDetect.isWindowPhone,BrowserDetect.isAndroid=a.indexOf("Android")>-1&&!BrowserDetect.isWindowPhone,BrowserDetect.isBlackberry=a.indexOf("Blackberry")>-1,createjs.BrowserDetect=BrowserDetect}(),this.createjs=this.createjs||{},function(){"use strict";function EventDispatcher(){this._listeners=null,this._captureListeners=null}var a=EventDispatcher.prototype;EventDispatcher.initialize=function(b){b.addEventListener=a.addEventListener,b.on=a.on,b.removeEventListener=b.off=a.removeEventListener,b.removeAllEventListeners=a.removeAllEventListeners,b.hasEventListener=a.hasEventListener,b.dispatchEvent=a.dispatchEvent,b._dispatchEvent=a._dispatchEvent,b.willTrigger=a.willTrigger},a.addEventListener=function(a,b,c){var d;d=c?this._captureListeners=this._captureListeners||{}:this._listeners=this._listeners||{};var e=d[a];return e&&this.removeEventListener(a,b,c),e=d[a],e?e.push(b):d[a]=[b],b},a.on=function(a,b,c,d,e,f){return b.handleEvent&&(c=c||b,b=b.handleEvent),c=c||this,this.addEventListener(a,function(a){b.call(c,a,e),d&&a.remove()},f)},a.removeEventListener=function(a,b,c){var d=c?this._captureListeners:this._listeners;if(d){var e=d[a];if(e)for(var f=0,g=e.length;g>f;f++)if(e[f]==b){1==g?delete d[a]:e.splice(f,1);break}}},a.off=a.removeEventListener,a.removeAllEventListeners=function(a){a?(this._listeners&&delete this._listeners[a],this._captureListeners&&delete this._captureListeners[a]):this._listeners=this._captureListeners=null},a.dispatchEvent=function(a,b,c){if("string"==typeof a){var d=this._listeners;if(!(b||d&&d[a]))return!0;a=new createjs.Event(a,b,c)}else a.target&&a.clone&&(a=a.clone());try{a.target=this}catch(e){}if(a.bubbles&&this.parent){for(var f=this,g=[f];f.parent;)g.push(f=f.parent);var h,i=g.length;for(h=i-1;h>=0&&!a.propagationStopped;h--)g[h]._dispatchEvent(a,1+(0==h));for(h=1;i>h&&!a.propagationStopped;h++)g[h]._dispatchEvent(a,3)}else this._dispatchEvent(a,2);return!a.defaultPrevented},a.hasEventListener=function(a){var b=this._listeners,c=this._captureListeners;return!!(b&&b[a]||c&&c[a])},a.willTrigger=function(a){for(var b=this;b;){if(b.hasEventListener(a))return!0;b=b.parent}return!1},a.toString=function(){return"[EventDispatcher]"},a._dispatchEvent=function(a,b){var c,d=1==b?this._captureListeners:this._listeners;if(a&&d){var e=d[a.type];if(!e||!(c=e.length))return;try{a.currentTarget=this}catch(f){}try{a.eventPhase=b}catch(f){}a.removed=!1,e=e.slice();for(var g=0;c>g&&!a.immediatePropagationStopped;g++){var h=e[g];h.handleEvent?h.handleEvent(a):h(a),a.removed&&(this.off(a.type,h,1==b),a.removed=!1)}}},createjs.EventDispatcher=EventDispatcher}(),this.createjs=this.createjs||{},function(){"use strict";function Event(a,b,c){this.type=a,this.target=null,this.currentTarget=null,this.eventPhase=0,this.bubbles=!!b,this.cancelable=!!c,this.timeStamp=(new Date).getTime(),this.defaultPrevented=!1,this.propagationStopped=!1,this.immediatePropagationStopped=!1,this.removed=!1}var a=Event.prototype;a.preventDefault=function(){this.defaultPrevented=this.cancelable&&!0},a.stopPropagation=function(){this.propagationStopped=!0},a.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},a.remove=function(){this.removed=!0},a.clone=function(){return new Event(this.type,this.bubbles,this.cancelable)},a.set=function(a){for(var b in a)this[b]=a[b];return this},a.toString=function(){return"[Event (type="+this.type+")]"},createjs.Event=Event}(),this.createjs=this.createjs||{},function(){"use strict";function ErrorEvent(a,b,c){this.Event_constructor("error"),this.title=a,this.message=b,this.data=c}var a=createjs.extend(ErrorEvent,createjs.Event);a.clone=function(){return new createjs.ErrorEvent(this.title,this.message,this.data)},createjs.ErrorEvent=createjs.promote(ErrorEvent,"Event")}(),this.createjs=this.createjs||{},function(a){"use strict";function ProgressEvent(a,b){this.Event_constructor("progress"),this.loaded=a,this.total=null==b?1:b,this.progress=0==b?0:this.loaded/this.total}var b=createjs.extend(ProgressEvent,createjs.Event);b.clone=function(){return new createjs.ProgressEvent(this.loaded,this.total)},createjs.ProgressEvent=createjs.promote(ProgressEvent,"Event")}(window),this.createjs=this.createjs||{},function(){"use strict";function LoadItem(){this.src=null,this.type=null,this.id=null,this.maintainOrder=!1,this.callback=null,this.data=null,this.method=createjs.LoadItem.GET,this.values=null,this.headers=null,this.withCredentials=!1,this.mimeType=null,this.crossOrigin=null,this.loadTimeout=b.LOAD_TIMEOUT_DEFAULT}var a=LoadItem.prototype={},b=LoadItem;b.LOAD_TIMEOUT_DEFAULT=8e3,b.create=function(a){if("string"==typeof a){var c=new LoadItem;return c.src=a,c}if(a instanceof b)return a;if(a instanceof Object&&a.src)return null==a.loadTimeout&&(a.loadTimeout=b.LOAD_TIMEOUT_DEFAULT),a;throw new Error("Type not recognized.")},a.set=function(a){for(var b in a)this[b]=a[b];return this},createjs.LoadItem=b}(),function(){var a={};a.ABSOLUTE_PATT=/^(?:\w+:)?\/{2}/i,a.RELATIVE_PATT=/^[.\/]*?\//i,a.EXTENSION_PATT=/\/?[^\/]+\.(\w{1,5})$/i,a.parseURI=function(b){var c={absolute:!1,relative:!1};if(null==b)return c;var d=b.indexOf("?");d>-1&&(b=b.substr(0,d));var e;return a.ABSOLUTE_PATT.test(b)?c.absolute=!0:a.RELATIVE_PATT.test(b)&&(c.relative=!0),(e=b.match(a.EXTENSION_PATT))&&(c.extension=e[1].toLowerCase()),c},a.formatQueryString=function(a,b){if(null==a)throw new Error("You must specify data.");var c=[];for(var d in a)c.push(d+"="+escape(a[d]));return b&&(c=c.concat(b)),c.join("&")},a.buildPath=function(a,b){if(null==b)return a;var c=[],d=a.indexOf("?");if(-1!=d){var e=a.slice(d+1);c=c.concat(e.split("&"))}return-1!=d?a.slice(0,d)+"?"+this.formatQueryString(b,c):a+"?"+this.formatQueryString(b,c)},a.isCrossDomain=function(a){var b=document.createElement("a");b.href=a.src;var c=document.createElement("a");c.href=location.href;var d=""!=b.hostname&&(b.port!=c.port||b.protocol!=c.protocol||b.hostname!=c.hostname);return d},a.isLocal=function(a){var b=document.createElement("a");return b.href=a.src,""==b.hostname&&"file:"==b.protocol},a.isBinary=function(a){switch(a){case createjs.AbstractLoader.IMAGE:case createjs.AbstractLoader.BINARY:return!0;default:return!1}},a.isImageTag=function(a){return a instanceof HTMLImageElement},a.isAudioTag=function(a){return window.HTMLAudioElement?a instanceof HTMLAudioElement:!1},a.isVideoTag=function(a){return window.HTMLVideoElement?a instanceof HTMLVideoElement:!1},a.isText=function(a){switch(a){case createjs.AbstractLoader.TEXT:case createjs.AbstractLoader.JSON:case createjs.AbstractLoader.MANIFEST:case createjs.AbstractLoader.XML:case createjs.AbstractLoader.CSS:case createjs.AbstractLoader.SVG:case createjs.AbstractLoader.JAVASCRIPT:case createjs.AbstractLoader.SPRITESHEET:return!0;default:return!1}},a.getTypeByExtension=function(a){if(null==a)return createjs.AbstractLoader.TEXT;switch(a.toLowerCase()){case"jpeg":case"jpg":case"gif":case"png":case"webp":case"bmp":return createjs.AbstractLoader.IMAGE;case"ogg":case"mp3":case"webm":return createjs.AbstractLoader.SOUND;case"mp4":case"webm":case"ts":return createjs.AbstractLoader.VIDEO;case"json":return createjs.AbstractLoader.JSON;case"xml":return createjs.AbstractLoader.XML;case"css":return createjs.AbstractLoader.CSS;case"js":return createjs.AbstractLoader.JAVASCRIPT;case"svg":return createjs.AbstractLoader.SVG;default:return createjs.AbstractLoader.TEXT}},createjs.RequestUtils=a}(),this.createjs=this.createjs||{},function(){"use strict";function AbstractLoader(a,b,c){this.EventDispatcher_constructor(),this.loaded=!1,this.canceled=!1,this.progress=0,this.type=c,this.resultFormatter=null,a?this._item=createjs.LoadItem.create(a):this._item=null,this._preferXHR=b,this._result=null,this._rawResult=null,this._loadedItems=null,this._tagSrcAttribute=null,this._tag=null}var a=createjs.extend(AbstractLoader,createjs.EventDispatcher),b=AbstractLoader;b.POST="POST",b.GET="GET",b.BINARY="binary",b.CSS="css",b.IMAGE="image",b.JAVASCRIPT="javascript",b.JSON="json",b.JSONP="jsonp",b.MANIFEST="manifest",b.SOUND="sound",b.VIDEO="video",b.SPRITESHEET="spritesheet",b.SVG="svg",b.TEXT="text",b.XML="xml",a.getItem=function(){return this._item},a.getResult=function(a){return a?this._rawResult:this._result},a.getTag=function(){return this._tag},a.setTag=function(a){this._tag=a},a.load=function(){this._createRequest(),this._request.on("complete",this,this),this._request.on("progress",this,this),this._request.on("loadStart",this,this),this._request.on("abort",this,this),this._request.on("timeout",this,this),this._request.on("error",this,this);var a=new createjs.Event("initialize");a.loader=this._request,this.dispatchEvent(a),this._request.load()},a.cancel=function(){this.canceled=!0,this.destroy()},a.destroy=function(){this._request&&(this._request.removeAllEventListeners(),this._request.destroy()),this._request=null,this._item=null,this._rawResult=null,this._result=null,this._loadItems=null,this.removeAllEventListeners()},a.getLoadedItems=function(){return this._loadedItems},a._createRequest=function(){this._preferXHR?this._request=new createjs.XHRRequest(this._item):this._request=new createjs.TagRequest(this._item,this._tag||this._createTag(),this._tagSrcAttribute)},a._createTag=function(a){return null},a._sendLoadStart=function(){this._isCanceled()||this.dispatchEvent("loadstart")},a._sendProgress=function(a){if(!this._isCanceled()){var b=null;"number"==typeof a?(this.progress=a,b=new createjs.ProgressEvent(this.progress)):(b=a,this.progress=a.loaded/a.total,b.progress=this.progress,(isNaN(this.progress)||this.progress==1/0)&&(this.progress=0)),this.hasEventListener("progress")&&this.dispatchEvent(b)}},a._sendComplete=function(){if(!this._isCanceled()){this.loaded=!0;var a=new createjs.Event("complete");a.rawResult=this._rawResult,null!=this._result&&(a.result=this._result),this.dispatchEvent(a)}},a._sendError=function(a){!this._isCanceled()&&this.hasEventListener("error")&&(null==a&&(a=new createjs.ErrorEvent("PRELOAD_ERROR_EMPTY")),this.dispatchEvent(a))},a._isCanceled=function(){return null==window.createjs||this.canceled?!0:!1},a.resultFormatter=null,a.handleEvent=function(a){switch(a.type){case"complete":this._rawResult=a.target._response;var b=this.resultFormatter&&this.resultFormatter(this);b instanceof Function?b.call(this,createjs.proxy(this._resultFormatSuccess,this),createjs.proxy(this._resultFormatFailed,this)):(this._result=b||this._rawResult,this._sendComplete());break;case"progress":this._sendProgress(a);break;case"error":this._sendError(a);break;case"loadstart":this._sendLoadStart();break;case"abort":case"timeout":this._isCanceled()||this.dispatchEvent(new createjs.ErrorEvent("PRELOAD_"+a.type.toUpperCase()+"_ERROR"))}},a._resultFormatSuccess=function(a){this._result=a,this._sendComplete()},a._resultFormatFailed=function(a){this._sendError(a)},a.buildPath=function(a,b){return createjs.RequestUtils.buildPath(a,b)},a.toString=function(){return"[PreloadJS AbstractLoader]"},createjs.AbstractLoader=createjs.promote(AbstractLoader,"EventDispatcher")}(),this.createjs=this.createjs||{},function(){"use strict";function AbstractMediaLoader(a,b,c){this.AbstractLoader_constructor(a,b,c),this.resultFormatter=this._formatResult,this._tagSrcAttribute="src",this.on("initialize",this._updateXHR,this)}var a=createjs.extend(AbstractMediaLoader,createjs.AbstractLoader);a.load=function(){this._tag||(this._tag=this._createTag(this._item.src)),this._tag.preload="auto",this._tag.load(),this.AbstractLoader_load()},a._createTag=function(){},a._createRequest=function(){this._preferXHR?this._request=new createjs.XHRRequest(this._item):this._request=new createjs.MediaTagRequest(this._item,this._tag||this._createTag(),this._tagSrcAttribute)},a._updateXHR=function(a){a.loader.setResponseType&&a.loader.setResponseType("blob")},a._formatResult=function(a){if(this._tag.removeEventListener&&this._tag.removeEventListener("canplaythrough",this._loadedHandler),this._tag.onstalled=null,this._preferXHR){var b=window.URL||window.webkitURL,c=a.getResult(!0);a.getTag().src=b.createObjectURL(c)}return a.getTag()},createjs.AbstractMediaLoader=createjs.promote(AbstractMediaLoader,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";var AbstractRequest=function(a){this._item=a},a=createjs.extend(AbstractRequest,createjs.EventDispatcher);a.load=function(){},a.destroy=function(){},a.cancel=function(){},createjs.AbstractRequest=createjs.promote(AbstractRequest,"EventDispatcher")}(),this.createjs=this.createjs||{},function(){"use strict";function TagRequest(a,b,c){this.AbstractRequest_constructor(a),this._tag=b,this._tagSrcAttribute=c,this._loadedHandler=createjs.proxy(this._handleTagComplete,this),this._addedToDOM=!1,this._startTagVisibility=null}var a=createjs.extend(TagRequest,createjs.AbstractRequest);a.load=function(){this._tag.onload=createjs.proxy(this._handleTagComplete,this),this._tag.onreadystatechange=createjs.proxy(this._handleReadyStateChange,this),this._tag.onerror=createjs.proxy(this._handleError,this);var a=new createjs.Event("initialize");a.loader=this._tag,this.dispatchEvent(a),this._hideTag(),this._loadTimeout=setTimeout(createjs.proxy(this._handleTimeout,this),this._item.loadTimeout),this._tag[this._tagSrcAttribute]=this._item.src,null==this._tag.parentNode&&(window.document.body.appendChild(this._tag),this._addedToDOM=!0)},a.destroy=function(){this._clean(),this._tag=null,this.AbstractRequest_destroy()},a._handleReadyStateChange=function(){clearTimeout(this._loadTimeout);var a=this._tag;("loaded"==a.readyState||"complete"==a.readyState)&&this._handleTagComplete()},a._handleError=function(){this._clean(),this.dispatchEvent("error")},a._handleTagComplete=function(){this._rawResult=this._tag,this._result=this.resultFormatter&&this.resultFormatter(this)||this._rawResult,this._clean(),this._showTag(),this.dispatchEvent("complete")},a._handleTimeout=function(){this._clean(),this.dispatchEvent(new createjs.Event("timeout"))},a._clean=function(){this._tag.onload=null,this._tag.onreadystatechange=null,this._tag.onerror=null,this._addedToDOM&&null!=this._tag.parentNode&&this._tag.parentNode.removeChild(this._tag),clearTimeout(this._loadTimeout)},a._hideTag=function(){this._startTagVisibility=this._tag.style.visibility,this._tag.style.visibility="hidden"},a._showTag=function(){this._tag.style.visibility=this._startTagVisibility},a._handleStalled=function(){},createjs.TagRequest=createjs.promote(TagRequest,"AbstractRequest")}(),this.createjs=this.createjs||{},function(){"use strict";function MediaTagRequest(a,b,c){this.AbstractRequest_constructor(a),this._tag=b,this._tagSrcAttribute=c,this._loadedHandler=createjs.proxy(this._handleTagComplete,this)}var a=createjs.extend(MediaTagRequest,createjs.TagRequest);a.load=function(){var a=createjs.proxy(this._handleStalled,this);this._stalledCallback=a;var b=createjs.proxy(this._handleProgress,this);this._handleProgress=b,this._tag.addEventListener("stalled",a),this._tag.addEventListener("progress",b),this._tag.addEventListener&&this._tag.addEventListener("canplaythrough",this._loadedHandler,!1),this.TagRequest_load()},a._handleReadyStateChange=function(){clearTimeout(this._loadTimeout);var a=this._tag;("loaded"==a.readyState||"complete"==a.readyState)&&this._handleTagComplete()},a._handleStalled=function(){},a._handleProgress=function(a){if(a&&!(a.loaded>0&&0==a.total)){var b=new createjs.ProgressEvent(a.loaded,a.total);this.dispatchEvent(b)}},a._clean=function(){this._tag.removeEventListener&&this._tag.removeEventListener("canplaythrough",this._loadedHandler),this._tag.removeEventListener("stalled",this._stalledCallback),this._tag.removeEventListener("progress",this._progressCallback),this.TagRequest__clean()},createjs.MediaTagRequest=createjs.promote(MediaTagRequest,"TagRequest")}(),this.createjs=this.createjs||{},function(){"use strict";function XHRRequest(a){this.AbstractRequest_constructor(a),this._request=null,this._loadTimeout=null,this._xhrLevel=1,this._response=null,this._rawResponse=null,this._canceled=!1,this._handleLoadStartProxy=createjs.proxy(this._handleLoadStart,this),this._handleProgressProxy=createjs.proxy(this._handleProgress,this),this._handleAbortProxy=createjs.proxy(this._handleAbort,this),this._handleErrorProxy=createjs.proxy(this._handleError,this),this._handleTimeoutProxy=createjs.proxy(this._handleTimeout,this),this._handleLoadProxy=createjs.proxy(this._handleLoad,this),this._handleReadyStateChangeProxy=createjs.proxy(this._handleReadyStateChange,this),!this._createXHR(a)}var a=createjs.extend(XHRRequest,createjs.AbstractRequest);XHRRequest.ACTIVEX_VERSIONS=["Msxml2.XMLHTTP.6.0","Msxml2.XMLHTTP.5.0","Msxml2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"],a.getResult=function(a){return a&&this._rawResponse?this._rawResponse:this._response},a.cancel=function(){this.canceled=!0,this._clean(),this._request.abort()},a.load=function(){if(null==this._request)return void this._handleError();null!=this._request.addEventListener?(this._request.addEventListener("loadstart",this._handleLoadStartProxy,!1),this._request.addEventListener("progress",this._handleProgressProxy,!1),this._request.addEventListener("abort",this._handleAbortProxy,!1),this._request.addEventListener("error",this._handleErrorProxy,!1),this._request.addEventListener("timeout",this._handleTimeoutProxy,!1),this._request.addEventListener("load",this._handleLoadProxy,!1),this._request.addEventListener("readystatechange",this._handleReadyStateChangeProxy,!1)):(this._request.onloadstart=this._handleLoadStartProxy,this._request.onprogress=this._handleProgressProxy,this._request.onabort=this._handleAbortProxy,this._request.onerror=this._handleErrorProxy,this._request.ontimeout=this._handleTimeoutProxy,this._request.onload=this._handleLoadProxy,this._request.onreadystatechange=this._handleReadyStateChangeProxy),1==this._xhrLevel&&(this._loadTimeout=setTimeout(createjs.proxy(this._handleTimeout,this),this._item.loadTimeout));try{this._item.values&&this._item.method!=createjs.AbstractLoader.GET?this._item.method==createjs.AbstractLoader.POST&&this._request.send(createjs.RequestUtils.formatQueryString(this._item.values)):this._request.send()}catch(a){this.dispatchEvent(new createjs.ErrorEvent("XHR_SEND",null,a))}},a.setResponseType=function(a){"blob"===a&&(a=window.URL?"blob":"arraybuffer",this._responseType=a),this._request.responseType=a},a.getAllResponseHeaders=function(){return this._request.getAllResponseHeaders instanceof Function?this._request.getAllResponseHeaders():null},a.getResponseHeader=function(a){return this._request.getResponseHeader instanceof Function?this._request.getResponseHeader(a):null},a._handleProgress=function(a){if(a&&!(a.loaded>0&&0==a.total)){var b=new createjs.ProgressEvent(a.loaded,a.total);this.dispatchEvent(b)}},a._handleLoadStart=function(a){clearTimeout(this._loadTimeout),this.dispatchEvent("loadstart")},a._handleAbort=function(a){this._clean(),this.dispatchEvent(new createjs.ErrorEvent("XHR_ABORTED",null,a))},a._handleError=function(a){this._clean(),this.dispatchEvent(new createjs.ErrorEvent(a.message))},a._handleReadyStateChange=function(a){4==this._request.readyState&&this._handleLoad()},a._handleLoad=function(a){if(!this.loaded){this.loaded=!0;var b=this._checkError();if(b)return void this._handleError(b);if(this._response=this._getResponse(),"arraybuffer"===this._responseType)try{this._response=new Blob([this._response])}catch(c){if(window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,"TypeError"===c.name&&window.BlobBuilder){var d=new BlobBuilder;d.append(this._response),this._response=d.getBlob()}}this._clean(),this.dispatchEvent(new createjs.Event("complete"))}},a._handleTimeout=function(a){this._clean(),this.dispatchEvent(new createjs.ErrorEvent("PRELOAD_TIMEOUT",null,a))},a._checkError=function(){var a=parseInt(this._request.status);switch(a){case 404:return new Error(a);case 0:return this._getResponse()?null:new Error(a)}return null},a._getResponse=function(){if(null!=this._response)return this._response;if(null!=this._request.response)return this._request.response;try{if(null!=this._request.responseText)return this._request.responseText}catch(a){}try{if(null!=this._request.responseXML)return this._request.responseXML}catch(a){}return null},a._createXHR=function(a){var b=createjs.RequestUtils.isCrossDomain(a),c={},d=null;if(window.XMLHttpRequest)d=new XMLHttpRequest,b&&void 0===d.withCredentials&&window.XDomainRequest&&(d=new XDomainRequest);else{for(var e=0,f=s.ACTIVEX_VERSIONS.length;f>e;e++){var g=s.ACTIVEX_VERSIONS[e];try{d=new ActiveXObject(g);break}catch(h){}}if(null==d)return!1}null==a.mimeType&&createjs.RequestUtils.isText(a.type)&&(a.mimeType="text/plain; charset=utf-8"),a.mimeType&&d.overrideMimeType&&d.overrideMimeType(a.mimeType),this._xhrLevel="string"==typeof d.responseType?2:1;var i=null;if(i=a.method==createjs.AbstractLoader.GET?createjs.RequestUtils.buildPath(a.src,a.values):a.src,d.open(a.method||createjs.AbstractLoader.GET,i,!0),b&&d instanceof XMLHttpRequest&&1==this._xhrLevel&&(c.Origin=location.origin),a.values&&a.method==createjs.AbstractLoader.POST&&(c["Content-Type"]="application/x-www-form-urlencoded"),b||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest"),a.headers)for(var j in a.headers)c[j]=a.headers[j];for(j in c)d.setRequestHeader(j,c[j]);return d instanceof XMLHttpRequest&&void 0!==a.withCredentials&&(d.withCredentials=a.withCredentials),this._request=d,!0},a._clean=function(){clearTimeout(this._loadTimeout),null!=this._request.removeEventListener?(this._request.removeEventListener("loadstart",this._handleLoadStartProxy),this._request.removeEventListener("progress",this._handleProgressProxy),this._request.removeEventListener("abort",this._handleAbortProxy),this._request.removeEventListener("error",this._handleErrorProxy),this._request.removeEventListener("timeout",this._handleTimeoutProxy),this._request.removeEventListener("load",this._handleLoadProxy),this._request.removeEventListener("readystatechange",this._handleReadyStateChangeProxy)):(this._request.onloadstart=null,this._request.onprogress=null,this._request.onabort=null,this._request.onerror=null,this._request.ontimeout=null,this._request.onload=null,this._request.onreadystatechange=null)},a.toString=function(){return"[PreloadJS XHRRequest]"},createjs.XHRRequest=createjs.promote(XHRRequest,"AbstractRequest")}(),this.createjs=this.createjs||{},function(){"use strict";function SoundLoader(a,b){this.AbstractMediaLoader_constructor(a,b,createjs.AbstractLoader.SOUND),createjs.RequestUtils.isAudioTag(a)?this._tag=a:createjs.RequestUtils.isAudioTag(a.src)?this._tag=a:createjs.RequestUtils.isAudioTag(a.tag)&&(this._tag=createjs.RequestUtils.isAudioTag(a)?a:a.src),null!=this._tag&&(this._preferXHR=!1)}var a=createjs.extend(SoundLoader,createjs.AbstractMediaLoader),b=SoundLoader;b.canLoadItem=function(a){return a.type==createjs.AbstractLoader.SOUND},a._createTag=function(a){var b=document.createElement("audio");return b.autoplay=!1,b.preload="none",b.src=a,b},createjs.SoundLoader=createjs.promote(SoundLoader,"AbstractMediaLoader")}(),this.createjs=this.createjs||{},function(){"use strict";var PlayPropsConfig=function(){this.interrupt=null,this.delay=null,this.offset=null,this.loop=null,this.volume=null,this.pan=null,this.startTime=null,this.duration=null},a=PlayPropsConfig.prototype={},b=PlayPropsConfig;b.create=function(a){if(a instanceof b||a instanceof Object){var c=new createjs.PlayPropsConfig;return c.set(a),c}throw new Error("Type not recognized.")},a.set=function(a){for(var b in a)this[b]=a[b];return this},a.toString=function(){return"[PlayPropsConfig]"},createjs.PlayPropsConfig=b}(),this.createjs=this.createjs||{},function(){"use strict";function Sound(){throw"Sound cannot be instantiated"}function a(a,b){this.init(a,b)}var b=Sound;b.INTERRUPT_ANY="any",b.INTERRUPT_EARLY="early",b.INTERRUPT_LATE="late",b.INTERRUPT_NONE="none",b.PLAY_INITED="playInited",b.PLAY_SUCCEEDED="playSucceeded",b.PLAY_INTERRUPTED="playInterrupted",b.PLAY_FINISHED="playFinished",b.PLAY_FAILED="playFailed",b.SUPPORTED_EXTENSIONS=["mp3","ogg","opus","mpeg","wav","m4a","mp4","aiff","wma","mid"],b.EXTENSION_MAP={m4a:"mp4"},b.FILE_PATTERN=/^(?:(\w+:)\/{2}(\w+(?:\.\w+)*\/?))?([\/.]*?(?:[^?]+)?\/)?((?:[^\/?]+)\.(\w+))(?:\?(\S+)?)?$/,b.defaultInterruptBehavior=b.INTERRUPT_NONE,b.alternateExtensions=[],b.activePlugin=null,b._masterVolume=1,Object.defineProperty(b,"volume",{get:function(){return this._masterVolume},set:function(a){if(null==Number(a))return!1;if(a=Math.max(0,Math.min(1,a)),b._masterVolume=a,!this.activePlugin||!this.activePlugin.setVolume||!this.activePlugin.setVolume(a))for(var c=this._instances,d=0,e=c.length;e>d;d++)c[d].setMasterVolume(a)}}),b._masterMute=!1,Object.defineProperty(b,"muted",{get:function(){return this._masterMute},set:function(a){if(null==a)return!1;if(this._masterMute=a,!this.activePlugin||!this.activePlugin.setMute||!this.activePlugin.setMute(a))for(var b=this._instances,c=0,d=b.length;d>c;c++)b[c].setMasterMute(a);return!0}}),Object.defineProperty(b,"capabilities",{get:function(){return null==b.activePlugin?null:b.activePlugin._capabilities},set:function(a){return!1}}),b._pluginsRegistered=!1,b._lastID=0,b._instances=[],b._idHash={},b._preloadHash={},b._defaultPlayPropsHash={},b.addEventListener=null,b.removeEventListener=null,b.removeAllEventListeners=null,b.dispatchEvent=null,b.hasEventListener=null,b._listeners=null,createjs.EventDispatcher.initialize(b),b.getPreloadHandlers=function(){return{callback:createjs.proxy(b.initLoad,b),types:["sound"],extensions:b.SUPPORTED_EXTENSIONS}},b._handleLoadComplete=function(a){var c=a.target.getItem().src;if(b.preloadHash[c])for(var d=0,e=b._preloadHash[c].length;e>d;d++){var f=b._preloadHash[c][d];if(b._preloadHash[c][d]=!0,b.hasEventListener("fileload")){var a=new createjs.Event("fileload");a.src=f.src,a.id=f.id,a.data=f.data,a.sprite=f.sprite,b.dispatchEvent(a)}}},b._handleLoadError=function(a){var c=a.target.getItem().src;if(b._preloadHash[c])for(var d=0,e=b._preloadHash[c].length;e>d;d++){var f=b._preloadHash[c][d];if(b._preloadHash[c][d]=!1,b.hasEventListener("fileerror")){var a=new createjs.Event("fileerror");a.src=f.src,a.id=f.id,a.data=f.data,a.sprite=f.sprite,b.dispatchEvent(a)}}},b._registerPlugin=function(a){return a.isSupported()?(b.activePlugin=new a,!0):!1},b.registerPlugins=function(a){b._pluginsRegistered=!0;for(var c=0,d=a.length;d>c;c++)if(b._registerPlugin(a[c]))return!0;return!1},b.initializeDefaultPlugins=function(){return null!=b.activePlugin?!0:b._pluginsRegistered?!1:b.registerPlugins([createjs.WebAudioPlugin,createjs.HTMLAudioPlugin])?!0:!1},b.isReady=function(){return null!=b.activePlugin},b.getCapabilities=function(){return null==b.activePlugin?null:b.activePlugin._capabilities},b.getCapability=function(a){return null==b.activePlugin?null:b.activePlugin._capabilities[a]},b.initLoad=function(a){return b._registerSound(a)},b._registerSound=function(c){if(!b.initializeDefaultPlugins())return!1;var d;if(c.src instanceof Object?(d=b._parseSrc(c.src),d.src=c.path+d.src):d=b._parsePath(c.src),null==d)return!1;c.src=d.src,c.type="sound";var e=c.data,f=null;if(null!=e&&(isNaN(e.channels)?isNaN(e)||(f=parseInt(e)):f=parseInt(e.channels),e.audioSprite))for(var g,h=e.audioSprite.length;h--;)g=e.audioSprite[h],b._idHash[g.id]={src:c.src,startTime:parseInt(g.startTime),duration:parseInt(g.duration)},g.defaultPlayProps&&(b._defaultPlayPropsHash[g.id]=createjs.PlayPropsConfig.create(g.defaultPlayProps));null!=c.id&&(b._idHash[c.id]={src:c.src});var i=b.activePlugin.register(c);return a.create(c.src,f),null!=e&&isNaN(e)?c.data.channels=f||a.maxPerChannel():c.data=f||a.maxPerChannel(),i.type&&(c.type=i.type),c.defaultPlayProps&&(b._defaultPlayPropsHash[c.src]=createjs.PlayPropsConfig.create(c.defaultPlayProps)),i},b.registerSound=function(a,c,d,e,f){var g={src:a,id:c,data:d,defaultPlayProps:f};a instanceof Object&&a.src&&(e=c,g=a),g=createjs.LoadItem.create(g),g.path=e,null==e||g.src instanceof Object||(g.src=e+a);var h=b._registerSound(g);if(!h)return!1;if(b._preloadHash[g.src]||(b._preloadHash[g.src]=[]),b._preloadHash[g.src].push(g),1==b._preloadHash[g.src].length)h.on("complete",createjs.proxy(this._handleLoadComplete,this)),h.on("error",createjs.proxy(this._handleLoadError,this)),b.activePlugin.preload(h);else if(1==b._preloadHash[g.src][0])return!0;return g},b.registerSounds=function(a,b){var c=[];a.path&&(b?b+=a.path:b=a.path,a=a.manifest);for(var d=0,e=a.length;e>d;d++)c[d]=createjs.Sound.registerSound(a[d].src,a[d].id,a[d].data,b,a[d].defaultPlayProps);return c},b.removeSound=function(c,d){if(null==b.activePlugin)return!1;c instanceof Object&&c.src&&(c=c.src);var e;if(c instanceof Object?e=b._parseSrc(c):(c=b._getSrcById(c).src,e=b._parsePath(c)),null==e)return!1;c=e.src,null!=d&&(c=d+c);for(var f in b._idHash)b._idHash[f].src==c&&delete b._idHash[f];return a.removeSrc(c),delete b._preloadHash[c],b.activePlugin.removeSound(c),!0},b.removeSounds=function(a,b){var c=[];a.path&&(b?b+=a.path:b=a.path,a=a.manifest);for(var d=0,e=a.length;e>d;d++)c[d]=createjs.Sound.removeSound(a[d].src,b);return c},b.removeAllSounds=function(){b._idHash={},b._preloadHash={},a.removeAll(),b.activePlugin&&b.activePlugin.removeAllSounds()},b.loadComplete=function(a){if(!b.isReady())return!1;var c=b._parsePath(a);return a=c?b._getSrcById(c.src).src:b._getSrcById(a).src,void 0==b._preloadHash[a]?!1:1==b._preloadHash[a][0]},b._parsePath=function(a){"string"!=typeof a&&(a=a.toString());var c,d,e;a.indexOf(".")>=0&&(c=a.substr(a.lastIndexOf(".")+1),c.indexOf("?")>0&&(c=c.substring(0,c.indexOf("?"))),d=a.substring(0,a.lastIndexOf(".")),d.indexOf("/")>=0&&(d=d.substr(d.lastIndexOf("/")+1)),e=c);for(var f=b.capabilities,g=0;!f[c];)if(c=b.alternateExtensions[g++],g>b.alternateExtensions.length)return null;a=a.replace("."+e,"."+c);var h={name:d,src:a,extension:c};return h},b._parseSrc=function(a){var c={name:void 0,src:void 0,extension:void 0},d=b.capabilities;for(var e in a)if(a.hasOwnProperty(e)&&d[e]){c.src=a[e],c.extension=e;break}if(!c.src)return!1;var f=c.src.lastIndexOf("/");return-1!=f?c.name=c.src.slice(f+1):c.name=c.src,c},b.play=function(a,c,d,e,f,g,h,i,j){var k;k=c instanceof Object||c instanceof createjs.PlayPropsConfig?createjs.PlayPropsConfig.create(c):createjs.PlayPropsConfig.create({interrupt:c,delay:d,offset:e,loop:f,volume:g,pan:h,startTime:i,duration:j});var l=b.createInstance(a,k.startTime,k.duration),m=b._playInstance(l,k);
+return m||l._playFailed(),l},b.createInstance=function(c,d,e){if(!b.initializeDefaultPlugins())return new createjs.DefaultSoundInstance(c,d,e);var f=b._defaultPlayPropsHash[c];c=b._getSrcById(c);var g=b._parsePath(c.src),h=null;return null!=g&&null!=g.src?(a.create(g.src),null==d&&(d=c.startTime),h=b.activePlugin.create(g.src,d,e||c.duration),f=f||b._defaultPlayPropsHash[g.src],f&&h.applyPlayProps(f)):h=new createjs.DefaultSoundInstance(c,d,e),h.uniqueId=b._lastID++,h},b.stop=function(){for(var a=this._instances,b=a.length;b--;)a[b].stop()},b.setVolume=function(a){if(null==Number(a))return!1;if(a=Math.max(0,Math.min(1,a)),b._masterVolume=a,!this.activePlugin||!this.activePlugin.setVolume||!this.activePlugin.setVolume(a))for(var c=this._instances,d=0,e=c.length;e>d;d++)c[d].setMasterVolume(a)},b.getVolume=function(){return this._masterVolume},b.setMute=function(a){if(null==a)return!1;if(this._masterMute=a,!this.activePlugin||!this.activePlugin.setMute||!this.activePlugin.setMute(a))for(var b=this._instances,c=0,d=b.length;d>c;c++)b[c].setMasterMute(a);return!0},b.getMute=function(){return this._masterMute},b.setDefaultPlayProps=function(a,c){a=b._getSrcById(a),b._defaultPlayPropsHash[b._parsePath(a.src).src]=createjs.PlayPropsConfig.create(c)},b.getDefaultPlayProps=function(a){return a=b._getSrcById(a),b._defaultPlayPropsHash[b._parsePath(a.src).src]},b.pause=function(){for(var a=this.instances,b=a.length;b--;)a[b].paused=!0},b.resume=function(){for(var a=this.instances,b=a.length;b--;)a[b].paused=!1},b._playInstance=function(a,c){var d=b._defaultPlayPropsHash[a.src]||{};if(null==c.interrupt&&(c.interrupt=d.interrupt||b.defaultInterruptBehavior),null==c.delay&&(c.delay=d.delay||0),null==c.offset&&(c.offset=a.getPosition()),null==c.loop&&(c.loop=a.loop),null==c.volume&&(c.volume=a.volume),null==c.pan&&(c.pan=a.pan),0==c.delay){var e=b._beginPlaying(a,c);if(!e)return!1}else{var f=setTimeout(function(){b._beginPlaying(a,c)},c.delay);a.delayTimeoutId=f}return this._instances.push(a),!0},b._beginPlaying=function(b,c){if(!a.add(b,c.interrupt))return!1;var d=b._beginPlaying(c);if(!d){var e=createjs.indexOf(this._instances,b);return e>-1&&this._instances.splice(e,1),!1}return!0},b._getSrcById=function(a){return b._idHash[a]||{src:a}},b._playFinished=function(c){a.remove(c);var d=createjs.indexOf(this._instances,c);d>-1&&this._instances.splice(d,1);var e=b.activePlugin._soundInstances;e[c.src]&&e[c.src].indexOf(c)>-1&&e[c.src].splice(e[c.src].indexOf(c),1)},createjs.Sound=Sound,a.channels={},a.create=function(b,c){var d=a.get(b);return null==d?(a.channels[b]=new a(b,c),!0):!1},a.removeSrc=function(b){var c=a.get(b);return null==c?!1:(c._removeAll(),delete a.channels[b],!0)},a.removeAll=function(){for(var b in a.channels)a.channels[b]._removeAll();a.channels={}},a.add=function(b,c){var d=a.get(b.src);return null==d?!1:d._add(b,c)},a.remove=function(b){var c=a.get(b.src);return null==c?!1:(c._remove(b),!0)},a.maxPerChannel=function(){return c.maxDefault},a.get=function(b){return a.channels[b]};var c=a.prototype;c.constructor=a,c.src=null,c.max=null,c.maxDefault=100,c.length=0,c.init=function(a,b){this.src=a,this.max=b||this.maxDefault,-1==this.max&&(this.max=this.maxDefault),this._instances=[]},c._get=function(a){return this._instances[a]},c._add=function(a,b){return this._getSlot(b,a)?(this._instances.push(a),this.length++,!0):!1},c._remove=function(a){var c=b.activePlugin._soundInstances;c[a.src]&&c[a.src].indexOf(a)>-1&&c[a.src].splice(c[a.src].indexOf(a),1);var d=createjs.indexOf(this._instances,a);return-1==d?!1:(this._instances.splice(d,1),this.length--,!0)},c._removeAll=function(){for(var a=this.length-1;a>=0;a--)this._instances[a].stop()},c._getSlot=function(a,b){var c,d;if(a!=Sound.INTERRUPT_NONE&&(d=this._get(0),null==d))return!0;for(var e=0,f=this.max;f>e;e++){if(c=this._get(e),null==c)return!0;if(c.playState==Sound.PLAY_FINISHED||c.playState==Sound.PLAY_INTERRUPTED||c.playState==Sound.PLAY_FAILED){d=c;break}a!=Sound.INTERRUPT_NONE&&(a==Sound.INTERRUPT_EARLY&&c.getPosition()d.getPosition())&&(d=c)}return null!=d?(d._interrupt(),this._remove(d),!0):!1},c.toString=function(){return"[Sound SoundChannel]"}}(),this.createjs=this.createjs||{},function(){"use strict";var AbstractSoundInstance=function(a,b,c,d){this.EventDispatcher_constructor(),this.src=a,this.uniqueId=-1,this.playState=null,this.delayTimeoutId=null,this._volume=1,Object.defineProperty(this,"volume",{get:this.getVolume,set:this.setVolume}),this._pan=0,Object.defineProperty(this,"pan",{get:this.getPan,set:this.setPan}),this._startTime=Math.max(0,b||0),Object.defineProperty(this,"startTime",{get:this.getStartTime,set:this.setStartTime}),this._duration=Math.max(0,c||0),Object.defineProperty(this,"duration",{get:this.getDuration,set:this.setDuration}),this._playbackResource=null,Object.defineProperty(this,"playbackResource",{get:this.getPlaybackResource,set:this.setPlaybackResource}),d!==!1&&d!==!0&&this.setPlaybackResource(d),this._position=0,Object.defineProperty(this,"position",{get:this.getPosition,set:this.setPosition}),this._loop=0,Object.defineProperty(this,"loop",{get:this.getLoop,set:this.setLoop}),this._muted=!1,Object.defineProperty(this,"muted",{get:this.getMuted,set:this.setMuted}),this._paused=!1,Object.defineProperty(this,"paused",{get:this.getPaused,set:this.setPaused})},a=createjs.extend(AbstractSoundInstance,createjs.EventDispatcher);a.play=function(a,b,c,d,e,f){var g;return g=a instanceof Object||a instanceof createjs.PlayPropsConfig?createjs.PlayPropsConfig.create(a):createjs.PlayPropsConfig.create({interrupt:a,delay:b,offset:c,loop:d,volume:e,pan:f}),this.playState==createjs.Sound.PLAY_SUCCEEDED?(this.applyPlayProps(g),void(this._paused&&this.setPaused(!1))):(this._cleanUp(),createjs.Sound._playInstance(this,g),this)},a.stop=function(){return this._position=0,this._paused=!1,this._handleStop(),this._cleanUp(),this.playState=createjs.Sound.PLAY_FINISHED,this},a.destroy=function(){this._cleanUp(),this.src=null,this.playbackResource=null,this.removeAllEventListeners()},a.applyPlayProps=function(a){return null!=a.offset&&this.setPosition(a.offset),null!=a.loop&&this.setLoop(a.loop),null!=a.volume&&this.setVolume(a.volume),null!=a.pan&&this.setPan(a.pan),null!=a.startTime&&(this.setStartTime(a.startTime),this.setDuration(a.duration)),this},a.toString=function(){return"[AbstractSoundInstance]"},a.getPaused=function(){return this._paused},a.setPaused=function(a){return a!==!0&&a!==!1||this._paused==a||1==a&&this.playState!=createjs.Sound.PLAY_SUCCEEDED?void 0:(this._paused=a,a?this._pause():this._resume(),clearTimeout(this.delayTimeoutId),this)},a.setVolume=function(a){return a==this._volume?this:(this._volume=Math.max(0,Math.min(1,a)),this._muted||this._updateVolume(),this)},a.getVolume=function(){return this._volume},a.setMuted=function(a){return a===!0||a===!1?(this._muted=a,this._updateVolume(),this):void 0},a.getMuted=function(){return this._muted},a.setPan=function(a){return a==this._pan?this:(this._pan=Math.max(-1,Math.min(1,a)),this._updatePan(),this)},a.getPan=function(){return this._pan},a.getPosition=function(){return this._paused||this.playState!=createjs.Sound.PLAY_SUCCEEDED||(this._position=this._calculateCurrentPosition()),this._position},a.setPosition=function(a){return this._position=Math.max(0,a),this.playState==createjs.Sound.PLAY_SUCCEEDED&&this._updatePosition(),this},a.getStartTime=function(){return this._startTime},a.setStartTime=function(a){return a==this._startTime?this:(this._startTime=Math.max(0,a||0),this._updateStartTime(),this)},a.getDuration=function(){return this._duration},a.setDuration=function(a){return a==this._duration?this:(this._duration=Math.max(0,a||0),this._updateDuration(),this)},a.setPlaybackResource=function(a){return this._playbackResource=a,0==this._duration&&this._setDurationFromSource(),this},a.getPlaybackResource=function(){return this._playbackResource},a.getLoop=function(){return this._loop},a.setLoop=function(a){null!=this._playbackResource&&(0!=this._loop&&0==a?this._removeLooping(a):0==this._loop&&0!=a&&this._addLooping(a)),this._loop=a},a._sendEvent=function(a){var b=new createjs.Event(a);this.dispatchEvent(b)},a._cleanUp=function(){clearTimeout(this.delayTimeoutId),this._handleCleanUp(),this._paused=!1,createjs.Sound._playFinished(this)},a._interrupt=function(){this._cleanUp(),this.playState=createjs.Sound.PLAY_INTERRUPTED,this._sendEvent("interrupted")},a._beginPlaying=function(a){return this.setPosition(a.offset),this.setLoop(a.loop),this.setVolume(a.volume),this.setPan(a.pan),null!=a.startTime&&(this.setStartTime(a.startTime),this.setDuration(a.duration)),null!=this._playbackResource&&this._positionc;c++){var e=this._soundInstances[b][c];e.setPlaybackResource(this._audioSources[b])}},a._handlePreloadError=function(a){},a._updateVolume=function(){},createjs.AbstractPlugin=AbstractPlugin}(),this.createjs=this.createjs||{},function(){"use strict";function a(a){this.AbstractLoader_constructor(a,!0,createjs.AbstractLoader.SOUND)}var b=createjs.extend(a,createjs.AbstractLoader);a.context=null,b.toString=function(){return"[WebAudioLoader]"},b._createRequest=function(){this._request=new createjs.XHRRequest(this._item,!1),this._request.setResponseType("arraybuffer")},b._sendComplete=function(b){a.context.decodeAudioData(this._rawResult,createjs.proxy(this._handleAudioDecoded,this),createjs.proxy(this._sendError,this))},b._handleAudioDecoded=function(a){this._result=a,this.AbstractLoader__sendComplete()},createjs.WebAudioLoader=createjs.promote(a,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function WebAudioSoundInstance(a,c,d,e){this.AbstractSoundInstance_constructor(a,c,d,e),this.gainNode=b.context.createGain(),this.panNode=b.context.createPanner(),this.panNode.panningModel=b._panningModel,this.panNode.connect(this.gainNode),this._updatePan(),this.sourceNode=null,this._soundCompleteTimeout=null,this._sourceNodeNext=null,this._playbackStartTime=0,this._endedHandler=createjs.proxy(this._handleSoundComplete,this)}var a=createjs.extend(WebAudioSoundInstance,createjs.AbstractSoundInstance),b=WebAudioSoundInstance;b.context=null,b._scratchBuffer=null,b.destinationNode=null,b._panningModel="equalpower",a.destroy=function(){this.AbstractSoundInstance_destroy(),this.panNode.disconnect(0),this.panNode=null,this.gainNode.disconnect(0),this.gainNode=null},a.toString=function(){return"[WebAudioSoundInstance]"},a._updatePan=function(){this.panNode.setPosition(this._pan,0,-.5)},a._removeLooping=function(a){this._sourceNodeNext=this._cleanUpAudioNode(this._sourceNodeNext)},a._addLooping=function(a){this.playState==createjs.Sound.PLAY_SUCCEEDED&&(this._sourceNodeNext=this._createAndPlayAudioNode(this._playbackStartTime,0))},a._setDurationFromSource=function(){this._duration=1e3*this.playbackResource.duration},a._handleCleanUp=function(){this.sourceNode&&this.playState==createjs.Sound.PLAY_SUCCEEDED&&(this.sourceNode=this._cleanUpAudioNode(this.sourceNode),this._sourceNodeNext=this._cleanUpAudioNode(this._sourceNodeNext)),0!=this.gainNode.numberOfOutputs&&this.gainNode.disconnect(0),clearTimeout(this._soundCompleteTimeout),this._playbackStartTime=0},a._cleanUpAudioNode=function(a){if(a){a.stop(0),a.disconnect(0);try{a.buffer=b._scratchBuffer}catch(c){}a=null}return a},a._handleSoundReady=function(a){this.gainNode.connect(b.destinationNode);var c=.001*this._duration,d=.001*this._position;d>c&&(d=c),this.sourceNode=this._createAndPlayAudioNode(b.context.currentTime-c,d),this._playbackStartTime=this.sourceNode.startTime-d,this._soundCompleteTimeout=setTimeout(this._endedHandler,1e3*(c-d)),0!=this._loop&&(this._sourceNodeNext=this._createAndPlayAudioNode(this._playbackStartTime,0))},a._createAndPlayAudioNode=function(a,c){var d=b.context.createBufferSource();d.buffer=this.playbackResource,d.connect(this.panNode);var e=.001*this._duration;return c>e&&(c=e-.001),d.startTime=a+e,d.start(d.startTime,c+.001*this._startTime,e-c),d},a._pause=function(){this._position=1e3*(b.context.currentTime-this._playbackStartTime),this.sourceNode=this._cleanUpAudioNode(this.sourceNode),this._sourceNodeNext=this._cleanUpAudioNode(this._sourceNodeNext),0!=this.gainNode.numberOfOutputs&&this.gainNode.disconnect(0),clearTimeout(this._soundCompleteTimeout)},a._resume=function(){this._handleSoundReady()},a._updateVolume=function(){var a=this._muted?0:this._volume;a!=this.gainNode.gain.value&&(this.gainNode.gain.value=a)},a._calculateCurrentPosition=function(){return 1e3*(b.context.currentTime-this._playbackStartTime)},a._updatePosition=function(){this.sourceNode=this._cleanUpAudioNode(this.sourceNode),this._sourceNodeNext=this._cleanUpAudioNode(this._sourceNodeNext),clearTimeout(this._soundCompleteTimeout),this._paused||this._handleSoundReady()},a._handleLoop=function(){this._cleanUpAudioNode(this.sourceNode),this.sourceNode=this._sourceNodeNext,this._playbackStartTime=this.sourceNode.startTime,this._sourceNodeNext=this._createAndPlayAudioNode(this._playbackStartTime,0),this._soundCompleteTimeout=setTimeout(this._endedHandler,this._duration)},a._updateDuration=function(){this.playState==createjs.Sound.PLAY_SUCCEEDED&&(this._pause(),this._resume())},createjs.WebAudioSoundInstance=createjs.promote(WebAudioSoundInstance,"AbstractSoundInstance")}(),this.createjs=this.createjs||{},function(){"use strict";function WebAudioPlugin(){this.AbstractPlugin_constructor(),this._panningModel=b._panningModel,this.context=b.context,this.dynamicsCompressorNode=this.context.createDynamicsCompressor(),this.dynamicsCompressorNode.connect(this.context.destination),this.gainNode=this.context.createGain(),this.gainNode.connect(this.dynamicsCompressorNode),createjs.WebAudioSoundInstance.destinationNode=this.gainNode,this._capabilities=b._capabilities,this._loaderClass=createjs.WebAudioLoader,this._soundInstanceClass=createjs.WebAudioSoundInstance,this._addPropsToClasses()}var a=createjs.extend(WebAudioPlugin,createjs.AbstractPlugin),b=WebAudioPlugin;b._capabilities=null,b._panningModel="equalpower",b.context=null,b._scratchBuffer=null,b._unlocked=!1,b.isSupported=function(){var a=createjs.BrowserDetect.isIOS||createjs.BrowserDetect.isAndroid||createjs.BrowserDetect.isBlackberry;return"file:"!=location.protocol||a||this._isFileXHRSupported()?(b._generateCapabilities(),null==b.context?!1:!0):!1},b.playEmptySound=function(){if(null!=b.context){var a=b.context.createBufferSource();a.buffer=b._scratchBuffer,a.connect(b.context.destination),a.start(0,0,0)}},b._isFileXHRSupported=function(){var a=!0,b=new XMLHttpRequest;try{b.open("GET","WebAudioPluginTest.fail",!1)}catch(c){return a=!1}b.onerror=function(){a=!1},b.onload=function(){a=404==this.status||200==this.status||0==this.status&&""!=this.response};try{b.send()}catch(c){a=!1}return a},b._generateCapabilities=function(){if(null==b._capabilities){var a=document.createElement("audio");if(null==a.canPlayType)return null;if(null==b.context)if(window.AudioContext)b.context=new AudioContext;else{if(!window.webkitAudioContext)return null;b.context=new webkitAudioContext}null==b._scratchBuffer&&(b._scratchBuffer=b.context.createBuffer(1,1,22050)),b._compatibilitySetUp(),"ontouchstart"in window&&"running"!=b.context.state&&(b._unlock(),document.addEventListener("mousedown",b._unlock,!0),document.addEventListener("touchend",b._unlock,!0)),b._capabilities={panning:!0,volume:!0,tracks:-1};for(var c=createjs.Sound.SUPPORTED_EXTENSIONS,d=createjs.Sound.EXTENSION_MAP,e=0,f=c.length;f>e;e++){var g=c[e],h=d[g]||g;b._capabilities[g]="no"!=a.canPlayType("audio/"+g)&&""!=a.canPlayType("audio/"+g)||"no"!=a.canPlayType("audio/"+h)&&""!=a.canPlayType("audio/"+h)}b.context.destination.numberOfChannels<2&&(b._capabilities.panning=!1)}},b._compatibilitySetUp=function(){if(b._panningModel="equalpower",!b.context.createGain){b.context.createGain=b.context.createGainNode;var a=b.context.createBufferSource();a.__proto__.start=a.__proto__.noteGrainOn,a.__proto__.stop=a.__proto__.noteOff,b._panningModel=0}},b._unlock=function(){b._unlocked||(b.playEmptySound(),"running"==b.context.state&&(document.removeEventListener("mousedown",b._unlock,!0),document.removeEventListener("touchend",b._unlock,!0),b._unlocked=!0))},a.toString=function(){return"[WebAudioPlugin]"},a._addPropsToClasses=function(){var a=this._soundInstanceClass;a.context=this.context,a._scratchBuffer=b._scratchBuffer,a.destinationNode=this.gainNode,a._panningModel=this._panningModel,this._loaderClass.context=this.context},a._updateVolume=function(){var a=createjs.Sound._masterMute?0:this._volume;a!=this.gainNode.gain.value&&(this.gainNode.gain.value=a)},createjs.WebAudioPlugin=createjs.promote(WebAudioPlugin,"AbstractPlugin")}(),this.createjs=this.createjs||{},function(){"use strict";function HTMLAudioTagPool(){throw"HTMLAudioTagPool cannot be instantiated"}function a(a){this._tags=[]}var b=HTMLAudioTagPool;b._tags={},b._tagPool=new a,b._tagUsed={},b.get=function(a){var c=b._tags[a];return null==c?(c=b._tags[a]=b._tagPool.get(),c.src=a):b._tagUsed[a]?(c=b._tagPool.get(),c.src=a):b._tagUsed[a]=!0,c},b.set=function(a,c){c==b._tags[a]?b._tagUsed[a]=!1:b._tagPool.set(c)},b.remove=function(a){var c=b._tags[a];return null==c?!1:(b._tagPool.set(c),delete b._tags[a],delete b._tagUsed[a],!0)},b.getDuration=function(a){var c=b._tags[a];return null!=c&&c.duration?1e3*c.duration:0},createjs.HTMLAudioTagPool=HTMLAudioTagPool;var c=a.prototype;c.constructor=a,c.get=function(){var a;return a=0==this._tags.length?this._createTag():this._tags.pop(),null==a.parentNode&&document.body.appendChild(a),a},c.set=function(a){var b=createjs.indexOf(this._tags,a);-1==b&&(this._tags.src=null,this._tags.push(a))},c.toString=function(){return"[TagPool]"},c._createTag=function(){var a=document.createElement("audio");return a.autoplay=!1,a.preload="none",a}}(),this.createjs=this.createjs||{},function(){"use strict";function HTMLAudioSoundInstance(a,b,c,d){this.AbstractSoundInstance_constructor(a,b,c,d),this._audioSpriteStopTime=null,this._delayTimeoutId=null,this._endedHandler=createjs.proxy(this._handleSoundComplete,this),this._readyHandler=createjs.proxy(this._handleTagReady,this),this._stalledHandler=createjs.proxy(this._playFailed,this),this._audioSpriteEndHandler=createjs.proxy(this._handleAudioSpriteLoop,this),this._loopHandler=createjs.proxy(this._handleSoundComplete,this),c?this._audioSpriteStopTime=.001*(b+c):this._duration=createjs.HTMLAudioTagPool.getDuration(this.src)}var a=createjs.extend(HTMLAudioSoundInstance,createjs.AbstractSoundInstance);a.setMasterVolume=function(a){this._updateVolume()},a.setMasterMute=function(a){this._updateVolume()},a.toString=function(){return"[HTMLAudioSoundInstance]"},a._removeLooping=function(){null!=this._playbackResource&&(this._playbackResource.loop=!1,this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._loopHandler,!1))},a._addLooping=function(){null==this._playbackResource||this._audioSpriteStopTime||(this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._loopHandler,!1),this._playbackResource.loop=!0)},a._handleCleanUp=function(){var a=this._playbackResource;if(null!=a){a.pause(),a.loop=!1,a.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_ENDED,this._endedHandler,!1),a.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_READY,this._readyHandler,!1),a.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_STALLED,this._stalledHandler,!1),a.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._loopHandler,!1),a.removeEventListener(createjs.HTMLAudioPlugin._TIME_UPDATE,this._audioSpriteEndHandler,!1);try{a.currentTime=this._startTime}catch(b){}createjs.HTMLAudioTagPool.set(this.src,a),this._playbackResource=null}},a._beginPlaying=function(a){return this._playbackResource=createjs.HTMLAudioTagPool.get(this.src),this.AbstractSoundInstance__beginPlaying(a)},a._handleSoundReady=function(a){if(4!==this._playbackResource.readyState){var b=this._playbackResource;return b.addEventListener(createjs.HTMLAudioPlugin._AUDIO_READY,this._readyHandler,!1),b.addEventListener(createjs.HTMLAudioPlugin._AUDIO_STALLED,this._stalledHandler,!1),b.preload="auto",void b.load()}this._updateVolume(),this._playbackResource.currentTime=.001*(this._startTime+this._position),this._audioSpriteStopTime?this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._TIME_UPDATE,this._audioSpriteEndHandler,!1):(this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._AUDIO_ENDED,this._endedHandler,!1),0!=this._loop&&(this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._loopHandler,!1),this._playbackResource.loop=!0)),this._playbackResource.play()},a._handleTagReady=function(a){this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_READY,this._readyHandler,!1),this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_STALLED,this._stalledHandler,!1),this._handleSoundReady()},a._pause=function(){this._playbackResource.pause()},a._resume=function(){this._playbackResource.play()},a._updateVolume=function(){if(null!=this._playbackResource){var a=this._muted||createjs.Sound._masterMute?0:this._volume*createjs.Sound._masterVolume;a!=this._playbackResource.volume&&(this._playbackResource.volume=a)}},a._calculateCurrentPosition=function(){return 1e3*this._playbackResource.currentTime-this._startTime},a._updatePosition=function(){this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._loopHandler,!1),this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._handleSetPositionSeek,!1);try{this._playbackResource.currentTime=.001*(this._position+this._startTime)}catch(a){this._handleSetPositionSeek(null)}},a._handleSetPositionSeek=function(a){null!=this._playbackResource&&(this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._handleSetPositionSeek,!1),this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._loopHandler,!1))},a._handleAudioSpriteLoop=function(a){this._playbackResource.currentTime<=this._audioSpriteStopTime||(this._playbackResource.pause(),0==this._loop?this._handleSoundComplete(null):(this._position=0,this._loop--,this._playbackResource.currentTime=.001*this._startTime,this._paused||this._playbackResource.play(),this._sendEvent("loop")))},a._handleLoop=function(a){0==this._loop&&(this._playbackResource.loop=!1,this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_SEEKED,this._loopHandler,!1))},a._updateStartTime=function(){this._audioSpriteStopTime=.001*(this._startTime+this._duration),this.playState==createjs.Sound.PLAY_SUCCEEDED&&(this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_ENDED,this._endedHandler,!1),this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._TIME_UPDATE,this._audioSpriteEndHandler,!1))},a._updateDuration=function(){this._audioSpriteStopTime=.001*(this._startTime+this._duration),this.playState==createjs.Sound.PLAY_SUCCEEDED&&(this._playbackResource.removeEventListener(createjs.HTMLAudioPlugin._AUDIO_ENDED,this._endedHandler,!1),this._playbackResource.addEventListener(createjs.HTMLAudioPlugin._TIME_UPDATE,this._audioSpriteEndHandler,!1))},a._setDurationFromSource=function(){this._duration=createjs.HTMLAudioTagPool.getDuration(this.src),this._playbackResource=null},createjs.HTMLAudioSoundInstance=createjs.promote(HTMLAudioSoundInstance,"AbstractSoundInstance")}(),this.createjs=this.createjs||{},function(){"use strict";function HTMLAudioPlugin(){this.AbstractPlugin_constructor(),this.defaultNumChannels=2,this._capabilities=b._capabilities,this._loaderClass=createjs.SoundLoader,this._soundInstanceClass=createjs.HTMLAudioSoundInstance}var a=createjs.extend(HTMLAudioPlugin,createjs.AbstractPlugin),b=HTMLAudioPlugin;b.MAX_INSTANCES=30,b._AUDIO_READY="canplaythrough",b._AUDIO_ENDED="ended",b._AUDIO_SEEKED="seeked",b._AUDIO_STALLED="stalled",b._TIME_UPDATE="timeupdate",b._capabilities=null,b.isSupported=function(){return b._generateCapabilities(),null!=b._capabilities},b._generateCapabilities=function(){if(null==b._capabilities){var a=document.createElement("audio");if(null==a.canPlayType)return null;b._capabilities={panning:!1,volume:!0,tracks:-1};for(var c=createjs.Sound.SUPPORTED_EXTENSIONS,d=createjs.Sound.EXTENSION_MAP,e=0,f=c.length;f>e;e++){var g=c[e],h=d[g]||g;b._capabilities[g]="no"!=a.canPlayType("audio/"+g)&&""!=a.canPlayType("audio/"+g)||"no"!=a.canPlayType("audio/"+h)&&""!=a.canPlayType("audio/"+h)}}},a.register=function(a){var b=createjs.HTMLAudioTagPool.get(a.src),c=this.AbstractPlugin_register(a);return c.setTag(b),c},a.removeSound=function(a){this.AbstractPlugin_removeSound(a),createjs.HTMLAudioTagPool.remove(a)},a.create=function(a,b,c){var d=this.AbstractPlugin_create(a,b,c);return d.setPlaybackResource(null),d},a.toString=function(){return"[HTMLAudioPlugin]"},a.setVolume=a.getVolume=a.setMute=null,createjs.HTMLAudioPlugin=createjs.promote(HTMLAudioPlugin,"AbstractPlugin")}();
\ No newline at end of file
diff --git a/src/preloadjs/net/XHRRequest.js b/src/preloadjs/net/XHRRequest.js
index a5cfee67..b5d97153 100644
--- a/src/preloadjs/net/XHRRequest.js
+++ b/src/preloadjs/net/XHRRequest.js
@@ -392,8 +392,9 @@ this.createjs = this.createjs || {};
switch (status) {
case 404: // Not Found
- case 0: // Not Loaded
return new Error(status);
+ case 0: // Not Loaded
+ return this._getResponse() ? null : new Error(status);
}
return null;
};
diff --git a/src/soundjs/AbstractPlugin.js b/src/soundjs/AbstractPlugin.js
index a01aadda..d119af91 100644
--- a/src/soundjs/AbstractPlugin.js
+++ b/src/soundjs/AbstractPlugin.js
@@ -102,6 +102,14 @@ this.createjs = this.createjs || {};
* @protected;
*/
this._soundInstanceClass;
+
+ /**
+ * The master volume of the plugin, which affects all SoundInstances.
+ * Default is 1.
+ * @type {Number}
+ * @protected
+ */
+ this._volume = 1;
};
var p = AbstractPlugin.prototype;
diff --git a/src/soundjs/Sound.js b/src/soundjs/Sound.js
index 69a78cc4..906b7287 100644
--- a/src/soundjs/Sound.js
+++ b/src/soundjs/Sound.js
@@ -380,13 +380,14 @@ this.createjs = this.createjs || {};
/**
* The RegExp pattern used to parse file URIs. This supports simple file names, as well as full domain URIs with
- * query strings. The resulting match is: protocol:$1 domain:$2 path:$3 file:$4 extension:$5 query:$6.
+ * query strings. The resulting match is: protocol:$1 domain:$2 path:$3 file:$4 extension:$5 query:$6 query-file:$7 query-extension:$8.
+ * "query-file" and "query-extension" are provided if the source file is defined by a query string.
* @property FILE_PATTERN
* @type {RegExp}
* @static
* @protected
*/
- s.FILE_PATTERN = /^(?:(\w+:)\/{2}(\w+(?:\.\w+)*\/?))?([/.]*?(?:[^?]+)?\/)?((?:[^/?]+)\.(\w+))(?:\?(\S+)?)?$/;
+ s.FILE_PATTERN = /^(?:(\w+:)\/{2}(\w+(?:\.\w+)*\/?))?([\/.]*?(?:[^?]+)?\/)?(?:((?:[^\/?]+)\.(\w+))|(?:[^\/?]+))(?:\?((?:(?:[^&]*?[\/=])?(?:((?:(?:[^\/?&=]+)\.(\w+)))\S*?)|\S+))?)?$/;
// Class Public properties
@@ -686,7 +687,11 @@ this.createjs = this.createjs || {};
*/
s._handleLoadComplete = function(event) {
var src = event.target.getItem().src;
- if (!s._preloadHash[src]) {return;}
+ if (!s.preloadHash[src]) {
+ //set this to true so it is still valid to detect if the audio has been loaded
+ //s.preloadHash[src] = [true];
+ return;
+ }
for (var i = 0, l = s._preloadHash[src].length; i < l; i++) {
var item = s._preloadHash[src][i];
@@ -1187,18 +1192,31 @@ this.createjs = this.createjs || {};
s._parsePath = function (value) {
if (typeof(value) != "string") {value = value.toString();}
+ //Changed how extensions and filenames are grabbed from the url to add simple support for
+ //urls that use php services & query string params to specify the file
var match = value.match(s.FILE_PATTERN);
- if (match == null) {return false;}
+ if (match === null) {return false;}
+
+ var name = '';
+ var ext = '';
+ var origExt = '';
+ if (s.SUPPORTED_EXTENSIONS.indexOf(match[5]) >= 0) {
+ name = match[4];
+ origExt = ext = match[5];
+ } else if (s.SUPPORTED_EXTENSIONS.indexOf(match[8]) >= 0) {
+ name = match[7];
+ origExt = ext = match[8];
+ } else {
+ return null;
+ }
- var name = match[4];
- var ext = match[5];
var c = s.capabilities;
var i = 0;
while (!c[ext]) {
ext = s.alternateExtensions[i++];
if (i > s.alternateExtensions.length) { return null;} // no extensions are supported
}
- value = value.replace("."+match[5], "."+ext);
+ value = value.replace("."+origExt, "."+ext);
var ret = {name:name, src:value, extension:ext};
return ret;
@@ -1466,6 +1484,38 @@ this.createjs = this.createjs || {};
return s._defaultPlayPropsHash[s._parsePath(src.src).src];
};
+ /**
+ * Pauses all audio (global pause on existing audio).
+ *
+ *
Example
+ * createjs.Sound.pause();
+ *
+ * @method pause
+ * @static
+ */
+ s.pause = function () {
+ var instances = this.instances;
+ for (var i = instances.length; i--; ) {
+ instances[i].paused = true;
+ }
+ };
+
+ /**
+ * Resumes all audio (global resume on existing audio).
+ *
+ *
Example
+ * createjs.Sound.resume();
+ *
+ * @method resume
+ * @static
+ */
+ s.resume = function () {
+ var instances = this.instances;
+ for (var i = instances.length; i--; ) {
+ instances[i].paused = false;
+ }
+ };
+
/* ---------------
Internal methods
@@ -1556,6 +1606,12 @@ this.createjs = this.createjs || {};
SoundChannel.remove(instance);
var index = createjs.indexOf(this._instances, instance);
if (index > -1) {this._instances.splice(index, 1);} // OJR this will always be > -1, there is no way for an instance to exist without being added to this._instances
+ //MMB 9/2015: sounds were being removed from _instances, but not from activePlugin._soundInstances
+ var soundInstances = s.activePlugin._soundInstances;
+ if (soundInstances[instance.src] && soundInstances[instance.src].indexOf(instance) > -1)
+ {
+ soundInstances[instance.src].splice(soundInstances[instance.src].indexOf(instance), 1);
+ }
};
createjs.Sound = Sound;
@@ -1769,6 +1825,12 @@ this.createjs = this.createjs || {};
* return false.
*/
p._remove = function (instance) {
+ //MMB 9/2015: sounds were being removed from _instances, but not from activePlugin._soundInstances
+ var soundInstances = s.activePlugin._soundInstances;
+ if (soundInstances[instance.src] && soundInstances[instance.src].indexOf(instance) > -1)
+ {
+ soundInstances[instance.src].splice(soundInstances[instance.src].indexOf(instance), 1);
+ }
var index = createjs.indexOf(this._instances, instance);
if (index == -1) {return false;}
this._instances.splice(index, 1);
diff --git a/src/soundjs/cordovaaudio/CordovaAudioLoader.js b/src/soundjs/cordovaaudio/CordovaAudioLoader.js
index 2f03a75f..efb0577c 100644
--- a/src/soundjs/cordovaaudio/CordovaAudioLoader.js
+++ b/src/soundjs/cordovaaudio/CordovaAudioLoader.js
@@ -80,7 +80,17 @@ this.createjs = this.createjs || {};
// public methods
p.load = function() {
- this._media = new Media(this._item.src, null, createjs.proxy(this._mediaErrorHandler,this));
+
+ var cordovaMedia = window.Media || window.top.Media || null;
+
+ if (cordovaMedia) {
+ this._media = new cordovaMedia(this._item.src, null, createjs.proxy(this._mediaErrorHandler,this));
+ } else {
+ //Could not find Media Object
+ this.handleEvent({type:"error"});
+ return;
+ }
+
this._media.seekTo(0); // needed to get duration
this._getMediaDuration();
@@ -110,6 +120,7 @@ this.createjs = this.createjs || {};
*/
p._getMediaDuration = function() {
this._result = this._media.getDuration() * 1000;
+
if (this._result < 0) {
this._loadTime += this._TIMER_FREQUENCY;
if (this._loadTime > this._item.loadTimeout) {
diff --git a/src/soundjs/cordovaaudio/CordovaAudioPlugin.js b/src/soundjs/cordovaaudio/CordovaAudioPlugin.js
index be6cbc0d..58e468c8 100644
--- a/src/soundjs/cordovaaudio/CordovaAudioPlugin.js
+++ b/src/soundjs/cordovaaudio/CordovaAudioPlugin.js
@@ -108,6 +108,7 @@ this.createjs = this.createjs || {};
* @static
*/
s.isSupported = function () {
+ // # feature/sound-fix
s._generateCapabilities();
return (s._capabilities != null);
};
@@ -120,7 +121,14 @@ this.createjs = this.createjs || {};
* @protected
*/
s._generateCapabilities = function () {
- if (s._capabilities != null || !(window.cordova || window.PhoneGap || window.phonegap) || !window.Media) {return;}
+ var cordovaObj = window.cordova || window.top.cordova || null;
+ var phoneGapObj = window.PhoneGap || window.top.PhoneGap || null;
+ var pgObj = window.phonegap || window.top.phonegap || null;
+ var cordovaMedia = window.Media || window.top.Media || null;
+
+ if (s._capabilities != null || !(cordovaObj || phoneGapObj || pgObj) || !cordovaMedia) {
+ return;
+ }
// OJR my best guess is that Cordova will have the same limits on playback that the audio tag has, but this could be wrong
var t = document.createElement("audio");
@@ -167,8 +175,9 @@ this.createjs = this.createjs || {};
return this._srcDurationHash[src];
};
-// Private Methods
+ // Private Methods
p._handlePreloadComplete = function (event) {
+
var src = event.target.getItem().src;
this._srcDurationHash[src] = event.result;
this._audioSources[src] = event.result;
@@ -176,6 +185,7 @@ this.createjs = this.createjs || {};
};
p.removeSound = function (src) {
+ // #/feature/sound-fx
delete(this._srcDurationHash[src]);
this.AbstractPlugin_removeSound(src);
};
diff --git a/src/soundjs/cordovaaudio/CordovaAudioSoundInstance.js b/src/soundjs/cordovaaudio/CordovaAudioSoundInstance.js
index dac1b526..e4049cc1 100644
--- a/src/soundjs/cordovaaudio/CordovaAudioSoundInstance.js
+++ b/src/soundjs/cordovaaudio/CordovaAudioSoundInstance.js
@@ -93,7 +93,12 @@ this.createjs = this.createjs || {};
this._mediaErrorHandler = createjs.proxy(this._handleMediaError, this);
this._mediaProgressHandler = createjs.proxy(this._handleMediaProgress, this);
- this._playbackResource = new Media(src, this._mediaPlayFinishedHandler, this._mediaErrorHandler, this._mediaProgressHandler);
+
+ var cordovaMedia = window.Media || window.top.Media || null;
+
+ if (cordovaMedia) {
+ this._playbackResource = new cordovaMedia(src, this._mediaPlayFinishedHandler, this._mediaErrorHandler, this._mediaProgressHandler);
+ }
if (duration) {
this._audioSprite = true;
@@ -146,7 +151,7 @@ this.createjs = this.createjs || {};
return "[CordovaAudioSoundInstance]";
};
-//Private Methods
+ //Private Methods
/**
* media object has failed and likely will never work
* @method _handleMediaError
@@ -179,7 +184,7 @@ this.createjs = this.createjs || {};
p._handleCleanUp = function () {
clearTimeout(this._audioSpriteTimeout);
this._playbackResource.pause(); // OJR cannot use .stop as it prevents .seekTo from working
- // todo consider media.release
+ this._playbackResource.release();
};
p._handleSoundReady = function (event) {
diff --git a/src/soundjs/flashaudio/FlashAudioPlugin.js b/src/soundjs/flashaudio/FlashAudioPlugin.js
index 85582f3b..166489e7 100644
--- a/src/soundjs/flashaudio/FlashAudioPlugin.js
+++ b/src/soundjs/flashaudio/FlashAudioPlugin.js
@@ -316,6 +316,8 @@ this.createjs = this.createjs || {};
this._loaderClass.setFlash(this._flash);
this._soundInstanceClass.setFlash(this._flash);
+
+ this._updateVolume();
};
/**
@@ -326,6 +328,7 @@ this.createjs = this.createjs || {};
* @since 0.4.0
*/
p._updateVolume = function () {
+ if(!this.flashReady) return true;
var newVolume = createjs.Sound._masterMute ? 0 : this._volume;
return this._flash.setMasterVolume(newVolume);
};
diff --git a/src/soundjs/flashaudio/FlashAudioPlugin.swf b/src/soundjs/flashaudio/FlashAudioPlugin.swf
index 60fbfa25..64ea45ca 100644
Binary files a/src/soundjs/flashaudio/FlashAudioPlugin.swf and b/src/soundjs/flashaudio/FlashAudioPlugin.swf differ
diff --git a/src/soundjs/webaudio/WebAudioPlugin.js b/src/soundjs/webaudio/WebAudioPlugin.js
index cce8c667..4c3ef0ff 100644
--- a/src/soundjs/webaudio/WebAudioPlugin.js
+++ b/src/soundjs/webaudio/WebAudioPlugin.js
@@ -229,6 +229,11 @@ this.createjs = this.createjs || {};
source.buffer = s._scratchBuffer;
source.connect(s.context.destination);
source.start(0, 0, 0);
+
+ //Chrome 55 fix
+ if (source.context.state === 'suspended') {
+ source.context.resume();
+ }
};
@@ -287,6 +292,13 @@ this.createjs = this.createjs || {};
} else {
return null;
}
+
+ // fix for chrome 66 autoplay issue: https://developers.google.com/web/updates/2017/09/autoplay-policy-changes#webaudio
+ document.addEventListener('click', function() {
+ if(s.context.state === 'suspended') {
+ s.context.resume();
+ }
+ });
}
if (s._scratchBuffer == null) {
s._scratchBuffer = s.context.createBuffer(1, 1, 22050);
@@ -298,6 +310,7 @@ this.createjs = this.createjs || {};
if ("ontouchstart" in window && s.context.state != "running") {
s._unlock(); // When played inside of a touch event, this will enable audio on iOS immediately.
document.addEventListener("mousedown", s._unlock, true);
+ document.addEventListener("touchstart", s._unlock, true);
document.addEventListener("touchend", s._unlock, true);
}
@@ -365,11 +378,17 @@ this.createjs = this.createjs || {};
* @private
*/
s._unlock = function() {
+
+ if(s.context.state === 'suspended') {
+ s.context.resume();
+ }
+
if (s._unlocked) { return; }
s.playEmptySound();
if (s.context.state == "running") {
document.removeEventListener("mousedown", s._unlock, true);
document.removeEventListener("touchend", s._unlock, true);
+ document.removeEventListener("touchstart", s._unlock, true);
s._unlocked = true;
}
};
diff --git a/src/soundjs/webaudio/WebAudioSoundInstance.js b/src/soundjs/webaudio/WebAudioSoundInstance.js
index 888564b2..c96adae1 100644
--- a/src/soundjs/webaudio/WebAudioSoundInstance.js
+++ b/src/soundjs/webaudio/WebAudioSoundInstance.js
@@ -273,6 +273,8 @@ this.createjs = this.createjs || {};
audioNode.buffer = this.playbackResource;
audioNode.connect(this.panNode);
var dur = this._duration * 0.001;
+ if(offset > dur)
+ offset = dur - 0.001;
audioNode.startTime = startTime + dur;
audioNode.start(audioNode.startTime, offset+(this._startTime*0.001), dur - offset);
return audioNode;