AgcManagerDirect tests: fix NonEmptyRmsErrorOverrideHasEffect

- Set the initial input volume to that forced by startup min volume
  since the latter is removed in a follow-up CL
- Remove unwanted expectations

Bug: webrtc:7494
Change-Id: I2df28f5bfaf4e592dfeae5e03b157268473cc822
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/278784
Commit-Queue: Alessio Bazzica <alessiob@webrtc.org>
Reviewed-by: Jesus de Vicente Pena <devicentepena@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38370}
This commit is contained in:
Alessio Bazzica 2022-10-11 13:03:07 +02:00 committed by WebRTC LUCI CQ
parent c0794c23ff
commit 601b2f5e8c

View File

@ -44,7 +44,7 @@ constexpr int kClippedLevelStep = 15;
constexpr float kClippedRatioThreshold = 0.1f;
constexpr int kClippedWaitFrames = 300;
constexpr float kHighSpeechProbability = 0.7f;
constexpr float kSpeechLevel = -25.0f;
constexpr float kSpeechLevelDbfs = -25.0f;
constexpr float kMinSample = std::numeric_limits<int16_t>::min();
constexpr float kMaxSample = std::numeric_limits<int16_t>::max();
@ -556,7 +556,7 @@ TEST_P(AgcManagerDirectParametrizedTest,
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_EQ(kInitialInputVolume, helper.manager.recommended_analog_level());
}
@ -566,7 +566,7 @@ TEST_P(AgcManagerDirectParametrizedTest, MicVolumeResponseToRmsError) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume, speech_probability_override,
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
// Compressor default; no residual error.
EXPECT_CALL(*helper.mock_agc, GetRmsErrorDb(_))
@ -629,7 +629,7 @@ TEST_P(AgcManagerDirectParametrizedTest, MicVolumeIsLimited) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume, speech_probability_override,
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
// Maximum upwards change is limited.
EXPECT_CALL(*helper.mock_agc, GetRmsErrorDb(_))
@ -711,7 +711,7 @@ TEST_P(AgcManagerDirectParametrizedTest, CompressorStepsTowardsTarget) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume, speech_probability_override,
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
// Compressor default; no call to set_compression_gain_db.
EXPECT_CALL(*helper.mock_agc, GetRmsErrorDb(_))
@ -783,7 +783,7 @@ TEST_P(AgcManagerDirectParametrizedTest, CompressorErrorIsDeemphasized) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume, speech_probability_override,
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_CALL(*helper.mock_agc, GetRmsErrorDb(_))
.WillOnce(DoAll(SetArgPointee<0>(10), Return(true)))
@ -828,7 +828,7 @@ TEST_P(AgcManagerDirectParametrizedTest, CompressorReachesMaximum) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume, speech_probability_override,
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_CALL(*helper.mock_agc, GetRmsErrorDb(_))
.WillOnce(DoAll(SetArgPointee<0>(10), Return(true)))
@ -865,7 +865,7 @@ TEST_P(AgcManagerDirectParametrizedTest, CompressorReachesMinimum) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume, speech_probability_override,
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_CALL(*helper.mock_agc, GetRmsErrorDb(_))
.WillOnce(DoAll(SetArgPointee<0>(0), Return(true)))
@ -899,12 +899,12 @@ TEST_P(AgcManagerDirectParametrizedTest, NoActionWhileMuted) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
helper.manager.HandleCaptureOutputUsedChange(false);
helper.manager.Process(helper.audio_buffer,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
absl::optional<int> new_digital_gain =
helper.manager.GetDigitalComressionGain();
@ -917,7 +917,7 @@ TEST_P(AgcManagerDirectParametrizedTest, UnmutingChecksVolumeWithoutRaising) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
helper.manager.HandleCaptureOutputUsedChange(false);
helper.manager.HandleCaptureOutputUsedChange(true);
@ -930,7 +930,7 @@ TEST_P(AgcManagerDirectParametrizedTest, UnmutingChecksVolumeWithoutRaising) {
EXPECT_CALL(*helper.mock_agc, GetRmsErrorDb(_)).WillOnce(Return(false));
helper.CallProcess(/*num_calls=*/1,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_EQ(127, helper.manager.recommended_analog_level());
}
@ -938,7 +938,7 @@ TEST_P(AgcManagerDirectParametrizedTest, UnmutingRaisesTooLowVolume) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
helper.manager.HandleCaptureOutputUsedChange(false);
helper.manager.HandleCaptureOutputUsedChange(true);
@ -950,7 +950,7 @@ TEST_P(AgcManagerDirectParametrizedTest, UnmutingRaisesTooLowVolume) {
EXPECT_CALL(*helper.mock_agc, GetRmsErrorDb(_)).WillOnce(Return(false));
helper.CallProcess(/*num_calls=*/1,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_EQ(GetMinMicLevel(), helper.manager.recommended_analog_level());
}
@ -961,7 +961,7 @@ TEST_P(AgcManagerDirectParametrizedTest,
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume, speech_probability_override,
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
// Change outside of compressor's range, which would normally trigger a call
// to `SetMicVolume()`.
@ -1003,7 +1003,7 @@ TEST_P(AgcManagerDirectParametrizedTest,
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume, speech_probability_override,
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
// Force the mic up to max volume. Takes a few steps due to the residual
// gain limitation.
@ -1051,7 +1051,7 @@ TEST_P(AgcManagerDirectParametrizedTest,
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume, speech_probability_override,
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
// Manual change below min, but strictly positive, otherwise AGC won't take
// any action.
@ -1097,7 +1097,7 @@ TEST_P(AgcManagerDirectParametrizedTest,
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume, speech_probability_override,
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
// Manual change below min, but strictly positive, otherwise
// AGC won't take any action.
@ -1114,7 +1114,7 @@ TEST_P(AgcManagerDirectParametrizedTest, NoClippingHasNoImpact) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
helper.CallPreProc(/*num_calls=*/100, /*clipped_ratio=*/0);
EXPECT_EQ(128, helper.manager.recommended_analog_level());
@ -1124,7 +1124,7 @@ TEST_P(AgcManagerDirectParametrizedTest, ClippingUnderThresholdHasNoImpact) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
helper.CallPreProc(/*num_calls=*/1, /*clipped_ratio=*/0.099);
EXPECT_EQ(128, helper.manager.recommended_analog_level());
@ -1134,7 +1134,7 @@ TEST_P(AgcManagerDirectParametrizedTest, ClippingLowersVolume) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(/*applied_input_volume=*/255,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_CALL(*helper.mock_agc, Reset()).Times(AtLeast(1));
helper.CallPreProc(/*num_calls=*/1, /*clipped_ratio=*/0.2);
@ -1145,7 +1145,7 @@ TEST_P(AgcManagerDirectParametrizedTest, WaitingPeriodBetweenClippingChecks) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(/*applied_input_volume=*/255,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_CALL(*helper.mock_agc, Reset()).Times(AtLeast(1));
helper.CallPreProc(/*num_calls=*/1, /*clipped_ratio=*/kAboveClippedThreshold);
@ -1165,7 +1165,7 @@ TEST_P(AgcManagerDirectParametrizedTest, ClippingLoweringIsLimited) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(/*applied_input_volume=*/180,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_CALL(*helper.mock_agc, Reset()).Times(AtLeast(1));
helper.CallPreProc(/*num_calls=*/1, /*clipped_ratio=*/kAboveClippedThreshold);
@ -1185,7 +1185,7 @@ TEST_P(AgcManagerDirectParametrizedTest,
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(/*applied_input_volume=*/255,
speech_probability_override,
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_CALL(*helper.mock_agc, Reset()).Times(AtLeast(1));
helper.CallPreProc(/*num_calls=*/1, /*clipped_ratio=*/kAboveClippedThreshold);
@ -1206,7 +1206,7 @@ TEST_P(AgcManagerDirectParametrizedTest,
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(/*applied_input_volume=*/200,
speech_probability_override,
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_CALL(*helper.mock_agc, Reset()).Times(AtLeast(1));
helper.CallPreProc(/*num_calls=*/1, /*clipped_ratio=*/kAboveClippedThreshold);
@ -1231,7 +1231,7 @@ TEST_P(AgcManagerDirectParametrizedTest,
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(/*applied_input_volume=*/210,
speech_probability_override,
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_CALL(*helper.mock_agc, Reset()).Times(AtLeast(1));
helper.CallPreProc(/*num_calls=*/1, kAboveClippedThreshold);
@ -1328,7 +1328,7 @@ TEST_P(AgcManagerDirectParametrizedTest, UserCanRaiseVolumeAfterClipping) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(/*applied_input_volume=*/225,
speech_probability_override,
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_CALL(*helper.mock_agc, Reset()).Times(AtLeast(1));
helper.CallPreProc(/*num_calls=*/1, /*clipped_ratio=*/kAboveClippedThreshold);
@ -1368,7 +1368,7 @@ TEST_P(AgcManagerDirectParametrizedTest, ClippingDoesNotPullLowVolumeBackUp) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(/*applied_input_volume=*/80,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_CALL(*helper.mock_agc, Reset()).Times(0);
int initial_volume = helper.manager.recommended_analog_level();
@ -1380,7 +1380,7 @@ TEST_P(AgcManagerDirectParametrizedTest, TakesNoActionOnZeroMicVolume) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(kInitialInputVolume,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_CALL(*helper.mock_agc, GetRmsErrorDb(_))
.WillRepeatedly(DoAll(SetArgPointee<0>(30), Return(true)));
@ -1395,7 +1395,7 @@ TEST_P(AgcManagerDirectParametrizedTest, ClippingDetectionLowersVolume) {
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(/*applied_input_volume=*/255,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_EQ(255, helper.manager.recommended_analog_level());
helper.CallPreProcForChangingAudio(/*num_calls=*/100, /*peak_ratio=*/0.99f);
@ -1409,7 +1409,7 @@ TEST_P(AgcManagerDirectParametrizedTest,
AgcManagerDirectTestHelper helper;
helper.CallAgcSequence(/*applied_input_volume=*/255,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_FALSE(helper.manager.clipping_predictor_enabled());
EXPECT_EQ(255, helper.manager.recommended_analog_level());
@ -1835,7 +1835,7 @@ TEST_P(AgcManagerDirectParametrizedTest,
EXPECT_FALSE(manager.use_clipping_predictor_step());
EXPECT_EQ(manager.recommended_analog_level(), 255);
manager.Process(audio_buffer, GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
CallPreProcessAudioBuffer(/*num_calls=*/10, /*peak_ratio=*/0.99f, manager);
EXPECT_EQ(manager.recommended_analog_level(), 255);
CallPreProcessAudioBuffer(/*num_calls=*/300, /*peak_ratio=*/0.99f, manager);
@ -1870,10 +1870,10 @@ TEST_P(AgcManagerDirectParametrizedTest,
manager_without_prediction.set_stream_analog_level(kInitialLevel);
manager_with_prediction.Process(audio_buffer,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
manager_without_prediction.Process(audio_buffer,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_TRUE(manager_with_prediction.clipping_predictor_enabled());
EXPECT_FALSE(manager_without_prediction.clipping_predictor_enabled());
EXPECT_TRUE(manager_with_prediction.use_clipping_predictor_step());
@ -1977,10 +1977,10 @@ TEST_P(AgcManagerDirectParametrizedTest,
manager_without_prediction.set_stream_analog_level(kInitialLevel);
manager_with_prediction.Process(audio_buffer,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
manager_without_prediction.Process(audio_buffer,
GetOverrideOrEmpty(kHighSpeechProbability),
GetOverrideOrEmpty(kSpeechLevel));
GetOverrideOrEmpty(kSpeechLevelDbfs));
EXPECT_TRUE(manager_with_prediction.clipping_predictor_enabled());
EXPECT_FALSE(manager_without_prediction.clipping_predictor_enabled());
@ -2096,40 +2096,31 @@ TEST_P(AgcManagerDirectParametrizedTest, NonEmptyRmsErrorOverrideHasEffect) {
manager_1.Initialize();
manager_2.Initialize();
constexpr int kAnalogLevel = 50;
manager_1.set_stream_analog_level(kAnalogLevel);
manager_2.set_stream_analog_level(kAnalogLevel);
constexpr int kInputVolume = 128;
manager_1.set_stream_analog_level(kInputVolume);
manager_2.set_stream_analog_level(kInputVolume);
// Feed speech with low energy to trigger an upward adapation of the analog
// level.
// Feed speech with low energy to trigger an upward adapation of the input
// volume.
constexpr int kNumFrames = 125;
constexpr int kGainDb = -20;
SpeechSamplesReader reader;
// Check the initial input volume.
ASSERT_EQ(manager_1.recommended_analog_level(), kAnalogLevel);
ASSERT_EQ(manager_2.recommended_analog_level(), kAnalogLevel);
// Make sure that the feeding samples triggers an adaptation when no override
// is specified.
reader.Feed(kNumFrames, kGainDb, manager_1);
ASSERT_GT(manager_1.recommended_analog_level(), kInputVolume);
// Expect that feeding samples triggers an adaptation when the speech
// probability and speech level overrides are specified.
reader.Feed(kNumFrames, kGainDb,
absl::optional<float>(kHighSpeechProbability),
absl::optional<float>(kSpeechLevel), manager_1);
reader.Feed(kNumFrames, kGainDb, manager_2);
/*speech_probability_override=*/kHighSpeechProbability,
/*speech_level_override=*/-45.0f, manager_2);
EXPECT_GT(manager_2.recommended_analog_level(), kInputVolume);
// Check that different adaptation occurs. The voice probability estimate from
// AGC is not affected.
ASSERT_GT(manager_1.recommended_analog_level(), kAnalogLevel);
ASSERT_GT(manager_2.recommended_analog_level(), kAnalogLevel);
ASSERT_NE(manager_1.recommended_analog_level(),
manager_2.recommended_analog_level());
// The voice probability override does not affect the `voice_probability()`
// getter.
EXPECT_EQ(manager_1.voice_probability(), manager_2.voice_probability());
EXPECT_EQ(manager_1.num_channels(), manager_2.num_channels());
for (int i = 0; i < manager_1.num_channels(); ++i) {
EXPECT_NE(manager_1.channel_agcs_[i]->recommended_analog_level(),
manager_2.channel_agcs_[i]->recommended_analog_level());
EXPECT_EQ(manager_1.channel_agcs_[i]->voice_probability(),
manager_2.channel_agcs_[i]->voice_probability());
}
}
} // namespace webrtc