blob: 28e21177fe1c9bad39942a324f9c726ef8417e7b [file] [log] [blame]
Sam Zackrissonf0d1c032019-03-27 13:28:08 +01001/*
2 * Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "modules/audio_processing/gain_control_config_proxy.h"
12
13namespace webrtc {
14namespace {
15
16AudioProcessing::Config::GainController1::Mode InterfaceModeToConfigMode(
17 GainControl::Mode agc_mode) {
18 using AgcConfig = AudioProcessing::Config::GainController1;
19 switch (agc_mode) {
20 case GainControl::kAdaptiveAnalog:
21 return AgcConfig::kAdaptiveAnalog;
22 case GainControl::kAdaptiveDigital:
23 return AgcConfig::kAdaptiveDigital;
24 case GainControl::kFixedDigital:
25 return AgcConfig::kFixedDigital;
26 }
27}
28} // namespace
29
30GainControlConfigProxy::GainControlConfigProxy(
31 rtc::CriticalSection* crit_capture,
32 AudioProcessing* apm,
33 GainControl* agc)
34 : crit_capture_(crit_capture), apm_(apm), agc_(agc) {
35 RTC_DCHECK(apm);
36 RTC_DCHECK(agc);
37 RTC_DCHECK(crit_capture);
38}
39
40GainControlConfigProxy::~GainControlConfigProxy() = default;
41
42int GainControlConfigProxy::set_stream_analog_level(int level) {
43 apm_->set_stream_analog_level(level);
44 return AudioProcessing::kNoError;
45}
46
47int GainControlConfigProxy::stream_analog_level() const {
48 return apm_->recommended_stream_analog_level();
49}
50
51int GainControlConfigProxy::Enable(bool enable) {
52 auto apm_config = apm_->GetConfig();
53 apm_config.gain_controller1.enabled = enable;
54 apm_->ApplyConfig(apm_config);
55 return AudioProcessing::kNoError;
56}
57
58int GainControlConfigProxy::set_mode(Mode mode) {
59 auto config = apm_->GetConfig();
60 config.gain_controller1.mode = InterfaceModeToConfigMode(mode);
61 apm_->ApplyConfig(config);
62 return AudioProcessing::kNoError;
63}
64
65int GainControlConfigProxy::set_target_level_dbfs(int level) {
66 auto config = apm_->GetConfig();
67 config.gain_controller1.target_level_dbfs = level;
68 apm_->ApplyConfig(config);
69 return AudioProcessing::kNoError;
70}
71
72int GainControlConfigProxy::set_compression_gain_db(int gain) {
73 apm_->SetRuntimeSetting(
74 AudioProcessing::RuntimeSetting::CreateCompressionGainDb(gain));
75 return AudioProcessing::kNoError;
76}
77
78int GainControlConfigProxy::enable_limiter(bool enable) {
79 auto config = apm_->GetConfig();
80 config.gain_controller1.enable_limiter = enable;
81 apm_->ApplyConfig(config);
82 return AudioProcessing::kNoError;
83}
84
85int GainControlConfigProxy::set_analog_level_limits(int minimum, int maximum) {
86 auto config = apm_->GetConfig();
87 config.gain_controller1.analog_level_minimum = minimum;
88 config.gain_controller1.analog_level_maximum = maximum;
89 apm_->ApplyConfig(config);
90 return AudioProcessing::kNoError;
91}
92
93bool GainControlConfigProxy::is_limiter_enabled() const {
94 rtc::CritScope cs_capture(crit_capture_);
95 return agc_->is_limiter_enabled();
96}
97
98int GainControlConfigProxy::compression_gain_db() const {
99 rtc::CritScope cs_capture(crit_capture_);
100 return agc_->compression_gain_db();
101}
102
103bool GainControlConfigProxy::is_enabled() const {
104 rtc::CritScope cs_capture(crit_capture_);
105 return agc_->is_enabled();
106}
107
108GainControl::Mode GainControlConfigProxy::mode() const {
109 rtc::CritScope cs_capture(crit_capture_);
110 return agc_->mode();
111}
112
113int GainControlConfigProxy::target_level_dbfs() const {
114 rtc::CritScope cs_capture(crit_capture_);
115 return agc_->target_level_dbfs();
116}
117
118int GainControlConfigProxy::analog_level_minimum() const {
119 rtc::CritScope cs_capture(crit_capture_);
120 return agc_->analog_level_minimum();
121}
122
123int GainControlConfigProxy::analog_level_maximum() const {
124 rtc::CritScope cs_capture(crit_capture_);
125 return agc_->analog_level_maximum();
126}
127
128bool GainControlConfigProxy::stream_is_saturated() const {
129 rtc::CritScope cs_capture(crit_capture_);
130 return agc_->stream_is_saturated();
131}
132} // namespace webrtc