xref: /aosp_15_r20/external/webrtc/modules/audio_processing/aec3/config_selector_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2022 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "modules/audio_processing/aec3/config_selector.h"
12 
13 #include <tuple>
14 
15 #include "absl/types/optional.h"
16 #include "api/audio/echo_canceller3_config.h"
17 #include "test/gtest.h"
18 
19 namespace webrtc {
20 
21 class ConfigSelectorChannelsAndContentDetection
22     : public ::testing::Test,
23       public ::testing::WithParamInterface<std::tuple<int, bool>> {};
24 
25 INSTANTIATE_TEST_SUITE_P(ConfigSelectorMultiParameters,
26                          ConfigSelectorChannelsAndContentDetection,
27                          ::testing::Combine(::testing::Values(1, 2, 8),
28                                             ::testing::Values(false, true)));
29 
30 class ConfigSelectorChannels : public ::testing::Test,
31                                public ::testing::WithParamInterface<int> {};
32 
33 INSTANTIATE_TEST_SUITE_P(ConfigSelectorMultiParameters,
34                          ConfigSelectorChannels,
35                          ::testing::Values(1, 2, 8));
36 
TEST_P(ConfigSelectorChannelsAndContentDetection,MonoConfigIsSelectedWhenNoMultiChannelConfigPresent)37 TEST_P(ConfigSelectorChannelsAndContentDetection,
38        MonoConfigIsSelectedWhenNoMultiChannelConfigPresent) {
39   const auto [num_channels, detect_stereo_content] = GetParam();
40   EchoCanceller3Config config;
41   config.multi_channel.detect_stereo_content = detect_stereo_content;
42   absl::optional<EchoCanceller3Config> multichannel_config;
43 
44   config.delay.default_delay = config.delay.default_delay + 1;
45   const size_t custom_delay_value_in_config = config.delay.default_delay;
46 
47   ConfigSelector cs(config, multichannel_config,
48                     /*num_render_input_channels=*/num_channels);
49   EXPECT_EQ(cs.active_config().delay.default_delay,
50             custom_delay_value_in_config);
51 
52   cs.Update(/*multichannel_content=*/false);
53   EXPECT_EQ(cs.active_config().delay.default_delay,
54             custom_delay_value_in_config);
55 
56   cs.Update(/*multichannel_content=*/true);
57   EXPECT_EQ(cs.active_config().delay.default_delay,
58             custom_delay_value_in_config);
59 }
60 
TEST_P(ConfigSelectorChannelsAndContentDetection,CorrectInitialConfigIsSelected)61 TEST_P(ConfigSelectorChannelsAndContentDetection,
62        CorrectInitialConfigIsSelected) {
63   const auto [num_channels, detect_stereo_content] = GetParam();
64   EchoCanceller3Config config;
65   config.multi_channel.detect_stereo_content = detect_stereo_content;
66   absl::optional<EchoCanceller3Config> multichannel_config = config;
67 
68   config.delay.default_delay += 1;
69   const size_t custom_delay_value_in_config = config.delay.default_delay;
70   multichannel_config->delay.default_delay += 2;
71   const size_t custom_delay_value_in_multichannel_config =
72       multichannel_config->delay.default_delay;
73 
74   ConfigSelector cs(config, multichannel_config,
75                     /*num_render_input_channels=*/num_channels);
76 
77   if (num_channels == 1 || detect_stereo_content) {
78     EXPECT_EQ(cs.active_config().delay.default_delay,
79               custom_delay_value_in_config);
80   } else {
81     EXPECT_EQ(cs.active_config().delay.default_delay,
82               custom_delay_value_in_multichannel_config);
83   }
84 }
85 
TEST_P(ConfigSelectorChannels,CorrectConfigUpdateBehavior)86 TEST_P(ConfigSelectorChannels, CorrectConfigUpdateBehavior) {
87   const int num_channels = GetParam();
88   EchoCanceller3Config config;
89   config.multi_channel.detect_stereo_content = true;
90   absl::optional<EchoCanceller3Config> multichannel_config = config;
91 
92   config.delay.default_delay += 1;
93   const size_t custom_delay_value_in_config = config.delay.default_delay;
94   multichannel_config->delay.default_delay += 2;
95   const size_t custom_delay_value_in_multichannel_config =
96       multichannel_config->delay.default_delay;
97 
98   ConfigSelector cs(config, multichannel_config,
99                     /*num_render_input_channels=*/num_channels);
100 
101   cs.Update(/*multichannel_content=*/false);
102   EXPECT_EQ(cs.active_config().delay.default_delay,
103             custom_delay_value_in_config);
104 
105   if (num_channels == 1) {
106     cs.Update(/*multichannel_content=*/false);
107     EXPECT_EQ(cs.active_config().delay.default_delay,
108               custom_delay_value_in_config);
109   } else {
110     cs.Update(/*multichannel_content=*/true);
111     EXPECT_EQ(cs.active_config().delay.default_delay,
112               custom_delay_value_in_multichannel_config);
113   }
114 }
115 
116 }  // namespace webrtc
117