Some changes
parent
ecb8b7a686
commit
819836d706
|
@ -3,7 +3,7 @@ project(TeaWeb-Native)
|
|||
set(CMAKE_CXX_COMPILER "emcc")
|
||||
set(CMAKE_C_COMPILER "emcc")
|
||||
set(CMAKE_C_LINK_EXECUTABLE "emcc")
|
||||
set(CMAKE_CXX_FLAGS "-O2") #-s WASM=1
|
||||
set(CMAKE_CXX_FLAGS "-s ASSERTIONS=2") #-s WASM=1
|
||||
set(CMAKE_VERBOSE_MAKEFILE ON)
|
||||
set(CMAKE_EXE_LINKER_FLAGS "-s EXTRA_EXPORTED_RUNTIME_METHODS='[\"ccall\", \"cwrap\"]'") #
|
||||
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -5,7 +5,6 @@
|
|||
using namespace std;
|
||||
extern "C" {
|
||||
struct OpusHandle {
|
||||
string name;
|
||||
OpusEncoder* encoder = nullptr;
|
||||
OpusDecoder* decoder = nullptr;
|
||||
|
||||
|
@ -14,10 +13,10 @@ extern "C" {
|
|||
|
||||
EMSCRIPTEN_KEEPALIVE
|
||||
OpusHandle* codec_opus_createNativeHandle(size_t channelCount) {
|
||||
printf("inizalisized (%d)!\n", channelCount);
|
||||
auto codec = new OpusHandle;
|
||||
codec->name = "Opus codec!";
|
||||
codec->decoder = opus_decoder_create(48000, channelCount, nullptr);
|
||||
codec->encoder = opus_encoder_create(48000, channelCount, OPUS_APPLICATION_VOIP, nullptr);
|
||||
codec->encoder = opus_encoder_create(48000, channelCount, OPUS_APPLICATION_AUDIO, nullptr);
|
||||
return codec;
|
||||
}
|
||||
|
||||
|
@ -36,6 +35,10 @@ extern "C" {
|
|||
|
||||
EMSCRIPTEN_KEEPALIVE
|
||||
int codec_opus_encode(OpusHandle* handle, uint8_t* buffer, size_t length, size_t maxLength) {
|
||||
printf("codec_opus_encode(%p,%p,%d, %d)\n", handle->encoder, (void*) buffer, length, maxLength);
|
||||
float bbuffer[960];
|
||||
uint8_t rbuffer[120];
|
||||
return opus_encode_float(handle->encoder, bbuffer, 960, rbuffer, 120);
|
||||
auto result = opus_encode_float(handle->encoder, (float*) buffer, length / handle->channelCount, buffer, maxLength);
|
||||
if(result < 0) return result;
|
||||
return result;
|
||||
|
|
|
@ -10,10 +10,10 @@ class OpusCodec extends Codec {
|
|||
return "Opus";
|
||||
}
|
||||
initialise() {
|
||||
this.fn_newHandle = Module.cwrap("codec_opus_createNativeHandle", "pointer", []);
|
||||
this.fn_decode = Module.cwrap("codec_opus_encode", "number", ["pointer", "pointer", "length"]);
|
||||
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.nativeHandle = this.fn_newHandle();
|
||||
this.fn_encode = Module.cwrap("codec_opus_encode", "number", ["pointer", "pointer", "number", "number"]);
|
||||
this.nativeHandle = this.fn_newHandle(1);
|
||||
}
|
||||
deinitialise() {
|
||||
}
|
||||
|
@ -25,22 +25,27 @@ class OpusCodec extends Codec {
|
|||
let result = this.fn_decode(this.nativeHandle, heapBytes.byteOffset, data.byteLength, maxBytes);
|
||||
if (result < 0) {
|
||||
Module._free(buffer);
|
||||
return "invalid result (" + result + ")";
|
||||
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;
|
||||
}
|
||||
convertBlock(incomingData, length) {
|
||||
var i, l = length;
|
||||
var outputData = new Float32Array(length);
|
||||
for (i = 0; i < l; i++) {
|
||||
outputData[i] = (incomingData[i] - 128) / 128.0;
|
||||
}
|
||||
return outputData;
|
||||
}
|
||||
encode(data) {
|
||||
return undefined;
|
||||
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;
|
||||
|
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"Codec.js","sourceRoot":"","sources":["Codec.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"Codec.js","sourceRoot":"","sources":["Codec.ts"],"names":[],"mappings":"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"}
|
|
@ -7,7 +7,7 @@ abstract class Codec {
|
|||
|
||||
|
||||
abstract decode(data: Uint8Array) : Float32Array | string;
|
||||
abstract encode(data: Float32Array) : Uint8Array;
|
||||
abstract encode(data: Float32Array) : Uint8Array | string;
|
||||
}
|
||||
|
||||
class OpusCodec extends Codec {
|
||||
|
@ -16,6 +16,7 @@ class OpusCodec extends Codec {
|
|||
|
||||
private fn_newHandle: any;
|
||||
private fn_decode: any;
|
||||
private fn_encode: any;
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
|
@ -26,11 +27,11 @@ class OpusCodec extends Codec {
|
|||
}
|
||||
|
||||
initialise() {
|
||||
this.fn_newHandle = Module.cwrap("codec_opus_createNativeHandle", "pointer", []);
|
||||
this.fn_decode = Module.cwrap("codec_opus_encode", "number", ["pointer", "pointer", "length"]);
|
||||
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();
|
||||
this.nativeHandle = this.fn_newHandle(1);
|
||||
}
|
||||
|
||||
deinitialise() {
|
||||
|
@ -45,24 +46,28 @@ class OpusCodec extends Codec {
|
|||
let result = this.fn_decode(this.nativeHandle, heapBytes.byteOffset, data.byteLength, maxBytes);
|
||||
if(result < 0) {
|
||||
Module._free(buffer);
|
||||
return "invalid result (" + result + ")";
|
||||
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;
|
||||
}
|
||||
|
||||
convertBlock(incomingData, length: number) { // incoming data is a UInt8Array
|
||||
var i, l = length;
|
||||
var outputData = new Float32Array(length);
|
||||
for (i = 0; i < l; i++) {
|
||||
outputData[i] = (incomingData[i] - 128) / 128.0;
|
||||
encode(data: Float32Array): Uint8Array | string {
|
||||
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 + ")";
|
||||
}
|
||||
return outputData;
|
||||
}
|
||||
|
||||
encode(data: Float32Array): Uint8Array {
|
||||
return undefined;
|
||||
console.log("Bytes: " + result);
|
||||
let buf = Module.HEAP8.slice(heapBytes.byteOffset, heapBytes.byteOffset + result);
|
||||
Module._free(buffer);
|
||||
return Uint8Array.from(buf);
|
||||
}
|
||||
|
||||
private _arrayToHeap(typedArray: any){
|
||||
|
|
23
js/voice.js
23
js/voice.js
|
@ -59,18 +59,6 @@ class VoiceConnection {
|
|||
console.log("Got new data channel!");
|
||||
}
|
||||
onDataChannelMessage(message) {
|
||||
/*
|
||||
let bin = new Uint8Array(message.data);
|
||||
let clientId = bin[0] << 8 | bin[1];
|
||||
console.log("Client id " + clientId);
|
||||
let client = this.client.channelTree.findClient(clientId);
|
||||
if(!client) {
|
||||
console.error("Having voice from unknown client? (ClientID: " + clientId + ")");
|
||||
return;
|
||||
}
|
||||
var pcm = new Float32Array(message.data, 4);
|
||||
client.getAudioController().play(pcm);
|
||||
*/
|
||||
let bin = new Uint8Array(message.data);
|
||||
let clientId = bin[0] << 8 | bin[1];
|
||||
console.log("Client id " + clientId);
|
||||
|
@ -89,8 +77,15 @@ class VoiceConnection {
|
|||
sendPCMData(data) {
|
||||
console.log("SEND DATA!");
|
||||
//console.log(data);
|
||||
if (this.dataChannel)
|
||||
this.dataChannel.send(data);
|
||||
//FIXME just for debug
|
||||
if (this.dataChannel) {
|
||||
console.log("XXX");
|
||||
let enbcoded = this.codec.encode(data);
|
||||
if (enbcoded instanceof Uint8Array)
|
||||
this.dataChannel.send(enbcoded);
|
||||
else
|
||||
console.log("Invalid decode " + enbcoded);
|
||||
}
|
||||
}
|
||||
}
|
||||
class VoiceRecorder {
|
||||
|
|
File diff suppressed because one or more lines are too long
23
js/voice.ts
23
js/voice.ts
|
@ -80,18 +80,6 @@ class VoiceConnection {
|
|||
}
|
||||
|
||||
onDataChannelMessage(message) {
|
||||
/*
|
||||
let bin = new Uint8Array(message.data);
|
||||
let clientId = bin[0] << 8 | bin[1];
|
||||
console.log("Client id " + clientId);
|
||||
let client = this.client.channelTree.findClient(clientId);
|
||||
if(!client) {
|
||||
console.error("Having voice from unknown client? (ClientID: " + clientId + ")");
|
||||
return;
|
||||
}
|
||||
var pcm = new Float32Array(message.data, 4);
|
||||
client.getAudioController().play(pcm);
|
||||
*/
|
||||
let bin = new Uint8Array(message.data);
|
||||
let clientId = bin[0] << 8 | bin[1];
|
||||
console.log("Client id " + clientId);
|
||||
|
@ -110,8 +98,15 @@ class VoiceConnection {
|
|||
private sendPCMData(data: any) {
|
||||
console.log("SEND DATA!");
|
||||
//console.log(data);
|
||||
if(this.dataChannel) //FIXME just for debug
|
||||
this.dataChannel.send(data);
|
||||
//FIXME just for debug
|
||||
if(this.dataChannel) {
|
||||
console.log("XXX");
|
||||
let enbcoded = this.codec.encode(data);
|
||||
if(enbcoded instanceof Uint8Array)
|
||||
this.dataChannel.send(enbcoded);
|
||||
else console.log("Invalid decode " + enbcoded);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue