TeaWeb/web/js/workers/codec/CodecWorker.ts

101 lines
3 KiB
TypeScript
Raw Normal View History

2018-04-11 17:56:09 +02:00
const prefix = "[CodecWorker] ";
2018-04-18 20:12:10 +02:00
const workerCallbackToken = "callback_token";
2018-04-11 17:56:09 +02:00
interface CodecWorker {
name();
2018-04-19 18:42:34 +02:00
initialise?() : string;
2018-04-11 17:56:09 +02:00
deinitialise();
decode(data: Uint8Array);
encode(data: Float32Array) : Uint8Array | string;
reset();
}
let codecInstance: CodecWorker;
onmessage = function(e: MessageEvent) {
let data = e.data;
2018-04-11 17:56:09 +02:00
let res: any = {};
res.token = data.token;
2018-04-18 20:12:10 +02:00
res.success = false;
2018-04-11 17:56:09 +02:00
2018-04-19 18:42:34 +02:00
//console.log(prefix + " Got from main: %o", data);
2018-04-11 17:56:09 +02:00
switch (data.command) {
case "initialise":
let error;
2018-11-12 13:00:13 +01:00
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);
2018-04-11 17:56:09 +02:00
break;
default:
error = "Could not find worker type!";
2018-04-11 17:56:09 +02:00
console.error("Could not resolve opus type!");
break;
2018-04-11 17:56:09 +02:00
}
error = error || codecInstance.initialise();
2018-04-19 18:42:34 +02:00
if(error)
res["message"] = error;
else
res["success"] = true;
2018-04-11 17:56:09 +02:00
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);
}
2018-04-18 20:12:10 +02:00
if(res.token && res.token.length > 0) sendMessage(res, e.origin);
2018-04-11 17:56:09 +02:00
};
2018-05-07 11:51:50 +02:00
function printMessageToServerTab(message: string) {
/*
sendMessage({
token: workerCallbackToken,
type: "chatmessage_server",
message: message
});
*/
}
2018-04-11 17:56:09 +02:00
declare function postMessage(message: any): void;
2018-04-18 20:12:10 +02:00
function sendMessage(message: any, origin?: string){
2018-05-07 11:51:50 +02:00
message["timestamp"] = Date.now();
postMessage(message);
2018-04-11 17:56:09 +02:00
}