blob: 34a04f61bb93bfc91ca2df5fbb847f477471f7d0 [file] [log] [blame]
andrew@webrtc.org1760a172013-09-25 23:17:38 +00001/*
2 * Copyright (c) 2013 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
kwiberg88788ad2016-02-19 07:04:49 -080011#include <memory>
12
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "modules/audio_processing/aec/aec_core.h"
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020014#include "modules/audio_processing/echo_cancellation_impl.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "modules/audio_processing/include/audio_processing.h"
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020016#include "rtc_base/criticalsection.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "test/gtest.h"
andrew@webrtc.org1760a172013-09-25 23:17:38 +000018
19namespace webrtc {
Henrik Lundin441f6342015-06-09 16:03:13 +020020TEST(EchoCancellationInternalTest, ExtendedFilter) {
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020021 rtc::CriticalSection crit_render;
22 rtc::CriticalSection crit_capture;
23 EchoCancellationImpl echo_canceller(&crit_render, &crit_capture);
24 echo_canceller.Initialize(AudioProcessing::kSampleRate32kHz, 2, 2, 2);
andrew@webrtc.org1760a172013-09-25 23:17:38 +000025
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020026 EXPECT_TRUE(echo_canceller.aec_core() == nullptr);
andrew@webrtc.org1760a172013-09-25 23:17:38 +000027
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020028 echo_canceller.Enable(true);
29
30 AecCore* aec_core = echo_canceller.aec_core();
andrew@webrtc.org1760a172013-09-25 23:17:38 +000031 ASSERT_TRUE(aec_core != NULL);
32 // Disabled by default.
Henrik Lundin441f6342015-06-09 16:03:13 +020033 EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000034
35 Config config;
Henrik Lundin441f6342015-06-09 16:03:13 +020036 config.Set<ExtendedFilter>(new ExtendedFilter(true));
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020037 echo_canceller.SetExtraOptions(config);
Henrik Lundin441f6342015-06-09 16:03:13 +020038 EXPECT_EQ(1, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000039
40 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020041 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 2, 2, 2);
Henrik Lundin441f6342015-06-09 16:03:13 +020042 EXPECT_EQ(1, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000043
Henrik Lundin441f6342015-06-09 16:03:13 +020044 config.Set<ExtendedFilter>(new ExtendedFilter(false));
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020045 echo_canceller.SetExtraOptions(config);
Henrik Lundin441f6342015-06-09 16:03:13 +020046 EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000047
48 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020049 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 1, 1, 1);
Henrik Lundin441f6342015-06-09 16:03:13 +020050 EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000051}
52
henrik.lundin0f133b92015-07-02 00:17:55 -070053TEST(EchoCancellationInternalTest, DelayAgnostic) {
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020054 rtc::CriticalSection crit_render;
55 rtc::CriticalSection crit_capture;
56 EchoCancellationImpl echo_canceller(&crit_render, &crit_capture);
57 echo_canceller.Initialize(AudioProcessing::kSampleRate32kHz, 1, 1, 1);
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000058
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020059 EXPECT_TRUE(echo_canceller.aec_core() == NULL);
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000060
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020061 EXPECT_EQ(0, echo_canceller.Enable(true));
62 EXPECT_TRUE(echo_canceller.is_enabled());
63
64 AecCore* aec_core = echo_canceller.aec_core();
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000065 ASSERT_TRUE(aec_core != NULL);
66 // Enabled by default.
henrik.lundin0f133b92015-07-02 00:17:55 -070067 EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000068
69 Config config;
henrik.lundin0f133b92015-07-02 00:17:55 -070070 config.Set<DelayAgnostic>(new DelayAgnostic(true));
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020071 echo_canceller.SetExtraOptions(config);
henrik.lundin0f133b92015-07-02 00:17:55 -070072 EXPECT_EQ(1, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000073
74 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020075 echo_canceller.Initialize(AudioProcessing::kSampleRate32kHz, 2, 2, 2);
henrik.lundin0f133b92015-07-02 00:17:55 -070076 EXPECT_EQ(1, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000077
henrik.lundin0f133b92015-07-02 00:17:55 -070078 config.Set<DelayAgnostic>(new DelayAgnostic(false));
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020079 echo_canceller.SetExtraOptions(config);
henrik.lundin0f133b92015-07-02 00:17:55 -070080 EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000081
82 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020083 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 2, 2, 2);
henrik.lundin0f133b92015-07-02 00:17:55 -070084 EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000085}
86
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020087TEST(EchoCancellationInternalTest, InterfaceConfiguration) {
88 rtc::CriticalSection crit_render;
89 rtc::CriticalSection crit_capture;
90 EchoCancellationImpl echo_canceller(&crit_render, &crit_capture);
91 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 1, 1, 1);
92
93 EXPECT_EQ(0, echo_canceller.enable_drift_compensation(true));
94 EXPECT_TRUE(echo_canceller.is_drift_compensation_enabled());
95 EXPECT_EQ(0, echo_canceller.enable_drift_compensation(false));
96 EXPECT_FALSE(echo_canceller.is_drift_compensation_enabled());
97
98 EchoCancellation::SuppressionLevel level[] = {
99 EchoCancellation::kLowSuppression, EchoCancellation::kModerateSuppression,
100 EchoCancellation::kHighSuppression,
101 };
102 for (size_t i = 0; i < arraysize(level); i++) {
103 EXPECT_EQ(0, echo_canceller.set_suppression_level(level[i]));
104 EXPECT_EQ(level[i], echo_canceller.suppression_level());
105 }
106
107 EchoCancellation::Metrics metrics;
108 EXPECT_EQ(AudioProcessing::kNotEnabledError,
109 echo_canceller.GetMetrics(&metrics));
110
111 EXPECT_EQ(0, echo_canceller.Enable(true));
112 EXPECT_TRUE(echo_canceller.is_enabled());
113
114 EXPECT_EQ(0, echo_canceller.enable_metrics(true));
115 EXPECT_TRUE(echo_canceller.are_metrics_enabled());
116 EXPECT_EQ(0, echo_canceller.enable_metrics(false));
117 EXPECT_FALSE(echo_canceller.are_metrics_enabled());
118
119 EXPECT_EQ(0, echo_canceller.enable_delay_logging(true));
120 EXPECT_TRUE(echo_canceller.is_delay_logging_enabled());
121 EXPECT_EQ(0, echo_canceller.enable_delay_logging(false));
122 EXPECT_FALSE(echo_canceller.is_delay_logging_enabled());
123
124 EXPECT_EQ(0, echo_canceller.Enable(false));
125 EXPECT_FALSE(echo_canceller.is_enabled());
126
127 int median = 0;
128 int std = 0;
129 float poor_fraction = 0;
130 EXPECT_EQ(AudioProcessing::kNotEnabledError,
131 echo_canceller.GetDelayMetrics(&median, &std, &poor_fraction));
132
133 EXPECT_EQ(0, echo_canceller.Enable(true));
134 EXPECT_TRUE(echo_canceller.is_enabled());
135 EXPECT_EQ(0, echo_canceller.Enable(false));
136 EXPECT_FALSE(echo_canceller.is_enabled());
137
138 EXPECT_EQ(0, echo_canceller.Enable(true));
139 EXPECT_TRUE(echo_canceller.is_enabled());
140 EXPECT_TRUE(echo_canceller.aec_core() != NULL);
141 EXPECT_EQ(0, echo_canceller.Enable(false));
142 EXPECT_FALSE(echo_canceller.is_enabled());
143 EXPECT_FALSE(echo_canceller.aec_core() != NULL);
144}
145
andrew@webrtc.org1760a172013-09-25 23:17:38 +0000146} // namespace webrtc