blob: 47475cc5407b41bc64a8f016a0b26cebf0704d20 [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
Yves Gerey665174f2018-06-19 15:03:05 +020021constexpr AgcConfig kDefaultAgcConfig = {3, 9, true};
solenberg76377c52017-02-21 00:54:31 -080022
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));
Ivo Creusen62337e52018-01-09 14:17:33 +010028 apm_ = rtc::scoped_refptr<AudioProcessing>(
29 AudioProcessingBuilder().Create(config));
Fredrik Solenberg55900fd2017-11-23 20:22:55 +010030 apm_helpers::Init(apm());
solenberg76377c52017-02-21 00:54:31 -080031 }
32
peaha9cc40b2017-06-29 08:32:09 -070033 AudioProcessing* apm() { return apm_.get(); }
solenberg76377c52017-02-21 00:54:31 -080034
peaha9cc40b2017-06-29 08:32:09 -070035 const AudioProcessing* apm() const { return apm_.get(); }
solenberg76377c52017-02-21 00:54:31 -080036
solenberg76377c52017-02-21 00:54:31 -080037 bool GetEcMetricsStatus() const {
38 EchoCancellation* ec = apm()->echo_cancellation();
39 bool metrics_enabled = ec->are_metrics_enabled();
40 EXPECT_EQ(metrics_enabled, ec->is_delay_logging_enabled());
41 return metrics_enabled;
42 }
43
44 bool CanGetEcMetrics() const {
45 EchoCancellation* ec = apm()->echo_cancellation();
46 EchoCancellation::Metrics metrics;
47 int metrics_result = ec->GetMetrics(&metrics);
48 int median = 0;
49 int std = 0;
50 float fraction = 0;
51 int delay_metrics_result = ec->GetDelayMetrics(&median, &std, &fraction);
52 return metrics_result == AudioProcessing::kNoError &&
53 delay_metrics_result == AudioProcessing::kNoError;
54 }
55
56 private:
peaha9cc40b2017-06-29 08:32:09 -070057 rtc::scoped_refptr<AudioProcessing> apm_;
solenberg76377c52017-02-21 00:54:31 -080058};
59} // namespace
60
61TEST(ApmHelpersTest, AgcConfig_DefaultConfiguration) {
62 TestHelper helper;
Yves Gerey665174f2018-06-19 15:03:05 +020063 AgcConfig agc_config = apm_helpers::GetAgcConfig(helper.apm());
solenberg76377c52017-02-21 00:54:31 -080064
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) {
Yves Gerey665174f2018-06-19 15:03:05 +020072 const AgcConfig agc_config = {11, 17, false};
solenberg76377c52017-02-21 00:54:31 -080073
74 TestHelper helper;
75 apm_helpers::SetAgcConfig(helper.apm(), agc_config);
Yves Gerey665174f2018-06-19 15:03:05 +020076 AgcConfig actual_config = apm_helpers::GetAgcConfig(helper.apm());
solenberg76377c52017-02-21 00:54:31 -080077
78 EXPECT_EQ(agc_config.digitalCompressionGaindB,
79 actual_config.digitalCompressionGaindB);
Yves Gerey665174f2018-06-19 15:03:05 +020080 EXPECT_EQ(agc_config.limiterEnable, actual_config.limiterEnable);
81 EXPECT_EQ(agc_config.targetLeveldBOv, actual_config.targetLeveldBOv);
solenberg76377c52017-02-21 00:54:31 -080082}
83
84TEST(ApmHelpersTest, AgcStatus_DefaultMode) {
85 TestHelper helper;
86 GainControl* gc = helper.apm()->gain_control();
Fredrik Solenberg55900fd2017-11-23 20:22:55 +010087 EXPECT_FALSE(gc->is_enabled());
oprypin45197522017-06-22 01:47:20 -070088#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR
Fredrik Solenberg55900fd2017-11-23 20:22:55 +010089 EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
oprypin45197522017-06-22 01:47:20 -070090#elif defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
solenberg76377c52017-02-21 00:54:31 -080091 EXPECT_EQ(GainControl::kFixedDigital, gc->mode());
92#else
solenberg76377c52017-02-21 00:54:31 -080093 EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
94#endif
95}
96
97TEST(ApmHelpersTest, AgcStatus_EnableDisable) {
98 TestHelper helper;
99 GainControl* gc = helper.apm()->gain_control();
100#if defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
henrikae26456a2017-12-13 14:08:48 +0100101 apm_helpers::SetAgcStatus(helper.apm(), false);
solenberg76377c52017-02-21 00:54:31 -0800102 EXPECT_FALSE(gc->is_enabled());
103 EXPECT_EQ(GainControl::kFixedDigital, gc->mode());
104
henrikae26456a2017-12-13 14:08:48 +0100105 apm_helpers::SetAgcStatus(helper.apm(), true);
solenberg76377c52017-02-21 00:54:31 -0800106 EXPECT_TRUE(gc->is_enabled());
107 EXPECT_EQ(GainControl::kFixedDigital, gc->mode());
108#else
henrikae26456a2017-12-13 14:08:48 +0100109 apm_helpers::SetAgcStatus(helper.apm(), false);
solenberg76377c52017-02-21 00:54:31 -0800110 EXPECT_FALSE(gc->is_enabled());
111 EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
henrikae26456a2017-12-13 14:08:48 +0100112 apm_helpers::SetAgcStatus(helper.apm(), true);
solenberg76377c52017-02-21 00:54:31 -0800113 EXPECT_TRUE(gc->is_enabled());
114 EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
115#endif
116}
117
118TEST(ApmHelpersTest, EcStatus_DefaultMode) {
119 TestHelper helper;
120 EchoCancellation* ec = helper.apm()->echo_cancellation();
121 EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
122 EXPECT_FALSE(ec->is_enabled());
123 EXPECT_FALSE(ecm->is_enabled());
124}
125
126TEST(ApmHelpersTest, EcStatus_EnableDisable) {
127 TestHelper helper;
128 EchoCancellation* ec = helper.apm()->echo_cancellation();
129 EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
130
131 apm_helpers::SetEcStatus(helper.apm(), true, kEcAecm);
132 EXPECT_FALSE(ec->is_enabled());
133 EXPECT_TRUE(ecm->is_enabled());
134
135 apm_helpers::SetEcStatus(helper.apm(), false, kEcAecm);
136 EXPECT_FALSE(ec->is_enabled());
137 EXPECT_FALSE(ecm->is_enabled());
138
139 apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
140 EXPECT_TRUE(ec->is_enabled());
141 EXPECT_FALSE(ecm->is_enabled());
142 EXPECT_EQ(EchoCancellation::kHighSuppression, ec->suppression_level());
143
144 apm_helpers::SetEcStatus(helper.apm(), false, kEcConference);
145 EXPECT_FALSE(ec->is_enabled());
146 EXPECT_FALSE(ecm->is_enabled());
147 EXPECT_EQ(EchoCancellation::kHighSuppression, ec->suppression_level());
148
149 apm_helpers::SetEcStatus(helper.apm(), true, kEcAecm);
150 EXPECT_FALSE(ec->is_enabled());
151 EXPECT_TRUE(ecm->is_enabled());
152}
153
154TEST(ApmHelpersTest, EcMetrics_DefaultMode) {
155 TestHelper helper;
156 apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
157 EXPECT_TRUE(helper.GetEcMetricsStatus());
158}
159
160TEST(ApmHelpersTest, EcMetrics_CanEnableDisable) {
161 TestHelper helper;
162 apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
163
164 apm_helpers::SetEcMetricsStatus(helper.apm(), true);
165 EXPECT_TRUE(helper.GetEcMetricsStatus());
166 apm_helpers::SetEcMetricsStatus(helper.apm(), false);
167 EXPECT_FALSE(helper.GetEcMetricsStatus());
168}
169
170TEST(ApmHelpersTest, EcMetrics_NoStatsUnlessEcMetricsAndEcEnabled) {
171 TestHelper helper;
172 EXPECT_FALSE(helper.CanGetEcMetrics());
173
174 apm_helpers::SetEcMetricsStatus(helper.apm(), true);
175 EXPECT_FALSE(helper.CanGetEcMetrics());
176
177 apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
178 EXPECT_TRUE(helper.CanGetEcMetrics());
179
180 apm_helpers::SetEcMetricsStatus(helper.apm(), false);
181 EXPECT_FALSE(helper.CanGetEcMetrics());
182}
183
184TEST(ApmHelpersTest, AecmMode_DefaultMode) {
185 TestHelper helper;
186 EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
187 EXPECT_EQ(EchoControlMobile::kSpeakerphone, ecm->routing_mode());
188 EXPECT_TRUE(ecm->is_comfort_noise_enabled());
189}
190
191TEST(ApmHelpersTest, AecmMode_EnableDisableCng) {
192 TestHelper helper;
193 EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
194 apm_helpers::SetAecmMode(helper.apm(), false);
195 EXPECT_FALSE(ecm->is_comfort_noise_enabled());
196 apm_helpers::SetAecmMode(helper.apm(), true);
197 EXPECT_TRUE(ecm->is_comfort_noise_enabled());
198}
199
200TEST(ApmHelpersTest, NsStatus_DefaultMode) {
201 TestHelper helper;
202 NoiseSuppression* ns = helper.apm()->noise_suppression();
203 EXPECT_EQ(NoiseSuppression::kModerate, ns->level());
204 EXPECT_FALSE(ns->is_enabled());
205}
206
207TEST(ApmHelpersTest, NsStatus_EnableDisable) {
208 TestHelper helper;
209 NoiseSuppression* ns = helper.apm()->noise_suppression();
210 apm_helpers::SetNsStatus(helper.apm(), true);
211 EXPECT_EQ(NoiseSuppression::kHigh, ns->level());
212 EXPECT_TRUE(ns->is_enabled());
213 apm_helpers::SetNsStatus(helper.apm(), false);
214 EXPECT_EQ(NoiseSuppression::kHigh, ns->level());
215 EXPECT_FALSE(ns->is_enabled());
216}
217
218TEST(ApmHelpersTest, TypingDetectionStatus_DefaultMode) {
219 TestHelper helper;
220 VoiceDetection* vd = helper.apm()->voice_detection();
221 EXPECT_FALSE(vd->is_enabled());
222}
223
Fredrik Solenberg2a877972017-12-15 16:42:15 +0100224TEST(ApmHelpersTest, TypingDetectionStatus_EnableDisable) {
solenberg76377c52017-02-21 00:54:31 -0800225 TestHelper helper;
226 VoiceDetection* vd = helper.apm()->voice_detection();
227 apm_helpers::SetTypingDetectionStatus(helper.apm(), true);
Fredrik Solenberg2a877972017-12-15 16:42:15 +0100228 EXPECT_EQ(VoiceDetection::kVeryLowLikelihood, vd->likelihood());
solenberg76377c52017-02-21 00:54:31 -0800229 EXPECT_TRUE(vd->is_enabled());
230 apm_helpers::SetTypingDetectionStatus(helper.apm(), false);
Fredrik Solenberg2a877972017-12-15 16:42:15 +0100231 EXPECT_EQ(VoiceDetection::kVeryLowLikelihood, vd->likelihood());
solenberg76377c52017-02-21 00:54:31 -0800232 EXPECT_FALSE(vd->is_enabled());
233}
234
235// TODO(solenberg): Move this test to a better place - added here for the sake
236// of duplicating all relevant tests from audio_processing_test.cc.
237TEST(ApmHelpersTest, HighPassFilter_DefaultMode) {
238 TestHelper helper;
Fredrik Solenberg55900fd2017-11-23 20:22:55 +0100239 EXPECT_FALSE(helper.apm()->high_pass_filter()->is_enabled());
solenberg76377c52017-02-21 00:54:31 -0800240}
solenberg76377c52017-02-21 00:54:31 -0800241} // namespace webrtc