'use strict'; var BufferLoader = function() { } BufferLoader.prototype.init = function(params) { var loader = this; loader.context = params.context; loader.bufferList = []; loader.loadCount = 0; loader.defaultParams = { }; loader.params = Object.create(params); Object.keys(loader.defaultParams).forEach(function (key) { if (!(key in params)) { params[key] = loader.defaultParams[key]; } }); } BufferLoader.prototype.requestBuffer = function(url, name) { var loader = this, request = new XMLHttpRequest(); request.open("GET", url, true); request.responseType = "arraybuffer"; request.onload = function() { loader.context.decodeAudioData(request.response, function(buffer) { if (!buffer) { alert('error decoding file data: '+url); return; } loader.loadCount++; loader.onAudioFileLoad(name, buffer); if (loader.loadCount === loader.urlList.length) { loader.onAudioFilesDone(loader.bufferList); } }, function(error) { console.error('decodeAudioData error',error); }); } request.onerror = function(){ alert('BufferLoader: XHR error'); }; request.send(); }; BufferLoader.prototype.loadAudio = function(aUrls, callback) { var names=[]; var paths=[]; for (var name in aUrls) { var path = aUrls[name]; names.push(name); paths.push(path); } this.urlList = paths; var i, length; for (i = 0, length = paths.length; i < length; i++) { this.requestBuffer(paths[i], names[i]); } } BufferLoader.prototype.onAudioFileLoad = function(name, buffer) { this.bufferList[name] = buffer; } BufferLoader.prototype.onAudioFilesDone = function(bufferList) { var fn = this.params.onComplete; fn(bufferList); }