| /* |
| * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #ifndef MODULES_AUDIO_PROCESSING_AGC_GAIN_CONTROL_H_ |
| #define MODULES_AUDIO_PROCESSING_AGC_GAIN_CONTROL_H_ |
| |
| namespace webrtc { |
| |
| // The automatic gain control (AGC) component brings the signal to an |
| // appropriate range. This is done by applying a digital gain directly and, in |
| // the analog mode, prescribing an analog gain to be applied at the audio HAL. |
| // |
| // Recommended to be enabled on the client-side. |
| class GainControl { |
| public: |
| // When an analog mode is set, this must be called prior to `ProcessStream()` |
| // to pass the current analog level from the audio HAL. Must be within the |
| // range provided to `set_analog_level_limits()`. |
| virtual int set_stream_analog_level(int level) = 0; |
| |
| // When an analog mode is set, this should be called after `ProcessStream()` |
| // to obtain the recommended new analog level for the audio HAL. It is the |
| // users responsibility to apply this level. |
| virtual int stream_analog_level() const = 0; |
| |
| enum Mode { |
| // Adaptive mode intended for use if an analog volume control is available |
| // on the capture device. It will require the user to provide coupling |
| // between the OS mixer controls and AGC through the `stream_analog_level()` |
| // functions. |
| // |
| // It consists of an analog gain prescription for the audio device and a |
| // digital compression stage. |
| kAdaptiveAnalog, |
| |
| // Adaptive mode intended for situations in which an analog volume control |
| // is unavailable. It operates in a similar fashion to the adaptive analog |
| // mode, but with scaling instead applied in the digital domain. As with |
| // the analog mode, it additionally uses a digital compression stage. |
| kAdaptiveDigital, |
| |
| // Fixed mode which enables only the digital compression stage also used by |
| // the two adaptive modes. |
| // |
| // It is distinguished from the adaptive modes by considering only a |
| // short time-window of the input signal. It applies a fixed gain through |
| // most of the input level range, and compresses (gradually reduces gain |
| // with increasing level) the input signal at higher levels. This mode is |
| // preferred on embedded devices where the capture signal level is |
| // predictable, so that a known gain can be applied. |
| kFixedDigital |
| }; |
| |
| virtual int set_mode(Mode mode) = 0; |
| virtual Mode mode() const = 0; |
| |
| // Sets the target peak `level` (or envelope) of the AGC in dBFs (decibels |
| // from digital full-scale). The convention is to use positive values. For |
| // instance, passing in a value of 3 corresponds to -3 dBFs, or a target |
| // level 3 dB below full-scale. Limited to [0, 31]. |
| // |
| // TODO(ajm): use a negative value here instead, if/when VoE will similarly |
| // update its interface. |
| virtual int set_target_level_dbfs(int level) = 0; |
| virtual int target_level_dbfs() const = 0; |
| |
| // Sets the maximum `gain` the digital compression stage may apply, in dB. A |
| // higher number corresponds to greater compression, while a value of 0 will |
| // leave the signal uncompressed. Limited to [0, 90]. |
| virtual int set_compression_gain_db(int gain) = 0; |
| virtual int compression_gain_db() const = 0; |
| |
| // When enabled, the compression stage will hard limit the signal to the |
| // target level. Otherwise, the signal will be compressed but not limited |
| // above the target level. |
| virtual int enable_limiter(bool enable) = 0; |
| virtual bool is_limiter_enabled() const = 0; |
| |
| // Sets the `minimum` and `maximum` analog levels of the audio capture device. |
| // Must be set if and only if an analog mode is used. Limited to [0, 65535]. |
| virtual int set_analog_level_limits(int minimum, int maximum) = 0; |
| virtual int analog_level_minimum() const = 0; |
| virtual int analog_level_maximum() const = 0; |
| |
| // Returns true if the AGC has detected a saturation event (period where the |
| // signal reaches digital full-scale) in the current frame and the analog |
| // level cannot be reduced. |
| // |
| // This could be used as an indicator to reduce or disable analog mic gain at |
| // the audio HAL. |
| virtual bool stream_is_saturated() const = 0; |
| |
| protected: |
| virtual ~GainControl() {} |
| }; |
| } // namespace webrtc |
| |
| #endif // MODULES_AUDIO_PROCESSING_AGC_GAIN_CONTROL_H_ |