UNPKG

stream-audio-level

Version:
77 lines 2.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.watchStreamAudioLevel = void 0; const averageFreqData = (bin, sampleRate, minHz, maxHz) => { let sum = 0; let n = 0; const binCount = bin.length; for (let i = 0; i < binCount; i++) { const hz = (i * sampleRate) / binCount; if (minHz !== undefined && hz < minHz) { continue; } if (maxHz !== undefined && hz > maxHz) { continue; } sum += bin[i]; n++; } const average = sum / n; return average; }; const maxFreqData = (bin, sampleRate, minHz, maxHz) => { let maxVal = -Infinity; const binCount = bin.length; for (let i = 0; i < binCount; i++) { if (maxVal < bin[i]) { const hz = (i * sampleRate) / binCount; if (minHz !== undefined && hz < minHz) { continue; } if (maxHz !== undefined && hz > maxHz) { continue; } maxVal = bin[i]; } } return maxVal; }; exports.watchStreamAudioLevel = (stream, onUpdate, opt) => { const calcMethod = (opt && opt.calcMethod) || 'average'; const valueType = (opt && opt.valueType) || 'byte'; const AudioContext = window.AudioContext || window.webkitAudioContext; const audioContext = new AudioContext(); const analyser = audioContext.createAnalyser(); const mediaStreamSource = audioContext.createMediaStreamSource(stream); const processor = audioContext.createScriptProcessor(2048, 1, 1); analyser.smoothingTimeConstant = (opt && opt.smoothingTimeConstant) || 0.1; analyser.fftSize = (opt && opt.fftSize) || 512; mediaStreamSource.connect(analyser); analyser.connect(processor); processor.connect(audioContext.destination); const calcF = calcMethod === 'average' ? averageFreqData : maxFreqData; const getFreqData = () => { if (valueType === 'byte') { const bin = new Uint8Array(analyser.frequencyBinCount); analyser.getByteFrequencyData(bin); return bin; } const bin = new Float32Array(analyser.frequencyBinCount); analyser.getFloatFrequencyData(bin); return bin; }; const handler = () => { const bin = getFreqData(); const v = calcF(bin, audioContext.sampleRate, opt && opt.minHz, opt && opt.maxHz); onUpdate(v); }; processor.onaudioprocess = handler; return () => { processor.removeEventListener('audioprocess', handler); analyser.disconnect(processor); processor.disconnect(audioContext.destination); mediaStreamSource.disconnect(analyser); audioContext.close(); }; }; //# sourceMappingURL=index.js.map