_initStream()

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'));
      });
  }