UNPKG

crossbrowdy

Version:

A Multimedia JavaScript framework to create real cross-platform and hybrid game engines, games, emulators, multimedia libraries and apps.

233 lines (197 loc) 6.74 kB
(function(T) { "use strict"; if (T.env !== "webkit") { return; } var fn = T.fn; var context = fn._audioContext; var BUFFERSIZE = 1024; function WebAudioAPINode(_args) { T.Object.call(this, 2, _args); fn.fixAR(this); var _ = this._; _.mode = ""; _.bufferL = new fn.SignalArray(BUFFERSIZE << 2); _.bufferR = new fn.SignalArray(BUFFERSIZE << 2); _.buffermask = _.bufferL.length - 1; _.node = null; _.script = context.createScriptProcessor(BUFFERSIZE, 2, 2); _.writeIndex = 0; _.readIndex = 0; _.totalRead = 0; _.totalWrite = 0; } fn.extend(WebAudioAPINode); var $ = WebAudioAPINode.prototype; Object.defineProperties($, { context: { get: function() { return context; } }, mode: { get: function() { return this._.mode; } } }); $.cancel = function() { var _ = this._; var cell = this.cells[0]; for (var i = 0, imax = cell.length; i < imax; ++i) { cell[i] = 0; } _.node = null; }; (function() { function WebAudioAPIRecvNode(_args) { WebAudioAPINode.call(this, _args); var _ = this._; _.mode = "recv"; _.script.onaudioprocess = make_recv_process(this); _.gain = context.createGain(); _.gain.gain.value = 0; _.script.connect(_.gain); } fn.extend(WebAudioAPIRecvNode, WebAudioAPINode); var make_recv_process = function(self) { return function(e) { var _ = self._; var ins = e.inputBuffer; var inputL = ins.getChannelData(0); var inputR = ins.getChannelData(1); var length = ins.length; var writeIndex = _.writeIndex; _.bufferL.set(inputL, writeIndex); _.bufferR.set(inputR, writeIndex); _.writeIndex = (writeIndex + length) & _.buffermask; _.totalWrite += length; }; }; var $ = WebAudioAPIRecvNode.prototype; $.cancel = function() { WebAudioAPINode.prototype.cancel.call(this); this._.gain.disconnect(); if(this._.node) { this._.node.disconnect(); } }; $.recv = function(node) { var _ = this._; try { _.node = node; _.node.connect(_.script); _.gain.connect(context.destination); } catch(e) { _.node = null; } _.writeIndex = 0; _.readIndex = 0; _.totalWrite = 0; _.totalRead = 0; return this; }; $.process = function(tickID) { var _ = this._; if (_.node === null) { return this; } if (this.tickID !== tickID) { this.tickID = tickID; var cellsize = _.cellsize; var bufferL = _.bufferL; var bufferR = _.bufferR; if (_.totalWrite > _.totalRead + cellsize) { var begin = _.readIndex; var end = begin + cellsize; this.cells[1].set(bufferL.subarray(begin, end)); this.cells[2].set(bufferR.subarray(begin, end)); _.readIndex = end & _.buffermask; _.totalRead += cellsize; } fn.outputSignalAR(this); } return this; }; fn.register("WebAudioAPI:recv", WebAudioAPIRecvNode); })(); (function() { function WebAudioAPISendNode(_args) { WebAudioAPINode.call(this, _args); fn.listener(this); var _ = this._; _.mode = "send"; _.script.onaudioprocess = make_send_process(this); _.connectIndex = null; } fn.extend(WebAudioAPISendNode, WebAudioAPINode); var make_send_process = function(self) { return function(e) { var _ = self._; var outs = e.outputBuffer; var length = outs.length; if (_.totalWrite > _.totalRead + length) { var begin = _.readIndex; var end = begin + length; outs.getChannelData(0).set(_.bufferL.subarray(begin, end)); outs.getChannelData(1).set(_.bufferR.subarray(begin, end)); _.readIndex = end & _.buffermask; _.totalRead += length; } }; }; var $ = WebAudioAPISendNode.prototype; $.cancel = function() { WebAudioAPINode.prototype.cancel.call(this); var _ = this._; if (_.connectIndex !== null) { _.script.disconnect(_.connectIndex); } else { _.script.disconnect(); } this.unlisten(); }; $.send = function(node, index) { var _ = this._; try { _.node = node; if (typeof index === "number") { _.script.connect(_.node, index); _.connectIndex = index; } else { _.script.connect(_.node); _.connectIndex = null; } this.listen(); } catch(e) { _.node = null; } _.writeIndex = 0; _.readIndex = 0; _.totalWrite = 0; _.totalRead = 0; return this; }; $.process = function(tickID) { var _ = this._; if (_.script === null) { return this; } if (this.tickID !== tickID) { this.tickID = tickID; var cellL = this.cells[1]; var cellR = this.cells[2]; var cellsize = _.cellsize; var writeIndex = _.writeIndex; fn.inputSignalAR(this); _.bufferL.set(cellL, writeIndex); _.bufferR.set(cellR, writeIndex); _.writeIndex = (writeIndex + cellsize) & _.buffermask; _.totalWrite += cellsize; fn.outputSignalAR(this); } return this; }; fn.register("WebAudioAPI:send", WebAudioAPISendNode); })(); })(timbre);