mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 13:50:40 +01:00

Bug: webrtc:7494 Change-Id: I7957602d60658b84175a617f9c283ea44eafe57d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/216260 Commit-Queue: Alessio Bazzica <alessiob@webrtc.org> Reviewed-by: Sam Zackrisson <saza@google.com> Cr-Commit-Position: refs/heads/master@{#33876}
179 lines
7.7 KiB
C++
179 lines
7.7 KiB
C++
/*
|
|
* Copyright (c) 2016 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/include/audio_processing.h"
|
|
|
|
#include "rtc_base/strings/string_builder.h"
|
|
#include "rtc_base/system/arch.h"
|
|
|
|
namespace webrtc {
|
|
namespace {
|
|
|
|
using Agc1Config = AudioProcessing::Config::GainController1;
|
|
using Agc2Config = AudioProcessing::Config::GainController2;
|
|
|
|
std::string NoiseSuppressionLevelToString(
|
|
const AudioProcessing::Config::NoiseSuppression::Level& level) {
|
|
switch (level) {
|
|
case AudioProcessing::Config::NoiseSuppression::Level::kLow:
|
|
return "Low";
|
|
case AudioProcessing::Config::NoiseSuppression::Level::kModerate:
|
|
return "Moderate";
|
|
case AudioProcessing::Config::NoiseSuppression::Level::kHigh:
|
|
return "High";
|
|
case AudioProcessing::Config::NoiseSuppression::Level::kVeryHigh:
|
|
return "VeryHigh";
|
|
}
|
|
RTC_CHECK_NOTREACHED();
|
|
}
|
|
|
|
std::string GainController1ModeToString(const Agc1Config::Mode& mode) {
|
|
switch (mode) {
|
|
case Agc1Config::Mode::kAdaptiveAnalog:
|
|
return "AdaptiveAnalog";
|
|
case Agc1Config::Mode::kAdaptiveDigital:
|
|
return "AdaptiveDigital";
|
|
case Agc1Config::Mode::kFixedDigital:
|
|
return "FixedDigital";
|
|
}
|
|
RTC_CHECK_NOTREACHED();
|
|
}
|
|
|
|
std::string GainController2NoiseEstimatorToString(
|
|
const Agc2Config::NoiseEstimator& type) {
|
|
switch (type) {
|
|
case Agc2Config::NoiseEstimator::kStationaryNoise:
|
|
return "StationaryNoise";
|
|
case Agc2Config::NoiseEstimator::kNoiseFloor:
|
|
return "NoiseFloor";
|
|
}
|
|
RTC_CHECK_NOTREACHED();
|
|
}
|
|
|
|
} // namespace
|
|
|
|
constexpr int AudioProcessing::kNativeSampleRatesHz[];
|
|
|
|
void CustomProcessing::SetRuntimeSetting(
|
|
AudioProcessing::RuntimeSetting setting) {}
|
|
|
|
bool Agc1Config::operator==(const Agc1Config& rhs) const {
|
|
const auto& analog_lhs = analog_gain_controller;
|
|
const auto& analog_rhs = rhs.analog_gain_controller;
|
|
return enabled == rhs.enabled && mode == rhs.mode &&
|
|
target_level_dbfs == rhs.target_level_dbfs &&
|
|
compression_gain_db == rhs.compression_gain_db &&
|
|
enable_limiter == rhs.enable_limiter &&
|
|
analog_level_minimum == rhs.analog_level_minimum &&
|
|
analog_level_maximum == rhs.analog_level_maximum &&
|
|
analog_lhs.enabled == analog_rhs.enabled &&
|
|
analog_lhs.startup_min_volume == analog_rhs.startup_min_volume &&
|
|
analog_lhs.clipped_level_min == analog_rhs.clipped_level_min &&
|
|
analog_lhs.enable_digital_adaptive ==
|
|
analog_rhs.enable_digital_adaptive;
|
|
}
|
|
|
|
bool Agc2Config::AdaptiveDigital::operator==(
|
|
const Agc2Config::AdaptiveDigital& rhs) const {
|
|
return enabled == rhs.enabled && dry_run == rhs.dry_run &&
|
|
noise_estimator == rhs.noise_estimator &&
|
|
vad_reset_period_ms == rhs.vad_reset_period_ms &&
|
|
adjacent_speech_frames_threshold ==
|
|
rhs.adjacent_speech_frames_threshold &&
|
|
max_gain_change_db_per_second == rhs.max_gain_change_db_per_second &&
|
|
max_output_noise_level_dbfs == rhs.max_output_noise_level_dbfs &&
|
|
sse2_allowed == rhs.sse2_allowed && avx2_allowed == rhs.avx2_allowed &&
|
|
neon_allowed == rhs.neon_allowed;
|
|
}
|
|
|
|
bool Agc2Config::operator==(const Agc2Config& rhs) const {
|
|
return enabled == rhs.enabled &&
|
|
fixed_digital.gain_db == rhs.fixed_digital.gain_db &&
|
|
adaptive_digital == rhs.adaptive_digital;
|
|
}
|
|
|
|
bool AudioProcessing::Config::CaptureLevelAdjustment::operator==(
|
|
const AudioProcessing::Config::CaptureLevelAdjustment& rhs) const {
|
|
return enabled == rhs.enabled && pre_gain_factor == rhs.pre_gain_factor &&
|
|
post_gain_factor && rhs.post_gain_factor &&
|
|
analog_mic_gain_emulation == rhs.analog_mic_gain_emulation;
|
|
}
|
|
|
|
bool AudioProcessing::Config::CaptureLevelAdjustment::AnalogMicGainEmulation::
|
|
operator==(const AudioProcessing::Config::CaptureLevelAdjustment::
|
|
AnalogMicGainEmulation& rhs) const {
|
|
return enabled == rhs.enabled && initial_level == rhs.initial_level;
|
|
}
|
|
|
|
std::string AudioProcessing::Config::ToString() const {
|
|
char buf[2048];
|
|
rtc::SimpleStringBuilder builder(buf);
|
|
builder
|
|
<< "AudioProcessing::Config{ "
|
|
"pipeline: { "
|
|
"maximum_internal_processing_rate: "
|
|
<< pipeline.maximum_internal_processing_rate
|
|
<< ", multi_channel_render: " << pipeline.multi_channel_render
|
|
<< ", multi_channel_capture: " << pipeline.multi_channel_capture
|
|
<< " }, pre_amplifier: { enabled: " << pre_amplifier.enabled
|
|
<< ", fixed_gain_factor: " << pre_amplifier.fixed_gain_factor
|
|
<< " },capture_level_adjustment: { enabled: "
|
|
<< capture_level_adjustment.enabled
|
|
<< ", pre_gain_factor: " << capture_level_adjustment.pre_gain_factor
|
|
<< ", post_gain_factor: " << capture_level_adjustment.post_gain_factor
|
|
<< ", analog_mic_gain_emulation: { enabled: "
|
|
<< capture_level_adjustment.analog_mic_gain_emulation.enabled
|
|
<< ", initial_level: "
|
|
<< capture_level_adjustment.analog_mic_gain_emulation.initial_level
|
|
<< " }}, high_pass_filter: { enabled: " << high_pass_filter.enabled
|
|
<< " }, echo_canceller: { enabled: " << echo_canceller.enabled
|
|
<< ", mobile_mode: " << echo_canceller.mobile_mode
|
|
<< ", enforce_high_pass_filtering: "
|
|
<< echo_canceller.enforce_high_pass_filtering
|
|
<< " }, noise_suppression: { enabled: " << noise_suppression.enabled
|
|
<< ", level: " << NoiseSuppressionLevelToString(noise_suppression.level)
|
|
<< " }, transient_suppression: { enabled: "
|
|
<< transient_suppression.enabled
|
|
<< " }, voice_detection: { enabled: " << voice_detection.enabled
|
|
<< " }, gain_controller1: { enabled: " << gain_controller1.enabled
|
|
<< ", mode: " << GainController1ModeToString(gain_controller1.mode)
|
|
<< ", target_level_dbfs: " << gain_controller1.target_level_dbfs
|
|
<< ", compression_gain_db: " << gain_controller1.compression_gain_db
|
|
<< ", enable_limiter: " << gain_controller1.enable_limiter
|
|
<< ", analog_level_minimum: " << gain_controller1.analog_level_minimum
|
|
<< ", analog_level_maximum: " << gain_controller1.analog_level_maximum
|
|
<< " }, gain_controller2: { enabled: " << gain_controller2.enabled
|
|
<< ", fixed_digital: { gain_db: "
|
|
<< gain_controller2.fixed_digital.gain_db
|
|
<< " }, adaptive_digital: { enabled: "
|
|
<< gain_controller2.adaptive_digital.enabled
|
|
<< ", dry_run: " << gain_controller2.adaptive_digital.dry_run
|
|
<< ", noise_estimator: "
|
|
<< GainController2NoiseEstimatorToString(
|
|
gain_controller2.adaptive_digital.noise_estimator)
|
|
<< ", vad_reset_period_ms: "
|
|
<< gain_controller2.adaptive_digital.vad_reset_period_ms
|
|
<< ", adjacent_speech_frames_threshold: "
|
|
<< gain_controller2.adaptive_digital.adjacent_speech_frames_threshold
|
|
<< ", max_gain_change_db_per_second: "
|
|
<< gain_controller2.adaptive_digital.max_gain_change_db_per_second
|
|
<< ", max_output_noise_level_dbfs: "
|
|
<< gain_controller2.adaptive_digital.max_output_noise_level_dbfs
|
|
<< ", sse2_allowed: " << gain_controller2.adaptive_digital.sse2_allowed
|
|
<< ", avx2_allowed: " << gain_controller2.adaptive_digital.avx2_allowed
|
|
<< ", neon_allowed: " << gain_controller2.adaptive_digital.neon_allowed
|
|
<< "}}, residual_echo_detector: { enabled: "
|
|
<< residual_echo_detector.enabled
|
|
<< " }, level_estimation: { enabled: " << level_estimation.enabled
|
|
<< " }}";
|
|
return builder.str();
|
|
}
|
|
|
|
} // namespace webrtc
|