blob: a970a4ea5a299b28f2cf246129743b01c214a11a [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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "modules/audio_processing/echo_cancellation_impl.h"
12
kwiberg88788ad2016-02-19 07:04:49 -080013#include <memory>
14
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "modules/audio_processing/aec/aec_core.h"
16#include "modules/audio_processing/include/audio_processing.h"
Steve Anton10542f22019-01-11 09:11:00 -080017#include "rtc_base/critical_section.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "test/gtest.h"
andrew@webrtc.org1760a172013-09-25 23:17:38 +000019
20namespace webrtc {
Henrik Lundin441f6342015-06-09 16:03:13 +020021TEST(EchoCancellationInternalTest, ExtendedFilter) {
Sam Zackrisson7f4dfa42018-11-01 08:59:29 +010022 EchoCancellationImpl echo_canceller;
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020023 echo_canceller.Initialize(AudioProcessing::kSampleRate32kHz, 2, 2, 2);
andrew@webrtc.org1760a172013-09-25 23:17:38 +000024
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020025 AecCore* aec_core = echo_canceller.aec_core();
andrew@webrtc.org1760a172013-09-25 23:17:38 +000026 ASSERT_TRUE(aec_core != NULL);
27 // Disabled by default.
Henrik Lundin441f6342015-06-09 16:03:13 +020028 EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000029
30 Config config;
Per Åhgrenf204faf2019-04-25 15:18:06 +020031 echo_canceller.SetExtraOptions(true, false, false);
Henrik Lundin441f6342015-06-09 16:03:13 +020032 EXPECT_EQ(1, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000033
34 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020035 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 2, 2, 2);
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
Per Åhgrenf204faf2019-04-25 15:18:06 +020038 echo_canceller.SetExtraOptions(false, false, false);
Henrik Lundin441f6342015-06-09 16:03:13 +020039 EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000040
41 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020042 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 1, 1, 1);
Henrik Lundin441f6342015-06-09 16:03:13 +020043 EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000044}
45
henrik.lundin0f133b92015-07-02 00:17:55 -070046TEST(EchoCancellationInternalTest, DelayAgnostic) {
Sam Zackrisson7f4dfa42018-11-01 08:59:29 +010047 EchoCancellationImpl echo_canceller;
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020048 echo_canceller.Initialize(AudioProcessing::kSampleRate32kHz, 1, 1, 1);
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000049
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020050 AecCore* aec_core = echo_canceller.aec_core();
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000051 ASSERT_TRUE(aec_core != NULL);
52 // Enabled by default.
henrik.lundin0f133b92015-07-02 00:17:55 -070053 EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000054
55 Config config;
Per Åhgrenf204faf2019-04-25 15:18:06 +020056 echo_canceller.SetExtraOptions(false, true, false);
henrik.lundin0f133b92015-07-02 00:17:55 -070057 EXPECT_EQ(1, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000058
59 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020060 echo_canceller.Initialize(AudioProcessing::kSampleRate32kHz, 2, 2, 2);
henrik.lundin0f133b92015-07-02 00:17:55 -070061 EXPECT_EQ(1, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000062
henrik.lundin0f133b92015-07-02 00:17:55 -070063 config.Set<DelayAgnostic>(new DelayAgnostic(false));
Per Åhgrenf204faf2019-04-25 15:18:06 +020064 echo_canceller.SetExtraOptions(false, false, false);
henrik.lundin0f133b92015-07-02 00:17:55 -070065 EXPECT_EQ(0, 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::kSampleRate16kHz, 2, 2, 2);
henrik.lundin0f133b92015-07-02 00:17:55 -070069 EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000070}
71
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020072TEST(EchoCancellationInternalTest, InterfaceConfiguration) {
Sam Zackrisson7f4dfa42018-11-01 08:59:29 +010073 EchoCancellationImpl echo_canceller;
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020074 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 1, 1, 1);
75
76 EXPECT_EQ(0, echo_canceller.enable_drift_compensation(true));
77 EXPECT_TRUE(echo_canceller.is_drift_compensation_enabled());
78 EXPECT_EQ(0, echo_canceller.enable_drift_compensation(false));
79 EXPECT_FALSE(echo_canceller.is_drift_compensation_enabled());
80
sazabe490b22018-10-03 17:03:13 +020081 EchoCancellationImpl::SuppressionLevel level[] = {
82 EchoCancellationImpl::kLowSuppression,
83 EchoCancellationImpl::kModerateSuppression,
84 EchoCancellationImpl::kHighSuppression,
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020085 };
86 for (size_t i = 0; i < arraysize(level); i++) {
87 EXPECT_EQ(0, echo_canceller.set_suppression_level(level[i]));
88 EXPECT_EQ(level[i], echo_canceller.suppression_level());
89 }
90
sazabe490b22018-10-03 17:03:13 +020091 EchoCancellationImpl::Metrics metrics;
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020092 EXPECT_EQ(0, echo_canceller.enable_metrics(true));
93 EXPECT_TRUE(echo_canceller.are_metrics_enabled());
94 EXPECT_EQ(0, echo_canceller.enable_metrics(false));
95 EXPECT_FALSE(echo_canceller.are_metrics_enabled());
96
97 EXPECT_EQ(0, echo_canceller.enable_delay_logging(true));
98 EXPECT_TRUE(echo_canceller.is_delay_logging_enabled());
99 EXPECT_EQ(0, echo_canceller.enable_delay_logging(false));
100 EXPECT_FALSE(echo_canceller.is_delay_logging_enabled());
101
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +0200102 int median = 0;
103 int std = 0;
104 float poor_fraction = 0;
105 EXPECT_EQ(AudioProcessing::kNotEnabledError,
106 echo_canceller.GetDelayMetrics(&median, &std, &poor_fraction));
107
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +0200108 EXPECT_TRUE(echo_canceller.aec_core() != NULL);
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +0200109}
110
andrew@webrtc.org1760a172013-09-25 23:17:38 +0000111} // namespace webrtc