AGC2: AdaptiveAgc ctor with sample rate and # of channels

The class has also been renamed to better reflect its purpose.

Bug: webrtc:7494
Change-Id: I223a364ab4f8b8a5fef765848bf05675d045cefd
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/236343
Reviewed-by: Hanna Silen <silen@webrtc.org>
Commit-Queue: Alessio Bazzica <alessiob@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35277}
This commit is contained in:
Alessio Bazzica
2021-10-26 14:08:23 +02:00
committed by WebRTC LUCI CQ
parent ec19d5ea79
commit 2fa4618a3b
8 changed files with 65 additions and 64 deletions

View File

@ -17,10 +17,10 @@ group("agc2") {
rtc_library("adaptive_digital") { rtc_library("adaptive_digital") {
sources = [ sources = [
"adaptive_agc.cc",
"adaptive_agc.h",
"adaptive_digital_gain_applier.cc", "adaptive_digital_gain_applier.cc",
"adaptive_digital_gain_applier.h", "adaptive_digital_gain_applier.h",
"adaptive_digital_gain_controller.cc",
"adaptive_digital_gain_controller.h",
"adaptive_mode_level_estimator.cc", "adaptive_mode_level_estimator.cc",
"adaptive_mode_level_estimator.h", "adaptive_mode_level_estimator.h",
"saturation_protector.cc", "saturation_protector.cc",

View File

@ -118,7 +118,9 @@ void CopyAudio(AudioFrameView<const float> src,
AdaptiveDigitalGainApplier::AdaptiveDigitalGainApplier( AdaptiveDigitalGainApplier::AdaptiveDigitalGainApplier(
ApmDataDumper* apm_data_dumper, ApmDataDumper* apm_data_dumper,
const AudioProcessing::Config::GainController2::AdaptiveDigital& config) const AudioProcessing::Config::GainController2::AdaptiveDigital& config,
int sample_rate_hz,
int num_channels)
: apm_data_dumper_(apm_data_dumper), : apm_data_dumper_(apm_data_dumper),
gain_applier_( gain_applier_(
/*hard_clip_samples=*/false, /*hard_clip_samples=*/false,
@ -134,7 +136,7 @@ AdaptiveDigitalGainApplier::AdaptiveDigitalGainApplier(
RTC_DCHECK_GE(frames_to_gain_increase_allowed_, 1); RTC_DCHECK_GE(frames_to_gain_increase_allowed_, 1);
RTC_DCHECK_GE(config_.max_output_noise_level_dbfs, -90.0f); RTC_DCHECK_GE(config_.max_output_noise_level_dbfs, -90.0f);
RTC_DCHECK_LE(config_.max_output_noise_level_dbfs, 0.0f); RTC_DCHECK_LE(config_.max_output_noise_level_dbfs, 0.0f);
Initialize(/*sample_rate_hz=*/48000, /*num_channels=*/1); Initialize(sample_rate_hz, num_channels);
} }
void AdaptiveDigitalGainApplier::Initialize(int sample_rate_hz, void AdaptiveDigitalGainApplier::Initialize(int sample_rate_hz,

View File

@ -38,7 +38,9 @@ class AdaptiveDigitalGainApplier {
AdaptiveDigitalGainApplier( AdaptiveDigitalGainApplier(
ApmDataDumper* apm_data_dumper, ApmDataDumper* apm_data_dumper,
const AudioProcessing::Config::GainController2::AdaptiveDigital& config); const AudioProcessing::Config::GainController2::AdaptiveDigital& config,
int sample_rate_hz,
int num_channels);
AdaptiveDigitalGainApplier(const AdaptiveDigitalGainApplier&) = delete; AdaptiveDigitalGainApplier(const AdaptiveDigitalGainApplier&) = delete;
AdaptiveDigitalGainApplier& operator=(const AdaptiveDigitalGainApplier&) = AdaptiveDigitalGainApplier& operator=(const AdaptiveDigitalGainApplier&) =
delete; delete;

View File

@ -50,11 +50,15 @@ constexpr AdaptiveDigitalConfig kDefaultConfig{};
// Helper to create initialized `AdaptiveDigitalGainApplier` objects. // Helper to create initialized `AdaptiveDigitalGainApplier` objects.
struct GainApplierHelper { struct GainApplierHelper {
explicit GainApplierHelper(const AdaptiveDigitalConfig& config) GainApplierHelper(const AdaptiveDigitalConfig& config,
int sample_rate_hz,
int num_channels)
: apm_data_dumper(0), : apm_data_dumper(0),
gain_applier( gain_applier(
std::make_unique<AdaptiveDigitalGainApplier>(&apm_data_dumper, std::make_unique<AdaptiveDigitalGainApplier>(&apm_data_dumper,
config)) {} config,
sample_rate_hz,
num_channels)) {}
ApmDataDumper apm_data_dumper; ApmDataDumper apm_data_dumper;
std::unique_ptr<AdaptiveDigitalGainApplier> gain_applier; std::unique_ptr<AdaptiveDigitalGainApplier> gain_applier;
}; };
@ -76,8 +80,7 @@ AdaptiveDigitalGainApplier::FrameInfo GetFrameInfoToNotAdapt(
} }
TEST(GainController2AdaptiveGainApplier, GainApplierShouldNotCrash) { TEST(GainController2AdaptiveGainApplier, GainApplierShouldNotCrash) {
GainApplierHelper helper(kDefaultConfig); GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/48000, kStereo);
helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kStereo);
// Make one call with reasonable audio level values and settings. // Make one call with reasonable audio level values and settings.
VectorFloatFrame fake_audio(kStereo, kFrameLen10ms48kHz, 10000.0f); VectorFloatFrame fake_audio(kStereo, kFrameLen10ms48kHz, 10000.0f);
helper.gain_applier->Process(GetFrameInfoToNotAdapt(kDefaultConfig), helper.gain_applier->Process(GetFrameInfoToNotAdapt(kDefaultConfig),
@ -92,8 +95,7 @@ TEST(GainController2AdaptiveGainApplier, MaxGainApplied) {
kDefaultConfig.max_gain_change_db_per_second)) + kDefaultConfig.max_gain_change_db_per_second)) +
kNumExtraFrames; kNumExtraFrames;
GainApplierHelper helper(kDefaultConfig); GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/8000, kMono);
helper.gain_applier->Initialize(/*sample_rate_hz=*/8000, kMono);
AdaptiveDigitalGainApplier::FrameInfo info = AdaptiveDigitalGainApplier::FrameInfo info =
GetFrameInfoToNotAdapt(kDefaultConfig); GetFrameInfoToNotAdapt(kDefaultConfig);
info.speech_level_dbfs = -60.0f; info.speech_level_dbfs = -60.0f;
@ -108,8 +110,7 @@ TEST(GainController2AdaptiveGainApplier, MaxGainApplied) {
} }
TEST(GainController2AdaptiveGainApplier, GainDoesNotChangeFast) { TEST(GainController2AdaptiveGainApplier, GainDoesNotChangeFast) {
GainApplierHelper helper(kDefaultConfig); GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/8000, kMono);
helper.gain_applier->Initialize(/*sample_rate_hz=*/8000, kMono);
constexpr float initial_level_dbfs = -25.0f; constexpr float initial_level_dbfs = -25.0f;
constexpr float kMaxGainChangeDbPerFrame = constexpr float kMaxGainChangeDbPerFrame =
@ -150,8 +151,7 @@ TEST(GainController2AdaptiveGainApplier, GainDoesNotChangeFast) {
} }
TEST(GainController2AdaptiveGainApplier, GainIsRampedInAFrame) { TEST(GainController2AdaptiveGainApplier, GainIsRampedInAFrame) {
GainApplierHelper helper(kDefaultConfig); GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/48000, kMono);
helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kMono);
constexpr float initial_level_dbfs = -25.0f; constexpr float initial_level_dbfs = -25.0f;
@ -177,8 +177,7 @@ TEST(GainController2AdaptiveGainApplier, GainIsRampedInAFrame) {
} }
TEST(GainController2AdaptiveGainApplier, NoiseLimitsGain) { TEST(GainController2AdaptiveGainApplier, NoiseLimitsGain) {
GainApplierHelper helper(kDefaultConfig); GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/48000, kMono);
helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kMono);
constexpr float initial_level_dbfs = -25.0f; constexpr float initial_level_dbfs = -25.0f;
constexpr int num_initial_frames = constexpr int num_initial_frames =
@ -209,8 +208,7 @@ TEST(GainController2AdaptiveGainApplier, NoiseLimitsGain) {
} }
TEST(GainController2GainApplier, CanHandlePositiveSpeechLevels) { TEST(GainController2GainApplier, CanHandlePositiveSpeechLevels) {
GainApplierHelper helper(kDefaultConfig); GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/48000, kStereo);
helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kStereo);
// Make one call with positive audio level values and settings. // Make one call with positive audio level values and settings.
VectorFloatFrame fake_audio(kStereo, kFrameLen10ms48kHz, 10000.0f); VectorFloatFrame fake_audio(kStereo, kFrameLen10ms48kHz, 10000.0f);
@ -221,8 +219,7 @@ TEST(GainController2GainApplier, CanHandlePositiveSpeechLevels) {
} }
TEST(GainController2GainApplier, AudioLevelLimitsGain) { TEST(GainController2GainApplier, AudioLevelLimitsGain) {
GainApplierHelper helper(kDefaultConfig); GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/48000, kMono);
helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kMono);
constexpr float initial_level_dbfs = -25.0f; constexpr float initial_level_dbfs = -25.0f;
constexpr int num_initial_frames = constexpr int num_initial_frames =
@ -262,8 +259,7 @@ TEST_P(AdaptiveDigitalGainApplierTest,
DoNotIncreaseGainWithTooFewSpeechFrames) { DoNotIncreaseGainWithTooFewSpeechFrames) {
AdaptiveDigitalConfig config; AdaptiveDigitalConfig config;
config.adjacent_speech_frames_threshold = adjacent_speech_frames_threshold(); config.adjacent_speech_frames_threshold = adjacent_speech_frames_threshold();
GainApplierHelper helper(config); GainApplierHelper helper(config, /*sample_rate_hz=*/48000, kMono);
helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kMono);
// Lower the speech level so that the target gain will be increased. // Lower the speech level so that the target gain will be increased.
AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config); AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config);
@ -285,8 +281,7 @@ TEST_P(AdaptiveDigitalGainApplierTest,
TEST_P(AdaptiveDigitalGainApplierTest, IncreaseGainWithEnoughSpeechFrames) { TEST_P(AdaptiveDigitalGainApplierTest, IncreaseGainWithEnoughSpeechFrames) {
AdaptiveDigitalConfig config; AdaptiveDigitalConfig config;
config.adjacent_speech_frames_threshold = adjacent_speech_frames_threshold(); config.adjacent_speech_frames_threshold = adjacent_speech_frames_threshold();
GainApplierHelper helper(config); GainApplierHelper helper(config, /*sample_rate_hz=*/48000, kMono);
helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kMono);
// Lower the speech level so that the target gain will be increased. // Lower the speech level so that the target gain will be increased.
AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config); AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config);
@ -316,7 +311,7 @@ INSTANTIATE_TEST_SUITE_P(GainController2,
TEST(GainController2GainApplier, DryRunDoesNotChangeInput) { TEST(GainController2GainApplier, DryRunDoesNotChangeInput) {
AdaptiveDigitalConfig config; AdaptiveDigitalConfig config;
config.dry_run = true; config.dry_run = true;
GainApplierHelper helper(config); GainApplierHelper helper(config, /*sample_rate_hz=*/8000, kMono);
// Simulate an input signal with log speech level. // Simulate an input signal with log speech level.
AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config); AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config);
@ -328,7 +323,6 @@ TEST(GainController2GainApplier, DryRunDoesNotChangeInput) {
kNumExtraFrames; kNumExtraFrames;
constexpr float kPcmSamples = 123.456f; constexpr float kPcmSamples = 123.456f;
// Run the gain applier and check that the PCM samples are not modified. // Run the gain applier and check that the PCM samples are not modified.
helper.gain_applier->Initialize(/*sample_rate_hz=*/8000, kMono);
for (int i = 0; i < num_frames_to_adapt; ++i) { for (int i = 0; i < num_frames_to_adapt; ++i) {
SCOPED_TRACE(i); SCOPED_TRACE(i);
VectorFloatFrame fake_audio(kMono, kFrameLen10ms8kHz, kPcmSamples); VectorFloatFrame fake_audio(kMono, kFrameLen10ms8kHz, kPcmSamples);
@ -341,13 +335,12 @@ TEST(GainController2GainApplier, DryRunDoesNotChangeInput) {
TEST(GainController2GainApplier, DryRunHandlesSampleRateChange) { TEST(GainController2GainApplier, DryRunHandlesSampleRateChange) {
AdaptiveDigitalConfig config; AdaptiveDigitalConfig config;
config.dry_run = true; config.dry_run = true;
GainApplierHelper helper(config); GainApplierHelper helper(config, /*sample_rate_hz=*/8000, kMono);
AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config); AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config);
info.speech_level_dbfs = -60.0f; info.speech_level_dbfs = -60.0f;
constexpr float kPcmSamples = 123.456f; constexpr float kPcmSamples = 123.456f;
VectorFloatFrame fake_audio_8k(kMono, kFrameLen10ms8kHz, kPcmSamples); VectorFloatFrame fake_audio_8k(kMono, kFrameLen10ms8kHz, kPcmSamples);
helper.gain_applier->Initialize(/*sample_rate_hz=*/8000, kMono);
helper.gain_applier->Process(info, fake_audio_8k.float_frame_view()); helper.gain_applier->Process(info, fake_audio_8k.float_frame_view());
EXPECT_FLOAT_EQ(fake_audio_8k.float_frame_view().channel(0)[0], kPcmSamples); EXPECT_FLOAT_EQ(fake_audio_8k.float_frame_view().channel(0)[0], kPcmSamples);
helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kMono); helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kMono);
@ -361,13 +354,12 @@ TEST(GainController2GainApplier, DryRunHandlesSampleRateChange) {
TEST(GainController2GainApplier, DryRunHandlesNumChannelsChange) { TEST(GainController2GainApplier, DryRunHandlesNumChannelsChange) {
AdaptiveDigitalConfig config; AdaptiveDigitalConfig config;
config.dry_run = true; config.dry_run = true;
GainApplierHelper helper(config); GainApplierHelper helper(config, /*sample_rate_hz=*/8000, kMono);
AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config); AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config);
info.speech_level_dbfs = -60.0f; info.speech_level_dbfs = -60.0f;
constexpr float kPcmSamples = 123.456f; constexpr float kPcmSamples = 123.456f;
VectorFloatFrame fake_audio_8k(kMono, kFrameLen10ms8kHz, kPcmSamples); VectorFloatFrame fake_audio_8k(kMono, kFrameLen10ms8kHz, kPcmSamples);
helper.gain_applier->Initialize(/*sample_rate_hz=*/8000, kMono);
helper.gain_applier->Process(info, fake_audio_8k.float_frame_view()); helper.gain_applier->Process(info, fake_audio_8k.float_frame_view());
EXPECT_FLOAT_EQ(fake_audio_8k.float_frame_view().channel(0)[0], kPcmSamples); EXPECT_FLOAT_EQ(fake_audio_8k.float_frame_view().channel(0)[0], kPcmSamples);
VectorFloatFrame fake_audio_48k(kStereo, kFrameLen10ms8kHz, kPcmSamples); VectorFloatFrame fake_audio_48k(kStereo, kFrameLen10ms8kHz, kPcmSamples);

View File

@ -8,7 +8,9 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#include "modules/audio_processing/agc2/adaptive_agc.h" #include "modules/audio_processing/agc2/adaptive_digital_gain_controller.h"
#include <algorithm>
#include "common_audio/include/audio_util.h" #include "common_audio/include/audio_util.h"
#include "modules/audio_processing/agc2/vad_wrapper.h" #include "modules/audio_processing/agc2/vad_wrapper.h"
@ -39,11 +41,13 @@ AudioLevels ComputeAudioLevels(AudioFrameView<float> frame) {
} // namespace } // namespace
AdaptiveAgc::AdaptiveAgc( AdaptiveDigitalGainController::AdaptiveDigitalGainController(
ApmDataDumper* apm_data_dumper, ApmDataDumper* apm_data_dumper,
const AudioProcessing::Config::GainController2::AdaptiveDigital& config) const AudioProcessing::Config::GainController2::AdaptiveDigital& config,
int sample_rate_hz,
int num_channels)
: speech_level_estimator_(apm_data_dumper, config), : speech_level_estimator_(apm_data_dumper, config),
gain_controller_(apm_data_dumper, config), gain_controller_(apm_data_dumper, config, sample_rate_hz, num_channels),
apm_data_dumper_(apm_data_dumper), apm_data_dumper_(apm_data_dumper),
noise_level_estimator_(CreateNoiseFloorEstimator(apm_data_dumper)), noise_level_estimator_(CreateNoiseFloorEstimator(apm_data_dumper)),
saturation_protector_( saturation_protector_(
@ -55,13 +59,14 @@ AdaptiveAgc::AdaptiveAgc(
RTC_DCHECK(saturation_protector_); RTC_DCHECK(saturation_protector_);
} }
AdaptiveAgc::~AdaptiveAgc() = default; AdaptiveDigitalGainController::~AdaptiveDigitalGainController() = default;
void AdaptiveAgc::Initialize(int sample_rate_hz, int num_channels) { void AdaptiveDigitalGainController::Initialize(int sample_rate_hz,
int num_channels) {
gain_controller_.Initialize(sample_rate_hz, num_channels); gain_controller_.Initialize(sample_rate_hz, num_channels);
} }
void AdaptiveAgc::Process(AudioFrameView<float> frame, void AdaptiveDigitalGainController::Process(AudioFrameView<float> frame,
float speech_probability, float speech_probability,
float limiter_envelope) { float limiter_envelope) {
AudioLevels levels = ComputeAudioLevels(frame); AudioLevels levels = ComputeAudioLevels(frame);
@ -95,7 +100,7 @@ void AdaptiveAgc::Process(AudioFrameView<float> frame,
gain_controller_.Process(info, frame); gain_controller_.Process(info, frame);
} }
void AdaptiveAgc::HandleInputGainChange() { void AdaptiveDigitalGainController::HandleInputGainChange() {
speech_level_estimator_.Reset(); speech_level_estimator_.Reset();
saturation_protector_->Reset(); saturation_protector_->Reset();
} }

View File

@ -8,8 +8,8 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#ifndef MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_AGC_H_ #ifndef MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_DIGITAL_GAIN_CONTROLLER_H_
#define MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_AGC_H_ #define MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_DIGITAL_GAIN_CONTROLLER_H_
#include <memory> #include <memory>
@ -23,22 +23,26 @@
namespace webrtc { namespace webrtc {
class ApmDataDumper; class ApmDataDumper;
// Adaptive digital gain controller. // Gain controller that adapts and applies a variable digital gain to meet the
// TODO(crbug.com/webrtc/7494): Rename to `AdaptiveDigitalGainController`. // target level, which is determined by the given configuration.
class AdaptiveAgc { class AdaptiveDigitalGainController {
public: public:
AdaptiveAgc( AdaptiveDigitalGainController(
ApmDataDumper* apm_data_dumper, ApmDataDumper* apm_data_dumper,
const AudioProcessing::Config::GainController2::AdaptiveDigital& config); const AudioProcessing::Config::GainController2::AdaptiveDigital& config,
~AdaptiveAgc(); int sample_rate_hz,
int num_channels);
AdaptiveDigitalGainController(const AdaptiveDigitalGainController&) = delete;
AdaptiveDigitalGainController& operator=(
const AdaptiveDigitalGainController&) = delete;
~AdaptiveDigitalGainController();
// Detects and handles changes of sample rate and or number of channels.
void Initialize(int sample_rate_hz, int num_channels); void Initialize(int sample_rate_hz, int num_channels);
// TODO(crbug.com/webrtc/7494): Add `SetLimiterEnvelope()`. // Analyzes `frame`, adapts the current digital gain and applies it to
// `frame`.
// Analyzes `frame` and applies a digital adaptive gain to it. Takes into // TODO(bugs.webrtc.org/7494): Remove `limiter_envelope`.
// account the speech probability and the envelope measured by the limiter.
// TODO(crbug.com/webrtc/7494): Remove `limiter_envelope`.
void Process(AudioFrameView<float> frame, void Process(AudioFrameView<float> frame,
float speech_probability, float speech_probability,
float limiter_envelope); float limiter_envelope);
@ -56,4 +60,4 @@ class AdaptiveAgc {
} // namespace webrtc } // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_AGC_H_ #endif // MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_DIGITAL_GAIN_CONTROLLER_H_

View File

@ -51,18 +51,14 @@ AvailableCpuFeatures GetAllowedCpuFeatures() {
} }
// Creates an adaptive digital gain controller if enabled. // Creates an adaptive digital gain controller if enabled.
std::unique_ptr<AdaptiveAgc> CreateAdaptiveDigitalController( std::unique_ptr<AdaptiveDigitalGainController> CreateAdaptiveDigitalController(
const Agc2Config::AdaptiveDigital& config, const Agc2Config::AdaptiveDigital& config,
int sample_rate_hz, int sample_rate_hz,
int num_channels, int num_channels,
ApmDataDumper* data_dumper) { ApmDataDumper* data_dumper) {
if (config.enabled) { if (config.enabled) {
// TODO(bugs.webrtc.org/7494): Also init with sample rate and num return std::make_unique<AdaptiveDigitalGainController>(
// channels. data_dumper, config, sample_rate_hz, num_channels);
auto controller = std::make_unique<AdaptiveAgc>(data_dumper, config);
// TODO(bugs.webrtc.org/7494): Remove once passed to the ctor.
controller->Initialize(sample_rate_hz, num_channels);
return controller;
} }
return nullptr; return nullptr;
} }

View File

@ -14,7 +14,7 @@
#include <memory> #include <memory>
#include <string> #include <string>
#include "modules/audio_processing/agc2/adaptive_agc.h" #include "modules/audio_processing/agc2/adaptive_digital_gain_controller.h"
#include "modules/audio_processing/agc2/cpu_features.h" #include "modules/audio_processing/agc2/cpu_features.h"
#include "modules/audio_processing/agc2/gain_applier.h" #include "modules/audio_processing/agc2/gain_applier.h"
#include "modules/audio_processing/agc2/limiter.h" #include "modules/audio_processing/agc2/limiter.h"
@ -57,7 +57,7 @@ class GainController2 {
ApmDataDumper data_dumper_; ApmDataDumper data_dumper_;
GainApplier fixed_gain_applier_; GainApplier fixed_gain_applier_;
std::unique_ptr<VoiceActivityDetectorWrapper> vad_; std::unique_ptr<VoiceActivityDetectorWrapper> vad_;
std::unique_ptr<AdaptiveAgc> adaptive_digital_controller_; std::unique_ptr<AdaptiveDigitalGainController> adaptive_digital_controller_;
Limiter limiter_; Limiter limiter_;
int calls_since_last_limiter_log_; int calls_since_last_limiter_log_;
int analog_level_; int analog_level_;