TeaWeb/shared/js/workers/codec/CodecWorker.ts
2018-11-14 19:29:29 +01:00

101 lines
No EOL
3 KiB
TypeScript

const prefix = "[CodecWorker] ";
const workerCallbackToken = "callback_token";
interface CodecWorker {
name();
initialise?() : string;
deinitialise();
decode(data: Uint8Array);
encode(data: Float32Array) : Uint8Array | string;
reset();
}
let codecInstance: CodecWorker;
onmessage = function(e: MessageEvent) {
let data = e.data;
let res: any = {};
res.token = data.token;
res.success = false;
//console.log(prefix + " Got from main: %o", data);
switch (data.command) {
case "initialise":
let error;
console.log(prefix + "Got initialize for type " + CodecType[data.type as CodecType]);
switch (data.type as CodecType) {
case CodecType.OPUS_MUSIC:
codecInstance = new OpusWorker(2, OpusType.AUDIO);
break;
case CodecType.OPUS_VOICE:
codecInstance = new OpusWorker(1, OpusType.VOIP);
break;
default:
error = "Could not find worker type!";
console.error("Could not resolve opus type!");
break;
}
error = error || codecInstance.initialise();
if(error)
res["message"] = error;
else
res["success"] = true;
break;
case "encodeSamples":
let encodeArray = new Float32Array(data.dataLength);
for(let index = 0; index < encodeArray.length; index++)
encodeArray[index] = data.data[index];
let encodeResult = codecInstance.encode(encodeArray);
if(typeof encodeResult === "string") {
res.message = encodeResult;
} else {
res.success = true;
res.data = encodeResult;
res.dataLength = encodeResult.length;
}
break;
case "decodeSamples":
let decodeArray = new Uint8Array(data.dataLength);
for(let index = 0; index < decodeArray.length; index++)
decodeArray[index] = data.data[index];
let decodeResult = codecInstance.decode(decodeArray);
if(typeof decodeResult === "string") {
res.message = decodeResult;
} else {
res.success = true;
res.data = decodeResult;
res.dataLength = decodeResult.length;
}
break;
case "reset":
codecInstance.reset();
break;
default:
console.error(prefix + "Unknown type " + data.command);
}
if(res.token && res.token.length > 0) sendMessage(res, e.origin);
};
function printMessageToServerTab(message: string) {
/*
sendMessage({
token: workerCallbackToken,
type: "chatmessage_server",
message: message
});
*/
}
declare function postMessage(message: any): void;
function sendMessage(message: any, origin?: string){
message["timestamp"] = Date.now();
postMessage(message);
}