1e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
2e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
4e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  Use of this source code is governed by a BSD-style license
5e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  that can be found in the LICENSE file in the root of the source
6e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  tree. An additional intellectual property rights grant can be found
7e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  in the file PATENTS.  All contributing project authors may
8e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  be found in the AUTHORS file in the root of the source tree.
9e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
10e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
11e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_GAIN_CONTROL_IMPL_H_
12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_GAIN_CONTROL_IMPL_H_
13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
14e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include <vector>
15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "audio_processing.h"
17e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "processing_component.h"
18e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
19e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentnamespace webrtc {
20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass AudioProcessingImpl;
21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass AudioBuffer;
22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass GainControlImpl : public GainControl,
24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                        public ProcessingComponent {
25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent public:
26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  explicit GainControlImpl(const AudioProcessingImpl* apm);
27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual ~GainControlImpl();
28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  int ProcessRenderAudio(AudioBuffer* audio);
30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  int AnalyzeCaptureAudio(AudioBuffer* audio);
31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  int ProcessCaptureAudio(AudioBuffer* audio);
32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  // ProcessingComponent implementation.
34e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int Initialize();
35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int get_version(char* version, int version_len_bytes) const;
36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  // GainControl implementation.
38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual bool is_enabled() const;
39c55a96383497a772a307b346368133960b02ad03Eric Laurent  virtual int stream_analog_level();
40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent private:
42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  // GainControl implementation.
43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int Enable(bool enable);
44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int set_stream_analog_level(int level);
45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int set_mode(Mode mode);
46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual Mode mode() const;
47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int set_target_level_dbfs(int level);
48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int target_level_dbfs() const;
49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int set_compression_gain_db(int gain);
50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int compression_gain_db() const;
51e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int enable_limiter(bool enable);
52e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual bool is_limiter_enabled() const;
53e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int set_analog_level_limits(int minimum, int maximum);
54e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int analog_level_minimum() const;
55e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int analog_level_maximum() const;
56e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual bool stream_is_saturated() const;
57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
58e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  // ProcessingComponent implementation.
59e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual void* CreateHandle() const;
60e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int InitializeHandle(void* handle) const;
61e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int ConfigureHandle(void* handle) const;
62e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int DestroyHandle(void* handle) const;
63e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int num_handles_required() const;
64e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  virtual int GetHandleError(void* handle) const;
65e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
66e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  const AudioProcessingImpl* apm_;
67e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  Mode mode_;
68e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  int minimum_capture_level_;
69e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  int maximum_capture_level_;
70e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  bool limiter_enabled_;
71e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  int target_level_dbfs_;
72e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  int compression_gain_db_;
73e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  std::vector<int> capture_levels_;
74e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  int analog_capture_level_;
75e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  bool was_analog_level_set_;
76e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent  bool stream_is_saturated_;
77e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent};
78e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}  // namespace webrtc
79e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
80e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_MAIN_SOURCE_GAIN_CONTROL_IMPL_H_
81