/* * 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. */ #ifndef WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_LEVEL_CONTROLLER_H_ #define WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_LEVEL_CONTROLLER_H_ #include #include #include "webrtc/api/optional.h" #include "webrtc/modules/audio_processing/include/audio_processing.h" #include "webrtc/modules/audio_processing/level_controller/gain_applier.h" #include "webrtc/modules/audio_processing/level_controller/gain_selector.h" #include "webrtc/modules/audio_processing/level_controller/noise_level_estimator.h" #include "webrtc/modules/audio_processing/level_controller/peak_level_estimator.h" #include "webrtc/modules/audio_processing/level_controller/saturating_gain_estimator.h" #include "webrtc/modules/audio_processing/level_controller/signal_classifier.h" #include "webrtc/rtc_base/constructormagic.h" namespace webrtc { class ApmDataDumper; class AudioBuffer; class LevelController { public: LevelController(); ~LevelController(); void Initialize(int sample_rate_hz); void Process(AudioBuffer* audio); float GetLastGain() { return last_gain_; } // TODO(peah): This method is a temporary solution as the the aim is to // instead apply the config inside the constructor. Therefore this is likely // to change. void ApplyConfig(const AudioProcessing::Config::LevelController& config); // Validates a config. static bool Validate(const AudioProcessing::Config::LevelController& config); // Dumps a config to a string. static std::string ToString( const AudioProcessing::Config::LevelController& config); private: class Metrics { public: Metrics() { Initialize(AudioProcessing::kSampleRate48kHz); } void Initialize(int sample_rate_hz); void Update(float long_term_peak_level, float noise_level, float gain, float frame_peak_level); private: void Reset(); size_t metrics_frame_counter_; float gain_sum_; float peak_level_sum_; float noise_energy_sum_; float max_gain_; float max_peak_level_; float max_noise_energy_; float frame_length_; }; std::unique_ptr data_dumper_; GainSelector gain_selector_; GainApplier gain_applier_; SignalClassifier signal_classifier_; NoiseLevelEstimator noise_level_estimator_; PeakLevelEstimator peak_level_estimator_; SaturatingGainEstimator saturating_gain_estimator_; Metrics metrics_; rtc::Optional sample_rate_hz_; static int instance_count_; float dc_level_[2]; float dc_forgetting_factor_; float last_gain_; bool gain_jumpstart_ = false; AudioProcessing::Config::LevelController config_; RTC_DISALLOW_COPY_AND_ASSIGN(LevelController); }; } // namespace webrtc #endif // WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_LEVEL_CONTROLLER_H_