Skip to content

Commit

Permalink
Rewrite web worker for MP3 encoding
Browse files Browse the repository at this point in the history
  • Loading branch information
tassoevan committed Feb 15, 2019
1 parent c0046d5 commit d99f36a
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 42 deletions.
4 changes: 3 additions & 1 deletion packages/rocketchat-ui/client/lib/recorderjs/audioEncoder.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Meteor } from 'meteor/meteor';
import { settings } from 'meteor/rocketchat:settings';
import EventEmitter from 'wolfy87-eventemitter';

Expand All @@ -6,10 +7,11 @@ class AudioEncoder extends EventEmitter {
bufferLen = 4096,
numChannels = 1,
bitRate = settings.get('Message_Audio_bitRate') || 32,
workerPath = 'mp3-realtime-worker.js',
} = {}) {
super();

const workerPath = Meteor.absoluteUrl('mp3-realtime-worker.js');

this.worker = new Worker(workerPath);
this.worker.onmessage = this.handleWorkerMessage;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ class AudioRecorder {
}

const input = this.audioContext.createMediaStreamSource(this.stream);
this.encoder = new AudioEncoder(input, { numChannels: 1 });
this.encoder = new AudioEncoder(input);
}

destroyEncoder() {
Expand Down
71 changes: 31 additions & 40 deletions public/mp3-realtime-worker.js
Original file line number Diff line number Diff line change
@@ -1,72 +1,63 @@
(function () {
'use strict';
'use strict';

(function () {
importScripts('lame.min.js');

var mp3Encoder, maxSamples = 1152, samplesMono, config, dataBuffer;
var clearBuffer = function () {
dataBuffer = [];
};

var appendToBuffer = function (mp3Buf) {
dataBuffer.push(new Int8Array(mp3Buf));
};

var encoder;
var maxSamples = 1152;
var samplesMono;
var config;
var dataBuffer;

var init = function (prefConfig) {
config = prefConfig || {};
mp3Encoder = new lamejs.Mp3Encoder(1, config.sampleRate || 44100, config.bitRate || 128);
clearBuffer();
};
function convertBuffer(arrayBuffer) {
var input = new Float32Array(arrayBuffer);
var output = new Int16Array(arrayBuffer.length);

var floatTo16BitPCM = function floatTo16BitPCM(input, output) {
for (var i = 0; i < input.length; i++) {
for (var i = 0; i < input.length; i++) {
var s = Math.max(-1, Math.min(1, input[i]));
output[i] = (s < 0 ? s * 0x8000 : s * 0x7FFF);
}
};

var convertBuffer = function(arrayBuffer){
var data = new Float32Array(arrayBuffer);
var out = new Int16Array(arrayBuffer.length);
floatTo16BitPCM(data, out)
return out;
};
return output;
}

var encode = function (arrayBuffer) {
function init(config) {
config = config || {};
encoder = new lamejs.Mp3Encoder(config.numChannels || 1, config.sampleRate || 44100, config.bitRate || 32);
dataBuffer = [];
}

function encode(arrayBuffer) {
samplesMono = convertBuffer(arrayBuffer);
var remaining = samplesMono.length;
for (var i = 0; remaining >= 0; i += maxSamples) {
var left = samplesMono.subarray(i, i + maxSamples);
var mp3buf = mp3Encoder.encodeBuffer(left);
appendToBuffer(mp3buf);
var buffer = encoder.encodeBuffer(left);
dataBuffer.push(new Int8Array(buffer));
remaining -= maxSamples;
}
};

var finish = function () {
appendToBuffer(mp3Encoder.flush());
self.postMessage({
command: 'end',
buffer: dataBuffer
});
clearBuffer();
function finish() {
var buffer = encoder.flush();
dataBuffer.push(new Int8Array(buffer));
self.postMessage({ command: 'end', buffer: dataBuffer });
dataBuffer = [];
};

self.onmessage = function (e) {
switch (e.data.command) {
self.onmessage = function (event) {
switch (event.data.command) {
case 'init':
init(e.data.config);
init(event.data.config);
break;

case 'encode':
encode(e.data.buffer);
encode(event.data.buffer);
break;

case 'finish':
finish();
break;
}
};

})();

0 comments on commit d99f36a

Please sign in to comment.