Created
November 9, 2014 13:07
-
-
Save jussi-kalliokoski/aa84fbb4cde7fc54ff01 to your computer and use it in GitHub Desktop.
Example of pre-initialized AudioWorker proposal
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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