| Index: webrtc/voice_engine/voe_audio_processing_impl.cc
 | 
| diff --git a/webrtc/voice_engine/voe_audio_processing_impl.cc b/webrtc/voice_engine/voe_audio_processing_impl.cc
 | 
| deleted file mode 100644
 | 
| index 3ee0e9562fd7c4793948cc2830e9861a251dc9da..0000000000000000000000000000000000000000
 | 
| --- a/webrtc/voice_engine/voe_audio_processing_impl.cc
 | 
| +++ /dev/null
 | 
| @@ -1,774 +0,0 @@
 | 
| -/*
 | 
| - *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 | 
| - *
 | 
| - *  Use of this source code is governed by a BSD-style license
 | 
| - *  that can be found in the LICENSE file in the root of the source
 | 
| - *  tree. An additional intellectual property rights grant can be found
 | 
| - *  in the file PATENTS.  All contributing project authors may
 | 
| - *  be found in the AUTHORS file in the root of the source tree.
 | 
| - */
 | 
| -
 | 
| -#include "webrtc/voice_engine/voe_audio_processing_impl.h"
 | 
| -
 | 
| -#include "webrtc/base/logging.h"
 | 
| -#include "webrtc/modules/audio_processing/include/audio_processing.h"
 | 
| -#include "webrtc/system_wrappers/include/trace.h"
 | 
| -#include "webrtc/voice_engine/channel.h"
 | 
| -#include "webrtc/voice_engine/include/voe_errors.h"
 | 
| -#include "webrtc/voice_engine/transmit_mixer.h"
 | 
| -#include "webrtc/voice_engine/voice_engine_impl.h"
 | 
| -
 | 
| -// TODO(andrew): move to a common place.
 | 
| -#define WEBRTC_VOICE_INIT_CHECK()                        \
 | 
| -  do {                                                   \
 | 
| -    if (!_shared->statistics().Initialized()) {          \
 | 
| -      _shared->SetLastError(VE_NOT_INITED, kTraceError); \
 | 
| -      return -1;                                         \
 | 
| -    }                                                    \
 | 
| -  } while (0)
 | 
| -
 | 
| -#define WEBRTC_VOICE_INIT_CHECK_BOOL()                   \
 | 
| -  do {                                                   \
 | 
| -    if (!_shared->statistics().Initialized()) {          \
 | 
| -      _shared->SetLastError(VE_NOT_INITED, kTraceError); \
 | 
| -      return false;                                      \
 | 
| -    }                                                    \
 | 
| -  } while (0)
 | 
| -
 | 
| -namespace webrtc {
 | 
| -
 | 
| -#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
 | 
| -static const EcModes kDefaultEcMode = kEcAecm;
 | 
| -#else
 | 
| -static const EcModes kDefaultEcMode = kEcAec;
 | 
| -#endif
 | 
| -
 | 
| -VoEAudioProcessing* VoEAudioProcessing::GetInterface(VoiceEngine* voiceEngine) {
 | 
| -  if (NULL == voiceEngine) {
 | 
| -    return NULL;
 | 
| -  }
 | 
| -  VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
 | 
| -  s->AddRef();
 | 
| -  return s;
 | 
| -}
 | 
| -
 | 
| -VoEAudioProcessingImpl::VoEAudioProcessingImpl(voe::SharedData* shared)
 | 
| -    : _isAecMode(kDefaultEcMode == kEcAec), _shared(shared) {
 | 
| -  WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "VoEAudioProcessingImpl::VoEAudioProcessingImpl() - ctor");
 | 
| -}
 | 
| -
 | 
| -VoEAudioProcessingImpl::~VoEAudioProcessingImpl() {
 | 
| -  WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "VoEAudioProcessingImpl::~VoEAudioProcessingImpl() - dtor");
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::SetNsStatus(bool enable, NsModes mode) {
 | 
| -  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "SetNsStatus(enable=%d, mode=%d)", enable, mode);
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  NoiseSuppression::Level nsLevel = kDefaultNsMode;
 | 
