Skip to content

Commit

Permalink
Fix: Initial configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
mohayonao committed Jun 5, 2012
1 parent 3bb185f commit bf906af
Show file tree
Hide file tree
Showing 5 changed files with 195 additions and 72 deletions.
25 changes: 16 additions & 9 deletions src/core/soundsystem.js
Expand Up @@ -11,15 +11,11 @@ var SoundSystem = (function() {
initialize.apply(this, arguments);
}, $this = SoundSystem.prototype;

var initialize = function(streamsize, channels) {
streamsize = streamsize || timbre.streamsize;
channels = channels || timbre.channels;
channels = (channels === 1) ? 1 : 2;

this.streamsize = streamsize;
this.channels = channels;
this.L = new Float32Array(streamsize);
this.R = new Float32Array(streamsize);
var initialize = function() {
this.streamsize = timbre.streamsize;
this.channels = timbre.channels;
this.L = new Float32Array(timbre.streamsize);
this.R = new Float32Array(timbre.streamsize);
this.cell = new Float32Array(timbre.cellsize);
this.seq_id = 0;

Expand All @@ -33,6 +29,17 @@ var SoundSystem = (function() {
this._.impl = new PlayerKlass(this);
};

$this.setup = function() {
if (this._.impl) this._.impl.setup();
this.streamsize = timbre.streamsize;
this.channels = timbre.channels;
this.L = new Float32Array(timbre.streamsize);
this.R = new Float32Array(timbre.streamsize);
this.cell = new Float32Array(timbre.cellsize);
this._.cellsize = timbre.cellsize;
if (timbre.samplerate === 0) timbre.samplerate = 44100;
};

$this.on = function() {
if (this._.impl) {
this._.ison = true;
Expand Down
24 changes: 24 additions & 0 deletions src/timbre.js
Expand Up @@ -4,6 +4,7 @@
"use strict";

// __BEGIN__

var timbre = function() {
return timbre.fn.init.apply(timbre, arguments);
};
Expand Down Expand Up @@ -59,8 +60,31 @@ Object.defineProperty(timbre, "isOff", {
get: function() { return !timbre.sys._.ison; }
});

timbre.setup = function(params) {
var samplerate, channels, cellsize, streamsize;

if (!Object.isFrozen(timbre)) {
params = params || {};
if (typeof params.samplerate === "number") {
timbre.samplerate = params.samplerate;
}
if (typeof params.channels === "number") {
timbre.channels = params.channels;
}
if (typeof params.cellsize === "number") {
timbre.cellsize = params.cellsize;
}
if (typeof params.streamsize === "number") {
timbre.cellsize = params.streamsize;
}
timbre.sys.setup();
Object.freeze(timbre);
}
};

timbre.on = function() {
if (!timbre.sys._.ison) {
timbre.setup();
timbre.sys.on();
timbre.fn.do_event(this, "on");
}
Expand Down
3 changes: 1 addition & 2 deletions src/timbre.txt
Expand Up @@ -28,7 +28,6 @@ var timbre = (function(context, timbre) {
}(context, timbre));

timbre.isEnabled = !!timbre.sys._.impl;
Object.freeze(timbre);


return timbre;
}(this));
2 changes: 1 addition & 1 deletion src/window/exports.js
Expand Up @@ -23,6 +23,6 @@ timbre.context = window;
console.log(x.join(""));
}());

window.T = timbre;
window.timbre = window.T = timbre;

// __END__
213 changes: 153 additions & 60 deletions src/window/player.js
Expand Up @@ -7,84 +7,177 @@ var timbre = require("../timbre");
var window = {};
// __BEGIN__

var setupTimbre = function(defaultSamplerate) {
switch (timbre.samplerate) {
case 11025: case 12000:
case 22050: case 24000:
case 44100: case 48000:
break;
default:
timbre.samplerate = defaultSamplerate;
}

switch (timbre.channels) {
default:
timbre.channels = 2;
}

switch (timbre.cellsize) {
case 64: case 128:
case 256: case 512:
break;
default:
timbre.cellsize = 128;
}

switch (timbre.streamsize) {
case 512: case 1024: case 2048:
case 4096: case 8192:
break;
default:
timbre.streamsize = 1024;
}
};


var WebKitPlayer = function(sys) {
var ctx, node, onaudioprocess;
var self = this;
var ctx, onaudioprocess;
var samplerate, dx;

ctx = new webkitAudioContext();
timbre.samplerate = ctx.sampleRate;
samplerate = ctx.sampleRate;

node = ctx.createJavaScriptNode(sys.streamsize, 1, sys.channels);

onaudioprocess = function(e) {
var inL, inR, outL, outR, i;
sys.process();
this.setup = function() {
setupTimbre(samplerate);
this.streamsize = timbre.streamsize;

inL = sys.L;
inR = sys.R;
outL = e.outputBuffer.getChannelData(0);
outR = e.outputBuffer.getChannelData(1);
for (i = outL.length; i--; ) {
outL[i] = inL[i];
outR[i] = inR[i];
if (timbre.samplerate === samplerate) {
onaudioprocess = function(e) {
var inL, inR, outL, outR, i;
sys.process();

inL = sys.L;
inR = sys.R;
outL = e.outputBuffer.getChannelData(0);
outR = e.outputBuffer.getChannelData(1);
for (i = outL.length; i--; ) {
outL[i] = inL[i];
outR[i] = inR[i];
}
};
} else {
dx = timbre.samplerate / samplerate;
onaudioprocess = function(e) {
var inL, inR, outL, outR, outLen;
var streamsize, x, prevL, prevR;
var index, delta, x0, x1, xx;
var i, imax;

inL = sys.L;
inR = sys.R;
outL = e.outputBuffer.getChannelData(0);
outR = e.outputBuffer.getChannelData(1);
outLen = outL.length;

streamsize = self.streamsize;
x = self.x;
for (i = 0, imax = outL.length; i < imax; ++i) {
if (x >= streamsize) {
sys.process();
x -= streamsize;
}

index = x|0;
delta = x - index;

x1 = inL[index];
xx = (1.0 - delta) * prevL + delta * x1;
prevL = x1;
outL[i] = xx;

x1 = inR[index];
xx = (1.0 - delta) * prevR + delta * x1;
prevR = x1;
outR[i] = xx;

x += dx;
}
self.x = x;
self.prevL = prevL;
self.prevR = prevR;
};
}

return this;
};

return {
on : function() {
this.node = ctx.createJavaScriptNode(sys.streamsize, 1, sys.channels);
this.node.onaudioprocess = onaudioprocess;
this.node.connect(ctx.destination);
},
off: function() {
this.node.disconnect();
this.node = null;
}
this.on = function() {
this.x = this.streamsize;
this.prevL = this.prevR = 0;
this.node = ctx.createJavaScriptNode(sys.streamsize, 1, sys.channels);
this.node.onaudioprocess = onaudioprocess;
this.node.connect(ctx.destination);
};
this.off = function() {
this.node.disconnect();
this.node = null;
};

return this.setup();
};

var MozPlayer = function(sys) {
var self = this;
var audio, timer;
var interval, interleaved;
var onaudioprocess;
var timer = new MutekiTimer();

audio = new Audio();
audio.mozSetup(sys.channels, timbre.samplerate);
timbre.samplerate = audio.mozSampleRate;
timbre.channels = audio.mozChannels;

timer = new MutekiTimer();
interval = (sys.streamsize / timbre.samplerate) * 1000;

interleaved = new Float32Array(sys.streamsize * sys.channels);

onaudioprocess = function() {
var inL, inR, i, j;
audio.mozWriteAudio(interleaved);
sys.process();
this.setup = function() {
var self = this;

inL = sys.L;
inR = sys.R;
setupTimbre(44100);

i = interleaved.length;
j = inL.length;
while (j--) {
interleaved[--i] = inR[j];
interleaved[--i] = inL[j];
}
this.audio = new Audio();
this.audio.mozSetup(timbre.channels, timbre.samplerate);
timbre.samplerate = this.audio.mozSampleRate;
timbre.channels = this.audio.mozChannels;

this.interval = (timbre.streamsize / timbre.samplerate) * 1000;
this.interleaved = new Float32Array(timbre.streamsize * timbre.channels);

this.onaudioprocess = function() {
var interleaved;
var inL, inR, i, j;

interleaved = self.interleaved;
self.audio.mozWriteAudio(interleaved);
sys.process();

inL = sys.L;
inR = sys.R;

i = interleaved.length;
j = inL.length;
while (j--) {
interleaved[--i] = inR[j];
interleaved[--i] = inL[j];
}
};

return this;
};

return {
on : function() {
timer.setInterval(onaudioprocess, interval);
},
off: function() {
timer.clearInterval();
for (var i = interleaved.length; i--; ) {
interleaved[i] = 0.0;
}
}
this.on = function() {
timer.setInterval(this.onaudioprocess, this.interval);
};

this.off = function() {
var interleaved = this.interleaved;
for (var i = interleaved.length; i--; ) {
interleaved[i] = 0.0;
}
timer.clearInterval();
}

return this.setup();
};

if (typeof webkitAudioContext === "function") {
Expand Down

0 comments on commit bf906af

Please sign in to comment.