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}
diff --git a/modules/audio_processing/agc2/BUILD.gn b/modules/audio_processing/agc2/BUILD.gn
index 5ec3ce1..e122528 100644
--- a/modules/audio_processing/agc2/BUILD.gn
+++ b/modules/audio_processing/agc2/BUILD.gn
@@ -17,10 +17,10 @@
rtc_library("adaptive_digital") {
sources = [
- "adaptive_agc.cc",
- "adaptive_agc.h",
"adaptive_digital_gain_applier.cc",
"adaptive_digital_gain_applier.h",
+ "adaptive_digital_gain_controller.cc",
+ "adaptive_digital_gain_controller.h",
"adaptive_mode_level_estimator.cc",
"adaptive_mode_level_estimator.h",
"saturation_protector.cc",
diff --git a/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc b/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc
index deb03b0..a34f598 100644
--- a/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc
+++ b/modules/audio_processing/agc2/adaptive_digital_gain_applier.cc
@@ -118,7 +118,9 @@
AdaptiveDigitalGainApplier::AdaptiveDigitalGainApplier(
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),
gain_applier_(
/*hard_clip_samples=*/false,
@@ -134,7 +136,7 @@
RTC_DCHECK_GE(frames_to_gain_increase_allowed_, 1);
RTC_DCHECK_GE(config_.max_output_noise_level_dbfs, -90.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,
diff --git a/modules/audio_processing/agc2/adaptive_digital_gain_applier.h b/modules/audio_processing/agc2/adaptive_digital_gain_applier.h
index e254b51..dc84c1e 100644
--- a/modules/audio_processing/agc2/adaptive_digital_gain_applier.h
+++ b/modules/audio_processing/agc2/adaptive_digital_gain_applier.h
@@ -38,7 +38,9 @@
AdaptiveDigitalGainApplier(
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& operator=(const AdaptiveDigitalGainApplier&) =
delete;
diff --git a/modules/audio_processing/agc2/adaptive_digital_gain_applier_unittest.cc b/modules/audio_processing/agc2/adaptive_digital_gain_applier_unittest.cc
index efbc1e1..ea7485f 100644
--- a/modules/audio_processing/agc2/adaptive_digital_gain_applier_unittest.cc
+++ b/modules/audio_processing/agc2/adaptive_digital_gain_applier_unittest.cc
@@ -50,11 +50,15 @@
// Helper to create initialized `AdaptiveDigitalGainApplier` objects.
struct GainApplierHelper {
- explicit GainApplierHelper(const AdaptiveDigitalConfig& config)
+ GainApplierHelper(const AdaptiveDigitalConfig& config,
+ int sample_rate_hz,
+ int num_channels)
: apm_data_dumper(0),
gain_applier(
std::make_unique<AdaptiveDigitalGainApplier>(&apm_data_dumper,
- config)) {}
+ config,
+ sample_rate_hz,
+ num_channels)) {}
ApmDataDumper apm_data_dumper;
std::unique_ptr<AdaptiveDigitalGainApplier> gain_applier;
};
@@ -76,8 +80,7 @@
}
TEST(GainController2AdaptiveGainApplier, GainApplierShouldNotCrash) {
- GainApplierHelper helper(kDefaultConfig);
- helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kStereo);
+ GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/48000, kStereo);
// Make one call with reasonable audio level values and settings.
VectorFloatFrame fake_audio(kStereo, kFrameLen10ms48kHz, 10000.0f);
helper.gain_applier->Process(GetFrameInfoToNotAdapt(kDefaultConfig),
@@ -92,8 +95,7 @@
kDefaultConfig.max_gain_change_db_per_second)) +
kNumExtraFrames;
- GainApplierHelper helper(kDefaultConfig);
- helper.gain_applier->Initialize(/*sample_rate_hz=*/8000, kMono);
+ GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/8000, kMono);
AdaptiveDigitalGainApplier::FrameInfo info =
GetFrameInfoToNotAdapt(kDefaultConfig);
info.speech_level_dbfs = -60.0f;
@@ -108,8 +110,7 @@
}
TEST(GainController2AdaptiveGainApplier, GainDoesNotChangeFast) {
- GainApplierHelper helper(kDefaultConfig);
- helper.gain_applier->Initialize(/*sample_rate_hz=*/8000, kMono);
+ GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/8000, kMono);
constexpr float initial_level_dbfs = -25.0f;
constexpr float kMaxGainChangeDbPerFrame =
@@ -150,8 +151,7 @@
}
TEST(GainController2AdaptiveGainApplier, GainIsRampedInAFrame) {
- GainApplierHelper helper(kDefaultConfig);
- helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kMono);
+ GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/48000, kMono);
constexpr float initial_level_dbfs = -25.0f;
@@ -177,8 +177,7 @@
}
TEST(GainController2AdaptiveGainApplier, NoiseLimitsGain) {
- GainApplierHelper helper(kDefaultConfig);
- helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kMono);
+ GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/48000, kMono);
constexpr float initial_level_dbfs = -25.0f;
constexpr int num_initial_frames =
@@ -209,8 +208,7 @@
}
TEST(GainController2GainApplier, CanHandlePositiveSpeechLevels) {
- GainApplierHelper helper(kDefaultConfig);
- helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kStereo);
+ GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/48000, kStereo);
// Make one call with positive audio level values and settings.
VectorFloatFrame fake_audio(kStereo, kFrameLen10ms48kHz, 10000.0f);
@@ -221,8 +219,7 @@
}
TEST(GainController2GainApplier, AudioLevelLimitsGain) {
- GainApplierHelper helper(kDefaultConfig);
- helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kMono);
+ GainApplierHelper helper(kDefaultConfig, /*sample_rate_hz=*/48000, kMono);
constexpr float initial_level_dbfs = -25.0f;
constexpr int num_initial_frames =
@@ -262,8 +259,7 @@
DoNotIncreaseGainWithTooFewSpeechFrames) {
AdaptiveDigitalConfig config;
config.adjacent_speech_frames_threshold = adjacent_speech_frames_threshold();
- GainApplierHelper helper(config);
- helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kMono);
+ GainApplierHelper helper(config, /*sample_rate_hz=*/48000, kMono);
// Lower the speech level so that the target gain will be increased.
AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config);
@@ -285,8 +281,7 @@
TEST_P(AdaptiveDigitalGainApplierTest, IncreaseGainWithEnoughSpeechFrames) {
AdaptiveDigitalConfig config;
config.adjacent_speech_frames_threshold = adjacent_speech_frames_threshold();
- GainApplierHelper helper(config);
- helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kMono);
+ GainApplierHelper helper(config, /*sample_rate_hz=*/48000, kMono);
// Lower the speech level so that the target gain will be increased.
AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config);
@@ -316,7 +311,7 @@
TEST(GainController2GainApplier, DryRunDoesNotChangeInput) {
AdaptiveDigitalConfig config;
config.dry_run = true;
- GainApplierHelper helper(config);
+ GainApplierHelper helper(config, /*sample_rate_hz=*/8000, kMono);
// Simulate an input signal with log speech level.
AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config);
@@ -328,7 +323,6 @@
kNumExtraFrames;
constexpr float kPcmSamples = 123.456f;
// 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) {
SCOPED_TRACE(i);
VectorFloatFrame fake_audio(kMono, kFrameLen10ms8kHz, kPcmSamples);
@@ -341,13 +335,12 @@
TEST(GainController2GainApplier, DryRunHandlesSampleRateChange) {
AdaptiveDigitalConfig config;
config.dry_run = true;
- GainApplierHelper helper(config);
+ GainApplierHelper helper(config, /*sample_rate_hz=*/8000, kMono);
AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config);
info.speech_level_dbfs = -60.0f;
constexpr float kPcmSamples = 123.456f;
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());
EXPECT_FLOAT_EQ(fake_audio_8k.float_frame_view().channel(0)[0], kPcmSamples);
helper.gain_applier->Initialize(/*sample_rate_hz=*/48000, kMono);
@@ -361,13 +354,12 @@
TEST(GainController2GainApplier, DryRunHandlesNumChannelsChange) {
AdaptiveDigitalConfig config;
config.dry_run = true;
- GainApplierHelper helper(config);
+ GainApplierHelper helper(config, /*sample_rate_hz=*/8000, kMono);
AdaptiveDigitalGainApplier::FrameInfo info = GetFrameInfoToNotAdapt(config);
info.speech_level_dbfs = -60.0f;
constexpr float kPcmSamples = 123.456f;
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());
EXPECT_FLOAT_EQ(fake_audio_8k.float_frame_view().channel(0)[0], kPcmSamples);
VectorFloatFrame fake_audio_48k(kStereo, kFrameLen10ms8kHz, kPcmSamples);
diff --git a/modules/audio_processing/agc2/adaptive_agc.cc b/modules/audio_processing/agc2/adaptive_digital_gain_controller.cc
similarity index 80%
rename from modules/audio_processing/agc2/adaptive_agc.cc
rename to modules/audio_processing/agc2/adaptive_digital_gain_controller.cc
index 295a33f..381e454 100644
--- a/modules/audio_processing/agc2/adaptive_agc.cc
+++ b/modules/audio_processing/agc2/adaptive_digital_gain_controller.cc
@@ -8,7 +8,9 @@
* 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 "modules/audio_processing/agc2/vad_wrapper.h"
@@ -39,11 +41,13 @@
} // namespace
-AdaptiveAgc::AdaptiveAgc(
+AdaptiveDigitalGainController::AdaptiveDigitalGainController(
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),
- gain_controller_(apm_data_dumper, config),
+ gain_controller_(apm_data_dumper, config, sample_rate_hz, num_channels),
apm_data_dumper_(apm_data_dumper),
noise_level_estimator_(CreateNoiseFloorEstimator(apm_data_dumper)),
saturation_protector_(
@@ -55,15 +59,16 @@
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);
}
-void AdaptiveAgc::Process(AudioFrameView<float> frame,
- float speech_probability,
- float limiter_envelope) {
+void AdaptiveDigitalGainController::Process(AudioFrameView<float> frame,
+ float speech_probability,
+ float limiter_envelope) {
AudioLevels levels = ComputeAudioLevels(frame);
apm_data_dumper_->DumpRaw("agc2_input_rms_dbfs", levels.rms_dbfs);
apm_data_dumper_->DumpRaw("agc2_input_peak_dbfs", levels.peak_dbfs);
@@ -95,7 +100,7 @@
gain_controller_.Process(info, frame);
}
-void AdaptiveAgc::HandleInputGainChange() {
+void AdaptiveDigitalGainController::HandleInputGainChange() {
speech_level_estimator_.Reset();
saturation_protector_->Reset();
}
diff --git a/modules/audio_processing/agc2/adaptive_agc.h b/modules/audio_processing/agc2/adaptive_digital_gain_controller.h
similarity index 62%
rename from modules/audio_processing/agc2/adaptive_agc.h
rename to modules/audio_processing/agc2/adaptive_digital_gain_controller.h
index a9a6985..75ea445 100644
--- a/modules/audio_processing/agc2/adaptive_agc.h
+++ b/modules/audio_processing/agc2/adaptive_digital_gain_controller.h
@@ -8,8 +8,8 @@
* be found in the AUTHORS file in the root of the source tree.
*/
-#ifndef MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_AGC_H_
-#define MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_AGC_H_
+#ifndef MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_DIGITAL_GAIN_CONTROLLER_H_
+#define MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_DIGITAL_GAIN_CONTROLLER_H_
#include <memory>
@@ -23,22 +23,26 @@
namespace webrtc {
class ApmDataDumper;
-// Adaptive digital gain controller.
-// TODO(crbug.com/webrtc/7494): Rename to `AdaptiveDigitalGainController`.
-class AdaptiveAgc {
+// Gain controller that adapts and applies a variable digital gain to meet the
+// target level, which is determined by the given configuration.
+class AdaptiveDigitalGainController {
public:
- AdaptiveAgc(
+ AdaptiveDigitalGainController(
ApmDataDumper* apm_data_dumper,
- const AudioProcessing::Config::GainController2::AdaptiveDigital& config);
- ~AdaptiveAgc();
+ const AudioProcessing::Config::GainController2::AdaptiveDigital& config,
+ 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);
- // TODO(crbug.com/webrtc/7494): Add `SetLimiterEnvelope()`.
-
- // Analyzes `frame` and applies a digital adaptive gain to it. Takes into
- // account the speech probability and the envelope measured by the limiter.
- // TODO(crbug.com/webrtc/7494): Remove `limiter_envelope`.
+ // Analyzes `frame`, adapts the current digital gain and applies it to
+ // `frame`.
+ // TODO(bugs.webrtc.org/7494): Remove `limiter_envelope`.
void Process(AudioFrameView<float> frame,
float speech_probability,
float limiter_envelope);
@@ -56,4 +60,4 @@
} // namespace webrtc
-#endif // MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_AGC_H_
+#endif // MODULES_AUDIO_PROCESSING_AGC2_ADAPTIVE_DIGITAL_GAIN_CONTROLLER_H_
diff --git a/modules/audio_processing/gain_controller2.cc b/modules/audio_processing/gain_controller2.cc
index 8ca87c7..466e4b0 100644
--- a/modules/audio_processing/gain_controller2.cc
+++ b/modules/audio_processing/gain_controller2.cc
@@ -51,18 +51,14 @@
}
// Creates an adaptive digital gain controller if enabled.
-std::unique_ptr<AdaptiveAgc> CreateAdaptiveDigitalController(
+std::unique_ptr<AdaptiveDigitalGainController> CreateAdaptiveDigitalController(
const Agc2Config::AdaptiveDigital& config,
int sample_rate_hz,
int num_channels,
ApmDataDumper* data_dumper) {
if (config.enabled) {
- // TODO(bugs.webrtc.org/7494): Also init with sample rate and 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 std::make_unique<AdaptiveDigitalGainController>(
+ data_dumper, config, sample_rate_hz, num_channels);
}
return nullptr;
}
diff --git a/modules/audio_processing/gain_controller2.h b/modules/audio_processing/gain_controller2.h
index 7e28ee2..8c82d74 100644
--- a/modules/audio_processing/gain_controller2.h
+++ b/modules/audio_processing/gain_controller2.h
@@ -14,7 +14,7 @@
#include <memory>
#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/gain_applier.h"
#include "modules/audio_processing/agc2/limiter.h"
@@ -57,7 +57,7 @@
ApmDataDumper data_dumper_;
GainApplier fixed_gain_applier_;
std::unique_ptr<VoiceActivityDetectorWrapper> vad_;
- std::unique_ptr<AdaptiveAgc> adaptive_digital_controller_;
+ std::unique_ptr<AdaptiveDigitalGainController> adaptive_digital_controller_;
Limiter limiter_;
int calls_since_last_limiter_log_;
int analog_level_;