| -  switch (mode) {
 | 
| -    case kNsDefault:
 | 
| -      nsLevel = kDefaultNsMode;
 | 
| -      break;
 | 
| -    case kNsUnchanged:
 | 
| -      nsLevel = _shared->audio_processing()->noise_suppression()->level();
 | 
| -      break;
 | 
| -    case kNsConference:
 | 
| -      nsLevel = NoiseSuppression::kHigh;
 | 
| -      break;
 | 
| -    case kNsLowSuppression:
 | 
| -      nsLevel = NoiseSuppression::kLow;
 | 
| -      break;
 | 
| -    case kNsModerateSuppression:
 | 
| -      nsLevel = NoiseSuppression::kModerate;
 | 
| -      break;
 | 
| -    case kNsHighSuppression:
 | 
| -      nsLevel = NoiseSuppression::kHigh;
 | 
| -      break;
 | 
| -    case kNsVeryHighSuppression:
 | 
| -      nsLevel = NoiseSuppression::kVeryHigh;
 | 
| -      break;
 | 
| -  }
 | 
| -
 | 
| -  if (_shared->audio_processing()->noise_suppression()->set_level(nsLevel) !=
 | 
| -      0) {
 | 
| -    _shared->SetLastError(VE_APM_ERROR, kTraceError,
 | 
| -                          "SetNsStatus() failed to set Ns mode");
 | 
| -    return -1;
 | 
| -  }
 | 
