xref: /aosp_15_r20/external/webrtc/modules/audio_processing/include/audio_processing.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2016 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/include/audio_processing.h"
12 
13 #include "rtc_base/strings/string_builder.h"
14 #include "rtc_base/system/arch.h"
15 
16 namespace webrtc {
17 namespace {
18 
19 using Agc1Config = AudioProcessing::Config::GainController1;
20 using Agc2Config = AudioProcessing::Config::GainController2;
21 
NoiseSuppressionLevelToString(const AudioProcessing::Config::NoiseSuppression::Level & level)22 std::string NoiseSuppressionLevelToString(
23     const AudioProcessing::Config::NoiseSuppression::Level& level) {
24   switch (level) {
25     case AudioProcessing::Config::NoiseSuppression::Level::kLow:
26       return "Low";
27     case AudioProcessing::Config::NoiseSuppression::Level::kModerate:
28       return "Moderate";
29     case AudioProcessing::Config::NoiseSuppression::Level::kHigh:
30       return "High";
31     case AudioProcessing::Config::NoiseSuppression::Level::kVeryHigh:
32       return "VeryHigh";
33   }
34   RTC_CHECK_NOTREACHED();
35 }
36 
GainController1ModeToString(const Agc1Config::Mode & mode)37 std::string GainController1ModeToString(const Agc1Config::Mode& mode) {
38   switch (mode) {
39     case Agc1Config::Mode::kAdaptiveAnalog:
40       return "AdaptiveAnalog";
41     case Agc1Config::Mode::kAdaptiveDigital:
42       return "AdaptiveDigital";
43     case Agc1Config::Mode::kFixedDigital:
44       return "FixedDigital";
45   }
46   RTC_CHECK_NOTREACHED();
47 }
48 
49 }  // namespace
50 
51 constexpr int AudioProcessing::kNativeSampleRatesHz[];
52 
SetRuntimeSetting(AudioProcessing::RuntimeSetting setting)53 void CustomProcessing::SetRuntimeSetting(
54     AudioProcessing::RuntimeSetting setting) {}
55 
operator ==(const Agc1Config & rhs) const56 bool Agc1Config::operator==(const Agc1Config& rhs) const {
57   const auto& analog_lhs = analog_gain_controller;
58   const auto& analog_rhs = rhs.analog_gain_controller;
59   return enabled == rhs.enabled && mode == rhs.mode &&
60          target_level_dbfs == rhs.target_level_dbfs &&
61          compression_gain_db == rhs.compression_gain_db &&
62          enable_limiter == rhs.enable_limiter &&
63          analog_lhs.enabled == analog_rhs.enabled &&
64          analog_lhs.startup_min_volume == analog_rhs.startup_min_volume &&
65          analog_lhs.clipped_level_min == analog_rhs.clipped_level_min &&
66          analog_lhs.enable_digital_adaptive ==
67              analog_rhs.enable_digital_adaptive &&
68          analog_lhs.clipped_level_step == analog_rhs.clipped_level_step &&
69          analog_lhs.clipped_ratio_threshold ==
70              analog_rhs.clipped_ratio_threshold &&
71          analog_lhs.clipped_wait_frames == analog_rhs.clipped_wait_frames &&
72          analog_lhs.clipping_predictor.mode ==
73              analog_rhs.clipping_predictor.mode &&
74          analog_lhs.clipping_predictor.window_length ==
75              analog_rhs.clipping_predictor.window_length &&
76          analog_lhs.clipping_predictor.reference_window_length ==
77              analog_rhs.clipping_predictor.reference_window_length &&
78          analog_lhs.clipping_predictor.reference_window_delay ==
79              analog_rhs.clipping_predictor.reference_window_delay &&
80          analog_lhs.clipping_predictor.clipping_threshold ==
81              analog_rhs.clipping_predictor.clipping_threshold &&
82          analog_lhs.clipping_predictor.crest_factor_margin ==
83              analog_rhs.clipping_predictor.crest_factor_margin &&
84          analog_lhs.clipping_predictor.use_predicted_step ==
85              analog_rhs.clipping_predictor.use_predicted_step;
86 }
87 
operator ==(const Agc2Config::AdaptiveDigital & rhs) const88 bool Agc2Config::AdaptiveDigital::operator==(
89     const Agc2Config::AdaptiveDigital& rhs) const {
90   return enabled == rhs.enabled && dry_run == rhs.dry_run &&
91          headroom_db == rhs.headroom_db && max_gain_db == rhs.max_gain_db &&
92          initial_gain_db == rhs.initial_gain_db &&
93          vad_reset_period_ms == rhs.vad_reset_period_ms &&
94          adjacent_speech_frames_threshold ==
95              rhs.adjacent_speech_frames_threshold &&
96          max_gain_change_db_per_second == rhs.max_gain_change_db_per_second &&
97          max_output_noise_level_dbfs == rhs.max_output_noise_level_dbfs;
98 }
99 
operator ==(const Agc2Config::InputVolumeController & rhs) const100 bool Agc2Config::InputVolumeController::operator==(
101     const Agc2Config::InputVolumeController& rhs) const {
102   return enabled == rhs.enabled;
103 }
104 
operator ==(const Agc2Config & rhs) const105 bool Agc2Config::operator==(const Agc2Config& rhs) const {
106   return enabled == rhs.enabled &&
107          fixed_digital.gain_db == rhs.fixed_digital.gain_db &&
108          adaptive_digital == rhs.adaptive_digital &&
109          input_volume_controller == rhs.input_volume_controller;
110 }
111 
operator ==(const AudioProcessing::Config::CaptureLevelAdjustment & rhs) const112 bool AudioProcessing::Config::CaptureLevelAdjustment::operator==(
113     const AudioProcessing::Config::CaptureLevelAdjustment& rhs) const {
114   return enabled == rhs.enabled && pre_gain_factor == rhs.pre_gain_factor &&
115          post_gain_factor == rhs.post_gain_factor &&
116          analog_mic_gain_emulation == rhs.analog_mic_gain_emulation;
117 }
118 
119 bool AudioProcessing::Config::CaptureLevelAdjustment::AnalogMicGainEmulation::
operator ==(const AudioProcessing::Config::CaptureLevelAdjustment::AnalogMicGainEmulation & rhs) const120 operator==(const AudioProcessing::Config::CaptureLevelAdjustment::
121                AnalogMicGainEmulation& rhs) const {
122   return enabled == rhs.enabled && initial_level == rhs.initial_level;
123 }
124 
ToString() const125 std::string AudioProcessing::Config::ToString() const {
126   char buf[2048];
127   rtc::SimpleStringBuilder builder(buf);
128   builder << "AudioProcessing::Config{ "
129              "pipeline: { "
130              "maximum_internal_processing_rate: "
131           << pipeline.maximum_internal_processing_rate
132           << ", multi_channel_render: " << pipeline.multi_channel_render
133           << ", multi_channel_capture: " << pipeline.multi_channel_capture
134           << " }, pre_amplifier: { enabled: " << pre_amplifier.enabled
135           << ", fixed_gain_factor: " << pre_amplifier.fixed_gain_factor
136           << " },capture_level_adjustment: { enabled: "
137           << capture_level_adjustment.enabled
138           << ", pre_gain_factor: " << capture_level_adjustment.pre_gain_factor
139           << ", post_gain_factor: " << capture_level_adjustment.post_gain_factor
140           << ", analog_mic_gain_emulation: { enabled: "
141           << capture_level_adjustment.analog_mic_gain_emulation.enabled
142           << ", initial_level: "
143           << capture_level_adjustment.analog_mic_gain_emulation.initial_level
144           << " }}, high_pass_filter: { enabled: " << high_pass_filter.enabled
145           << " }, echo_canceller: { enabled: " << echo_canceller.enabled
146           << ", mobile_mode: " << echo_canceller.mobile_mode
147           << ", enforce_high_pass_filtering: "
148           << echo_canceller.enforce_high_pass_filtering
149           << " }, noise_suppression: { enabled: " << noise_suppression.enabled
150           << ", level: "
151           << NoiseSuppressionLevelToString(noise_suppression.level)
152           << " }, transient_suppression: { enabled: "
153           << transient_suppression.enabled
154           << " }, gain_controller1: { enabled: " << gain_controller1.enabled
155           << ", mode: " << GainController1ModeToString(gain_controller1.mode)
156           << ", target_level_dbfs: " << gain_controller1.target_level_dbfs
157           << ", compression_gain_db: " << gain_controller1.compression_gain_db
158           << ", enable_limiter: " << gain_controller1.enable_limiter
159           << ", analog_gain_controller { enabled: "
160           << gain_controller1.analog_gain_controller.enabled
161           << ", startup_min_volume: "
162           << gain_controller1.analog_gain_controller.startup_min_volume
163           << ", clipped_level_min: "
164           << gain_controller1.analog_gain_controller.clipped_level_min
165           << ", enable_digital_adaptive: "
166           << gain_controller1.analog_gain_controller.enable_digital_adaptive
167           << ", clipped_level_step: "
168           << gain_controller1.analog_gain_controller.clipped_level_step
169           << ", clipped_ratio_threshold: "
170           << gain_controller1.analog_gain_controller.clipped_ratio_threshold
171           << ", clipped_wait_frames: "
172           << gain_controller1.analog_gain_controller.clipped_wait_frames
173           << ", clipping_predictor:  { enabled: "
174           << gain_controller1.analog_gain_controller.clipping_predictor.enabled
175           << ", mode: "
176           << gain_controller1.analog_gain_controller.clipping_predictor.mode
177           << ", window_length: "
178           << gain_controller1.analog_gain_controller.clipping_predictor
179                  .window_length
180           << ", reference_window_length: "
181           << gain_controller1.analog_gain_controller.clipping_predictor
182                  .reference_window_length
183           << ", reference_window_delay: "
184           << gain_controller1.analog_gain_controller.clipping_predictor
185                  .reference_window_delay
186           << ", clipping_threshold: "
187           << gain_controller1.analog_gain_controller.clipping_predictor
188                  .clipping_threshold
189           << ", crest_factor_margin: "
190           << gain_controller1.analog_gain_controller.clipping_predictor
191                  .crest_factor_margin
192           << ", use_predicted_step: "
193           << gain_controller1.analog_gain_controller.clipping_predictor
194                  .use_predicted_step
195           << " }}}, gain_controller2: { enabled: " << gain_controller2.enabled
196           << ", fixed_digital: { gain_db: "
197           << gain_controller2.fixed_digital.gain_db
198           << " }, adaptive_digital: { enabled: "
199           << gain_controller2.adaptive_digital.enabled
200           << ", dry_run: " << gain_controller2.adaptive_digital.dry_run
201           << ", headroom_db: " << gain_controller2.adaptive_digital.headroom_db
202           << ", max_gain_db: " << gain_controller2.adaptive_digital.max_gain_db
203           << ", initial_gain_db: "
204           << gain_controller2.adaptive_digital.initial_gain_db
205           << ", vad_reset_period_ms: "
206           << gain_controller2.adaptive_digital.vad_reset_period_ms
207           << ", adjacent_speech_frames_threshold: "
208           << gain_controller2.adaptive_digital.adjacent_speech_frames_threshold
209           << ", max_gain_change_db_per_second: "
210           << gain_controller2.adaptive_digital.max_gain_change_db_per_second
211           << ", max_output_noise_level_dbfs: "
212           << gain_controller2.adaptive_digital.max_output_noise_level_dbfs
213           << " }, input_volume_control : { enabled "
214           << gain_controller2.input_volume_controller.enabled << "}}";
215   return builder.str();
216 }
217 
218 }  // namespace webrtc
219