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