blob: 11075646d7cc25f8a90ce7d92456a86153f81838 [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 AecCore* aec_core = echo_canceller.aec_core();
andrew@webrtc.org1760a172013-09-25 23:17:38 +000025 ASSERT_TRUE(aec_core != NULL);
26 // Disabled by default.
Henrik Lundin441f6342015-06-09 16:03:13 +020027 EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000028
29 Config config;
Per Åhgrenf204faf2019-04-25 15:18:06 +020030 echo_canceller.SetExtraOptions(true, false, false);
Henrik Lundin441f6342015-06-09 16:03:13 +020031 EXPECT_EQ(1, WebRtcAec_extended_filter_enabled(aec_core));
andrew@webrtc.org1760a172013-09-25 23:17:38 +000032
33 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020034 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 2, 2, 2);
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
Per Åhgrenf204faf2019-04-25 15:18:06 +020037 echo_canceller.SetExtraOptions(false, false, false);
Henrik Lundin441f6342015-06-09 16:03:13 +020038 EXPECT_EQ(0, 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, 1, 1, 1);
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
henrik.lundin0f133b92015-07-02 00:17:55 -070045TEST(EchoCancellationInternalTest, DelayAgnostic) {
Sam Zackrisson7f4dfa42018-11-01 08:59:29 +010046 EchoCancellationImpl echo_canceller;
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020047 echo_canceller.Initialize(AudioProcessing::kSampleRate32kHz, 1, 1, 1);
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000048
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020049 AecCore* aec_core = echo_canceller.aec_core();
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000050 ASSERT_TRUE(aec_core != NULL);
51 // Enabled by default.
henrik.lundin0f133b92015-07-02 00:17:55 -070052 EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000053
54 Config config;
Per Åhgrenf204faf2019-04-25 15:18:06 +020055 echo_canceller.SetExtraOptions(false, true, false);
henrik.lundin0f133b92015-07-02 00:17:55 -070056 EXPECT_EQ(1, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000057
58 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020059 echo_canceller.Initialize(AudioProcessing::kSampleRate32kHz, 2, 2, 2);
henrik.lundin0f133b92015-07-02 00:17:55 -070060 EXPECT_EQ(1, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000061
henrik.lundin0f133b92015-07-02 00:17:55 -070062 config.Set<DelayAgnostic>(new DelayAgnostic(false));
Per Åhgrenf204faf2019-04-25 15:18:06 +020063 echo_canceller.SetExtraOptions(false, false, false);
henrik.lundin0f133b92015-07-02 00:17:55 -070064 EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000065
66 // Retains setting after initialization.
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020067 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 2, 2, 2);
henrik.lundin0f133b92015-07-02 00:17:55 -070068 EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
bjornv@webrtc.org3f830722014-06-11 04:48:11 +000069}
70
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020071TEST(EchoCancellationInternalTest, InterfaceConfiguration) {
Sam Zackrisson7f4dfa42018-11-01 08:59:29 +010072 EchoCancellationImpl echo_canceller;
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020073 echo_canceller.Initialize(AudioProcessing::kSampleRate16kHz, 1, 1, 1);
74
75 EXPECT_EQ(0, echo_canceller.enable_drift_compensation(true));
76 EXPECT_TRUE(echo_canceller.is_drift_compensation_enabled());
77 EXPECT_EQ(0, echo_canceller.enable_drift_compensation(false));
78 EXPECT_FALSE(echo_canceller.is_drift_compensation_enabled());
79
sazabe490b22018-10-03 17:03:13 +020080 EchoCancellationImpl::SuppressionLevel level[] = {
81 EchoCancellationImpl::kLowSuppression,
82 EchoCancellationImpl::kModerateSuppression,
83 EchoCancellationImpl::kHighSuppression,
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020084 };
85 for (size_t i = 0; i < arraysize(level); i++) {
86 EXPECT_EQ(0, echo_canceller.set_suppression_level(level[i]));
87 EXPECT_EQ(level[i], echo_canceller.suppression_level());
88 }
89
sazabe490b22018-10-03 17:03:13 +020090 EchoCancellationImpl::Metrics metrics;
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +020091 EXPECT_EQ(0, echo_canceller.enable_metrics(true));
92 EXPECT_TRUE(echo_canceller.are_metrics_enabled());
93 EXPECT_EQ(0, echo_canceller.enable_metrics(false));
94 EXPECT_FALSE(echo_canceller.are_metrics_enabled());
95
96 EXPECT_EQ(0, echo_canceller.enable_delay_logging(true));
97 EXPECT_TRUE(echo_canceller.is_delay_logging_enabled());
98 EXPECT_EQ(0, echo_canceller.enable_delay_logging(false));
99 EXPECT_FALSE(echo_canceller.is_delay_logging_enabled());
100
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +0200101 int median = 0;
102 int std = 0;
103 float poor_fraction = 0;
104 EXPECT_EQ(AudioProcessing::kNotEnabledError,
105 echo_canceller.GetDelayMetrics(&median, &std, &poor_fraction));
106
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +0200107 EXPECT_TRUE(echo_canceller.aec_core() != NULL);
Sam Zackrissoncdf0e6d2018-09-17 11:05:17 +0200108}
109
andrew@webrtc.org1760a172013-09-25 23:17:38 +0000110} // namespace webrtc