Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/webroot/rsrc/externals/javelin/lib/Sound.js
12242 views
1
/**
2
* @requires javelin-install
3
* @provides javelin-sound
4
* @javelin
5
*/
6
7
8
JX.install('Sound', {
9
statics: {
10
_sounds: {},
11
_queue: [],
12
_playingQueue: false,
13
14
load: function(uri) {
15
var self = JX.Sound;
16
17
if (!(uri in self._sounds)) {
18
var audio = JX.$N(
19
'audio',
20
{
21
src: uri,
22
preload: 'auto'
23
});
24
25
// In Safari, it isn't good enough to just load a sound in response
26
// to a click: we must also play it. Once we've played it once, we
27
// can continue to play it freely.
28
29
// Play the sound, then immediately pause it. This rejects the "play()"
30
// promise but marks the audio as playable, so our "play()" method will
31
// work correctly later.
32
if (window.webkitAudioContext) {
33
audio.play().then(JX.bag, JX.bag);
34
audio.pause();
35
}
36
37
self._sounds[uri] = audio;
38
}
39
},
40
41
play: function(uri, callback) {
42
var self = JX.Sound;
43
self.load(uri);
44
45
var sound = self._sounds[uri];
46
47
try {
48
sound.onended = callback || JX.bag;
49
sound.play().then(JX.bag, callback || JX.bag);
50
} catch (ex) {
51
JX.log(ex);
52
}
53
},
54
55
queue: function(uri) {
56
var self = JX.Sound;
57
self._queue.push(uri);
58
self._playQueue();
59
},
60
61
_playQueue: function() {
62
var self = JX.Sound;
63
if (self._playingQueue) {
64
return;
65
}
66
self._playingQueue = true;
67
self._nextQueue();
68
},
69
70
_nextQueue: function() {
71
var self = JX.Sound;
72
if (self._queue.length) {
73
var next = self._queue[0];
74
self._queue.splice(0, 1);
75
self.play(next, self._nextQueue);
76
} else {
77
self._playingQueue = false;
78
}
79
}
80
81
}
82
});
83
84