1135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*
2135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Copyright 2009, The Android Open Source Project
3135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
4135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
5135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * you may not use this file except in compliance with the License.
6135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * You may obtain a copy of the License at
7135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
8135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *     http://www.apache.org/licenses/LICENSE-2.0
9135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
10135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Unless required by applicable law or agreed to in writing, software
11135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
12135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * See the License for the specific language governing permissions and
14135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * limitations under the License.
15135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */
16135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
17135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#ifndef AUDIOEQUALIZER_H_
18135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define AUDIOEQUALIZER_H_
19135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
20135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include "AudioCommon.h"
21135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
22135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentnamespace android {
23135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
24135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentclass AudioShelvingFilter;
25135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentclass AudioPeakingFilter;
26135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
27135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// A parametric audio equalizer. Supports an arbitrary number of bands and
28135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// presets.
29135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// The EQ is composed of a low-shelf, zero or more peaking filters and a high
30135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// shelf, where each band has frequency and gain controls, and the peaking
31135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// filters have an additional bandwidth control.
32135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentclass AudioEqualizer {
33135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentpublic:
34135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Configuration of a single band.
35135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    struct BandConfig {
36135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent        // Gain in millibel.
37135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent        int32_t gain;
38135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent        // Frequency in millihertz.
39135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent        uint32_t freq;
40135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent        // Bandwidth in cents (ignored on shelving filters).
41135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent        uint32_t bandwidth;
42135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    };
43135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
44135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Preset configuration.
45135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    struct PresetConfig {
46135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent        // Human-readable name.
47135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent        const char * name;
48135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent        // An array of size nBands where each element is a configuration for the
49135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent        // corresponding band.
50135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent        const BandConfig * bandConfigs;
51135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    };
52135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
53135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // This value is used when requesting current preset, and EQ is not using a
54135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // preset.
55135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    static const int PRESET_CUSTOM = -1;
56135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
57135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Get the required memory size for an instance of this class.
58135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // nBands   Number of bands required in the instance.
59135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    static size_t GetInstanceSize(int nBands);
60135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
61135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Create an instance of this class.
62135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // If succeeds, a respective call is expected to freeInstance(), regardless
63135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // of who owns the context memory.
64135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // pMem         A memory buffer of at least the size returned by
65135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    //              GetInstanceSize(), where the instance context is to be
66135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    //              stored. If NULL, it will be automatically allocated (using
67135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    //              malloc).
68135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // nBands       Number of bands. Must be >= 2.
69135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // nChannels    Number of input/output channels (interlaced).
70135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // sampleRate   The input/output sample rate, in Hz.
71135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // presets      The presets configuration. May be NULL, but in that case the
72135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    //              client is required not to call preset-related functions.
73135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    //              This array is owned by the client and is not copied. It
74135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    //              must be kept valid by the client as long as the instance is
75135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    //              alive.
76135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // nPresets     Number of elements in the presets array.
77135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // returns      The instance if success. NULL if pMem is NULL and allocation
78135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    //              failed.
79135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    static AudioEqualizer * CreateInstance(void * pMem, int nBands,
80135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                           int nChannels,
81135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                           int sampleRate,
82135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                           const PresetConfig * presets,
83135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                           int nPresets);
84135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
85135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Reconfiguration of the filter. Changes input/output format, but does not
86135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // alter current parameter values. Causes reset of the delay lines.
87135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // nChannels  Number of input/output channels (interlaced).
88135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // sampleRate The input/output sample rate, in Hz.
89135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    void configure(int nChannels, int sampleRate);
90135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
91135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Resets the filter parameters to the following values:
92135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // frequency: 0
93135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // gain: 0
94135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // bandwidth: 1200 cents.
95135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // It also disables the filter. Does not clear the delay lines.
96135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    void reset();
97135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
98135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Clears delay lines. Does not alter parameter values.
99135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    void clear();
100135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
101135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Frees the object. Will free the memory if the object owned it, i.e. if
102135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // a NULL pointer was passed to CreateInstance as pMem.
103135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    void free();
104135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
105135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Sets gain value. Actual change will only take place upon commit().
106135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // This value will be remembered even if the filter is in disabled() state.
107135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // band     The band to set the gain for.
108135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // millibel Gain value in millibel (1/100 of decibel).
109135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    void setGain(int band, int32_t millibel);
110135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
111135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Gets gain of a certain band. This is always the last value set (or
112135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // default value after reset).
113135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // band     The band to get the gain for.
114135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // returns  Gain value in millibel (1/100 of decibel).
115135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int32_t getGain(int band) const;
116135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
117135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Sets cutoff frequency value. Actual change will only take place upon
118135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // commit().
119135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // This value will be remembered even if the filter is in disabled() state.
120135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // band       The band to set the frequency for.
121135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // millihertz Frequency value in mHz.
122135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    void setFrequency(int band, uint32_t millihertz);
123135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
124135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Gets frequency of a certain band. This is always the last value set (or
125135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // default value after reset).
126135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // band     The band to get the frequency for.
127135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // returns  Frequency value in mHz.
128135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint32_t getFrequency(int band) const;
129135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
130135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Sets bandwidth value. Actual change will only take place upon commit().
131135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // This value will be remembered even if the filter is in disabled() state.
132135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // If called on the first or last band, this call is ignored.
133135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // band  The band to set the frequency for.
134135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // cents Bandwidth value in cents (1/1200 octave).
135135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    void setBandwidth(int band, uint32_t cents);
136135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
137135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Gets bandwidth of a certain band. This is always the last value set (or
138135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // default value after reset). For the first and last bands, 0 is always
139135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // returned.
140135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // band     The band to get the bandwidth for.
141135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // returns  Bandwidth value in cents (1/1200 octave).
142135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint32_t getBandwidth(int band) const;
143135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
144135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Gets lower and upper boundaries of a band.
145135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // For the low shelf, the low bound is 0 and the high bound is the band
146135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // frequency.
147135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // For the high shelf, the low bound is the band frequency and the high
148135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // bound is Nyquist.
149135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // For the peaking filters, they are the gain[dB]/2 points.
150135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    void getBandRange(int band, uint32_t & low, uint32_t & high) const;
151135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
152135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Gets a human-readable name for a preset ID. Will return "Custom" if
153135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // PRESET_CUSTOM is passed.
154135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // preset       The preset ID. Must be less than number of presets.
155135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    const char * getPresetName(int preset) const;
156135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
157135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Gets the number of presets.
158135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int getNumPresets() const;
159135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
160135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Gets the currently set preset ID.
161135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Will return PRESET_CUSTOM in case the EQ parameters have been modified
162135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // manually since a preset was set.
163135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int getPreset() const;
164135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
165135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Sets the current preset by ID.
166135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // All the band parameters will be overridden.
167135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Change will not be applied until commit() is called.
168135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // preset       The preset ID. Must be less than number of presets.
169135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    //              PRESET_CUSTOM is NOT a valid value here.
170135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    void setPreset(int preset);
171135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
172135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Applies all parameter changes done to this point in time.
173135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // If the filter is disabled, the new parameters will take place when it is
174135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // enabled again. Does not introduce artifacts, unless immediate is set.
175135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // immediate    Whether to apply change abruptly (ignored if filter is
176135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // disabled).
177135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent   void commit(bool immediate = false);
178135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
179135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Process a buffer of input data. The input and output should contain
180135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // frameCount * nChannels interlaced samples. Processing can be done
181135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // in-place, by passing the same buffer as both arguments.
182135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // pIn          Input buffer.
183135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // pOut         Output buffer.
184135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // frameCount   Number of frames to produce on each call to process().
185135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    void process(const audio_sample_t * pIn, audio_sample_t * pOut,
186135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                 int frameCount);
187135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
188135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Enables the filter, so it would start processing input. Does not
189135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // introduce artifacts, unless immediate is set.
190135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // immediate    Whether to apply change abruptly.
191135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    void enable(bool immediate = false);
192135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
193135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Disabled (bypasses) the filter. Does not introduce artifacts, unless
194135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // immediate is set.
195135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // immediate    Whether to apply change abruptly.
196135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    void disable(bool immediate = false);
197135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
198135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Returns the band with the maximum influence on a given frequency.
199135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Result is unaffected by whether EQ is enabled or not, or by whether
200135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // changes have been committed or not.
201135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // targetFreq   The target frequency, in millihertz.
202135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int getMostRelevantBand(uint32_t targetFreq) const;
203135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
204135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentprivate:
205135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Bottom frequency, in mHz.
206135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    static const int kMinFreq = 20000;
207135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Sample rate, in Hz.
208135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int mSampleRate;
209135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Number of peaking filters. Total number of bands is +2.
210135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int mNumPeaking;
211135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Preset configurations.
212135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    const PresetConfig * mpPresets;
213135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Number of elements in mpPresets;
214135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int mNumPresets;
215135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Current preset.
216135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int mCurPreset;
217135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
218135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Memory space to free when instance is deleted, or NULL if no memory is
219135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // owned.
220135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    void * mpMem;
221135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // The low-shelving filter.
222135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    AudioShelvingFilter * mpLowShelf;
223135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // The high-shelving filter.
224135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    AudioShelvingFilter * mpHighShelf;
225135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // An array of size mNumPeaking of peaking filters.
226135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    AudioPeakingFilter * mpPeakingFilters;
227135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
228135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // Constructor. Resets the filter (see reset()). Must call init() doing
229135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // anything else.
230135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // pMem       Memory buffer for bands.
231135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // nChannels  Number of input/output channels (interlaced).
232135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // sampleRate The input/output sample rate, in Hz.
233135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // ownMem     Whether pMem is owned by me.
234135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // presets      The presets configuration. May be NULL, but in that case the
235135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    //              client is required not to call preset-related functions.
236135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    //              This array is owned by the client and is not copied. It
237135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    //              must be kept valid by the client as long as the instance is
238135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    //              alive.
239135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // nPresets     Number of elements in the presets array.
240135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    AudioEqualizer(void * pMem, int nBands, int nChannels, int sampleRate,
241135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                   bool ownMem, const PresetConfig * presets, int nPresets);
242135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent};
243135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
244135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}
245135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
246135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#endif // AUDIOEQUALIZER_H_
247