Files
movim-rs/frontend/scripts/movim_jingle_session_audio_worklet.js
2026-10-24 14:03:52 +07:00

61 lines
1.6 KiB
JavaScript

class MovimJingleSessionAudioWorklet extends AudioWorkletProcessor {
static BUFFER_SIZE = 128 * 128;
constructor() {
super();
this.isMuteStep = 0;
this.remoteMaxLevel = 0;
this.buffer = new Float32Array(MovimJingleSessionAudioWorklet.BUFFER_SIZE);
this.offset = 0;
}
process(inputList, _outputList, _parameters) {
const input = inputList[0][0];
if (input != undefined) {
for (let i = 0; i < input.length; i++) {
this.buffer[i + this.offset] = input[i];
}
this.offset += input.length;
if (this.offset >= this.buffer.length - 1) {
this.flush();
}
return true;
}
}
flush() {
this.offset = 0;
var instant = 0.0;
var sum = 0.0;
for (var i = 0; i < this.buffer.length; ++i) {
sum += this.buffer[i] * this.buffer[i];
}
instant = Math.sqrt(sum / this.buffer.length);
this.remoteMaxLevel = Math.max(this.remoteMaxLevel, instant);
var base = (instant / this.remoteMaxLevel);
var level = (base > 0.05) ? base ** .3 : 0;
// Fallback in case we don't have the proper signalisation
if (level == 0) {
this.isMuteStep++;
} else {
this.isMuteStep = 0;
}
this.port.postMessage({
"isMuteStep": this.isMuteStep,
"level": level.toFixed(2),
"published": Date.now()
});
}
}
registerProcessor('jinglesession-audioworklet', MovimJingleSessionAudioWorklet);