123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- "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;
|