web-audio-peak-meter
Version:
A customizable peak meter using the web audio API
48 lines (43 loc) • 1.63 kB
text/typescript
import { calculateLPFCoefficients, truePeakValues } from './true-peak';
class TruePeakProcessor extends AudioWorkletProcessor {
sampleRate: number;
numCoefficients: number;
upsampleFactor: number;
lpfCoefficients: number[];
lpfBuffers: number[][];
processCount: number;
constructor() {
super();
this.numCoefficients = 33;
//@ts-ignore
this.sampleRate = sampleRate;
this.upsampleFactor = this.sampleRate > 80000 ? 2 : 4;
this.lpfCoefficients = calculateLPFCoefficients(this.numCoefficients, this.upsampleFactor);
// this.lpfBuffers = new Array(this.numChannels).fill(new Array(numCoefficients).fill(0));
this.lpfBuffers = [];
this.port.postMessage({type: 'message', message: `true peak inited? ${this.sampleRate}`});
this.processCount = 0;
}
process(inputs:Float32Array[][]) {
const input = inputs[0];
if (input.length > this.lpfBuffers.length) {
for (let i = 1; i <= input.length; i += 1) {
if (i > this.lpfBuffers.length) {
this.lpfBuffers.push(new Array(this.numCoefficients).fill(0));
}
}
}
const maxes = truePeakValues(input, this.lpfBuffers, this.lpfCoefficients, this.upsampleFactor);
this.port.postMessage({type: 'peaks', peaks: maxes});
if (this.processCount % 100 === 0) {
this.port.postMessage({type: 'message', message: this.lpfBuffers});
}
this.processCount += 1;
return true;
}
}
try {
registerProcessor('true-peak-processor', TruePeakProcessor);
} catch (err) {
console.info('Failed to register true-peak-processor. This probably means it was already registered.');
}