/* -*- mode:javascript; coding:utf-8; -*- */ 'use strict'; (function (window) { function on_ended(context) { if (this.link && this.link.buffer) { console.log('playing next sound'); queue.link = this.link; this.link.onended = _.partial(on_ended, context); this.link.play(context); } else { console.log('playing again'); this.play(context); } }; function Queue() { this.last = this; } Queue.prototype.append = function (x) { if (!this.seen || x.gt(this.seen)) { this.last.link = x; this.last = x; this.seen = { seq: x.seq, timestamp: x.timestamp }; return x; } else { return null; } }; var queue = new Queue(); window.AudioContext = window.AudioContext || window.webkitAudioContext; window.onload = function () { var context = new AudioContext(); var field = document.getElementById("field"); var history = document.getElementById("history"); var send = document.getElementById('send'); var messages = []; var socket = io.connect('/'); socket.on('message', function (data) { if (data.message) { messages.push(data.message); var html = ''; for (var i = 0; i < messages.length; i++) { html += messages[i] + '
'; } history.innerHTML = html; if (data.queue) { _.each(data.queue, function (s) { try { var sample = new Sample(s); if (queue.append(sample)) { if (queue.link === sample) { sample.onended = _.partial(on_ended, context); sample.onload = function () { this.play(context); }; } sample.load(context); } } catch (e) { console.error((e.message || 'error') + ' in "' + s + '"'); } }); } } else { console.error('error: ', data); } }); send.onclick = function () { var text = field.value; socket.emit('send', { message: text }); }; }; })(window);