blob: 22741ee1f9a0f793e65a51febff13d077eecd91d [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;
Per Åhgrenf204faf2019-04-25 15:18:06 +020034 echo_canceller.SetExtraOptions(true, false, false);
Henrik Lundin441f6342015-06-09 16:03:13 +020035 EXPECT_EQ(1, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000036
37 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020038 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 2, 2, 2);
Henrik Lundin441f6342015-06-09 16:03:13 +020039 EXPECT_EQ(1, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000040
Per Åhgrenf204faf2019-04-25 15:18:06 +020041 echo_canceller.SetExtraOptions(false, false, false);
Henrik Lundin441f6342015-06-09 16:03:13 +020042 EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000043
44 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020045 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 1, 1, 1);
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
henrik.lundin0f133b92015-07-02 00:17:55 -070049TEST(EchoCancellationInternalTest, DelayAgnostic) {
Sam Zackrisson7f4dfa42018-11-01 08:59:29 +010050 EchoCancellationImpl echo_canceller;
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020051 echo_canceller.Initialize(AudioProcessing::kSampleRate32kHz, 1, 1, 1);
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000052
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020053 EXPECT_TRUE(echo_canceller.aec_core() == NULL);
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000054
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020055 EXPECT_EQ(0, echo_canceller.Enable(true));
56 EXPECT_TRUE(echo_canceller.is_enabled());
57
58 AecCore* aec_core = echo_canceller.aec_core();
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000059 ASSERT_TRUE(aec_core != NULL);
60 // Enabled by default.
henrik.lundin0f133b92015-07-02 00:17:55 -070061 EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000062
63 Config config;
Per Åhgrenf204faf2019-04-25 15:18:06 +020064 echo_canceller.SetExtraOptions(false, true, false);
henrik.lundin0f133b92015-07-02 00:17:55 -070065 EXPECT_EQ(1, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000066
67 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020068 echo_canceller.Initialize(AudioProcessing::kSampleRate32kHz, 2, 2, 2);
henrik.lundin0f133b92015-07-02 00:17:55 -070069 EXPECT_EQ(1, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000070
henrik.lundin0f133b92015-07-02 00:17:55 -070071 config.Set<DelayAgnostic>(new DelayAgnostic(false));
Per Åhgrenf204faf2019-04-25 15:18:06 +020072 echo_canceller.SetExtraOptions(false, false, false);
henrik.lundin0f133b92015-07-02 00:17:55 -070073 EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000074
75 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020076 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 2, 2, 2);
henrik.lundin0f133b92015-07-02 00:17:55 -070077 EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000078}
79
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020080TEST(EchoCancellationInternalTest, InterfaceConfiguration) {
Sam Zackrisson7f4dfa42018-11-01 08:59:29 +010081 EchoCancellationImpl echo_canceller;
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020082 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 1, 1, 1);
83
84 EXPECT_EQ(0, echo_canceller.enable_drift_compensation(true));
85 EXPECT_TRUE(echo_canceller.is_drift_compensation_enabled());
86 EXPECT_EQ(0, echo_canceller.enable_drift_compensation(false));
87 EXPECT_FALSE(echo_canceller.is_drift_compensation_enabled());
88
sazabe490b22018-10-03 17:03:13 +020089 EchoCancellationImpl::SuppressionLevel level[] = {
90 EchoCancellationImpl::kLowSuppression,
91 EchoCancellationImpl::kModerateSuppression,
92 EchoCancellationImpl::kHighSuppression,
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020093 };
94 for (size_t i = 0; i < arraysize(level); i++) {
95 EXPECT_EQ(0, echo_canceller.set_suppression_level(level[i]));
96 EXPECT_EQ(level[i], echo_canceller.suppression_level());
97 }
98
sazabe490b22018-10-03 17:03:13 +020099 EchoCancellationImpl::Metrics metrics;
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +0200100 EXPECT_EQ(AudioProcessing::kNotEnabledError,
101 echo_canceller.GetMetrics(&metrics));
102
103 EXPECT_EQ(0, echo_canceller.Enable(true));
104 EXPECT_TRUE(echo_canceller.is_enabled());
105
106 EXPECT_EQ(0, echo_canceller.enable_metrics(true));
107 EXPECT_TRUE(echo_canceller.are_metrics_enabled());
108 EXPECT_EQ(0, echo_canceller.enable_metrics(false));
109 EXPECT_FALSE(echo_canceller.are_metrics_enabled());
110
111 EXPECT_EQ(0, echo_canceller.enable_delay_logging(true));
112 EXPECT_TRUE(echo_canceller.is_delay_logging_enabled());
113 EXPECT_EQ(0, echo_canceller.enable_delay_logging(false));
114 EXPECT_FALSE(echo_canceller.is_delay_logging_enabled());
115
116 EXPECT_EQ(0, echo_canceller.Enable(false));
117 EXPECT_FALSE(echo_canceller.is_enabled());
118
119 int median = 0;
120 int std = 0;
121 float poor_fraction = 0;
122 EXPECT_EQ(AudioProcessing::kNotEnabledError,
123 echo_canceller.GetDelayMetrics(&median, &std, &poor_fraction));
124
125 EXPECT_EQ(0, echo_canceller.Enable(true));
126 EXPECT_TRUE(echo_canceller.is_enabled());
127 EXPECT_EQ(0, echo_canceller.Enable(false));
128 EXPECT_FALSE(echo_canceller.is_enabled());
129
130 EXPECT_EQ(0, echo_canceller.Enable(true));
131 EXPECT_TRUE(echo_canceller.is_enabled());
132 EXPECT_TRUE(echo_canceller.aec_core() != NULL);
133 EXPECT_EQ(0, echo_canceller.Enable(false));
134 EXPECT_FALSE(echo_canceller.is_enabled());
135 EXPECT_FALSE(echo_canceller.aec_core() != NULL);
136}
137
andrew@webrtc.org1760a172013-09-25 23:17:38 +0000138} // namespace webrtc