| -  if (_shared->audio_processing()->noise_suppression()->Enable(enable) != 0) {
 | 
| -    _shared->SetLastError(VE_APM_ERROR, kTraceError,
 | 
| -                          "SetNsStatus() failed to set Ns state");
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::GetNsStatus(bool& enabled, NsModes& mode) {
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  enabled = _shared->audio_processing()->noise_suppression()->is_enabled();
 | 
| -  NoiseSuppression::Level nsLevel =
 | 
| -      _shared->audio_processing()->noise_suppression()->level();
 | 
| -
 | 
| -  switch (nsLevel) {
 | 
| -    case NoiseSuppression::kLow:
 | 
| -      mode = kNsLowSuppression;
 | 
| -      break;
 | 
| -    case NoiseSuppression::kModerate:
 | 
| -      mode = kNsModerateSuppression;
 | 
| -      break;
 | 
| -    case NoiseSuppression::kHigh:
 | 
| -      mode = kNsHighSuppression;
 | 
| -      break;
 | 
| -    case NoiseSuppression::kVeryHigh:
 | 
| -      mode = kNsVeryHighSuppression;
 | 
| -      break;
 | 
| -  }
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::SetAgcStatus(bool enable, AgcModes mode) {
 | 
| -  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "SetAgcStatus(enable=%d, mode=%d)", enable, mode);
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -#if defined(WEBRTC_IOS) || defined(ATA) || defined(WEBRTC_ANDROID)
 | 
| -  if (mode == kAgcAdaptiveAnalog) {
 | 
| -    _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
 | 
| -                          "SetAgcStatus() invalid Agc mode for mobile device");
 | 
| -    return -1;
 | 
| -  }
 | 
| -#endif
 | 
| -
 | 
| -  GainControl::Mode agcMode = kDefaultAgcMode;
 | 
| -  switch (mode) {
 | 
| -    case kAgcDefault:
 | 
| -      agcMode = kDefaultAgcMode;
 | 
| -      break;
 | 
| -    case kAgcUnchanged:
 | 
| -      agcMode = _shared->audio_processing()->gain_control()->mode();
 | 
| -      break;
 | 
| -    case kAgcFixedDigital:
 | 
| -      agcMode = GainControl::kFixedDigital;
 | 
| -      break;
 | 
| -    case kAgcAdaptiveAnalog:
 | 
| -      agcMode = GainControl::kAdaptiveAnalog;
 | 
| -      break;
 | 
| -    case kAgcAdaptiveDigital:
 | 
| -      agcMode = GainControl::kAdaptiveDigital;
 | 
| -      break;
 | 
| -  }
 | 
| -
 | 
| -  if (_shared->audio_processing()->gain_control()->set_mode(agcMode) != 0) {
 | 
| -    _shared->SetLastError(VE_APM_ERROR, kTraceError,
 | 
| -                          "SetAgcStatus() failed to set Agc mode");
 | 
| -    return -1;
 | 
| -  }
 | 
| -  if (_shared->audio_processing()->gain_control()->Enable(enable) != 0) {
 | 
| -    _shared->SetLastError(VE_APM_ERROR, kTraceError,
 | 
| -                          "SetAgcStatus() failed to set Agc state");
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  if (agcMode != GainControl::kFixedDigital) {
 | 
| -    // Set Agc state in the ADM when adaptive Agc mode has been selected.
 | 
| -    // Note that we also enable the ADM Agc when Adaptive Digital mode is
 | 
| -    // used since we want to be able to provide the APM with updated mic
 | 
| -    // levels when the user modifies the mic level manually.
 | 
| -    if (_shared->audio_device()->SetAGC(enable) != 0) {
 | 
| -      _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning,
 | 
| -                            "SetAgcStatus() failed to set Agc mode");
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::GetAgcStatus(bool& enabled, AgcModes& mode) {
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  enabled = _shared->audio_processing()->gain_control()->is_enabled();
 | 
| -  GainControl::Mode agcMode =
 | 
| -      _shared->audio_processing()->gain_control()->mode();
 | 
| -
 | 
| -  switch (agcMode) {
 | 
| -    case GainControl::kFixedDigital:
 | 
| -      mode = kAgcFixedDigital;
 | 
| -      break;
 | 
| -    case GainControl::kAdaptiveAnalog:
 | 
| -      mode = kAgcAdaptiveAnalog;
 | 
| -      break;
 | 
| -    case GainControl::kAdaptiveDigital:
 | 
| -      mode = kAgcAdaptiveDigital;
 | 
| -      break;
 | 
| -  }
 | 
| -
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::SetAgcConfig(AgcConfig config) {
 | 
| -  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "SetAgcConfig()");
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  if (_shared->audio_processing()->gain_control()->set_target_level_dbfs(
 | 
| -          config.targetLeveldBOv) != 0) {
 | 
| -    _shared->SetLastError(VE_APM_ERROR, kTraceError,
 | 
| -                          "SetAgcConfig() failed to set target peak |level|"
 | 
| -                          " (or envelope) of the Agc");
 | 
| -    return -1;
 | 
| -  }
 | 
| -  if (_shared->audio_processing()->gain_control()->set_compression_gain_db(
 | 
| -          config.digitalCompressionGaindB) != 0) {
 | 
| -    _shared->SetLastError(VE_APM_ERROR, kTraceError,
 | 
| -                          "SetAgcConfig() failed to set the range in |gain| "
 | 
| -                          "the digital compression stage may apply");
 | 
| -    return -1;
 | 
| -  }
 | 
| -  if (_shared->audio_processing()->gain_control()->enable_limiter(
 | 
| -          config.limiterEnable) != 0) {
 | 
| -    _shared->SetLastError(
 | 
| -        VE_APM_ERROR, kTraceError,
 | 
| -        "SetAgcConfig() failed to set hard limiter to the signal");
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::GetAgcConfig(AgcConfig& config) {
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  config.targetLeveldBOv =
 | 
| -      _shared->audio_processing()->gain_control()->target_level_dbfs();
 | 
| -  config.digitalCompressionGaindB =
 | 
| -      _shared->audio_processing()->gain_control()->compression_gain_db();
 | 
| -  config.limiterEnable =
 | 
| -      _shared->audio_processing()->gain_control()->is_limiter_enabled();
 | 
| -
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -bool VoEAudioProcessing::DriftCompensationSupported() {
 | 
| -#if defined(WEBRTC_DRIFT_COMPENSATION_SUPPORTED)
 | 
| -  return true;
 | 
| -#else
 | 
| -  return false;
 | 
| -#endif
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::EnableDriftCompensation(bool enable) {
 | 
| -  WEBRTC_VOICE_INIT_CHECK();
 | 
| -
 | 
| -  if (!DriftCompensationSupported()) {
 | 
| -    _shared->SetLastError(
 | 
| -        VE_APM_ERROR, kTraceWarning,
 | 
| -        "Drift compensation is not supported on this platform.");
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  EchoCancellation* aec = _shared->audio_processing()->echo_cancellation();
 | 
| -  if (aec->enable_drift_compensation(enable) != 0) {
 | 
| -    _shared->SetLastError(VE_APM_ERROR, kTraceError,
 | 
| -                          "aec->enable_drift_compensation() failed");
 | 
| -    return -1;
 | 
| -  }
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -bool VoEAudioProcessingImpl::DriftCompensationEnabled() {
 | 
| -  WEBRTC_VOICE_INIT_CHECK_BOOL();
 | 
| -
 | 
| -  EchoCancellation* aec = _shared->audio_processing()->echo_cancellation();
 | 
| -  return aec->is_drift_compensation_enabled();
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::SetEcStatus(bool enable, EcModes mode) {
 | 
| -  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "SetEcStatus(enable=%d, mode=%d)", enable, mode);
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  // AEC mode
 | 
| -  if ((mode == kEcDefault) || (mode == kEcConference) || (mode == kEcAec) ||
 | 
| -      ((mode == kEcUnchanged) && (_isAecMode == true))) {
 | 
| -    if (enable) {
 | 
| -      // Disable the AECM before enable the AEC
 | 
| -      if (_shared->audio_processing()->echo_control_mobile()->is_enabled()) {
 | 
| -        _shared->SetLastError(VE_APM_ERROR, kTraceWarning,
 | 
| -                              "SetEcStatus() disable AECM before enabling AEC");
 | 
| -        if (_shared->audio_processing()->echo_control_mobile()->Enable(false) !=
 | 
| -            0) {
 | 
| -          _shared->SetLastError(VE_APM_ERROR, kTraceError,
 | 
| -                                "SetEcStatus() failed to disable AECM");
 | 
| -          return -1;
 | 
| -        }
 | 
| -      }
 | 
| -    }
 | 
| -    if (_shared->audio_processing()->echo_cancellation()->Enable(enable) != 0) {
 | 
| -      _shared->SetLastError(VE_APM_ERROR, kTraceError,
 | 
| -                            "SetEcStatus() failed to set AEC state");
 | 
| -      return -1;
 | 
| -    }
 | 
| -    if (mode == kEcConference) {
 | 
| -      if (_shared->audio_processing()
 | 
| -              ->echo_cancellation()
 | 
| -              ->set_suppression_level(EchoCancellation::kHighSuppression) !=
 | 
| -          0) {
 | 
| -        _shared->SetLastError(
 | 
| -            VE_APM_ERROR, kTraceError,
 | 
| -            "SetEcStatus() failed to set aggressiveness to high");
 | 
| -        return -1;
 | 
| -      }
 | 
| -    } else {
 | 
| -      if (_shared->audio_processing()
 | 
| -              ->echo_cancellation()
 | 
| -              ->set_suppression_level(EchoCancellation::kModerateSuppression) !=
 | 
| -          0) {
 | 
| -        _shared->SetLastError(
 | 
| -            VE_APM_ERROR, kTraceError,
 | 
| -            "SetEcStatus() failed to set aggressiveness to moderate");
 | 
| -        return -1;
 | 
| -      }
 | 
| -    }
 | 
| -
 | 
| -    _isAecMode = true;
 | 
| -  } else if ((mode == kEcAecm) ||
 | 
| -             ((mode == kEcUnchanged) && (_isAecMode == false))) {
 | 
| -    if (enable) {
 | 
| -      // Disable the AEC before enable the AECM
 | 
| -      if (_shared->audio_processing()->echo_cancellation()->is_enabled()) {
 | 
| -        _shared->SetLastError(VE_APM_ERROR, kTraceWarning,
 | 
| -                              "SetEcStatus() disable AEC before enabling AECM");
 | 
| -        if (_shared->audio_processing()->echo_cancellation()->Enable(false) !=
 | 
| -            0) {
 | 
| -          _shared->SetLastError(VE_APM_ERROR, kTraceError,
 | 
| -                                "SetEcStatus() failed to disable AEC");
 | 
| -          return -1;
 | 
| -        }
 | 
| -      }
 | 
| -    }
 | 
| -    if (_shared->audio_processing()->echo_control_mobile()->Enable(enable) !=
 | 
| -        0) {
 | 
| -      _shared->SetLastError(VE_APM_ERROR, kTraceError,
 | 
| -                            "SetEcStatus() failed to set AECM state");
 | 
| -      return -1;
 | 
| -    }
 | 
| -    _isAecMode = false;
 | 
| -  } else {
 | 
| -    _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
 | 
| -                          "SetEcStatus() invalid EC mode");
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::GetEcStatus(bool& enabled, EcModes& mode) {
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  if (_isAecMode == true) {
 | 
| -    mode = kEcAec;
 | 
| -    enabled = _shared->audio_processing()->echo_cancellation()->is_enabled();
 | 
| -  } else {
 | 
| -    mode = kEcAecm;
 | 
| -    enabled = _shared->audio_processing()->echo_control_mobile()->is_enabled();
 | 
| -  }
 | 
| -
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -void VoEAudioProcessingImpl::SetDelayOffsetMs(int offset) {
 | 
| -  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "SetDelayOffsetMs(offset = %d)", offset);
 | 
| -  _shared->audio_processing()->set_delay_offset_ms(offset);
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::DelayOffsetMs() {
 | 
| -  return _shared->audio_processing()->delay_offset_ms();
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::SetAecmMode(AecmModes mode, bool enableCNG) {
 | 
| -  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "SetAECMMode(mode = %d)", mode);
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  EchoControlMobile::RoutingMode aecmMode(
 | 
| -      EchoControlMobile::kQuietEarpieceOrHeadset);
 | 
| -
 | 
| -  switch (mode) {
 | 
| -    case kAecmQuietEarpieceOrHeadset:
 | 
| -      aecmMode = EchoControlMobile::kQuietEarpieceOrHeadset;
 | 
| -      break;
 | 
| -    case kAecmEarpiece:
 | 
| -      aecmMode = EchoControlMobile::kEarpiece;
 | 
| -      break;
 | 
| -    case kAecmLoudEarpiece:
 | 
| -      aecmMode = EchoControlMobile::kLoudEarpiece;
 | 
| -      break;
 | 
| -    case kAecmSpeakerphone:
 | 
| -      aecmMode = EchoControlMobile::kSpeakerphone;
 | 
| -      break;
 | 
| -    case kAecmLoudSpeakerphone:
 | 
| -      aecmMode = EchoControlMobile::kLoudSpeakerphone;
 | 
| -      break;
 | 
| -  }
 | 
| -
 | 
| -  if (_shared->audio_processing()->echo_control_mobile()->set_routing_mode(
 | 
| -          aecmMode) != 0) {
 | 
| -    _shared->SetLastError(VE_APM_ERROR, kTraceError,
 | 
| -                          "SetAECMMode() failed to set AECM routing mode");
 | 
| -    return -1;
 | 
| -  }
 | 
| -  if (_shared->audio_processing()->echo_control_mobile()->enable_comfort_noise(
 | 
| -          enableCNG) != 0) {
 | 
| -    _shared->SetLastError(
 | 
| -        VE_APM_ERROR, kTraceError,
 | 
| -        "SetAECMMode() failed to set comfort noise state for AECM");
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::GetAecmMode(AecmModes& mode, bool& enabledCNG) {
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  enabledCNG = false;
 | 
| -
 | 
| -  EchoControlMobile::RoutingMode aecmMode =
 | 
| -      _shared->audio_processing()->echo_control_mobile()->routing_mode();
 | 
| -  enabledCNG = _shared->audio_processing()
 | 
| -                   ->echo_control_mobile()
 | 
| -                   ->is_comfort_noise_enabled();
 | 
| -
 | 
| -  switch (aecmMode) {
 | 
| -    case EchoControlMobile::kQuietEarpieceOrHeadset:
 | 
| -      mode = kAecmQuietEarpieceOrHeadset;
 | 
| -      break;
 | 
| -    case EchoControlMobile::kEarpiece:
 | 
| -      mode = kAecmEarpiece;
 | 
| -      break;
 | 
| -    case EchoControlMobile::kLoudEarpiece:
 | 
| -      mode = kAecmLoudEarpiece;
 | 
| -      break;
 | 
| -    case EchoControlMobile::kSpeakerphone:
 | 
| -      mode = kAecmSpeakerphone;
 | 
| -      break;
 | 
| -    case EchoControlMobile::kLoudSpeakerphone:
 | 
| -      mode = kAecmLoudSpeakerphone;
 | 
| -      break;
 | 
| -  }
 | 
| -
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::EnableHighPassFilter(bool enable) {
 | 
| -  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "EnableHighPassFilter(%d)", enable);
 | 
| -  if (_shared->audio_processing()->high_pass_filter()->Enable(enable) !=
 | 
| -      AudioProcessing::kNoError) {
 | 
| -    _shared->SetLastError(VE_APM_ERROR, kTraceError,
 | 
| -                          "HighPassFilter::Enable() failed.");
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -bool VoEAudioProcessingImpl::IsHighPassFilterEnabled() {
 | 
| -  return _shared->audio_processing()->high_pass_filter()->is_enabled();
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::VoiceActivityIndicator(int channel) {
 | 
| -  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "VoiceActivityIndicator(channel=%d)", channel);
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
 | 
| -  voe::Channel* channelPtr = ch.channel();
 | 
| -  if (channelPtr == NULL) {
 | 
| -    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
 | 
| -                          "VoiceActivityIndicator() failed to locate channel");
 | 
| -    return -1;
 | 
| -  }
 | 
| -  int activity(-1);
 | 
| -  channelPtr->VoiceActivityIndicator(activity);
 | 
| -
 | 
| -  return activity;
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::SetEcMetricsStatus(bool enable) {
 | 
| -  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "SetEcMetricsStatus(enable=%d)", enable);
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  if ((_shared->audio_processing()->echo_cancellation()->enable_metrics(
 | 
| -           enable) != 0) ||
 | 
| -      (_shared->audio_processing()->echo_cancellation()->enable_delay_logging(
 | 
| -           enable) != 0)) {
 | 
| -    _shared->SetLastError(VE_APM_ERROR, kTraceError,
 | 
| -                          "SetEcMetricsStatus() unable to set EC metrics mode");
 | 
| -    return -1;
 | 
| -  }
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::GetEcMetricsStatus(bool& enabled) {
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  bool echo_mode =
 | 
| -      _shared->audio_processing()->echo_cancellation()->are_metrics_enabled();
 | 
| -  bool delay_mode = _shared->audio_processing()
 | 
| -                        ->echo_cancellation()
 | 
| -                        ->is_delay_logging_enabled();
 | 
| -
 | 
| -  if (echo_mode != delay_mode) {
 | 
| -    _shared->SetLastError(
 | 
| -        VE_APM_ERROR, kTraceError,
 | 
| -        "GetEcMetricsStatus() delay logging and echo mode are not the same");
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  enabled = echo_mode;
 | 
| -
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::GetEchoMetrics(int& ERL,
 | 
| -                                           int& ERLE,
 | 
| -                                           int& RERL,
 | 
| -                                           int& A_NLP) {
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -  if (!_shared->audio_processing()->echo_cancellation()->is_enabled()) {
 | 
| -    _shared->SetLastError(
 | 
| -        VE_APM_ERROR, kTraceWarning,
 | 
| -        "GetEchoMetrics() AudioProcessingModule AEC is not enabled");
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  // Get Echo Metrics from Audio Processing Module.
 | 
| -  EchoCancellation::Metrics echoMetrics;
 | 
| -  if (_shared->audio_processing()->echo_cancellation()->GetMetrics(
 | 
| -          &echoMetrics)) {
 | 
| -    WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -                 "GetEchoMetrics(), AudioProcessingModule metrics error");
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  // Echo quality metrics.
 | 
| -  ERL = echoMetrics.echo_return_loss.instant;
 | 
| -  ERLE = echoMetrics.echo_return_loss_enhancement.instant;
 | 
| -  RERL = echoMetrics.residual_echo_return_loss.instant;
 | 
| -  A_NLP = echoMetrics.a_nlp.instant;
 | 
| -
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::GetEcDelayMetrics(int& delay_median,
 | 
| -                                              int& delay_std,
 | 
| -                                              float& fraction_poor_delays) {
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -  if (!_shared->audio_processing()->echo_cancellation()->is_enabled()) {
 | 
| -    _shared->SetLastError(
 | 
| -        VE_APM_ERROR, kTraceWarning,
 | 
| -        "GetEcDelayMetrics() AudioProcessingModule AEC is not enabled");
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  int median = 0;
 | 
| -  int std = 0;
 | 
| -  float poor_fraction = 0;
 | 
| -  // Get delay-logging values from Audio Processing Module.
 | 
| -  if (_shared->audio_processing()->echo_cancellation()->GetDelayMetrics(
 | 
| -          &median, &std, &poor_fraction)) {
 | 
| -    WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -                 "GetEcDelayMetrics(), AudioProcessingModule delay-logging "
 | 
| -                 "error");
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  // EC delay-logging metrics
 | 
| -  delay_median = median;
 | 
| -  delay_std = std;
 | 
| -  fraction_poor_delays = poor_fraction;
 | 
| -
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::StartDebugRecording(const char* fileNameUTF8) {
 | 
| -  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "StartDebugRecording()");
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  return _shared->audio_processing()->StartDebugRecording(fileNameUTF8, -1);
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::StartDebugRecording(FILE* file_handle) {
 | 
| -  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "StartDebugRecording()");
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  return _shared->audio_processing()->StartDebugRecording(file_handle, -1);
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::StopDebugRecording() {
 | 
| -  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "StopDebugRecording()");
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  return _shared->audio_processing()->StopDebugRecording();
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::SetTypingDetectionStatus(bool enable) {
 | 
| -  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "SetTypingDetectionStatus()");
 | 
| -#if !WEBRTC_VOICE_ENGINE_TYPING_DETECTION
 | 
| -  NOT_SUPPORTED(_shared->statistics());
 | 
| -#else
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  // Just use the VAD state to determine if we should enable typing detection
 | 
| -  // or not
 | 
| -
 | 
| -  if (_shared->audio_processing()->voice_detection()->Enable(enable)) {
 | 
| -    _shared->SetLastError(VE_APM_ERROR, kTraceWarning,
 | 
| -                          "SetTypingDetectionStatus() failed to set VAD state");
 | 
| -    return -1;
 | 
| -  }
 | 
| -  if (_shared->audio_processing()->voice_detection()->set_likelihood(
 | 
| -          VoiceDetection::kVeryLowLikelihood)) {
 | 
| -    _shared->SetLastError(
 | 
| -        VE_APM_ERROR, kTraceWarning,
 | 
| -        "SetTypingDetectionStatus() failed to set VAD likelihood to low");
 | 
| -    return -1;
 | 
| -  }
 | 
| -
 | 
| -  return 0;
 | 
| -#endif
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::GetTypingDetectionStatus(bool& enabled) {
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -  // Just use the VAD state to determine if we should enable typing
 | 
| -  // detection or not
 | 
| -
 | 
| -  enabled = _shared->audio_processing()->voice_detection()->is_enabled();
 | 
| -
 | 
| -  return 0;
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::TimeSinceLastTyping(int& seconds) {
 | 
| -#if !WEBRTC_VOICE_ENGINE_TYPING_DETECTION
 | 
| -  NOT_SUPPORTED(_shared->statistics());
 | 
| -#else
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -  // Check if typing detection is enabled
 | 
| -  bool enabled = _shared->audio_processing()->voice_detection()->is_enabled();
 | 
| -  if (enabled) {
 | 
| -    _shared->transmit_mixer()->TimeSinceLastTyping(seconds);
 | 
| -    return 0;
 | 
| -  } else {
 | 
| -    _shared->SetLastError(VE_FUNC_NOT_SUPPORTED, kTraceError,
 | 
| -                          "SetTypingDetectionStatus is not enabled");
 | 
| -    return -1;
 | 
| -  }
 | 
| -#endif
 | 
| -}
 | 
| -
 | 
| -int VoEAudioProcessingImpl::SetTypingDetectionParameters(int timeWindow,
 | 
| -                                                         int costPerTyping,
 | 
| -                                                         int reportingThreshold,
 | 
| -                                                         int penaltyDecay,
 | 
| -                                                         int typeEventDelay) {
 | 
| -  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
 | 
| -               "SetTypingDetectionParameters()");
 | 
| -#if !WEBRTC_VOICE_ENGINE_TYPING_DETECTION
 | 
| -  NOT_SUPPORTED(_shared->statistics());
 | 
| -#else
 | 
| -  if (!_shared->statistics().Initialized()) {
 | 
| -    _shared->statistics().SetLastError(VE_NOT_INITED, kTraceError);
 | 
| -    return -1;
 | 
| -  }
 | 
| -  return (_shared->transmit_mixer()->SetTypingDetectionParameters(
 | 
| -      timeWindow, costPerTyping, reportingThreshold, penaltyDecay,
 | 
| -      typeEventDelay));
 | 
| -#endif
 | 
| -}
 | 
| -
 | 
| -void VoEAudioProcessingImpl::EnableStereoChannelSwapping(bool enable) {
 | 
| -  _shared->transmit_mixer()->EnableStereoChannelSwapping(enable);
 | 
| -}
 | 
| -
 | 
| -bool VoEAudioProcessingImpl::IsStereoChannelSwappingEnabled() {
 | 
| -  return _shared->transmit_mixer()->IsStereoChannelSwappingEnabled();
 | 
| -}
 | 
| -
 | 
| -}  // namespace webrtc
 | 
| 
 |