TeaWeb/js/codec/Codec.js
2018-02-28 20:49:56 +01:00

58 lines
No EOL
2.3 KiB
JavaScript

class Codec {
constructor() { }
}
class OpusCodec extends Codec {
constructor() {
super();
this.channelCount = 1;
}
name() {
return "Opus";
}
initialise() {
this.fn_newHandle = Module.cwrap("codec_opus_createNativeHandle", "pointer", ["number"]);
this.fn_decode = Module.cwrap("codec_opus_decode", "number", ["pointer", "pointer", "number", "number"]); /* codec_opus_decode(handle, buffer, length, maxlength) */
this.fn_encode = Module.cwrap("codec_opus_encode", "number", ["pointer", "pointer", "number", "number"]);
this.nativeHandle = this.fn_newHandle(1);
}
deinitialise() {
}
decode(data) {
let maxBytes = 4096;
let buffer = Module._malloc(maxBytes);
let heapBytes = new Uint8Array(Module.HEAPU8.buffer, buffer, maxBytes);
heapBytes.set(data);
let result = this.fn_decode(this.nativeHandle, heapBytes.byteOffset, data.byteLength, maxBytes);
if (result < 0) {
Module._free(buffer);
return "invalid result on decode (" + result + ")";
}
let buf = Module.HEAPF32.slice(heapBytes.byteOffset / 4, (heapBytes.byteOffset / 4) + (result * 4 * this.channelCount));
Module._free(buffer);
return buf;
}
encode(data) {
let maxBytes = 4096 * 1 + 4;
let buffer = Module._malloc(maxBytes);
console.log("X");
let heapBytes = new Uint8Array(Module.HEAPU8.buffer, buffer, maxBytes);
//heapBytes.set(data);
let result = this.fn_encode(this.nativeHandle, heapBytes.byteOffset, 960, maxBytes);
if (result < 0) {
Module._free(buffer);
return "invalid result on encode (" + result + ")";
}
console.log("Bytes: " + result);
let buf = Module.HEAP8.slice(heapBytes.byteOffset, heapBytes.byteOffset + result);
Module._free(buffer);
return Uint8Array.from(buf);
}
_arrayToHeap(typedArray) {
let numBytes = typedArray.length * typedArray.BYTES_PER_ELEMENT;
let ptr = Module._malloc(numBytes);
let heapBytes = new Uint8Array(Module.HEAPU8.buffer, ptr, numBytes);
heapBytes.set(new Uint8Array(typedArray.buffer));
return heapBytes;
}
}
//# sourceMappingURL=Codec.js.map