User:Brijsri/audiorecorder.js
Jump to navigation
Jump to search
Note: You may have to bypass your browser’s cache to see the changes. In addition, after saving a sitewide CSS file such as MediaWiki:Common.css, it will take 5-10 minutes before the changes take effect, even if you clear your cache.
- Mozilla / Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Command-R on a Macintosh);
- Konqueror and Chrome: click Reload or press F5;
- Opera: clear the cache in Tools → Preferences;
- Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5.
- This script lacks a documentation subpage. Please create it.
- Useful links: root page • root page’s subpages • links • redirects • your own
(function(window) {
var AUDIO_RECORDER_WORKER = '/w/index.php?title=User:Brijsri/audiorecorderworker.js&action=raw&ctype=text/javascript';
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);