class PlayerAudioProcessor extends AudioWorkletProcessor { constructor() { super(); this.buffer = new Float32Array(); this.port.onmessage = (event) => { let newFetchedData = new Float32Array(this.buffer.length + event.data.audioData.length); newFetchedData.set(this.buffer, 0); newFetchedData.set(event.data.audioData, this.buffer.length); this.buffer = newFetchedData; }; } process(inputs, outputs, parameters) { const output = outputs[0]; const channel = output[0]; const bufferLength = this.buffer.length; for (let i = 0; i < channel.length; i++) { channel[i] = (i < bufferLength) ? this.buffer[i] : 0; } this.buffer = this.buffer.slice(channel.length); return true; } } class RecordAudioProcessor extends AudioWorkletProcessor { constructor() { super(); } process(inputs, outputs, parameters) { const channel = inputs[0][0]; if (!channel || channel.length === 0) { return true; } const int16Array = new Int16Array(channel.length); for (let i = 0; i < channel.length; i++) { int16Array[i] = channel[i] * 32767; } this.port.postMessage({ data: int16Array }); return true } } registerProcessor('play-audio-processor', PlayerAudioProcessor); registerProcessor('record-audio-processor', RecordAudioProcessor);