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; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| }); | }); | ||||