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