1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/voe_audio_processing_impl.h"
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/modules/audio_processing/include/audio_processing.h"
14471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
15471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/system_wrappers/interface/logging.h"
16471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/system_wrappers/interface/trace.h"
17471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/channel.h"
18471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/include/voe_errors.h"
19471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/transmit_mixer.h"
20471ae72f18e7b23a96b245dbd508386fe139449cpbos@webrtc.org#include "webrtc/voice_engine/voice_engine_impl.h"
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// TODO(andrew): move to a common place.
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_VOICE_INIT_CHECK()                        \
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  do {                                                   \
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized()) {          \
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      _shared->SetLastError(VE_NOT_INITED, kTraceError); \
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return -1;                                         \
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }                                                    \
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  } while (0)
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_VOICE_INIT_CHECK_BOOL()                   \
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  do {                                                   \
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (!_shared->statistics().Initialized()) {          \
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      _shared->SetLastError(VE_NOT_INITED, kTraceError); \
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return false;                                      \
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }                                                    \
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  } while (0)
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstatic const EcModes kDefaultEcMode = kEcAecm;
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstatic const EcModes kDefaultEcMode = kEcAec;
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVoEAudioProcessing* VoEAudioProcessing::GetInterface(VoiceEngine* voiceEngine) {
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_VOICE_ENGINE_AUDIO_PROCESSING_API
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return NULL;
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (NULL == voiceEngine) {
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return NULL;
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
54b9e5a3d589349ee55e41cb54eca4ec822018f5c5tommi@webrtc.org  VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  s->AddRef();
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return s;
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_AUDIO_PROCESSING_API
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVoEAudioProcessingImpl::VoEAudioProcessingImpl(voe::SharedData* shared)
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    : _isAecMode(kDefaultEcMode == kEcAec),
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      _shared(shared) {
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "VoEAudioProcessingImpl::VoEAudioProcessingImpl() - ctor");
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgVoEAudioProcessingImpl::~VoEAudioProcessingImpl() {
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "VoEAudioProcessingImpl::~VoEAudioProcessingImpl() - dtor");
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::SetNsStatus(bool enable, NsModes mode) {
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "SetNsStatus(enable=%d, mode=%d)", enable, mode);
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_NR
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
82b79627b0f3cf072721f3ae4a584a4f90edba2d1bandrew@webrtc.org  NoiseSuppression::Level nsLevel = kDefaultNsMode;
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  switch (mode) {
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kNsDefault:
85b79627b0f3cf072721f3ae4a584a4f90edba2d1bandrew@webrtc.org      nsLevel = kDefaultNsMode;
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kNsUnchanged:
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      nsLevel = _shared->audio_processing()->noise_suppression()->level();
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kNsConference:
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      nsLevel = NoiseSuppression::kHigh;
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kNsLowSuppression:
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      nsLevel = NoiseSuppression::kLow;
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kNsModerateSuppression:
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      nsLevel = NoiseSuppression::kModerate;
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kNsHighSuppression:
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      nsLevel = NoiseSuppression::kHigh;
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kNsVeryHighSuppression:
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      nsLevel = NoiseSuppression::kVeryHigh;
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (_shared->audio_processing()->noise_suppression()->
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          set_level(nsLevel) != 0) {
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceError,
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "SetNsStatus() failed to set Ns mode");
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (_shared->audio_processing()->noise_suppression()->Enable(enable) != 0) {
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceError,
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "SetNsStatus() failed to set Ns state");
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "SetNsStatus() Ns is not supported");
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::GetNsStatus(bool& enabled, NsModes& mode) {
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetNsStatus(enabled=?, mode=?)");
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_NR
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
136b79627b0f3cf072721f3ae4a584a4f90edba2d1bandrew@webrtc.org  enabled = _shared->audio_processing()->noise_suppression()->is_enabled();
137b79627b0f3cf072721f3ae4a584a4f90edba2d1bandrew@webrtc.org  NoiseSuppression::Level nsLevel =
138b79627b0f3cf072721f3ae4a584a4f90edba2d1bandrew@webrtc.org      _shared->audio_processing()->noise_suppression()->level();
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  switch (nsLevel) {
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case NoiseSuppression::kLow:
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      mode = kNsLowSuppression;
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case NoiseSuppression::kModerate:
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      mode = kNsModerateSuppression;
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case NoiseSuppression::kHigh:
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      mode = kNsHighSuppression;
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case NoiseSuppression::kVeryHigh:
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      mode = kNsVeryHighSuppression;
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetNsStatus() => enabled=% d, mode=%d", enabled, mode);
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "GetNsStatus() Ns is not supported");
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::SetAgcStatus(bool enable, AgcModes mode) {
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "SetAgcStatus(enable=%d, mode=%d)", enable, mode);
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_AGC
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(WEBRTC_IOS) || defined(ATA) || defined(WEBRTC_ANDROID)
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (mode == kAgcAdaptiveAnalog) {
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "SetAgcStatus() invalid Agc mode for mobile device");
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
182b79627b0f3cf072721f3ae4a584a4f90edba2d1bandrew@webrtc.org  GainControl::Mode agcMode = kDefaultAgcMode;
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  switch (mode) {
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kAgcDefault:
185b79627b0f3cf072721f3ae4a584a4f90edba2d1bandrew@webrtc.org      agcMode = kDefaultAgcMode;
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kAgcUnchanged:
188b79627b0f3cf072721f3ae4a584a4f90edba2d1bandrew@webrtc.org      agcMode = _shared->audio_processing()->gain_control()->mode();
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kAgcFixedDigital:
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      agcMode = GainControl::kFixedDigital;
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kAgcAdaptiveAnalog:
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      agcMode = GainControl::kAdaptiveAnalog;
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kAgcAdaptiveDigital:
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      agcMode = GainControl::kAdaptiveDigital;
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (_shared->audio_processing()->gain_control()->set_mode(agcMode) != 0) {
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceError,
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "SetAgcStatus() failed to set Agc mode");
204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (_shared->audio_processing()->gain_control()->Enable(enable) != 0) {
207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceError,
208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "SetAgcStatus() failed to set Agc state");
209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (agcMode != GainControl::kFixedDigital) {
213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Set Agc state in the ADM when adaptive Agc mode has been selected.
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Note that we also enable the ADM Agc when Adaptive Digital mode is
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // used since we want to be able to provide the APM with updated mic
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // levels when the user modifies the mic level manually.
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_shared->audio_device()->SetAGC(enable) != 0) {
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR,
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          kTraceWarning, "SetAgcStatus() failed to set Agc mode");
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "SetAgcStatus() Agc is not supported");
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::GetAgcStatus(bool& enabled, AgcModes& mode) {
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetAgcStatus(enabled=?, mode=?)");
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_AGC
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
240b79627b0f3cf072721f3ae4a584a4f90edba2d1bandrew@webrtc.org  enabled = _shared->audio_processing()->gain_control()->is_enabled();
2410c1f10b1ee951ff3afde4cbaefb218761358eb10sjlee@webrtc.org  GainControl::Mode agcMode =
2420c1f10b1ee951ff3afde4cbaefb218761358eb10sjlee@webrtc.org    _shared->audio_processing()->gain_control()->mode();
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  switch (agcMode) {
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case GainControl::kFixedDigital:
246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      mode = kAgcFixedDigital;
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case GainControl::kAdaptiveAnalog:
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      mode = kAgcAdaptiveAnalog;
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case GainControl::kAdaptiveDigital:
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      mode = kAgcAdaptiveDigital;
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetAgcStatus() => enabled=%d, mode=%d", enabled, mode);
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "GetAgcStatus() Agc is not supported");
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
266ca7a9a2696d2f73f543241093c4faeb4c608678cpbos@webrtc.orgint VoEAudioProcessingImpl::SetAgcConfig(AgcConfig config) {
267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "SetAgcConfig()");
269b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_AGC
270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
273b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
275b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (_shared->audio_processing()->gain_control()->set_target_level_dbfs(
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      config.targetLeveldBOv) != 0) {
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceError,
278b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "SetAgcConfig() failed to set target peak |level|"
279b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        " (or envelope) of the Agc");
280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (_shared->audio_processing()->gain_control()->set_compression_gain_db(
283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        config.digitalCompressionGaindB) != 0) {
284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceError,
285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "SetAgcConfig() failed to set the range in |gain| "
286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "the digital compression stage may apply");
287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (_shared->audio_processing()->gain_control()->enable_limiter(
290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        config.limiterEnable) != 0) {
291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceError,
292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "SetAgcConfig() failed to set hard limiter to the signal");
293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "SetAgcConfig() EC is not supported");
300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::GetAgcConfig(AgcConfig& config) {
305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetAgcConfig(config=?)");
307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_AGC
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  config.targetLeveldBOv =
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->audio_processing()->gain_control()->target_level_dbfs();
315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  config.digitalCompressionGaindB =
316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->audio_processing()->gain_control()->compression_gain_db();
317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  config.limiterEnable =
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->audio_processing()->gain_control()->is_limiter_enabled();
319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetAgcConfig() => targetLeveldBOv=%u, "
322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                  "digitalCompressionGaindB=%u, limiterEnable=%d",
323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               config.targetLeveldBOv,
324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               config.digitalCompressionGaindB,
325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               config.limiterEnable);
326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
328b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
329b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "GetAgcConfig() EC is not supported");
331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::SetRxNsStatus(int channel,
336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          bool enable,
337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          NsModes mode) {
338d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  LOG_API3(channel, enable, mode);
3390dd483fedbcd03506db5e382204543020f168a4dandrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_NR
340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
345b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
346b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::Channel* channelPtr = ch.channel();
347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (channelPtr == NULL) {
348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "SetRxNsStatus() failed to locate channel");
350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return channelPtr->SetRxNsStatus(enable, mode);
353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
3550dd483fedbcd03506db5e382204543020f168a4dandrew@webrtc.org      "SetRxNsStatus() NS is not supported");
356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::GetRxNsStatus(int channel,
361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          bool& enabled,
362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          NsModes& mode) {
363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetRxNsStatus(channel=%d, enable=?, mode=?)", channel);
3650dd483fedbcd03506db5e382204543020f168a4dandrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_NR
366b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
367b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
368b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
369b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
370b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
371b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
372b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::Channel* channelPtr = ch.channel();
373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (channelPtr == NULL) {
374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "GetRxNsStatus() failed to locate channel");
376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return channelPtr->GetRxNsStatus(enabled, mode);
379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
3810dd483fedbcd03506db5e382204543020f168a4dandrew@webrtc.org      "GetRxNsStatus() NS is not supported");
382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
384b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
385b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::SetRxAgcStatus(int channel,
387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           bool enable,
388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           AgcModes mode) {
389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "SetRxAgcStatus(channel=%d, enable=%d, mode=%d)",
391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               channel, (int)enable, (int)mode);
392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_AGC
393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
398b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
399b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::Channel* channelPtr = ch.channel();
400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (channelPtr == NULL) {
401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "SetRxAgcStatus() failed to locate channel");
403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return channelPtr->SetRxAgcStatus(enable, mode);
406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "SetRxAgcStatus() Agc is not supported");
409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::GetRxAgcStatus(int channel,
414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           bool& enabled,
415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           AgcModes& mode) {
416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetRxAgcStatus(channel=%d, enable=?, mode=?)", channel);
418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_AGC
419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
424b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
425b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::Channel* channelPtr = ch.channel();
426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (channelPtr == NULL) {
427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "GetRxAgcStatus() failed to locate channel");
429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return channelPtr->GetRxAgcStatus(enabled, mode);
432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "GetRxAgcStatus() Agc is not supported");
435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::SetRxAgcConfig(int channel,
440ca7a9a2696d2f73f543241093c4faeb4c608678cpbos@webrtc.org                                           AgcConfig config) {
441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "SetRxAgcConfig(channel=%d)", channel);
443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_AGC
444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
449b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
450b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::Channel* channelPtr = ch.channel();
451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (channelPtr == NULL) {
452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "SetRxAgcConfig() failed to locate channel");
454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return channelPtr->SetRxAgcConfig(config);
457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "SetRxAgcConfig() Agc is not supported");
460b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
462b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
464b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::GetRxAgcConfig(int channel, AgcConfig& config) {
465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetRxAgcConfig(channel=%d)", channel);
467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_AGC
468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
473b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
474b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::Channel* channelPtr = ch.channel();
475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (channelPtr == NULL) {
476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "GetRxAgcConfig() failed to locate channel");
478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return channelPtr->GetRxAgcConfig(config);
481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "GetRxAgcConfig() Agc is not supported");
484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool VoEAudioProcessing::DriftCompensationSupported() {
489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(WEBRTC_DRIFT_COMPENSATION_SUPPORTED)
490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return true;
491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return false;
493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::EnableDriftCompensation(bool enable) {
497d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  LOG_API1(enable);
498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_VOICE_INIT_CHECK();
499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
500b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!DriftCompensationSupported()) {
501b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceWarning,
502b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "Drift compensation is not supported on this platform.");
503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EchoCancellation* aec = _shared->audio_processing()->echo_cancellation();
507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (aec->enable_drift_compensation(enable) != 0) {
508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceError,
509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "aec->enable_drift_compensation() failed");
510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool VoEAudioProcessingImpl::DriftCompensationEnabled() {
516d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  LOG_API0();
517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_VOICE_INIT_CHECK_BOOL();
518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EchoCancellation* aec = _shared->audio_processing()->echo_cancellation();
520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return aec->is_drift_compensation_enabled();
521b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::SetEcStatus(bool enable, EcModes mode) {
524b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
525b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "SetEcStatus(enable=%d, mode=%d)", enable, mode);
526b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_ECHO
527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
528b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
532b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // AEC mode
533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if ((mode == kEcDefault) ||
534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      (mode == kEcConference) ||
535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      (mode == kEcAec) ||
536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      ((mode == kEcUnchanged) &&
537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org       (_isAecMode == true))) {
538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (enable) {
539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      // Disable the AECM before enable the AEC
540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if (_shared->audio_processing()->echo_control_mobile()->is_enabled()) {
541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_APM_ERROR, kTraceWarning,
542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "SetEcStatus() disable AECM before enabling AEC");
543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_shared->audio_processing()->echo_control_mobile()->
544b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            Enable(false) != 0) {
545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          _shared->SetLastError(VE_APM_ERROR, kTraceError,
546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              "SetEcStatus() failed to disable AECM");
547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          return -1;
548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
549b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_shared->audio_processing()->echo_cancellation()->Enable(enable) != 0) {
552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      _shared->SetLastError(VE_APM_ERROR, kTraceError,
553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          "SetEcStatus() failed to set AEC state");
554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return -1;
555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (mode == kEcConference) {
557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if (_shared->audio_processing()->echo_cancellation()->
558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          set_suppression_level(EchoCancellation::kHighSuppression) != 0) {
559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_APM_ERROR, kTraceError,
560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "SetEcStatus() failed to set aggressiveness to high");
561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } else {
564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if (_shared->audio_processing()->echo_cancellation()->
565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          set_suppression_level(
566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            EchoCancellation::kModerateSuppression) != 0) {
567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_APM_ERROR, kTraceError,
568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "SetEcStatus() failed to set aggressiveness to moderate");
569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        return -1;
570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _isAecMode = true;
574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  } else if ((mode == kEcAecm) ||
575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org             ((mode == kEcUnchanged) &&
576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              (_isAecMode == false))) {
577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (enable) {
578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      // Disable the AEC before enable the AECM
579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      if (_shared->audio_processing()->echo_cancellation()->is_enabled()) {
580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        _shared->SetLastError(VE_APM_ERROR, kTraceWarning,
581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            "SetEcStatus() disable AEC before enabling AECM");
582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        if (_shared->audio_processing()->echo_cancellation()->
583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org            Enable(false) != 0) {
584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          _shared->SetLastError(VE_APM_ERROR, kTraceError,
585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              "SetEcStatus() failed to disable AEC");
586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          return -1;
587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        }
588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      }
589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    if (_shared->audio_processing()->echo_control_mobile()->
591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Enable(enable) != 0) {
592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      _shared->SetLastError(VE_APM_ERROR, kTraceError,
593b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          "SetEcStatus() failed to set AECM state");
594b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      return -1;
595b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _isAecMode = false;
597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  } else {
598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                   "SetEcStatus() invalid EC mode");
600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
603b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
604b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
605b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "SetEcStatus() EC is not supported");
607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::GetEcStatus(bool& enabled, EcModes& mode) {
612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
613b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetEcStatus()");
614b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_ECHO
615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (_isAecMode == true) {
621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    mode = kEcAec;
622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    enabled = _shared->audio_processing()->echo_cancellation()->is_enabled();
623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  } else {
624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    mode = kEcAecm;
625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    enabled = _shared->audio_processing()->echo_control_mobile()->
626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org              is_enabled();
627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetEcStatus() => enabled=%i, mode=%i",
631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               enabled, (int)mode);
632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "GetEcStatus() EC is not supported");
636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid VoEAudioProcessingImpl::SetDelayOffsetMs(int offset) {
641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "SetDelayOffsetMs(offset = %d)", offset);
643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->audio_processing()->set_delay_offset_ms(offset);
644b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
645b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::DelayOffsetMs() {
647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "DelayOffsetMs()");
649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return _shared->audio_processing()->delay_offset_ms();
650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::SetAecmMode(AecmModes mode, bool enableCNG) {
653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
654b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "SetAECMMode(mode = %d)", mode);
655b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_ECHO
656b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EchoControlMobile::RoutingMode aecmMode(
662b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      EchoControlMobile::kQuietEarpieceOrHeadset);
663b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  switch (mode) {
665b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kAecmQuietEarpieceOrHeadset:
666b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      aecmMode = EchoControlMobile::kQuietEarpieceOrHeadset;
667b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
668b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kAecmEarpiece:
669b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      aecmMode = EchoControlMobile::kEarpiece;
670b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
671b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kAecmLoudEarpiece:
672b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      aecmMode = EchoControlMobile::kLoudEarpiece;
673b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
674b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kAecmSpeakerphone:
675b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      aecmMode = EchoControlMobile::kSpeakerphone;
676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case kAecmLoudSpeakerphone:
678b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      aecmMode = EchoControlMobile::kLoudSpeakerphone;
679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
680b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
681b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
682b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (_shared->audio_processing()->echo_control_mobile()->
684b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      set_routing_mode(aecmMode) != 0) {
685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceError,
686b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "SetAECMMode() failed to set AECM routing mode");
687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
689b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (_shared->audio_processing()->echo_control_mobile()->
690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      enable_comfort_noise(enableCNG) != 0) {
691b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceError,
692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "SetAECMMode() failed to set comfort noise state for AECM");
693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
694b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
695b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
696b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
697b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
698b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
699b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "SetAECMMode() EC is not supported");
700b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
701b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
702b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
703b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
704b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::GetAecmMode(AecmModes& mode, bool& enabledCNG) {
705b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
706b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetAECMMode(mode=?)");
707b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_ECHO
708b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
709b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
710b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
711b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
712b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
713b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  enabledCNG = false;
714b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
715b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EchoControlMobile::RoutingMode aecmMode =
716b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      _shared->audio_processing()->echo_control_mobile()->routing_mode();
717b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  enabledCNG = _shared->audio_processing()->echo_control_mobile()->
718b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      is_comfort_noise_enabled();
719b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
720b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  switch (aecmMode) {
721b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case EchoControlMobile::kQuietEarpieceOrHeadset:
722b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      mode = kAecmQuietEarpieceOrHeadset;
723b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
724b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case EchoControlMobile::kEarpiece:
725b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      mode = kAecmEarpiece;
726b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
727b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case EchoControlMobile::kLoudEarpiece:
728b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      mode = kAecmLoudEarpiece;
729b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
730b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case EchoControlMobile::kSpeakerphone:
731b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      mode = kAecmSpeakerphone;
732b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
733b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    case EchoControlMobile::kLoudSpeakerphone:
734b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      mode = kAecmLoudSpeakerphone;
735b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      break;
736b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
737b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
738b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
739b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
740b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
741b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "GetAECMMode() EC is not supported");
742b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
743b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
744b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
745b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
746b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::EnableHighPassFilter(bool enable) {
747b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
748b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "EnableHighPassFilter(%d)", enable);
749b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (_shared->audio_processing()->high_pass_filter()->Enable(enable) !=
750b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      AudioProcessing::kNoError) {
751b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceError,
752b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "HighPassFilter::Enable() failed.");
753b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
754b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
755b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
756b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
757b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
758b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
759b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool VoEAudioProcessingImpl::IsHighPassFilterEnabled() {
760b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
761b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "IsHighPassFilterEnabled()");
762b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return _shared->audio_processing()->high_pass_filter()->is_enabled();
763b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
764b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
765b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::RegisterRxVadObserver(
766b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int channel,
767b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VoERxVadCallback& observer) {
768b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
769b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "RegisterRxVadObserver()");
770b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
771b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
772b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
773b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
774b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
775b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::Channel* channelPtr = ch.channel();
776b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (channelPtr == NULL) {
777b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
778b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "RegisterRxVadObserver() failed to locate channel");
779b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
780b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
781b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return channelPtr->RegisterRxVadObserver(observer);
782b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
783b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
784b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::DeRegisterRxVadObserver(int channel) {
785b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
786b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "DeRegisterRxVadObserver()");
787b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
788b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
789b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
790b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
791b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
792b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::Channel* channelPtr = ch.channel();
793b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (channelPtr == NULL) {
794b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
795b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "DeRegisterRxVadObserver() failed to locate channel");
796b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
797b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
798b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
799b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return channelPtr->DeRegisterRxVadObserver();
800b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
801b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
802b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::VoiceActivityIndicator(int channel) {
803b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
804b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "VoiceActivityIndicator(channel=%d)", channel);
805b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
806b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
807b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
808b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
809b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
810b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
811b3ada1540827c60a63058570a94a57dfd260ad11pbos@webrtc.org  voe::Channel* channelPtr = ch.channel();
812b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (channelPtr == NULL) {
813b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
814b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "DeRegisterRxVadObserver() failed to locate channel");
815b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
816b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
817b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int activity(-1);
818b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  channelPtr->VoiceActivityIndicator(activity);
819b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
820b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return activity;
821b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
822b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
823b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::SetEcMetricsStatus(bool enable) {
824b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
825b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "SetEcMetricsStatus(enable=%d)", enable);
826b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_ECHO
827b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
828b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
829b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
830b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
831b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
832b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if ((_shared->audio_processing()->echo_cancellation()->enable_metrics(enable)
833b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org       != 0) ||
834b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      (_shared->audio_processing()->echo_cancellation()->enable_delay_logging(
835b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org         enable) != 0)) {
836b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceError,
837b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "SetEcMetricsStatus() unable to set EC metrics mode");
838b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
839b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
840b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
841b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
842b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
843b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "SetEcStatus() EC is not supported");
844b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
845b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
846b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
847b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
848b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::GetEcMetricsStatus(bool& enabled) {
849b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
850b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetEcMetricsStatus(enabled=?)");
851b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_ECHO
852b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
853b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
854b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
855b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
856b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
857b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool echo_mode =
858b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->audio_processing()->echo_cancellation()->are_metrics_enabled();
859b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool delay_mode = _shared->audio_processing()->echo_cancellation()->
860b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      is_delay_logging_enabled();
861b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
862b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (echo_mode != delay_mode) {
863b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceError,
864b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "GetEcMetricsStatus() delay logging and echo mode are not the same");
865b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
866b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
867b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
868b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  enabled = echo_mode;
869b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
870b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
871b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetEcMetricsStatus() => enabled=%d", enabled);
872b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
873b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
874b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
875b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "SetEcStatus() EC is not supported");
876b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
877b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
878b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
879b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
880b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::GetEchoMetrics(int& ERL,
881b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           int& ERLE,
882b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           int& RERL,
883b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                           int& A_NLP) {
884b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
885b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetEchoMetrics(ERL=?, ERLE=?, RERL=?, A_NLP=?)");
886b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_ECHO
887b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
888b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
889b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
890b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
891b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->audio_processing()->echo_cancellation()->is_enabled()) {
892b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceWarning,
893b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "GetEchoMetrics() AudioProcessingModule AEC is not enabled");
894b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
895b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
896b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
897b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Get Echo Metrics from Audio Processing Module.
898b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EchoCancellation::Metrics echoMetrics;
899b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (_shared->audio_processing()->echo_cancellation()->GetMetrics(
900b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          &echoMetrics)) {
901b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1),
902b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "GetEchoMetrics(), AudioProcessingModule metrics error");
903b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
904b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
905b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
906b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Echo quality metrics.
907b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ERL = echoMetrics.echo_return_loss.instant;
908b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ERLE = echoMetrics.echo_return_loss_enhancement.instant;
909b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  RERL = echoMetrics.residual_echo_return_loss.instant;
910b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  A_NLP = echoMetrics.a_nlp.instant;
911b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
912b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
913b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetEchoMetrics() => ERL=%d, ERLE=%d, RERL=%d, A_NLP=%d",
914b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               ERL, ERLE, RERL, A_NLP);
915b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
916b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
917b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
918b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "SetEcStatus() EC is not supported");
919b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
920b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
921b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
922b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
923b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::GetEcDelayMetrics(int& delay_median,
924b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                              int& delay_std) {
925b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
926b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetEcDelayMetrics(median=?, std=?)");
927b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef WEBRTC_VOICE_ENGINE_ECHO
928b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
929b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
930b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
931b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
932b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->audio_processing()->echo_cancellation()->is_enabled()) {
933b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceWarning,
934b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "GetEcDelayMetrics() AudioProcessingModule AEC is not enabled");
935b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
936b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
937b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
938b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int median = 0;
939b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int std = 0;
940b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Get delay-logging values from Audio Processing Module.
941b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (_shared->audio_processing()->echo_cancellation()->GetDelayMetrics(
942b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        &median, &std)) {
943b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1),
944b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "GetEcDelayMetrics(), AudioProcessingModule delay-logging "
945b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                 "error");
946b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
947b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
948b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
949b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // EC delay-logging metrics
950b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  delay_median = median;
951b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  delay_std = std;
952b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
953b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
954b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetEcDelayMetrics() => delay_median=%d, delay_std=%d",
955b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               delay_median, delay_std);
956b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
957b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
958b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
959b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "SetEcStatus() EC is not supported");
960b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
961b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
962b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
963b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
964b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::StartDebugRecording(const char* fileNameUTF8) {
965b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
966b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "StartDebugRecording()");
967b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
968b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
969b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
970b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
971b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
972b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return _shared->audio_processing()->StartDebugRecording(fileNameUTF8);
973b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
974b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
9757b72264dd14dcffb873d096339de6ed47015ac43henrikg@webrtc.orgint VoEAudioProcessingImpl::StartDebugRecording(FILE* file_handle) {
9767b72264dd14dcffb873d096339de6ed47015ac43henrikg@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
9777b72264dd14dcffb873d096339de6ed47015ac43henrikg@webrtc.org               "StartDebugRecording()");
9787b72264dd14dcffb873d096339de6ed47015ac43henrikg@webrtc.org  if (!_shared->statistics().Initialized()) {
9797b72264dd14dcffb873d096339de6ed47015ac43henrikg@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
9807b72264dd14dcffb873d096339de6ed47015ac43henrikg@webrtc.org    return -1;
9817b72264dd14dcffb873d096339de6ed47015ac43henrikg@webrtc.org  }
9827b72264dd14dcffb873d096339de6ed47015ac43henrikg@webrtc.org
9837b72264dd14dcffb873d096339de6ed47015ac43henrikg@webrtc.org  return _shared->audio_processing()->StartDebugRecording(file_handle);
9847b72264dd14dcffb873d096339de6ed47015ac43henrikg@webrtc.org}
9857b72264dd14dcffb873d096339de6ed47015ac43henrikg@webrtc.org
986b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::StopDebugRecording() {
987b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
988b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "StopDebugRecording()");
989b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
990b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
991b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
992b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
993b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
994b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return _shared->audio_processing()->StopDebugRecording();
995b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
996b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
997b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::SetTypingDetectionStatus(bool enable) {
998b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
999b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "SetTypingDetectionStatus()");
1000f47d0f86cab3e8f1df029cfadf549e986cbff20eandrew@webrtc.org#if !defined(WEBRTC_VOICE_ENGINE_TYPING_DETECTION)
1001f47d0f86cab3e8f1df029cfadf549e986cbff20eandrew@webrtc.org  NOT_SUPPORTED(_shared->statistics());
1002f47d0f86cab3e8f1df029cfadf549e986cbff20eandrew@webrtc.org#else
1003b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
1004b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
1005b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
1006b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1007b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1008b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Just use the VAD state to determine if we should enable typing detection
1009b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // or not
1010b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1011b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (_shared->audio_processing()->voice_detection()->Enable(enable)) {
1012b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceWarning,
1013b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "SetTypingDetectionStatus() failed to set VAD state");
1014b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
1015b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1016b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (_shared->audio_processing()->voice_detection()->set_likelihood(
1017b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org          VoiceDetection::kVeryLowLikelihood)) {
1018b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_APM_ERROR, kTraceWarning,
1019b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        "SetTypingDetectionStatus() failed to set VAD likelihood to low");
1020b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
1021b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1022b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1023b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
1024b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1025b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1026b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1027b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::GetTypingDetectionStatus(bool& enabled) {
1028b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
1029b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "GetTypingDetectionStatus()");
1030b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
1031b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
1032b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
1033b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1034b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Just use the VAD state to determine if we should enable typing
1035b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // detection or not
1036b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1037b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  enabled = _shared->audio_processing()->voice_detection()->is_enabled();
1038b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1039b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
1040b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1041b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1042b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1043b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::TimeSinceLastTyping(int &seconds) {
1044b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
1045b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "TimeSinceLastTyping()");
1046f47d0f86cab3e8f1df029cfadf549e986cbff20eandrew@webrtc.org#if !defined(WEBRTC_VOICE_ENGINE_TYPING_DETECTION)
1047f47d0f86cab3e8f1df029cfadf549e986cbff20eandrew@webrtc.org  NOT_SUPPORTED(_shared->statistics());
1048f47d0f86cab3e8f1df029cfadf549e986cbff20eandrew@webrtc.org#else
1049b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
1050b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_NOT_INITED, kTraceError);
1051b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
1052b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1053b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Check if typing detection is enabled
1054b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bool enabled = _shared->audio_processing()->voice_detection()->is_enabled();
1055b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (enabled)
1056b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
1057b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->transmit_mixer()->TimeSinceLastTyping(seconds);
1058b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return 0;
1059b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1060b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  else
1061b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  {
1062b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
1063b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      "SetTypingDetectionStatus is not enabled");
1064b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return -1;
1065b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1066b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1067b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1068b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1069b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint VoEAudioProcessingImpl::SetTypingDetectionParameters(int timeWindow,
1070b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                         int costPerTyping,
1071b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                         int reportingThreshold,
1072b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                         int penaltyDecay,
1073b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                                         int typeEventDelay) {
1074b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
1075b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org               "SetTypingDetectionParameters()");
1076f47d0f86cab3e8f1df029cfadf549e986cbff20eandrew@webrtc.org#if !defined(WEBRTC_VOICE_ENGINE_TYPING_DETECTION)
1077f47d0f86cab3e8f1df029cfadf549e986cbff20eandrew@webrtc.org  NOT_SUPPORTED(_shared->statistics());
1078f47d0f86cab3e8f1df029cfadf549e986cbff20eandrew@webrtc.org#else
1079b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!_shared->statistics().Initialized()) {
1080b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    _shared->statistics().SetLastError(VE_NOT_INITED, kTraceError);
1081b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
1082b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
1083b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return (_shared->transmit_mixer()->SetTypingDetectionParameters(timeWindow,
1084b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      costPerTyping, reportingThreshold, penaltyDecay, typeEventDelay));
1085b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
1086b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1087b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1088b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid VoEAudioProcessingImpl::EnableStereoChannelSwapping(bool enable) {
1089d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  LOG_API1(enable);
1090b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  _shared->transmit_mixer()->EnableStereoChannelSwapping(enable);
1091b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1092b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1093b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool VoEAudioProcessingImpl::IsStereoChannelSwappingEnabled() {
1094d898c019c4e09c73bc7354da9f1b54004f3e4b7eandrew@webrtc.org  LOG_API0();
1095b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return _shared->transmit_mixer()->IsStereoChannelSwappingEnabled();
1096b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
1097b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1098b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // #ifdef WEBRTC_VOICE_ENGINE_AUDIO_PROCESSING_API
1099b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11003b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org}  // namespace webrtc
1101