blob: e1139b236a64277220be39e18bd5104812291036 [file] [log] [blame]
solenberg76377c52017-02-21 00:54:31 -08001/*
2 * Copyright (c) 2017 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "media/engine/apm_helpers.h"
solenberg76377c52017-02-21 00:54:31 -080012
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "modules/audio_processing/include/audio_processing.h"
Fredrik Solenberg2a877972017-12-15 16:42:15 +010014#include "rtc_base/scoped_ref_ptr.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "test/gmock.h"
16#include "test/gtest.h"
solenberg76377c52017-02-21 00:54:31 -080017
18namespace webrtc {
19namespace {
20
21constexpr AgcConfig kDefaultAgcConfig = { 3, 9, true };
22
23struct TestHelper {
24 TestHelper() {
solenberg76377c52017-02-21 00:54:31 -080025 // This replicates the conditions from voe_auto_test.
26 Config config;
27 config.Set<ExperimentalAgc>(new ExperimentalAgc(false));
peaha9cc40b2017-06-29 08:32:09 -070028 apm_ = rtc::scoped_refptr<AudioProcessing>(AudioProcessing::Create(config));
Fredrik Solenberg55900fd2017-11-23 20:22:55 +010029 apm_helpers::Init(apm());
solenberg76377c52017-02-21 00:54:31 -080030 }
31
peaha9cc40b2017-06-29 08:32:09 -070032 AudioProcessing* apm() { return apm_.get(); }
solenberg76377c52017-02-21 00:54:31 -080033
peaha9cc40b2017-06-29 08:32:09 -070034 const AudioProcessing* apm() const { return apm_.get(); }
solenberg76377c52017-02-21 00:54:31 -080035
solenberg76377c52017-02-21 00:54:31 -080036 bool GetEcMetricsStatus() const {
37 EchoCancellation* ec = apm()->echo_cancellation();
38 bool metrics_enabled = ec->are_metrics_enabled();
39 EXPECT_EQ(metrics_enabled, ec->is_delay_logging_enabled());
40 return metrics_enabled;
41 }
42
43 bool CanGetEcMetrics() const {
44 EchoCancellation* ec = apm()->echo_cancellation();
45 EchoCancellation::Metrics metrics;
46 int metrics_result = ec->GetMetrics(&metrics);
47 int median = 0;
48 int std = 0;
49 float fraction = 0;
50 int delay_metrics_result = ec->GetDelayMetrics(&median, &std, &fraction);
51 return metrics_result == AudioProcessing::kNoError &&
52 delay_metrics_result == AudioProcessing::kNoError;
53 }
54
55 private:
peaha9cc40b2017-06-29 08:32:09 -070056 rtc::scoped_refptr<AudioProcessing> apm_;
solenberg76377c52017-02-21 00:54:31 -080057};
58} // namespace
59
60TEST(ApmHelpersTest, AgcConfig_DefaultConfiguration) {
61 TestHelper helper;
62 AgcConfig agc_config =
63 apm_helpers::GetAgcConfig(helper.apm());
64
65 EXPECT_EQ(kDefaultAgcConfig.targetLeveldBOv, agc_config.targetLeveldBOv);
66 EXPECT_EQ(kDefaultAgcConfig.digitalCompressionGaindB,
67 agc_config.digitalCompressionGaindB);
68 EXPECT_EQ(kDefaultAgcConfig.limiterEnable, agc_config.limiterEnable);
69}
70
71TEST(ApmHelpersTest, AgcConfig_GetAndSet) {
72 const AgcConfig agc_config = { 11, 17, false };
73
74 TestHelper helper;
75 apm_helpers::SetAgcConfig(helper.apm(), agc_config);
76 AgcConfig actual_config =
77 apm_helpers::GetAgcConfig(helper.apm());
78
79 EXPECT_EQ(agc_config.digitalCompressionGaindB,
80 actual_config.digitalCompressionGaindB);
81 EXPECT_EQ(agc_config.limiterEnable,
82 actual_config.limiterEnable);
83 EXPECT_EQ(agc_config.targetLeveldBOv,
84 actual_config.targetLeveldBOv);
85}
86
87TEST(ApmHelpersTest, AgcStatus_DefaultMode) {
88 TestHelper helper;
89 GainControl* gc = helper.apm()->gain_control();
Fredrik Solenberg55900fd2017-11-23 20:22:55 +010090 EXPECT_FALSE(gc->is_enabled());
oprypin45197522017-06-22 01:47:20 -070091#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR
Fredrik Solenberg55900fd2017-11-23 20:22:55 +010092 EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
oprypin45197522017-06-22 01:47:20 -070093#elif defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
solenberg76377c52017-02-21 00:54:31 -080094 EXPECT_EQ(GainControl::kFixedDigital, gc->mode());
95#else
solenberg76377c52017-02-21 00:54:31 -080096 EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
97#endif
98}
99
100TEST(ApmHelpersTest, AgcStatus_EnableDisable) {
101 TestHelper helper;
102 GainControl* gc = helper.apm()->gain_control();
103#if defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
henrikae26456a2017-12-13 14:08:48 +0100104 apm_helpers::SetAgcStatus(helper.apm(), false);
solenberg76377c52017-02-21 00:54:31 -0800105 EXPECT_FALSE(gc->is_enabled());
106 EXPECT_EQ(GainControl::kFixedDigital, gc->mode());
107
henrikae26456a2017-12-13 14:08:48 +0100108 apm_helpers::SetAgcStatus(helper.apm(), true);
solenberg76377c52017-02-21 00:54:31 -0800109 EXPECT_TRUE(gc->is_enabled());
110 EXPECT_EQ(GainControl::kFixedDigital, gc->mode());
111#else
henrikae26456a2017-12-13 14:08:48 +0100112 apm_helpers::SetAgcStatus(helper.apm(), false);
solenberg76377c52017-02-21 00:54:31 -0800113 EXPECT_FALSE(gc->is_enabled());
114 EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
henrikae26456a2017-12-13 14:08:48 +0100115 apm_helpers::SetAgcStatus(helper.apm(), true);
solenberg76377c52017-02-21 00:54:31 -0800116 EXPECT_TRUE(gc->is_enabled());
117 EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
118#endif
119}
120
121TEST(ApmHelpersTest, EcStatus_DefaultMode) {
122 TestHelper helper;
123 EchoCancellation* ec = helper.apm()->echo_cancellation();
124 EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
125 EXPECT_FALSE(ec->is_enabled());
126 EXPECT_FALSE(ecm->is_enabled());
127}
128
129TEST(ApmHelpersTest, EcStatus_EnableDisable) {
130 TestHelper helper;
131 EchoCancellation* ec = helper.apm()->echo_cancellation();
132 EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
133
134 apm_helpers::SetEcStatus(helper.apm(), true, kEcAecm);
135 EXPECT_FALSE(ec->is_enabled());
136 EXPECT_TRUE(ecm->is_enabled());
137
138 apm_helpers::SetEcStatus(helper.apm(), false, kEcAecm);
139 EXPECT_FALSE(ec->is_enabled());
140 EXPECT_FALSE(ecm->is_enabled());
141
142 apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
143 EXPECT_TRUE(ec->is_enabled());
144 EXPECT_FALSE(ecm->is_enabled());
145 EXPECT_EQ(EchoCancellation::kHighSuppression, ec->suppression_level());
146
147 apm_helpers::SetEcStatus(helper.apm(), false, kEcConference);
148 EXPECT_FALSE(ec->is_enabled());
149 EXPECT_FALSE(ecm->is_enabled());
150 EXPECT_EQ(EchoCancellation::kHighSuppression, ec->suppression_level());
151
152 apm_helpers::SetEcStatus(helper.apm(), true, kEcAecm);
153 EXPECT_FALSE(ec->is_enabled());
154 EXPECT_TRUE(ecm->is_enabled());
155}
156
157TEST(ApmHelpersTest, EcMetrics_DefaultMode) {
158 TestHelper helper;
159 apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
160 EXPECT_TRUE(helper.GetEcMetricsStatus());
161}
162
163TEST(ApmHelpersTest, EcMetrics_CanEnableDisable) {
164 TestHelper helper;
165 apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
166
167 apm_helpers::SetEcMetricsStatus(helper.apm(), true);
168 EXPECT_TRUE(helper.GetEcMetricsStatus());
169 apm_helpers::SetEcMetricsStatus(helper.apm(), false);
170 EXPECT_FALSE(helper.GetEcMetricsStatus());
171}
172
173TEST(ApmHelpersTest, EcMetrics_NoStatsUnlessEcMetricsAndEcEnabled) {
174 TestHelper helper;
175 EXPECT_FALSE(helper.CanGetEcMetrics());
176
177 apm_helpers::SetEcMetricsStatus(helper.apm(), true);
178 EXPECT_FALSE(helper.CanGetEcMetrics());
179
180 apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
181 EXPECT_TRUE(helper.CanGetEcMetrics());
182
183 apm_helpers::SetEcMetricsStatus(helper.apm(), false);
184 EXPECT_FALSE(helper.CanGetEcMetrics());
185}
186
187TEST(ApmHelpersTest, AecmMode_DefaultMode) {
188 TestHelper helper;
189 EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
190 EXPECT_EQ(EchoControlMobile::kSpeakerphone, ecm->routing_mode());
191 EXPECT_TRUE(ecm->is_comfort_noise_enabled());
192}
193
194TEST(ApmHelpersTest, AecmMode_EnableDisableCng) {
195 TestHelper helper;
196 EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
197 apm_helpers::SetAecmMode(helper.apm(), false);
198 EXPECT_FALSE(ecm->is_comfort_noise_enabled());
199 apm_helpers::SetAecmMode(helper.apm(), true);
200 EXPECT_TRUE(ecm->is_comfort_noise_enabled());
201}
202
203TEST(ApmHelpersTest, NsStatus_DefaultMode) {
204 TestHelper helper;
205 NoiseSuppression* ns = helper.apm()->noise_suppression();
206 EXPECT_EQ(NoiseSuppression::kModerate, ns->level());
207 EXPECT_FALSE(ns->is_enabled());
208}
209
210TEST(ApmHelpersTest, NsStatus_EnableDisable) {
211 TestHelper helper;
212 NoiseSuppression* ns = helper.apm()->noise_suppression();
213 apm_helpers::SetNsStatus(helper.apm(), true);
214 EXPECT_EQ(NoiseSuppression::kHigh, ns->level());
215 EXPECT_TRUE(ns->is_enabled());
216 apm_helpers::SetNsStatus(helper.apm(), false);
217 EXPECT_EQ(NoiseSuppression::kHigh, ns->level());
218 EXPECT_FALSE(ns->is_enabled());
219}
220
221TEST(ApmHelpersTest, TypingDetectionStatus_DefaultMode) {
222 TestHelper helper;
223 VoiceDetection* vd = helper.apm()->voice_detection();
224 EXPECT_FALSE(vd->is_enabled());
225}
226
Fredrik Solenberg2a877972017-12-15 16:42:15 +0100227TEST(ApmHelpersTest, TypingDetectionStatus_EnableDisable) {
solenberg76377c52017-02-21 00:54:31 -0800228 TestHelper helper;
229 VoiceDetection* vd = helper.apm()->voice_detection();
230 apm_helpers::SetTypingDetectionStatus(helper.apm(), true);
Fredrik Solenberg2a877972017-12-15 16:42:15 +0100231 EXPECT_EQ(VoiceDetection::kVeryLowLikelihood, vd->likelihood());
solenberg76377c52017-02-21 00:54:31 -0800232 EXPECT_TRUE(vd->is_enabled());
233 apm_helpers::SetTypingDetectionStatus(helper.apm(), false);
Fredrik Solenberg2a877972017-12-15 16:42:15 +0100234 EXPECT_EQ(VoiceDetection::kVeryLowLikelihood, vd->likelihood());
solenberg76377c52017-02-21 00:54:31 -0800235 EXPECT_FALSE(vd->is_enabled());
236}
237
238// TODO(solenberg): Move this test to a better place - added here for the sake
239// of duplicating all relevant tests from audio_processing_test.cc.
240TEST(ApmHelpersTest, HighPassFilter_DefaultMode) {
241 TestHelper helper;
Fredrik Solenberg55900fd2017-11-23 20:22:55 +0100242 EXPECT_FALSE(helper.apm()->high_pass_filter()->is_enabled());
solenberg76377c52017-02-21 00:54:31 -0800243}
solenberg76377c52017-02-21 00:54:31 -0800244} // namespace webrtc