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_AGC_MAIN_INTERFACE_GAIN_CONTROL_H_
12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MAIN_INTERFACE_GAIN_CONTROL_H_
13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
14e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "typedefs.h"
15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Errors
17e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define AGC_UNSPECIFIED_ERROR           18000
18e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define AGC_UNSUPPORTED_FUNCTION_ERROR  18001
19e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define AGC_UNINITIALIZED_ERROR         18002
20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define AGC_NULL_POINTER_ERROR          18003
21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define AGC_BAD_PARAMETER_ERROR         18004
22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Warnings
24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#define AGC_BAD_PARAMETER_WARNING       18050
25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentenum
27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    kAgcModeUnchanged,
29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    kAgcModeAdaptiveAnalog,
30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    kAgcModeAdaptiveDigital,
31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    kAgcModeFixedDigital
32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent};
33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
34e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentenum
35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    kAgcFalse = 0,
37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    kAgcTrue
38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent};
39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurenttypedef struct
41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    WebRtc_Word16 targetLevelDbfs;   // default 3 (-3 dBOv)
43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    WebRtc_Word16 compressionGaindB; // default 9 dB
44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    WebRtc_UWord8 limiterEnable;     // default kAgcTrue (on)
45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} WebRtcAgc_config_t;
46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#if defined(__cplusplus)
48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentextern "C"
49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif
51e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
52e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
53e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * This function processes a 10/20ms frame of far-end speech to determine
54e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * if there is active speech. Far-end speech length can be either 10ms or
55e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 20ms. The length of the input speech vector must be given in samples
56e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * (80/160 when FS=8000, and 160/320 when FS=16000 or FS=32000).
57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
58e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Input:
59e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - agcInst           : AGC instance.
60e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - inFar             : Far-end input speech vector (10 or 20ms)
61e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - samples           : Number of samples in input vector
62e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
63e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Return value:
64e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          :  0 - Normal operation.
65e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          : -1 - Error
66e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
67e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint WebRtcAgc_AddFarend(void* agcInst,
68e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                        const WebRtc_Word16* inFar,
69e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                        WebRtc_Word16 samples);
70e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
71e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
72e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * This function processes a 10/20ms frame of microphone speech to determine
73e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * if there is active speech. Microphone speech length can be either 10ms or
74e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 20ms. The length of the input speech vector must be given in samples
75e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * (80/160 when FS=8000, and 160/320 when FS=16000 or FS=32000). For very low
76e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * input levels, the input signal is increased in level by multiplying and
77e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * overwriting the samples in inMic[].
78e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
79e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * This function should be called before any further processing of the
80e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * near-end microphone signal.
81e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
82e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Input:
83e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - agcInst           : AGC instance.
84e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - inMic             : Microphone input speech vector (10 or 20 ms) for
85e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                            L band
86e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - inMic_H           : Microphone input speech vector (10 or 20 ms) for
87e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                            H band
88e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - samples           : Number of samples in input vector
89e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
90e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Return value:
91e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          :  0 - Normal operation.
92e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          : -1 - Error
93e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
94e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint WebRtcAgc_AddMic(void* agcInst,
95e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                     WebRtc_Word16* inMic,
96e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                     WebRtc_Word16* inMic_H,
97e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                     WebRtc_Word16 samples);
98e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
99e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
100e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * This function replaces the analog microphone with a virtual one.
101e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * It is a digital gain applied to the input signal and is used in the
102e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * agcAdaptiveDigital mode where no microphone level is adjustable.
103e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Microphone speech length can be either 10ms or 20ms. The length of the
104e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * input speech vector must be given in samples (80/160 when FS=8000, and
105e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 160/320 when FS=16000 or FS=32000).
106e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
107e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Input:
108e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - agcInst           : AGC instance.
109e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - inMic             : Microphone input speech vector for (10 or 20 ms)
110e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                            L band
111e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - inMic_H           : Microphone input speech vector for (10 or 20 ms)
112e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                            H band
113e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - samples           : Number of samples in input vector
114e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - micLevelIn        : Input level of microphone (static)
115e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
116e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Output:
117e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - inMic             : Microphone output after processing (L band)
118e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - inMic_H           : Microphone output after processing (H band)
119e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - micLevelOut       : Adjusted microphone level after processing
120e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
121e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Return value:
122e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          :  0 - Normal operation.
123e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          : -1 - Error
124e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
125e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint WebRtcAgc_VirtualMic(void* agcInst,
126e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                         WebRtc_Word16* inMic,
127e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                         WebRtc_Word16* inMic_H,
128e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                         WebRtc_Word16 samples,
129e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                         WebRtc_Word32 micLevelIn,
130e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                         WebRtc_Word32* micLevelOut);
131e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
132e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
133e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * This function processes a 10/20ms frame and adjusts (normalizes) the gain
134e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * both analog and digitally. The gain adjustments are done only during
135e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * active periods of speech. The input speech length can be either 10ms or
136e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * 20ms and the output is of the same length. The length of the speech
137e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * vectors must be given in samples (80/160 when FS=8000, and 160/320 when
138e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * FS=16000 or FS=32000). The echo parameter can be used to ensure the AGC will
139e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * not adjust upward in the presence of echo.
140e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
141e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * This function should be called after processing the near-end microphone
142e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * signal, in any case after any echo cancellation.
143e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
144e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Input:
145e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - agcInst           : AGC instance
146e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - inNear            : Near-end input speech vector (10 or 20 ms) for
147e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                            L band
148e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - inNear_H          : Near-end input speech vector (10 or 20 ms) for
149e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                            H band
150e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - samples           : Number of samples in input/output vector
151e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - inMicLevel        : Current microphone volume level
152e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - echo              : Set to 0 if the signal passed to add_mic is
153e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                            almost certainly free of echo; otherwise set
154e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                            to 1. If you have no information regarding echo
155e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                            set to 0.
156e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
157e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Output:
158e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - outMicLevel       : Adjusted microphone volume level
159e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - out               : Gain-adjusted near-end speech vector (L band)
160e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          : May be the same vector as the input.
161e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - out_H             : Gain-adjusted near-end speech vector (H band)
162e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - saturationWarning : A returned value of 1 indicates a saturation event
163e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                            has occurred and the volume cannot be further
164e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                            reduced. Otherwise will be set to 0.
165e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
166e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Return value:
167e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          :  0 - Normal operation.
168e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          : -1 - Error
169e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
170e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint WebRtcAgc_Process(void* agcInst,
171e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                      const WebRtc_Word16* inNear,
172e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                      const WebRtc_Word16* inNear_H,
173e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                      WebRtc_Word16 samples,
174e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                      WebRtc_Word16* out,
175e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                      WebRtc_Word16* out_H,
176e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                      WebRtc_Word32 inMicLevel,
177e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                      WebRtc_Word32* outMicLevel,
178e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                      WebRtc_Word16 echo,
179e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                      WebRtc_UWord8* saturationWarning);
180e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
181e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
182e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * This function sets the config parameters (targetLevelDbfs,
183e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * compressionGaindB and limiterEnable).
184e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
185e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Input:
186e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - agcInst           : AGC instance
187e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - config            : config struct
188e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
189e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Output:
190e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
191e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Return value:
192e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          :  0 - Normal operation.
193e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          : -1 - Error
194e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
195e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint WebRtcAgc_set_config(void* agcInst, WebRtcAgc_config_t config);
196e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
197e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
198e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * This function returns the config parameters (targetLevelDbfs,
199e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * compressionGaindB and limiterEnable).
200e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
201e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Input:
202e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - agcInst           : AGC instance
203e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
204e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Output:
205e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - config            : config struct
206e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
207e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Return value:
208e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          :  0 - Normal operation.
209e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          : -1 - Error
210e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
211e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint WebRtcAgc_get_config(void* agcInst, WebRtcAgc_config_t* config);
212e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
213e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
214e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * This function creates an AGC instance, which will contain the state
215e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * information for one (duplex) channel.
216e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
217e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Return value             : AGC instance if successful
218e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          : 0 (i.e., a NULL pointer) if unsuccessful
219e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
220e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint WebRtcAgc_Create(void **agcInst);
221e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
222e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
223e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * This function frees the AGC instance created at the beginning.
224e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
225e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Input:
226e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - agcInst           : AGC instance.
227e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
228e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Return value             :  0 - Ok
229e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                            -1 - Error
230e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
231e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint WebRtcAgc_Free(void *agcInst);
232e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
233e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
234e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * This function initializes an AGC instance.
235e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
236e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Input:
237e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - agcInst           : AGC instance.
238e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - minLevel          : Minimum possible mic level
239e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - maxLevel          : Maximum possible mic level
240e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - agcMode           : 0 - Unchanged
241e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          : 1 - Adaptive Analog Automatic Gain Control -3dBOv
242e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          : 2 - Adaptive Digital Automatic Gain Control -3dBOv
243e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          : 3 - Fixed Digital Gain 0dB
244e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - fs                : Sampling frequency
245e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
246e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Return value             :  0 - Ok
247e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                            -1 - Error
248e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
249e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint WebRtcAgc_Init(void *agcInst,
250e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                   WebRtc_Word32 minLevel,
251e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                   WebRtc_Word32 maxLevel,
252e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                   WebRtc_Word16 agcMode,
253e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                   WebRtc_UWord32 fs);
254e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
255e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
256e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * This function returns a text string containing the version.
257e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
258e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Input:
259e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - length            : Length of the char array pointed to by version
260e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Output:
261e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *      - version           : Pointer to a char array of to which the version
262e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                          : string will be copied.
263e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
264e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * Return value             :  0 - OK
265e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *                            -1 - Error
266e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
267e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint WebRtcAgc_Version(WebRtc_Word8 *versionStr, WebRtc_Word16 length);
268e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
269e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#if defined(__cplusplus)
270e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
271e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif
272e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
273e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MAIN_INTERFACE_GAIN_CONTROL_H_
274