(function () { 'use strict'; console.log('MP3 conversion worker started.'); importScripts('../lame.min.js'); var mp3Encoder, maxSamples = 1152, wav, samplesLeft, config, dataBuffer, samplesRight; var clearBuffer = function () { dataBuffer = []; }; var appendToBuffer = function (mp3Buf) { dataBuffer.push(new Int8Array(mp3Buf)); }; var init = function (prefConfig) { config = prefConfig || {}; clearBuffer(); }; var encode = function (arrayBuffer) { wav = lamejs.WavHeader.readHeader(new DataView(arrayBuffer)); console.log('wave:', wav); if (!wav) { self.postMessage({cmd: 'error', msg: 'Specified file is not a Wave file'}); return; } var dataView = new Int16Array(arrayBuffer, wav.dataOffset, wav.dataLen / 2); samplesLeft = wav.channels === 1 ? dataView : new Int16Array(wav.dataLen / (2 * wav.channels)); samplesRight = wav.channels === 2 ? new Int16Array(wav.dataLen / (2 * wav.channels)) : undefined; if (wav.channels > 1) { for (var i = 0; i < samplesLeft.length; i++) { samplesLeft[i] = dataView[i * 2]; samplesRight[i] = dataView[i * 2 + 1]; } } mp3Encoder = new lamejs.Mp3Encoder(wav.channels, wav.sampleRate, config.bitRate || 96); var remaining = samplesLeft.length; for (var i = 0; remaining >= maxSamples; i += maxSamples) { var left = samplesLeft.subarray(i, i + maxSamples); var right; if (samplesRight) { right = samplesRight.subarray(i, i + maxSamples); } var mp3buf = mp3Encoder.encodeBuffer(left, right); appendToBuffer(mp3buf); remaining -= maxSamples; self.postMessage({ cmd: 'progress', progress: (1 - remaining / samplesLeft.length) }); } }; var finish = function () { if (!wav) { return; } var mp3buf = mp3Encoder.flush(); appendToBuffer(mp3buf); self.postMessage({ cmd: 'end', buf: dataBuffer }); console.log('done encoding'); clearBuffer(); //free up memory }; self.onmessage = function (e) { switch (e.data.cmd) { case 'init': init(e.data.config); break; case 'encode': encode(e.data.rawInput); break; case 'finish': finish(); break; } }; })();