diff options
Diffstat (limited to 'public/js/sample.js')
| -rw-r--r-- | public/js/sample.js | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/public/js/sample.js b/public/js/sample.js new file mode 100644 index 0000000..d54be71 --- /dev/null +++ b/public/js/sample.js @@ -0,0 +1,94 @@ +/* -*- 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); |
