66 lines
2.0 KiB
JavaScript
66 lines
2.0 KiB
JavaScript
|
(function(window) {
|
||
|
var AUDIO_RECORDER_WORKER = 'js/audioRecorderWorker.js';
|
||
|
var AudioRecorder = function(source, cfg) {
|
||
|
this.consumers = [];
|
||
|
var config = cfg || {};
|
||
|
var errorCallback = config.errorCallback || function() {};
|
||
|
var inputBufferLength = config.inputBufferLength || 4096;
|
||
|
var outputBufferLength = config.outputBufferLength || 4000;
|
||
|
this.context = source.context;
|
||
|
this.node = this.context.createScriptProcessor(inputBufferLength);
|
||
|
var worker = new Worker(config.worker || AUDIO_RECORDER_WORKER);
|
||
|
worker.postMessage({
|
||
|
command: 'init',
|
||
|
config: {
|
||
|
sampleRate: this.context.sampleRate,
|
||
|
outputBufferLength: outputBufferLength,
|
||
|
outputSampleRate: (config.outputSampleRate || 16000)
|
||
|
}
|
||
|
});
|
||
|
var recording = false;
|
||
|
this.node.onaudioprocess = function(e) {
|
||
|
if (!recording) return;
|
||
|
worker.postMessage({
|
||
|
command: 'record',
|
||
|
buffer: [
|
||
|
e.inputBuffer.getChannelData(0),
|
||
|
e.inputBuffer.getChannelData(1)
|
||
|
]
|
||
|
});
|
||
|
};
|
||
|
this.start = function(data) {
|
||
|
this.consumers.forEach(function(consumer, y, z) {
|
||
|
consumer.postMessage({ command: 'start', data: data });
|
||
|
recording = true;
|
||
|
return true;
|
||
|
});
|
||
|
recording = true;
|
||
|
return (this.consumers.length > 0);
|
||
|
};
|
||
|
this.stop = function() {
|
||
|
if (recording) {
|
||
|
this.consumers.forEach(function(consumer, y, z) {
|
||
|
consumer.postMessage({ command: 'stop' });
|
||
|
});
|
||
|
recording = false;
|
||
|
}
|
||
|
worker.postMessage({ command: 'clear' });
|
||
|
};
|
||
|
this.cancel = function() {
|
||
|
this.stop();
|
||
|
};
|
||
|
myClosure = this;
|
||
|
worker.onmessage = function(e) {
|
||
|
if (e.data.error && (e.data.error == "silent")) errorCallback("silent");
|
||
|
if ((e.data.command == 'newBuffer') && recording) {
|
||
|
myClosure.consumers.forEach(function(consumer, y, z) {
|
||
|
consumer.postMessage({ command: 'process', data: e.data.data });
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
source.connect(this.node);
|
||
|
this.node.connect(this.context.destination);
|
||
|
};
|
||
|
window.AudioRecorder = AudioRecorder;
|
||
|
})(window);
|