blob: 616f88ae2475062fbd01abe7abca1f4fb6259011 [file] [log] [blame]
alessiob3ec96df2017-05-22 06:57:06 -07001/*
2 * Copyright (c) 2017 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
Alex Loikoe36e8bb2018-02-16 11:54:07 +010011#ifndef MODULES_AUDIO_PROCESSING_GAIN_CONTROLLER2_H_
12#define MODULES_AUDIO_PROCESSING_GAIN_CONTROLLER2_H_
alessiob3ec96df2017-05-22 06:57:06 -070013
14#include <memory>
15#include <string>
16
Alessio Bazzica2fa46182021-10-26 14:08:23 +020017#include "modules/audio_processing/agc2/adaptive_digital_gain_controller.h"
Alessio Bazzicab4d4ae22021-10-15 13:57:56 +020018#include "modules/audio_processing/agc2/cpu_features.h"
Alessio Bazzica3e4c77f2018-11-01 21:31:38 +010019#include "modules/audio_processing/agc2/gain_applier.h"
20#include "modules/audio_processing/agc2/limiter.h"
Alessio Bazzicab4d4ae22021-10-15 13:57:56 +020021#include "modules/audio_processing/agc2/vad_wrapper.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "modules/audio_processing/include/audio_processing.h"
Alessio Bazzica8aaa6042021-03-31 15:16:05 +020023#include "modules/audio_processing/logging/apm_data_dumper.h"
alessiob3ec96df2017-05-22 06:57:06 -070024
25namespace webrtc {
26
alessiob3ec96df2017-05-22 06:57:06 -070027class AudioBuffer;
28
29// Gain Controller 2 aims to automatically adjust levels by acting on the
30// microphone gain and/or applying digital gain.
alessiob3ec96df2017-05-22 06:57:06 -070031class GainController2 {
32 public:
Hanna Silen0c1ad292022-06-16 16:35:45 +020033 // Ctor. If `use_internal_vad` is true, an internal voice activity
34 // detector is used for digital adaptive gain.
Alessio Bazzica38901042021-10-14 12:14:21 +020035 GainController2(const AudioProcessing::Config::GainController2& config,
36 int sample_rate_hz,
Hanna Silen0c1ad292022-06-16 16:35:45 +020037 int num_channels,
38 bool use_internal_vad);
Alessio Bazzica8aaa6042021-03-31 15:16:05 +020039 GainController2(const GainController2&) = delete;
40 GainController2& operator=(const GainController2&) = delete;
alessiob3ec96df2017-05-22 06:57:06 -070041 ~GainController2();
42
Alessio Bazzica38901042021-10-14 12:14:21 +020043 // Detects and handles changes of sample rate and/or number of channels.
Alessio Bazzicad66a6052021-04-29 16:13:25 +020044 void Initialize(int sample_rate_hz, int num_channels);
Alessio Bazzica38901042021-10-14 12:14:21 +020045
46 // Sets the fixed digital gain.
47 void SetFixedGainDb(float gain_db);
48
49 // Applies fixed and adaptive digital gains to `audio` and runs a limiter.
Hanna Silen0c1ad292022-06-16 16:35:45 +020050 // If the internal VAD is used, `speech_probability` is ignored. Otherwise
51 // `speech_probability` is used for digital adaptive gain if it's available
52 // (limited to values [0.0, 1.0]).
53 void Process(absl::optional<float> speech_probability, AudioBuffer* audio);
Alessio Bazzica38901042021-10-14 12:14:21 +020054
55 // Handles analog level changes.
Alex Loikoa837dd72018-08-06 16:32:12 +020056 void NotifyAnalogLevel(int level);
alessiob3ec96df2017-05-22 06:57:06 -070057
58 static bool Validate(const AudioProcessing::Config::GainController2& config);
alessiob3ec96df2017-05-22 06:57:06 -070059
Hanna Silen0c1ad292022-06-16 16:35:45 +020060 AvailableCpuFeatures GetCpuFeatures() const { return cpu_features_; }
61
alessiob3ec96df2017-05-22 06:57:06 -070062 private:
alessiob3ec96df2017-05-22 06:57:06 -070063 static int instance_count_;
Alessio Bazzicab4d4ae22021-10-15 13:57:56 +020064 const AvailableCpuFeatures cpu_features_;
Alessio Bazzica8aaa6042021-03-31 15:16:05 +020065 ApmDataDumper data_dumper_;
Alessio Bazzica82ea4ee2021-10-07 09:21:02 +020066 GainApplier fixed_gain_applier_;
Alessio Bazzicab4d4ae22021-10-15 13:57:56 +020067 std::unique_ptr<VoiceActivityDetectorWrapper> vad_;
Alessio Bazzica2fa46182021-10-26 14:08:23 +020068 std::unique_ptr<AdaptiveDigitalGainController> adaptive_digital_controller_;
Alessio Bazzica3e4c77f2018-11-01 21:31:38 +010069 Limiter limiter_;
Alessio Bazzica08d2a702020-11-20 16:26:24 +010070 int calls_since_last_limiter_log_;
Alessio Bazzica38901042021-10-14 12:14:21 +020071 int analog_level_;
alessiob3ec96df2017-05-22 06:57:06 -070072};
73
74} // namespace webrtc
75
Alex Loikoe36e8bb2018-02-16 11:54:07 +010076#endif // MODULES_AUDIO_PROCESSING_GAIN_CONTROLLER2_H_