1
0
mirror of https://github.com/musix-org/musix-oss synced 2024-12-23 06:43:17 +00:00
musix-oss/node_modules/opusscript/index.js
MatteZ02 5eb0264906 fix
2019-05-30 12:06:47 +03:00

100 lines
3.4 KiB
JavaScript

"use strict";
var opusscript_native = require("./build/opusscript_native.js");
var OpusApplication = {
VOIP: 2048,
AUDIO: 2049,
RESTRICTED_LOWDELAY: 2051
};
var OpusError = {
"0": "OK",
"-1": "Bad argument",
"-2": "Buffer too small",
"-3": "Internal error",
"-4": "Invalid packet",
"-5": "Unimplemented",
"-6": "Invalid state",
"-7": "Memory allocation fail"
};
var VALID_SAMPLING_RATES = [8000, 12000, 16000, 24000, 48000];
var MAX_FRAME_SIZE = 48000 * 60 / 1000;
var MAX_PACKET_SIZE = 1276 * 3;
function OpusScript(samplingRate, channels, application) {
if(!~VALID_SAMPLING_RATES.indexOf(samplingRate)) {
throw new RangeError(`${samplingRate} is an invalid sampling rate.`);
}
this.samplingRate = samplingRate;
this.channels = channels || 1;
this.application = application || OpusApplication.AUDIO;
this.handler = new opusscript_native.OpusScriptHandler(this.samplingRate, this.channels, this.application);
this.inPCMLength = MAX_FRAME_SIZE * this.channels * 2;
this.inPCMPointer = opusscript_native._malloc(this.inPCMLength);
this.inPCM = opusscript_native.HEAPU16.subarray(this.inPCMPointer, this.inPCMPointer + this.inPCMLength);
this.inOpusPointer = opusscript_native._malloc(MAX_PACKET_SIZE);
this.inOpus = opusscript_native.HEAPU8.subarray(this.inOpusPointer, this.inOpusPointer + MAX_PACKET_SIZE);
this.outOpusPointer = opusscript_native._malloc(MAX_PACKET_SIZE);
this.outOpus = opusscript_native.HEAPU8.subarray(this.outOpusPointer, this.outOpusPointer + MAX_PACKET_SIZE);
this.outPCMLength = MAX_FRAME_SIZE * this.channels * 2;
this.outPCMPointer = opusscript_native._malloc(this.outPCMLength);
this.outPCM = opusscript_native.HEAPU16.subarray(this.outPCMPointer, this.outPCMPointer + this.outPCMLength);
};
OpusScript.prototype.encode = function encode(buffer, frameSize) {
this.inPCM.set(buffer);
var len = this.handler._encode(this.inPCM.byteOffset, buffer.length, this.outOpusPointer, frameSize);
if(len < 0) {
throw new Error("Encode error: " + OpusError["" + len]);
}
return new Buffer(this.outOpus.subarray(0, len));
};
OpusScript.prototype.decode = function decode(buffer) {
this.inOpus.set(buffer);
var len = this.handler._decode(this.inOpusPointer, buffer.length, this.outPCM.byteOffset);
if(len < 0) {
throw new Error("Decode error: " + OpusError["" + len]);
}
return new Buffer(this.outPCM.subarray(0, len * this.channels * 2));
};
OpusScript.prototype.encoderCTL = function encoderCTL(ctl, arg) {
var len = this.handler._encoder_ctl(ctl, arg);
if(len < 0) {
throw new Error("Encoder CTL error: " + OpusError["" + len]);
}
};
OpusScript.prototype.decoderCTL = function decoderCTL(ctl, arg) {
var len = this.handler._decoder_ctl(ctl, arg);
if(len < 0) {
throw new Error("Decoder CTL error: " + OpusError["" + len]);
}
};
OpusScript.prototype.delete = function del() {
opusscript_native.OpusScriptHandler.destroy_handler(this.handler);
opusscript_native._free(this.inPCMPointer);
opusscript_native._free(this.inOpusPointer);
opusscript_native._free(this.outOpusPointer);
opusscript_native._free(this.outPCMPointer);
};
OpusScript.Application = OpusApplication;
OpusScript.Error = OpusError;
OpusScript.VALID_SAMPLING_RATES = VALID_SAMPLING_RATES;
OpusScript.MAX_PACKET_SIZE = MAX_PACKET_SIZE;
module.exports = OpusScript;