import { OpusWrapper } from './opus-wrapper'; export class Encoder { public static encode(buffer: AudioBuffer, format: String): Promise { return new Promise((resolve, reject) => { const encodingWorker = new Worker('/tp-audio-editor/encoding-worker.js'); encodingWorker.onmessage = e => { if (e.data.status === 'finished') { if (format === 'opus') { OpusWrapper.encode(e.data.blob).then(resolve, reject); encodingWorker.terminate(); } else { encodingWorker.terminate(); resolve(e.data.blob); } } else { encodingWorker.terminate(); reject('An error occured while encoding'); } }; encodingWorker.onerror = e => { encodingWorker.terminate(); reject(e); }; encodingWorker.postMessage({ format: format, buffer: Encoder.interleave(buffer), sampleRate: buffer.sampleRate }); }); } private static interleave(buffer: AudioBuffer): Float32Array[] { const channels = buffer.numberOfChannels; const out: Float32Array[] = []; for (let ch = 0; ch < buffer.numberOfChannels; ++ch) { out[ch] = buffer.getChannelData(0); } return out; } }