diff --git a/ts/Interfaces.ts b/ts/Interfaces.ts index aceffc6..11e7a10 100644 --- a/ts/Interfaces.ts +++ b/ts/Interfaces.ts @@ -55,6 +55,12 @@ export interface IStreamClientOptions { lang?: Constants.AVAILABLE_LANGUAGES; contentType?: string; readingInterval?: string; + /** + * Set the applied gain for the processed audio stream. + * + * @type {number} + */ + gain?: number; onOpen?: () => void; onClose?: () => void; onInit?: () => void; diff --git a/ts/Stream/StreamClient.ts b/ts/Stream/StreamClient.ts index bb86154..74d17aa 100644 --- a/ts/Stream/StreamClient.ts +++ b/ts/Stream/StreamClient.ts @@ -15,6 +15,7 @@ class StreamClient { private audioContext: AudioContext; private mediaStreamSource: MediaStreamAudioSourceNode; + private gainNode: GainNode; private userSpeechAnalyser: AnalyserNode; private recorder: Recorder; private resampleProcessor; @@ -29,7 +30,7 @@ class StreamClient { private onOpen; private onClose; private onInit; private onStartListening; private onStopListening; private onResults; private onEvent; private onError; - constructor(config: IStreamClientOptions = {}) { + constructor(private config: IStreamClientOptions = {}) { Processors.bindProcessors(); @@ -175,7 +176,14 @@ class StreamClient { this.mediaStreamSource = this.audioContext.createMediaStreamSource(stream); this.onEvent(IStreamClient.EVENT.MSG_MEDIA_STREAM_CREATED, "Media stream created"); + + // create audio nodes + this.gainNode = this.createGainNode(); this.userSpeechAnalyser = this.audioContext.createAnalyser(); + + // connect: input ~> gain ~> userSpeechAnalyser ~> output + this.mediaStreamSource.connect(this.gainNode); + this.gainNode.connect(this.userSpeechAnalyser); this.mediaStreamSource.connect(this.userSpeechAnalyser); this.recorder = new Recorder(this.mediaStreamSource); this.onEvent(IStreamClient.EVENT.MSG_INIT_RECORDER, "Recorder initialized"); @@ -185,6 +193,12 @@ class StreamClient { } } + private createGainNode(): GainNode { + const gainNode = this.audioContext.createGain(); + gainNode.gain.value = this.config.gain || gainNode.gain.defaultValue; + return gainNode; + } + private openWebSocket() { if (!this.recorder) { this.onError(IStreamClient.ERROR.ERR_AUDIO, "Recorder undefined");