// 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);