tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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