/* -*- mode:javascript; coding:utf-8; -*- */ 'use strict'; (function (window) { var LOOP_COUNT = 4; function sample(json) { var x = JSON.parse(json); this.seq = x.seq || 0; this.timestamp = x.timestamp || 0; this.url = x.url; } sample.prototype.gt = function (x) { return this.timestamp > x.timestamp || this.timestamp === x.timestamp && this.seq > x.seq; }; sample.prototype.load = function (context) { var self = this; if (self.url) { var request = new XMLHttpRequest(); request.open('GET', self.url, true); request.responseType = 'arraybuffer'; request.onload = function (v) { if (v && v.target && v.target.status == 200) { context.decodeAudioData(request.response, function (buffer) { if (buffer) { self.buffer = buffer; if (self.onload) { self.onload(); } console.log('sample.load: finished ', self.url); } else { console.error('sample.load: no decoded data', self); } }, function (e) { console.error('sample.load: decodeAudioData error', e, self); }); } }; request.onerror = function (e) { var s = (e && e.target && e.target.status && e.target.statusText ? (e.target.status + ' ' + e.target.statusText) : 'error'); console.error('sample.load: ' + s + ' while loading', self); }; request.send(); } else { console.error('sample.load: no URL'); } }; sample.prototype.play = function (context) { var self = this; if (self.buffer) { var delay = self.buffer.duration * LOOP_COUNT var source = context.createBufferSource(); source.buffer = self.buffer; source.loop = true; source.connect(context.destination); source.start(context.currentTime); source.stop(context.currentTime + delay); window.setTimeout(function () { if (self.onended) { self.onended(); } }, delay * 1000); // does not work //source.onended = function (e) { // console.log(e); //}; } else { console.error('sample.play: no buffer', self); } }; window['Sample'] = sample; })(window);