diff options
Diffstat (limited to 'third_party/libwebrtc/modules/audio_processing/gain_controller2.h')
-rw-r--r-- | third_party/libwebrtc/modules/audio_processing/gain_controller2.h | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/third_party/libwebrtc/modules/audio_processing/gain_controller2.h b/third_party/libwebrtc/modules/audio_processing/gain_controller2.h new file mode 100644 index 0000000000..304fa40489 --- /dev/null +++ b/third_party/libwebrtc/modules/audio_processing/gain_controller2.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2017 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_GAIN_CONTROLLER2_H_ +#define MODULES_AUDIO_PROCESSING_GAIN_CONTROLLER2_H_ + +#include <atomic> +#include <memory> +#include <string> + +#include "modules/audio_processing/agc2/adaptive_digital_gain_controller.h" +#include "modules/audio_processing/agc2/cpu_features.h" +#include "modules/audio_processing/agc2/gain_applier.h" +#include "modules/audio_processing/agc2/limiter.h" +#include "modules/audio_processing/agc2/vad_wrapper.h" +#include "modules/audio_processing/include/audio_processing.h" +#include "modules/audio_processing/logging/apm_data_dumper.h" + +namespace webrtc { + +class AudioBuffer; + +// Gain Controller 2 aims to automatically adjust levels by acting on the +// microphone gain and/or applying digital gain. +class GainController2 { + public: + // Ctor. If `use_internal_vad` is true, an internal voice activity + // detector is used for digital adaptive gain. + GainController2(const AudioProcessing::Config::GainController2& config, + int sample_rate_hz, + int num_channels, + bool use_internal_vad); + GainController2(const GainController2&) = delete; + GainController2& operator=(const GainController2&) = delete; + ~GainController2(); + + // Detects and handles changes of sample rate and/or number of channels. + void Initialize(int sample_rate_hz, int num_channels); + + // Sets the fixed digital gain. + void SetFixedGainDb(float gain_db); + + // Applies fixed and adaptive digital gains to `audio` and runs a limiter. + // If the internal VAD is used, `speech_probability` is ignored. Otherwise + // `speech_probability` is used for digital adaptive gain if it's available + // (limited to values [0.0, 1.0]). + void Process(absl::optional<float> speech_probability, AudioBuffer* audio); + + // Handles analog level changes. + void NotifyAnalogLevel(int level); + + static bool Validate(const AudioProcessing::Config::GainController2& config); + + AvailableCpuFeatures GetCpuFeatures() const { return cpu_features_; } + + private: + static std::atomic<int> instance_count_; + const AvailableCpuFeatures cpu_features_; + ApmDataDumper data_dumper_; + GainApplier fixed_gain_applier_; + std::unique_ptr<VoiceActivityDetectorWrapper> vad_; + std::unique_ptr<AdaptiveDigitalGainController> adaptive_digital_controller_; + Limiter limiter_; + int calls_since_last_limiter_log_; + int analog_level_; +}; + +} // namespace webrtc + +#endif // MODULES_AUDIO_PROCESSING_GAIN_CONTROLLER2_H_ |