blob: 841ea0d9fb31c5f89bb0955fb89ae66138e2da87 [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"
Steve Anton10542f22019-01-11 09:11:00 -080016#include "rtc_base/critical_section.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 Zackrisson7f4dfa42018-11-01 08:59:29 +010021 EchoCancellationImpl echo_canceller;
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020022 echo_canceller.Initialize(AudioProcessing::kSampleRate32kHz, 2, 2, 2);
andrew@webrtc.org1760a172013-09-25 23:17:38 +000023
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020024 EXPECT_TRUE(echo_canceller.aec_core() == nullptr);
andrew@webrtc.org1760a172013-09-25 23:17:38 +000025
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020026 echo_canceller.Enable(true);
27
28 AecCore* aec_core = echo_canceller.aec_core();
andrew@webrtc.org1760a172013-09-25 23:17:38 +000029 ASSERT_TRUE(aec_core != NULL);
30 // Disabled by default.
Henrik Lundin441f6342015-06-09 16:03:13 +020031 EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000032
33 Config config;
Henrik Lundin441f6342015-06-09 16:03:13 +020034 config.Set<ExtendedFilter>(new ExtendedFilter(true));
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020035 echo_canceller.SetExtraOptions(config);
Henrik Lundin441f6342015-06-09 16:03:13 +020036 EXPECT_EQ(1, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000037
38 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020039 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 2, 2, 2);
Henrik Lundin441f6342015-06-09 16:03:13 +020040 EXPECT_EQ(1, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000041
Henrik Lundin441f6342015-06-09 16:03:13 +020042 config.Set<ExtendedFilter>(new ExtendedFilter(false));
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020043 echo_canceller.SetExtraOptions(config);
Henrik Lundin441f6342015-06-09 16:03:13 +020044 EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000045
46 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020047 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 1, 1, 1);
Henrik Lundin441f6342015-06-09 16:03:13 +020048 EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000049}
50
henrik.lundin0f133b92015-07-02 00:17:55 -070051TEST(EchoCancellationInternalTest, DelayAgnostic) {
Sam Zackrisson7f4dfa42018-11-01 08:59:29 +010052 EchoCancellationImpl echo_canceller;
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020053 echo_canceller.Initialize(AudioProcessing::kSampleRate32kHz, 1, 1, 1);
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000054
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020055 EXPECT_TRUE(echo_canceller.aec_core() == NULL);
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000056
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020057 EXPECT_EQ(0, echo_canceller.Enable(true));
58 EXPECT_TRUE(echo_canceller.is_enabled());
59
60 AecCore* aec_core = echo_canceller.aec_core();
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000061 ASSERT_TRUE(aec_core != NULL);
62 // Enabled by default.
henrik.lundin0f133b92015-07-02 00:17:55 -070063 EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000064
65 Config config;
henrik.lundin0f133b92015-07-02 00:17:55 -070066 config.Set<DelayAgnostic>(new DelayAgnostic(true));
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020067 echo_canceller.SetExtraOptions(config);
henrik.lundin0f133b92015-07-02 00:17:55 -070068 EXPECT_EQ(1, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000069
70 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020071 echo_canceller.Initialize(AudioProcessing::kSampleRate32kHz, 2, 2, 2);
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
henrik.lundin0f133b92015-07-02 00:17:55 -070074 config.Set<DelayAgnostic>(new DelayAgnostic(false));
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020075 echo_canceller.SetExtraOptions(config);
henrik.lundin0f133b92015-07-02 00:17:55 -070076 EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000077
78 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020079 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 2, 2, 2);
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
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020083TEST(EchoCancellationInternalTest, InterfaceConfiguration) {
Sam Zackrisson7f4dfa42018-11-01 08:59:29 +010084 EchoCancellationImpl echo_canceller;
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020085 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 1, 1, 1);
86
87 EXPECT_EQ(0, echo_canceller.enable_drift_compensation(true));
88 EXPECT_TRUE(echo_canceller.is_drift_compensation_enabled());
89 EXPECT_EQ(0, echo_canceller.enable_drift_compensation(false));
90 EXPECT_FALSE(echo_canceller.is_drift_compensation_enabled());
91
sazabe490b22018-10-03 17:03:13 +020092 EchoCancellationImpl::SuppressionLevel level[] = {
93 EchoCancellationImpl::kLowSuppression,
94 EchoCancellationImpl::kModerateSuppression,
95 EchoCancellationImpl::kHighSuppression,
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020096 };
97 for (size_t i = 0; i < arraysize(level); i++) {
98 EXPECT_EQ(0, echo_canceller.set_suppression_level(level[i]));
99 EXPECT_EQ(level[i], echo_canceller.suppression_level());
100 }
101
sazabe490b22018-10-03 17:03:13 +0200102 EchoCancellationImpl::Metrics metrics;
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +0200103 EXPECT_EQ(AudioProcessing::kNotEnabledError,
104 echo_canceller.GetMetrics(&metrics));
105
106 EXPECT_EQ(0, echo_canceller.Enable(true));
107 EXPECT_TRUE(echo_canceller.is_enabled());
108
109 EXPECT_EQ(0, echo_canceller.enable_metrics(true));
110 EXPECT_TRUE(echo_canceller.are_metrics_enabled());
111 EXPECT_EQ(0, echo_canceller.enable_metrics(false));
112 EXPECT_FALSE(echo_canceller.are_metrics_enabled());
113
114 EXPECT_EQ(0, echo_canceller.enable_delay_logging(true));
115 EXPECT_TRUE(echo_canceller.is_delay_logging_enabled());
116 EXPECT_EQ(0, echo_canceller.enable_delay_logging(false));
117 EXPECT_FALSE(echo_canceller.is_delay_logging_enabled());
118
119 EXPECT_EQ(0, echo_canceller.Enable(false));
120 EXPECT_FALSE(echo_canceller.is_enabled());
121
122 int median = 0;
123 int std = 0;
124 float poor_fraction = 0;
125 EXPECT_EQ(AudioProcessing::kNotEnabledError,
126 echo_canceller.GetDelayMetrics(&median, &std, &poor_fraction));
127
128 EXPECT_EQ(0, echo_canceller.Enable(true));
129 EXPECT_TRUE(echo_canceller.is_enabled());
130 EXPECT_EQ(0, echo_canceller.Enable(false));
131 EXPECT_FALSE(echo_canceller.is_enabled());
132
133 EXPECT_EQ(0, echo_canceller.Enable(true));
134 EXPECT_TRUE(echo_canceller.is_enabled());
135 EXPECT_TRUE(echo_canceller.aec_core() != NULL);
136 EXPECT_EQ(0, echo_canceller.Enable(false));
137 EXPECT_FALSE(echo_canceller.is_enabled());
138 EXPECT_FALSE(echo_canceller.aec_core() != NULL);
139}
140
andrew@webrtc.org1760a172013-09-25 23:17:38 +0000141} // namespace webrtc