Skip to content

Instantly share code, notes, and snippets.

@jussi-kalliokoski
Created November 9, 2014 13:07
Show Gist options
  • Save jussi-kalliokoski/aa84fbb4cde7fc54ff01 to your computer and use it in GitHub Desktop.
Save jussi-kalliokoski/aa84fbb4cde7fc54ff01 to your computer and use it in GitHub Desktop.
Example of pre-initialized AudioWorker proposal
var context = new AudioContext();
var sineWorker = context.createAudioWorker("worker.js");
function createSineNode (frequency) {
var node = context.createAudioWorkerNode(sineWorker, {
numberOfInputChannels: 0,
numberOfOutputChannels: 1,
parameters: {
frequency: frequency || 440,
},
});
node.start = function (time) {
node.postMessage("start", { time: time });
};
}
var node = createSineNode(220);
node.connect(context.destination);
node.start(1.2);
var STATE_SILENCE = 0;
var STATE_WAITING_FOR_FIRST_FRAME = 1;
var STATE_PROCESSING = 2;
this.onaudionodecreated = function (event) {
var node = event.node;
var data = event.data;
var phase = 0;
var startTime = 0;
var state = STATE_SILENCE;
function process (frame, frequency, sampleRate) {
for ( var i = 0; i < frame.length; i++ ) {
frame[i] = Math.sin(phase * Math.PI * 2);
phase = frequency[i] / sampleRate;
}
}
node.onaudioprocess = function (event) {
var frame = event.outputBuffers[0];
var frequency = event.parameters.frequency;
var sampleRate = event.sampleRate;
switch ( state ) {
case STATE_SILENCE:
break;
case STATE_WAITING_FOR_FIRST_FRAME:
var startIndex = Math.floor(startTime * sampleRate);
var frameIndex = Math.floor(event.playbackTime * sampleRate);
if ( startIndex >= frameIndex + frame.length ) { return; }
var firstIndex = startIndex - frameIndex;
process(frame.subarray(firstIndex), frequency.subarray(firstIndex), sampleRate);
break;
case STATE_PROCESSING:
process(frame, frequency, sampleRate);
break;
}
};
node.onmessage = function (event) {
switch ( event.type ) {
case "start":
startTime = event.data.time;
break;
}
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment