blob: 70edce23fee2c146dd011ed19ef33a962760d68a [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 "media/engine/webrtcvoe.h"
14#include "modules/audio_device/include/mock_audio_device.h"
15#include "modules/audio_processing/include/audio_processing.h"
16#include "test/gmock.h"
17#include "test/gtest.h"
18#include "test/mock_audio_decoder_factory.h"
19#include "voice_engine/transmit_mixer.h"
solenberg76377c52017-02-21 00:54:31 -080020
21namespace webrtc {
22namespace {
23
24constexpr AgcConfig kDefaultAgcConfig = { 3, 9, true };
25
26struct TestHelper {
27 TestHelper() {
solenberg76377c52017-02-21 00:54:31 -080028 // This replicates the conditions from voe_auto_test.
29 Config config;
30 config.Set<ExperimentalAgc>(new ExperimentalAgc(false));
peaha9cc40b2017-06-29 08:32:09 -070031 apm_ = rtc::scoped_refptr<AudioProcessing>(AudioProcessing::Create(config));
Fredrik Solenberg55900fd2017-11-23 20:22:55 +010032 apm_helpers::Init(apm());
solenberg76377c52017-02-21 00:54:31 -080033 EXPECT_EQ(0, voe_wrapper_.base()->Init(
peaha9cc40b2017-06-29 08:32:09 -070034 &mock_audio_device_, apm_,
35 MockAudioDecoderFactory::CreateEmptyFactory()));
solenberg76377c52017-02-21 00:54:31 -080036 }
37
peaha9cc40b2017-06-29 08:32:09 -070038 AudioProcessing* apm() { return apm_.get(); }
solenberg76377c52017-02-21 00:54:31 -080039
peaha9cc40b2017-06-29 08:32:09 -070040 const AudioProcessing* apm() const { return apm_.get(); }
solenberg76377c52017-02-21 00:54:31 -080041
solenberg76377c52017-02-21 00:54:31 -080042 voe::TransmitMixer* transmit_mixer() {
43 return voe_wrapper_.base()->transmit_mixer();
44 }
45
46 bool GetEcMetricsStatus() const {
47 EchoCancellation* ec = apm()->echo_cancellation();
48 bool metrics_enabled = ec->are_metrics_enabled();
49 EXPECT_EQ(metrics_enabled, ec->is_delay_logging_enabled());
50 return metrics_enabled;
51 }
52
53 bool CanGetEcMetrics() const {
54 EchoCancellation* ec = apm()->echo_cancellation();
55 EchoCancellation::Metrics metrics;
56 int metrics_result = ec->GetMetrics(&metrics);
57 int median = 0;
58 int std = 0;
59 float fraction = 0;
60 int delay_metrics_result = ec->GetDelayMetrics(&median, &std, &fraction);
61 return metrics_result == AudioProcessing::kNoError &&
62 delay_metrics_result == AudioProcessing::kNoError;
63 }
64
65 private:
66 testing::NiceMock<test::MockAudioDeviceModule> mock_audio_device_;
67 cricket::VoEWrapper voe_wrapper_;
peaha9cc40b2017-06-29 08:32:09 -070068 rtc::scoped_refptr<AudioProcessing> apm_;
solenberg76377c52017-02-21 00:54:31 -080069};
70} // namespace
71
72TEST(ApmHelpersTest, AgcConfig_DefaultConfiguration) {
73 TestHelper helper;
74 AgcConfig agc_config =
75 apm_helpers::GetAgcConfig(helper.apm());
76
77 EXPECT_EQ(kDefaultAgcConfig.targetLeveldBOv, agc_config.targetLeveldBOv);
78 EXPECT_EQ(kDefaultAgcConfig.digitalCompressionGaindB,
79 agc_config.digitalCompressionGaindB);
80 EXPECT_EQ(kDefaultAgcConfig.limiterEnable, agc_config.limiterEnable);
81}
82
83TEST(ApmHelpersTest, AgcConfig_GetAndSet) {
84 const AgcConfig agc_config = { 11, 17, false };
85
86 TestHelper helper;
87 apm_helpers::SetAgcConfig(helper.apm(), agc_config);
88 AgcConfig actual_config =
89 apm_helpers::GetAgcConfig(helper.apm());
90
91 EXPECT_EQ(agc_config.digitalCompressionGaindB,
92 actual_config.digitalCompressionGaindB);
93 EXPECT_EQ(agc_config.limiterEnable,
94 actual_config.limiterEnable);
95 EXPECT_EQ(agc_config.targetLeveldBOv,
96 actual_config.targetLeveldBOv);
97}
98
99TEST(ApmHelpersTest, AgcStatus_DefaultMode) {
100 TestHelper helper;
101 GainControl* gc = helper.apm()->gain_control();
Fredrik Solenberg55900fd2017-11-23 20:22:55 +0100102 EXPECT_FALSE(gc->is_enabled());
oprypin45197522017-06-22 01:47:20 -0700103#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR
Fredrik Solenberg55900fd2017-11-23 20:22:55 +0100104 EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
oprypin45197522017-06-22 01:47:20 -0700105#elif defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
solenberg76377c52017-02-21 00:54:31 -0800106 EXPECT_EQ(GainControl::kFixedDigital, gc->mode());
107#else
solenberg76377c52017-02-21 00:54:31 -0800108 EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
109#endif
110}
111
112TEST(ApmHelpersTest, AgcStatus_EnableDisable) {
113 TestHelper helper;
114 GainControl* gc = helper.apm()->gain_control();
115#if defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
henrikae26456a2017-12-13 14:08:48 +0100116 apm_helpers::SetAgcStatus(helper.apm(), false);
solenberg76377c52017-02-21 00:54:31 -0800117 EXPECT_FALSE(gc->is_enabled());
118 EXPECT_EQ(GainControl::kFixedDigital, gc->mode());
119
henrikae26456a2017-12-13 14:08:48 +0100120 apm_helpers::SetAgcStatus(helper.apm(), true);
solenberg76377c52017-02-21 00:54:31 -0800121 EXPECT_TRUE(gc->is_enabled());
122 EXPECT_EQ(GainControl::kFixedDigital, gc->mode());
123#else
henrikae26456a2017-12-13 14:08:48 +0100124 apm_helpers::SetAgcStatus(helper.apm(), false);
solenberg76377c52017-02-21 00:54:31 -0800125 EXPECT_FALSE(gc->is_enabled());
126 EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
henrikae26456a2017-12-13 14:08:48 +0100127 apm_helpers::SetAgcStatus(helper.apm(), true);
solenberg76377c52017-02-21 00:54:31 -0800128 EXPECT_TRUE(gc->is_enabled());
129 EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
130#endif
131}
132
133TEST(ApmHelpersTest, EcStatus_DefaultMode) {
134 TestHelper helper;
135 EchoCancellation* ec = helper.apm()->echo_cancellation();
136 EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
137 EXPECT_FALSE(ec->is_enabled());
138 EXPECT_FALSE(ecm->is_enabled());
139}
140
141TEST(ApmHelpersTest, EcStatus_EnableDisable) {
142 TestHelper helper;
143 EchoCancellation* ec = helper.apm()->echo_cancellation();
144 EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
145
146 apm_helpers::SetEcStatus(helper.apm(), true, kEcAecm);
147 EXPECT_FALSE(ec->is_enabled());
148 EXPECT_TRUE(ecm->is_enabled());
149
150 apm_helpers::SetEcStatus(helper.apm(), false, kEcAecm);
151 EXPECT_FALSE(ec->is_enabled());
152 EXPECT_FALSE(ecm->is_enabled());
153
154 apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
155 EXPECT_TRUE(ec->is_enabled());
156 EXPECT_FALSE(ecm->is_enabled());
157 EXPECT_EQ(EchoCancellation::kHighSuppression, ec->suppression_level());
158
159 apm_helpers::SetEcStatus(helper.apm(), false, kEcConference);
160 EXPECT_FALSE(ec->is_enabled());
161 EXPECT_FALSE(ecm->is_enabled());
162 EXPECT_EQ(EchoCancellation::kHighSuppression, ec->suppression_level());
163
164 apm_helpers::SetEcStatus(helper.apm(), true, kEcAecm);
165 EXPECT_FALSE(ec->is_enabled());
166 EXPECT_TRUE(ecm->is_enabled());
167}
168
169TEST(ApmHelpersTest, EcMetrics_DefaultMode) {
170 TestHelper helper;
171 apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
172 EXPECT_TRUE(helper.GetEcMetricsStatus());
173}
174
175TEST(ApmHelpersTest, EcMetrics_CanEnableDisable) {
176 TestHelper helper;
177 apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
178
179 apm_helpers::SetEcMetricsStatus(helper.apm(), true);
180 EXPECT_TRUE(helper.GetEcMetricsStatus());
181 apm_helpers::SetEcMetricsStatus(helper.apm(), false);
182 EXPECT_FALSE(helper.GetEcMetricsStatus());
183}
184
185TEST(ApmHelpersTest, EcMetrics_NoStatsUnlessEcMetricsAndEcEnabled) {
186 TestHelper helper;
187 EXPECT_FALSE(helper.CanGetEcMetrics());
188
189 apm_helpers::SetEcMetricsStatus(helper.apm(), true);
190 EXPECT_FALSE(helper.CanGetEcMetrics());
191
192 apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
193 EXPECT_TRUE(helper.CanGetEcMetrics());
194
195 apm_helpers::SetEcMetricsStatus(helper.apm(), false);
196 EXPECT_FALSE(helper.CanGetEcMetrics());
197}
198
199TEST(ApmHelpersTest, AecmMode_DefaultMode) {
200 TestHelper helper;
201 EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
202 EXPECT_EQ(EchoControlMobile::kSpeakerphone, ecm->routing_mode());
203 EXPECT_TRUE(ecm->is_comfort_noise_enabled());
204}
205
206TEST(ApmHelpersTest, AecmMode_EnableDisableCng) {
207 TestHelper helper;
208 EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
209 apm_helpers::SetAecmMode(helper.apm(), false);
210 EXPECT_FALSE(ecm->is_comfort_noise_enabled());
211 apm_helpers::SetAecmMode(helper.apm(), true);
212 EXPECT_TRUE(ecm->is_comfort_noise_enabled());
213}
214
215TEST(ApmHelpersTest, NsStatus_DefaultMode) {
216 TestHelper helper;
217 NoiseSuppression* ns = helper.apm()->noise_suppression();
218 EXPECT_EQ(NoiseSuppression::kModerate, ns->level());
219 EXPECT_FALSE(ns->is_enabled());
220}
221
222TEST(ApmHelpersTest, NsStatus_EnableDisable) {
223 TestHelper helper;
224 NoiseSuppression* ns = helper.apm()->noise_suppression();
225 apm_helpers::SetNsStatus(helper.apm(), true);
226 EXPECT_EQ(NoiseSuppression::kHigh, ns->level());
227 EXPECT_TRUE(ns->is_enabled());
228 apm_helpers::SetNsStatus(helper.apm(), false);
229 EXPECT_EQ(NoiseSuppression::kHigh, ns->level());
230 EXPECT_FALSE(ns->is_enabled());
231}
232
233TEST(ApmHelpersTest, TypingDetectionStatus_DefaultMode) {
234 TestHelper helper;
235 VoiceDetection* vd = helper.apm()->voice_detection();
236 EXPECT_FALSE(vd->is_enabled());
237}
238
oprypin45197522017-06-22 01:47:20 -0700239// TODO(kthelgason): Reenable this test on simulator.
240// See bugs.webrtc.org/5569
241#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR
Steve Antone78bcb92017-10-31 09:53:08 -0700242#define MAYBE_TypingDetectionStatus_EnableDisable \
243 DISABLED_TypingDetectionStatus_EnableDisable
oprypin45197522017-06-22 01:47:20 -0700244#else
Steve Antone78bcb92017-10-31 09:53:08 -0700245#define MAYBE_TypingDetectionStatus_EnableDisable \
246 TypingDetectionStatus_EnableDisable
oprypin45197522017-06-22 01:47:20 -0700247#endif
248TEST(ApmHelpersTest, MAYBE_TypingDetectionStatus_EnableDisable) {
solenberg76377c52017-02-21 00:54:31 -0800249 TestHelper helper;
250 VoiceDetection* vd = helper.apm()->voice_detection();
251 apm_helpers::SetTypingDetectionStatus(helper.apm(), true);
252 EXPECT_TRUE(vd->is_enabled());
253 apm_helpers::SetTypingDetectionStatus(helper.apm(), false);
254 EXPECT_FALSE(vd->is_enabled());
255}
256
257// TODO(solenberg): Move this test to a better place - added here for the sake
258// of duplicating all relevant tests from audio_processing_test.cc.
259TEST(ApmHelpersTest, HighPassFilter_DefaultMode) {
260 TestHelper helper;
Fredrik Solenberg55900fd2017-11-23 20:22:55 +0100261 EXPECT_FALSE(helper.apm()->high_pass_filter()->is_enabled());
solenberg76377c52017-02-21 00:54:31 -0800262}
263
264// TODO(solenberg): Move this test to a better place - added here for the sake
265// of duplicating all relevant tests from audio_processing_test.cc.
266TEST(ApmHelpersTest, StereoSwapping_DefaultMode) {
267 TestHelper helper;
268 EXPECT_FALSE(helper.transmit_mixer()->IsStereoChannelSwappingEnabled());
269}
270
271// TODO(solenberg): Move this test to a better place - added here for the sake
272// of duplicating all relevant tests from audio_processing_test.cc.
273TEST(ApmHelpersTest, StereoSwapping_EnableDisable) {
274 TestHelper helper;
275 helper.transmit_mixer()->EnableStereoChannelSwapping(true);
276 EXPECT_TRUE(helper.transmit_mixer()->IsStereoChannelSwappingEnabled());
277 helper.transmit_mixer()->EnableStereoChannelSwapping(false);
278 EXPECT_FALSE(helper.transmit_mixer()->IsStereoChannelSwappingEnabled());
279}
280} // namespace webrtc