Fix `AudioProcessingImplTest` tests on analog gain changes
`EchoControllerObservesAnalogAgc1EchoPathGainChange` is incorrect
since it does not call `set_stream_analog_level()`,
`ProcessCapture()` and `recommended_stream_analog_level()`
according to the contract.
`EchoControllerObservesNoDigitalAgc2EchoPathGainChange` is
useless since AGC2 doesn't have any analog controller at the
moment and the test is not written to explictly trigger digital
gain adaptations.
Bug: webrtc:7494, b/241923537
Change-Id: I56203c736448ec060077b00b57e98cd4c29fa737
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/271541
Reviewed-by: Hanna Silen <silen@webrtc.org>
Commit-Queue: Alessio Bazzica <alessiob@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38052}
diff --git a/modules/audio_processing/audio_processing_impl_unittest.cc b/modules/audio_processing/audio_processing_impl_unittest.cc
index 5e4e355..bb016e0 100644
--- a/modules/audio_processing/audio_processing_impl_unittest.cc
+++ b/modules/audio_processing/audio_processing_impl_unittest.cc
@@ -450,8 +450,7 @@
webrtc::AudioProcessing::Config apm_config;
// Enable AGC1.
apm_config.gain_controller1.enabled = true;
- apm_config.gain_controller1.mode =
- AudioProcessing::Config::GainController1::kAdaptiveAnalog;
+ apm_config.gain_controller1.analog_gain_controller.enabled = true;
apm_config.gain_controller2.enabled = false;
apm_config.pre_amplifier.enabled = false;
apm->ApplyConfig(apm_config);
@@ -465,34 +464,43 @@
MockEchoControl* echo_control_mock = echo_control_factory_ptr->GetNext();
- const int initial_analog_gain = apm->recommended_stream_analog_level();
+ constexpr int kInitialStreamAnalogLevel = 123;
+ apm->set_stream_analog_level(kInitialStreamAnalogLevel);
+
+ // When the first fame is processed, no echo path gain change must be
+ // detected.
EXPECT_CALL(*echo_control_mock, AnalyzeCapture(testing::_)).Times(1);
- EXPECT_CALL(*echo_control_mock, ProcessCapture(NotNull(), testing::_, false))
+ EXPECT_CALL(*echo_control_mock,
+ ProcessCapture(NotNull(), testing::_, /*echo_path_change=*/false))
.Times(1);
apm->ProcessStream(frame.data(), stream_config, stream_config, frame.data());
- // Force an analog gain change if it did not happen.
- if (initial_analog_gain == apm->recommended_stream_analog_level()) {
- apm->set_stream_analog_level(initial_analog_gain + 1);
+ // Simulate the application of the recommended analog level.
+ int recommended_analog_level = apm->recommended_stream_analog_level();
+ if (recommended_analog_level == kInitialStreamAnalogLevel) {
+ // Force an analog gain change if it did not happen.
+ recommended_analog_level++;
}
+ apm->set_stream_analog_level(recommended_analog_level);
+ // After the first fame and with a stream analog level change, the echo path
+ // gain change must be detected.
EXPECT_CALL(*echo_control_mock, AnalyzeCapture(testing::_)).Times(1);
- EXPECT_CALL(*echo_control_mock, ProcessCapture(NotNull(), testing::_, true))
+ EXPECT_CALL(*echo_control_mock,
+ ProcessCapture(NotNull(), testing::_, /*echo_path_change=*/true))
.Times(1);
apm->ProcessStream(frame.data(), stream_config, stream_config, frame.data());
}
+// Tests that a stream is successfully processed when AGC2 adaptive digital is
+// used and when the field trial
+// `WebRTC-Audio-TransientSuppressorVadMode/Enabled-Default/` is set.
TEST(AudioProcessingImplTest,
- EchoControllerObservesNoDigitalAgc2EchoPathGainChange) {
- // Tests that the echo controller doesn't observe an echo path gain change
- // when the AGC2 digital submodule changes the digital gain without analog
- // gain changes.
- auto echo_control_factory = std::make_unique<MockEchoControlFactory>();
- const auto* echo_control_factory_ptr = echo_control_factory.get();
- rtc::scoped_refptr<AudioProcessing> apm =
- AudioProcessingBuilderForTesting()
- .SetEchoControlFactory(std::move(echo_control_factory))
- .Create();
+ ProcessWithAgc2AndTransientSuppressorVadModeDefault) {
+ webrtc::test::ScopedFieldTrials field_trials(
+ "WebRTC-Audio-TransientSuppressorVadMode/Enabled-Default/");
+ rtc::scoped_refptr<AudioProcessing> apm = AudioProcessingBuilder().Create();
+ ASSERT_EQ(apm->Initialize(), AudioProcessing::kNoError);
webrtc::AudioProcessing::Config apm_config;
// Disable AGC1 analog.
apm_config.gain_controller1.enabled = false;
@@ -500,33 +508,27 @@
apm_config.gain_controller2.enabled = true;
apm_config.gain_controller2.adaptive_digital.enabled = true;
apm->ApplyConfig(apm_config);
-
- constexpr int16_t kAudioLevel = 1000;
- constexpr size_t kSampleRateHz = 48000;
- constexpr size_t kNumChannels = 2;
- std::array<int16_t, kNumChannels * kSampleRateHz / 100> frame;
- StreamConfig stream_config(kSampleRateHz, kNumChannels);
- frame.fill(kAudioLevel);
-
- MockEchoControl* echo_control_mock = echo_control_factory_ptr->GetNext();
-
- EXPECT_CALL(*echo_control_mock, AnalyzeCapture(testing::_)).Times(1);
- EXPECT_CALL(*echo_control_mock, ProcessCapture(NotNull(), testing::_,
- /*echo_path_change=*/false))
- .Times(1);
- apm->ProcessStream(frame.data(), stream_config, stream_config, frame.data());
-
- EXPECT_CALL(*echo_control_mock, AnalyzeCapture(testing::_)).Times(1);
- EXPECT_CALL(*echo_control_mock, ProcessCapture(NotNull(), testing::_,
- /*echo_path_change=*/false))
- .Times(1);
- apm->ProcessStream(frame.data(), stream_config, stream_config, frame.data());
+ constexpr int kSampleRateHz = 48000;
+ constexpr int kNumChannels = 1;
+ std::array<float, kSampleRateHz / 100> buffer;
+ float* channel_pointers[] = {buffer.data()};
+ StreamConfig stream_config(/*sample_rate_hz=*/kSampleRateHz,
+ /*num_channels=*/kNumChannels);
+ Random random_generator(2341U);
+ constexpr int kFramesToProcess = 10;
+ for (int i = 0; i < kFramesToProcess; ++i) {
+ RandomizeSampleVector(&random_generator, buffer);
+ ASSERT_EQ(apm->ProcessStream(channel_pointers, stream_config, stream_config,
+ channel_pointers),
+ kNoErr);
+ }
}
-TEST(AudioProcessingImplTest, ProcessWithAgc2InjectedSpeechProbability) {
- // Tests that a stream is successfully processed for the field trial
- // `WebRTC-Audio-TransientSuppressorVadMode/Enabled-RnnVad/` using
- // injected speech probability in AGC2 digital.
+// Tests that a stream is successfully processed when AGC2 adaptive digital is
+// used and when the field trial
+// `WebRTC-Audio-TransientSuppressorVadMode/Enabled-RnnVad/` is set.
+TEST(AudioProcessingImplTest,
+ ProcessWithAgc2AndTransientSuppressorVadModeRnnVad) {
webrtc::test::ScopedFieldTrials field_trials(
"WebRTC-Audio-TransientSuppressorVadMode/Enabled-RnnVad/");
rtc::scoped_refptr<AudioProcessing> apm = AudioProcessingBuilder().Create();