opus-encdec
Version:
A JavaScript library for encoding and decoding OPUS audio
143 lines (114 loc) • 3.69 kB
JavaScript
"use strict";
var OggOpusEncoder, OpusEncoderLib;
if(typeof require === 'function'){
OpusEncoderLib = require('./libopus-encoder.js');
OggOpusEncoder = require('./oggOpusEncoder.js').OggOpusEncoder;
} else {
importScripts('./libopus-encoder.js');
importScripts('./oggOpusEncoder.js');
}
// Run in AudioWorkletGlobal scope
if (typeof registerProcessor === 'function') {
class EncoderWorklet extends AudioWorkletProcessor {
constructor(){
super();
this.continueProcess = true;
this.port.onmessage = ({ data }) => {
if (this.encoder) {
switch( data['command'] ){
case 'getHeaderPages':
this.postPage(this.encoder.generateIdPage());
this.postPage(this.encoder.generateCommentPage());
break;
case 'done':
this.encoder.encodeFinalFrame().forEach(pageData => this.postPage(pageData));
this.encoder.destroy();
delete this.encoder;
this.port.postMessage( {message: 'done'} );
break;
case 'flush':
this.postPage(this.encoder.flush());
this.port.postMessage( {message: 'flushed'} );
break;
default:
// Ignore any unknown commands and continue recieving commands
}
}
switch( data['command'] ){
case 'close':
this.continueProcess = false;
break;
case 'init':
this.encoder = new OggOpusEncoder( data, OpusEncoderLib );
this.port.postMessage( {message: 'ready'} );
break;
default:
// Ignore any unknown commands and continue recieving commands
}
}
}
process(inputs) {
if (this.encoder && inputs[0] && inputs[0].length && inputs[0][0] && inputs[0][0].length){
this.encoder.encode( inputs[0] ).forEach(pageData => this.postPage(pageData));
}
return this.continueProcess;
}
postPage(pageData) {
if (pageData) {
this.port.postMessage( pageData, [pageData.page.buffer] );
}
}
}
registerProcessor('encoder-worklet', EncoderWorklet);
}
// run in scriptProcessor worker scope
else {
var encoder;
var postPageGlobal = (pageData) => {
if (pageData) {
postMessage( pageData, [pageData.page.buffer] );
}
}
onmessage = ({ data }) => {
if (encoder) {
switch( data['command'] ){
case 'encode':
encoder.encode( data['buffers'] ).forEach(pageData => postPageGlobal(pageData));
break;
case 'getHeaderPages':
postPageGlobal(encoder.generateIdPage());
postPageGlobal(encoder.generateCommentPage());
break;
case 'done':
encoder.encodeFinalFrame().forEach(pageData => postPageGlobal(pageData));
encoder.destroy();
encoder = null;
postMessage( {message: 'done'} );
break;
case 'flush':
postPageGlobal(encoder.flush());
postMessage( {message: 'flushed'} );
break;
default:
// Ignore any unknown commands and continue recieving commands
}
}
switch( data['command'] ){
case 'close':
close();
break;
case 'init':
encoder = new OggOpusEncoder( data, OpusEncoderLib );
postMessage( {message: 'ready'} );
break;
default:
// Ignore any unknown commands and continue recieving commands
}
};
}
// Exports for unit testing.
var module = module || {};
module.exports = {
OpusEncoderLib: OpusEncoderLib,
OggOpusEncoder: OggOpusEncoder
};