Plato on Github
Report Home
src/audio/manager.js
Maintainability
116.68
Lines of code
108
Difficulty
35.77
Estimated Errors
0.92
Function weight
By Complexity
By SLOC
define(['jquery', 'clamp', '../log', '../audio', 'mixedice', 'eventmap'], function($, clamp, Log, Audio, mixedice, EventMap) { var AudioManager = function() { mixedice([this, AudioManager.prototype], new EventMap()); this.audioFiles = {}; }; var volume = 1; // default Object.defineProperty(AudioManager, 'volume', { get : function() { return volume; }, set : function(value) { volume = clamp(value, 0, 1); } }); /** * * @param {Object} options * @param {String} options.type ['music', 'sound'] * @param {String} options id * @param {Boolean} options loop * @param {Number} options volume * @param {Array} options paths paths to audio file with defined fallbacks * */ AudioManager.prototype.add = function(options) { options = $.extend({ 'id' : '', 'type' : 'sound', 'loop' : false, 'volume' : 1.0, 'paths' : [] }, options); // set volume in relation to current max volume options.volume *= volume; if (options.id === '') { Log.e('AudioManager.add: No id was given for new audio object'); return; } this.audioFiles[options.id] = new Audio(options); this.trigger('added', options.id, this.audioFiles[options.id]); return this.audioFiles[options]; }; AudioManager.prototype.play = function(id, loop) { if (!this.audioFiles[id]) { Log.e('AudioManager.play: No audio element found under id ' + id); return; } $('#' + id).off('ended'); $('#' + id).on('ended', { 'audioFile' : this.audioFiles[id], 'audioManager' : this, 'id' : id }, function(event) { if (event.data.audioFile.attr('loop') > 0 || event.data.audioFile.attr('loop') === -1) { event.data.audioFile.play(); event.data.audioManager.trigger('loopEnded', event.data.id, event.data.audioFile); } else { event.data.audioManager.trigger('ended', event.data.id, event.data.audioFile); } }); this.audioFiles[id].play(loop); this.trigger('play', id, this.audioFiles[id]); }; AudioManager.prototype.pause = function(id) { if (!this.audioFiles[id]) { Log.e('AudioManager.pause: No audio element found under id ' + id); return; } this.audioFiles[id].pause(); this.trigger('paused', id, this.audioFiles[id]); }; AudioManager.prototype.stop = function(id) { if (!this.audioFiles[id]) { Log.e('AudioManager.stop: No audio element found under id ' + id); return; } this.audioFiles[id].stop(); // ended event should be triggered automatically }; AudioManager.prototype.volume = function(id, volume) { if (!this.audioFiles[id]) { Log.e('AudioManager.volume: No audio element found under id ' + id); return; } if (volume) { this.audioFiles[id].volume = clamp(volume, 0, 1); } else { return this.audioFiles[id].volume; } }; return AudioManager; });