in lex-web-ui/src/lib/lex/recorder.js [515:568]
_initStream() {
// TODO obtain with navigator.mediaDevices.getSupportedConstraints()
const constraints = {
audio: {
optional: [{
echoCancellation: this.requestEchoCancellation,
}],
},
};
return navigator.mediaDevices.getUserMedia(constraints)
.then((stream) => {
this._stream = stream;
this._tracks = stream.getAudioTracks();
console.info('using media stream track labeled: ', this._tracks[0].label);
// assumes single channel
this._tracks[0].onmute = this._setIsMicMuted;
this._tracks[0].onunmute = this._setIsMicMuted;
const source = this._audioContext.createMediaStreamSource(stream);
const gainNode = this._audioContext.createGain();
const analyser = this._audioContext.createAnalyser();
if (this.useBandPass) {
// bandpass filter around human voice
// https://developer.mozilla.org/en-US/docs/Web/API/BiquadFilterNode
const biquadFilter = this._audioContext.createBiquadFilter();
biquadFilter.type = 'bandpass';
biquadFilter.frequency.value = this.bandPassFrequency;
biquadFilter.gain.Q = this.bandPassQ;
source.connect(biquadFilter);
biquadFilter.connect(gainNode);
analyser.smoothingTimeConstant = 0.5;
} else {
source.connect(gainNode);
analyser.smoothingTimeConstant = 0.9;
}
analyser.fftSize = this.bufferLength;
analyser.minDecibels = -90;
analyser.maxDecibels = -30;
gainNode.connect(analyser);
analyser.connect(this._micVolumeProcessor);
this._analyserData = new Float32Array(analyser.frequencyBinCount);
this._analyser = analyser;
this._micVolumeProcessor.connect(this._audioContext.destination);
this._eventTarget.dispatchEvent(new Event('streamReady'));
});
}