Changeset View
Changeset View
Standalone View
Standalone View
webroot/rsrc/externals/javelin/lib/Sound.js
/** | /** | ||||
* @requires javelin-install | * @requires javelin-install | ||||
* @provides javelin-sound | * @provides javelin-sound | ||||
* @javelin | * @javelin | ||||
*/ | */ | ||||
JX.install('Sound', { | JX.install('Sound', { | ||||
statics: { | statics: { | ||||
_sounds: {}, | _sounds: {}, | ||||
_queue: [], | |||||
_playingQueue: false, | |||||
load: function(uri) { | load: function(uri) { | ||||
var self = JX.Sound; | var self = JX.Sound; | ||||
if (!(uri in self._sounds)) { | if (!(uri in self._sounds)) { | ||||
self._sounds[uri] = JX.$N( | var audio = JX.$N( | ||||
'audio', | 'audio', | ||||
{ | { | ||||
src: uri, | src: uri, | ||||
preload: 'auto' | preload: 'auto' | ||||
}); | }); | ||||
// In Safari, it isn't good enough to just load a sound in response | |||||
// to a click: we must also play it. Once we've played it once, we | |||||
// can continue to play it freely. | |||||
// Play the sound, then immediately pause it. This rejects the "play()" | |||||
// promise but marks the audio as playable, so our "play()" method will | |||||
// work correctly later. | |||||
if (window.webkitAudioContext) { | |||||
audio.play().then(JX.bag, JX.bag); | |||||
audio.pause(); | |||||
} | |||||
self._sounds[uri] = audio; | |||||
} | } | ||||
}, | }, | ||||
play: function(uri) { | play: function(uri, callback) { | ||||
var self = JX.Sound; | var self = JX.Sound; | ||||
self.load(uri); | self.load(uri); | ||||
var sound = self._sounds[uri]; | var sound = self._sounds[uri]; | ||||
try { | try { | ||||
sound.play(); | sound.onended = callback || JX.bag; | ||||
sound.play().then(JX.bag, callback || JX.bag); | |||||
} catch (ex) { | } catch (ex) { | ||||
JX.log(ex); | JX.log(ex); | ||||
} | } | ||||
}, | |||||
queue: function(uri) { | |||||
var self = JX.Sound; | |||||
self._queue.push(uri); | |||||
self._playQueue(); | |||||
}, | |||||
_playQueue: function() { | |||||
var self = JX.Sound; | |||||
if (self._playingQueue) { | |||||
return; | |||||
} | } | ||||
self._playingQueue = true; | |||||
self._nextQueue(); | |||||
}, | |||||
_nextQueue: function() { | |||||
var self = JX.Sound; | |||||
if (self._queue.length) { | |||||
var next = self._queue[0]; | |||||
self._queue.splice(0, 1); | |||||
self.play(next, self._nextQueue); | |||||
} else { | |||||
self._playingQueue = false; | |||||
} | |||||
} | |||||
} | } | ||||
}); | }); |