Files
MeshChatX/meshchatx/src/frontend/public/assets/js/codec2-emscripten/processor.js
T

56 lines
2.0 KiB
JavaScript

class AudioProcessor extends AudioWorkletProcessor {
constructor() {
super();
this.bufferSize = 4096; // Adjust the buffer size as needed
this.sampleRate = 8000; // Target sample rate
this.inputBuffer = new Float32Array(this.bufferSize);
this.bufferIndex = 0;
}
process(inputs, outputs, parameters) {
const input = inputs[0];
if (input.length > 0) {
const inputData = input[0];
for (let i = 0; i < inputData.length; i++) {
if (this.bufferIndex < this.bufferSize) {
this.inputBuffer[this.bufferIndex++] = inputData[i];
}
if (this.bufferIndex === this.bufferSize) {
// Downsample the buffer and send to the main thread
const downsampledBuffer = this.downsampleBuffer(this.inputBuffer, this.sampleRate);
this.port.postMessage(downsampledBuffer);
this.bufferIndex = 0;
}
}
}
return true;
}
downsampleBuffer(buffer, targetSampleRate) {
if (targetSampleRate === this.sampleRate) {
return buffer;
}
const sampleRateRatio = this.sampleRate / targetSampleRate;
const newLength = Math.round(buffer.length / sampleRateRatio);
const result = new Float32Array(newLength);
let offsetResult = 0;
let offsetBuffer = 0;
while (offsetResult < result.length) {
const nextOffsetBuffer = Math.round((offsetResult + 1) * sampleRateRatio);
let accum = 0;
let count = 0;
for (let i = offsetBuffer; i < nextOffsetBuffer && i < buffer.length; i++) {
accum += buffer[i];
count++;
}
result[offsetResult] = accum / count;
offsetResult++;
offsetBuffer = nextOffsetBuffer;
}
return result;
}
}
registerProcessor('audio-processor', AudioProcessor);