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