/* * Copyright (c) 2019 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 "modules/audio_processing/gain_control_config_proxy.h" namespace webrtc { namespace { AudioProcessing::Config::GainController1::Mode InterfaceModeToConfigMode( GainControl::Mode agc_mode) { using AgcConfig = AudioProcessing::Config::GainController1; switch (agc_mode) { case GainControl::kAdaptiveAnalog: return AgcConfig::kAdaptiveAnalog; case GainControl::kAdaptiveDigital: return AgcConfig::kAdaptiveDigital; case GainControl::kFixedDigital: return AgcConfig::kFixedDigital; } } } // namespace GainControlConfigProxy::GainControlConfigProxy( rtc::CriticalSection* crit_capture, AudioProcessing* apm, GainControl* agc) : crit_capture_(crit_capture), apm_(apm), agc_(agc) { RTC_DCHECK(apm); RTC_DCHECK(agc); RTC_DCHECK(crit_capture); } GainControlConfigProxy::~GainControlConfigProxy() = default; int GainControlConfigProxy::set_stream_analog_level(int level) { apm_->set_stream_analog_level(level); return AudioProcessing::kNoError; } int GainControlConfigProxy::stream_analog_level() const { return apm_->recommended_stream_analog_level(); } int GainControlConfigProxy::Enable(bool enable) { auto apm_config = apm_->GetConfig(); apm_config.gain_controller1.enabled = enable; apm_->ApplyConfig(apm_config); return AudioProcessing::kNoError; } int GainControlConfigProxy::set_mode(Mode mode) { auto config = apm_->GetConfig(); config.gain_controller1.mode = InterfaceModeToConfigMode(mode); apm_->ApplyConfig(config); return AudioProcessing::kNoError; } int GainControlConfigProxy::set_target_level_dbfs(int level) { auto config = apm_->GetConfig(); config.gain_controller1.target_level_dbfs = level; apm_->ApplyConfig(config); return AudioProcessing::kNoError; } int GainControlConfigProxy::set_compression_gain_db(int gain) { apm_->SetRuntimeSetting( AudioProcessing::RuntimeSetting::CreateCompressionGainDb(gain)); return AudioProcessing::kNoError; } int GainControlConfigProxy::enable_limiter(bool enable) { auto config = apm_->GetConfig(); config.gain_controller1.enable_limiter = enable; apm_->ApplyConfig(config); return AudioProcessing::kNoError; } int GainControlConfigProxy::set_analog_level_limits(int minimum, int maximum) { auto config = apm_->GetConfig(); config.gain_controller1.analog_level_minimum = minimum; config.gain_controller1.analog_level_maximum = maximum; apm_->ApplyConfig(config); return AudioProcessing::kNoError; } bool GainControlConfigProxy::is_limiter_enabled() const { rtc::CritScope cs_capture(crit_capture_); return agc_->is_limiter_enabled(); } int GainControlConfigProxy::compression_gain_db() const { rtc::CritScope cs_capture(crit_capture_); return agc_->compression_gain_db(); } bool GainControlConfigProxy::is_enabled() const { rtc::CritScope cs_capture(crit_capture_); return agc_->is_enabled(); } GainControl::Mode GainControlConfigProxy::mode() const { rtc::CritScope cs_capture(crit_capture_); return agc_->mode(); } int GainControlConfigProxy::target_level_dbfs() const { rtc::CritScope cs_capture(crit_capture_); return agc_->target_level_dbfs(); } int GainControlConfigProxy::analog_level_minimum() const { rtc::CritScope cs_capture(crit_capture_); return agc_->analog_level_minimum(); } int GainControlConfigProxy::analog_level_maximum() const { rtc::CritScope cs_capture(crit_capture_); return agc_->analog_level_maximum(); } bool GainControlConfigProxy::stream_is_saturated() const { rtc::CritScope cs_capture(crit_capture_); return agc_->stream_is_saturated(); } } // namespace webrtc