48 lines
1.3 KiB
JavaScript
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);
|