88 lines
2.1 KiB
JavaScript
88 lines
2.1 KiB
JavaScript
/* Usage:
|
|
|
|
mediator.on('audio:play', playTones );
|
|
mediator.on('audio:on', on );
|
|
mediator.on('audio:off', off );
|
|
mediator.on('audio:mute', mute );
|
|
mediator.on('audio:unmute', unmute );
|
|
|
|
*/
|
|
|
|
// Sounds module, used for emitting those annoying bl-up sounds when receiving a message
|
|
define(['queue','castrato','templates'], function (queue,mediator,templates) {
|
|
|
|
var
|
|
// Private variables
|
|
ac = false,
|
|
enabled = true,
|
|
muted = false,
|
|
|
|
// Recursive function for playing tones
|
|
// accepts an array of [tone,start_ms,duration_ms] - entries
|
|
playTones = function (tones, i) {
|
|
|
|
// Parameter defaults
|
|
i = (i === undefined) ? 0 : i;
|
|
|
|
// Stop if we've reached the end of iteration, and require ac, also stop if we're muted
|
|
if (!ac || !enabled || !(i < Object.keys(tones).length) || muted) {
|
|
return;
|
|
}
|
|
|
|
// Add tones to execution queue
|
|
var current_tones = tones[i],
|
|
freqs = current_tones[0],
|
|
start = current_tones[1],
|
|
duration = current_tones[2];
|
|
|
|
var o = ac.createOscillator();
|
|
var g = ac.createGain();
|
|
o.frequency.value = freqs;
|
|
o.connect(g);
|
|
g.gain.value = 0.25;
|
|
g.connect(ac.destination);
|
|
queue.add_function_delayed(start,function() { o.noteOn && o.noteOn(0) || o.start(0); });
|
|
queue.add_function_delayed(start+duration,function() { o.noteOff && o.noteOff(0) || o.stop(0); });
|
|
|
|
// Iterate, or start playing
|
|
i++;
|
|
if( i < Object.keys(tones).length ) {
|
|
playTones(tones,i);
|
|
} else {
|
|
queue.run();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
on = function() {
|
|
enabled = true;
|
|
},
|
|
|
|
off = function() {
|
|
enabled = false;
|
|
},
|
|
|
|
mute = function() {
|
|
muted = true;
|
|
mediator.emit('console:info',templates.messages.muted);
|
|
},
|
|
|
|
unmute = function() {
|
|
muted = false;
|
|
mediator.emit('console:info',templates.messages.unmuted);
|
|
};
|
|
|
|
// Find audio context
|
|
if (window.AudioContext || window.webkitAudioContext) {
|
|
ac = new (window.AudioContext || window.webkitAudioContext);
|
|
}
|
|
|
|
// Connect events
|
|
mediator.on('audio:play', function(tones) {playTones(tones); } );
|
|
mediator.on('audio:on', on );
|
|
mediator.on('audio:off', off );
|
|
mediator.on('audio:mute', mute );
|
|
mediator.on('audio:unmute', unmute );
|
|
|
|
}); |