blob: 8c82d745b5a93897b261a190bb68db0968ba921a [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:
Alessio Bazzica38901042021-10-14 12:14:21 +020033 GainController2(const AudioProcessing::Config::GainController2& config,
34 int sample_rate_hz,
35 int num_channels);
Alessio Bazzica8aaa6042021-03-31 15:16:05 +020036 GainController2(const GainController2&) = delete;
37 GainController2& operator=(const GainController2&) = delete;
alessiob3ec96df2017-05-22 06:57:06 -070038 ~GainController2();
39
Alessio Bazzica38901042021-10-14 12:14:21 +020040 // Detects and handles changes of sample rate and/or number of channels.
Alessio Bazzicad66a6052021-04-29 16:13:25 +020041 void Initialize(int sample_rate_hz, int num_channels);
Alessio Bazzica38901042021-10-14 12:14:21 +020042
43 // Sets the fixed digital gain.
44 void SetFixedGainDb(float gain_db);
45
46 // Applies fixed and adaptive digital gains to `audio` and runs a limiter.
alessiob3ec96df2017-05-22 06:57:06 -070047 void Process(AudioBuffer* audio);
Alessio Bazzica38901042021-10-14 12:14:21 +020048
49 // Handles analog level changes.
Alex Loikoa837dd72018-08-06 16:32:12 +020050 void NotifyAnalogLevel(int level);
alessiob3ec96df2017-05-22 06:57:06 -070051
52 static bool Validate(const AudioProcessing::Config::GainController2& config);
alessiob3ec96df2017-05-22 06:57:06 -070053
54 private:
alessiob3ec96df2017-05-22 06:57:06 -070055 static int instance_count_;
Alessio Bazzicab4d4ae22021-10-15 13:57:56 +020056 const AvailableCpuFeatures cpu_features_;
Alessio Bazzica8aaa6042021-03-31 15:16:05 +020057 ApmDataDumper data_dumper_;
Alessio Bazzica82ea4ee2021-10-07 09:21:02 +020058 GainApplier fixed_gain_applier_;
Alessio Bazzicab4d4ae22021-10-15 13:57:56 +020059 std::unique_ptr<VoiceActivityDetectorWrapper> vad_;
Alessio Bazzica2fa46182021-10-26 14:08:23 +020060 std::unique_ptr<AdaptiveDigitalGainController> adaptive_digital_controller_;
Alessio Bazzica3e4c77f2018-11-01 21:31:38 +010061 Limiter limiter_;
Alessio Bazzica08d2a702020-11-20 16:26:24 +010062 int calls_since_last_limiter_log_;
Alessio Bazzica38901042021-10-14 12:14:21 +020063 int analog_level_;
alessiob3ec96df2017-05-22 06:57:06 -070064};
65
66} // namespace webrtc
67
Alex Loikoe36e8bb2018-02-16 11:54:07 +010068#endif // MODULES_AUDIO_PROCESSING_GAIN_CONTROLLER2_H_