mwss/rawpcmworklet.js
2025-02-12 22:25:29 +02:00

48 lines
1.3 KiB
JavaScript

// To explain succinctly, the people who designed AudioWorklet and
// deprecated ScriptProcessorNode are retarded and we need a worklet
// that does basically nothing to get glitchless audio.
class RawPCMWorklet extends AudioWorkletProcessor {
constructor() {
super()
this.left = new Float32Array()
this.right = new Float32Array()
this.port.onmessage = (event) => {
var newaudioframes = event.data.audio
for(var i = 0; i < newaudioframes.length; i++) {
var newleft = new Float32Array(this.left.length + newaudioframes[i].left.length)
newleft.set(this.left, 0)
newleft.set(newaudioframes[i].left, this.left.length)
this.left = newleft
var newright = new Float32Array(this.right.length + newaudioframes[i].right.length)
newright.set(this.right, 0)
newright.set(newaudioframes[i].right, this.right.length)
this.right = newright
}
}
}
process(inputs, outputs, parameters) {
const output = outputs[0]
var left = output[0]
var right = output[1]
var available = Math.min(left.length, this.left.length)
left.set(this.left.slice(0, available))
right.set(this.right.slice(0, available))
this.left = this.left.slice(available)
this.right = this.right.slice(available)
return true;
}
}
registerProcessor('rawpcmworklet', RawPCMWorklet);