Path: blob/master/webroot/rsrc/externals/javelin/lib/Sound.js
12242 views
/**1* @requires javelin-install2* @provides javelin-sound3* @javelin4*/567JX.install('Sound', {8statics: {9_sounds: {},10_queue: [],11_playingQueue: false,1213load: function(uri) {14var self = JX.Sound;1516if (!(uri in self._sounds)) {17var audio = JX.$N(18'audio',19{20src: uri,21preload: 'auto'22});2324// In Safari, it isn't good enough to just load a sound in response25// to a click: we must also play it. Once we've played it once, we26// can continue to play it freely.2728// Play the sound, then immediately pause it. This rejects the "play()"29// promise but marks the audio as playable, so our "play()" method will30// work correctly later.31if (window.webkitAudioContext) {32audio.play().then(JX.bag, JX.bag);33audio.pause();34}3536self._sounds[uri] = audio;37}38},3940play: function(uri, callback) {41var self = JX.Sound;42self.load(uri);4344var sound = self._sounds[uri];4546try {47sound.onended = callback || JX.bag;48sound.play().then(JX.bag, callback || JX.bag);49} catch (ex) {50JX.log(ex);51}52},5354queue: function(uri) {55var self = JX.Sound;56self._queue.push(uri);57self._playQueue();58},5960_playQueue: function() {61var self = JX.Sound;62if (self._playingQueue) {63return;64}65self._playingQueue = true;66self._nextQueue();67},6869_nextQueue: function() {70var self = JX.Sound;71if (self._queue.length) {72var next = self._queue[0];73self._queue.splice(0, 1);74self.play(next, self._nextQueue);75} else {76self._playingQueue = false;77}78}7980}81});828384