xref: /aosp_15_r20/frameworks/av/media/libeffects/testlibs/AudioEqualizer.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright 2009, The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #ifndef AUDIOEQUALIZER_H_
18*ec779b8eSAndroid Build Coastguard Worker #define AUDIOEQUALIZER_H_
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include "AudioCommon.h"
21*ec779b8eSAndroid Build Coastguard Worker 
22*ec779b8eSAndroid Build Coastguard Worker namespace android {
23*ec779b8eSAndroid Build Coastguard Worker 
24*ec779b8eSAndroid Build Coastguard Worker class AudioShelvingFilter;
25*ec779b8eSAndroid Build Coastguard Worker class AudioPeakingFilter;
26*ec779b8eSAndroid Build Coastguard Worker 
27*ec779b8eSAndroid Build Coastguard Worker // A parametric audio equalizer. Supports an arbitrary number of bands and
28*ec779b8eSAndroid Build Coastguard Worker // presets.
29*ec779b8eSAndroid Build Coastguard Worker // The EQ is composed of a low-shelf, zero or more peaking filters and a high
30*ec779b8eSAndroid Build Coastguard Worker // shelf, where each band has frequency and gain controls, and the peaking
31*ec779b8eSAndroid Build Coastguard Worker // filters have an additional bandwidth control.
32*ec779b8eSAndroid Build Coastguard Worker class AudioEqualizer {
33*ec779b8eSAndroid Build Coastguard Worker public:
34*ec779b8eSAndroid Build Coastguard Worker     // Configuration of a single band.
35*ec779b8eSAndroid Build Coastguard Worker     struct BandConfig {
36*ec779b8eSAndroid Build Coastguard Worker         // Gain in millibel.
37*ec779b8eSAndroid Build Coastguard Worker         int32_t gain;
38*ec779b8eSAndroid Build Coastguard Worker         // Frequency in millihertz.
39*ec779b8eSAndroid Build Coastguard Worker         uint32_t freq;
40*ec779b8eSAndroid Build Coastguard Worker         // Bandwidth in cents (ignored on shelving filters).
41*ec779b8eSAndroid Build Coastguard Worker         uint32_t bandwidth;
42*ec779b8eSAndroid Build Coastguard Worker     };
43*ec779b8eSAndroid Build Coastguard Worker 
44*ec779b8eSAndroid Build Coastguard Worker     // Preset configuration.
45*ec779b8eSAndroid Build Coastguard Worker     struct PresetConfig {
46*ec779b8eSAndroid Build Coastguard Worker         // Human-readable name.
47*ec779b8eSAndroid Build Coastguard Worker         const char * name;
48*ec779b8eSAndroid Build Coastguard Worker         // An array of size nBands where each element is a configuration for the
49*ec779b8eSAndroid Build Coastguard Worker         // corresponding band.
50*ec779b8eSAndroid Build Coastguard Worker         const BandConfig * bandConfigs;
51*ec779b8eSAndroid Build Coastguard Worker     };
52*ec779b8eSAndroid Build Coastguard Worker 
53*ec779b8eSAndroid Build Coastguard Worker     // This value is used when requesting current preset, and EQ is not using a
54*ec779b8eSAndroid Build Coastguard Worker     // preset.
55*ec779b8eSAndroid Build Coastguard Worker     static const int PRESET_CUSTOM = -1;
56*ec779b8eSAndroid Build Coastguard Worker 
57*ec779b8eSAndroid Build Coastguard Worker     // Get the required memory size for an instance of this class.
58*ec779b8eSAndroid Build Coastguard Worker     // nBands   Number of bands required in the instance.
59*ec779b8eSAndroid Build Coastguard Worker     static size_t GetInstanceSize(int nBands);
60*ec779b8eSAndroid Build Coastguard Worker 
61*ec779b8eSAndroid Build Coastguard Worker     // Create an instance of this class.
62*ec779b8eSAndroid Build Coastguard Worker     // If succeeds, a respective call is expected to freeInstance(), regardless
63*ec779b8eSAndroid Build Coastguard Worker     // of who owns the context memory.
64*ec779b8eSAndroid Build Coastguard Worker     // pMem         A memory buffer of at least the size returned by
65*ec779b8eSAndroid Build Coastguard Worker     //              GetInstanceSize(), where the instance context is to be
66*ec779b8eSAndroid Build Coastguard Worker     //              stored. If NULL, it will be automatically allocated (using
67*ec779b8eSAndroid Build Coastguard Worker     //              malloc).
68*ec779b8eSAndroid Build Coastguard Worker     // nBands       Number of bands. Must be >= 2.
69*ec779b8eSAndroid Build Coastguard Worker     // nChannels    Number of input/output channels (interlaced).
70*ec779b8eSAndroid Build Coastguard Worker     // sampleRate   The input/output sample rate, in Hz.
71*ec779b8eSAndroid Build Coastguard Worker     // presets      The presets configuration. May be NULL, but in that case the
72*ec779b8eSAndroid Build Coastguard Worker     //              client is required not to call preset-related functions.
73*ec779b8eSAndroid Build Coastguard Worker     //              This array is owned by the client and is not copied. It
74*ec779b8eSAndroid Build Coastguard Worker     //              must be kept valid by the client as long as the instance is
75*ec779b8eSAndroid Build Coastguard Worker     //              alive.
76*ec779b8eSAndroid Build Coastguard Worker     // nPresets     Number of elements in the presets array.
77*ec779b8eSAndroid Build Coastguard Worker     // returns      The instance if success. NULL if pMem is NULL and allocation
78*ec779b8eSAndroid Build Coastguard Worker     //              failed.
79*ec779b8eSAndroid Build Coastguard Worker     static AudioEqualizer * CreateInstance(void * pMem, int nBands,
80*ec779b8eSAndroid Build Coastguard Worker                                            int nChannels,
81*ec779b8eSAndroid Build Coastguard Worker                                            int sampleRate,
82*ec779b8eSAndroid Build Coastguard Worker                                            const PresetConfig * presets,
83*ec779b8eSAndroid Build Coastguard Worker                                            int nPresets);
84*ec779b8eSAndroid Build Coastguard Worker 
85*ec779b8eSAndroid Build Coastguard Worker     // Reconfiguration of the filter. Changes input/output format, but does not
86*ec779b8eSAndroid Build Coastguard Worker     // alter current parameter values. Causes reset of the delay lines.
87*ec779b8eSAndroid Build Coastguard Worker     // nChannels  Number of input/output channels (interlaced).
88*ec779b8eSAndroid Build Coastguard Worker     // sampleRate The input/output sample rate, in Hz.
89*ec779b8eSAndroid Build Coastguard Worker     void configure(int nChannels, int sampleRate);
90*ec779b8eSAndroid Build Coastguard Worker 
91*ec779b8eSAndroid Build Coastguard Worker     // Resets the filter parameters to the following values:
92*ec779b8eSAndroid Build Coastguard Worker     // frequency: 0
93*ec779b8eSAndroid Build Coastguard Worker     // gain: 0
94*ec779b8eSAndroid Build Coastguard Worker     // bandwidth: 1200 cents.
95*ec779b8eSAndroid Build Coastguard Worker     // It also disables the filter. Does not clear the delay lines.
96*ec779b8eSAndroid Build Coastguard Worker     void reset();
97*ec779b8eSAndroid Build Coastguard Worker 
98*ec779b8eSAndroid Build Coastguard Worker     // Clears delay lines. Does not alter parameter values.
99*ec779b8eSAndroid Build Coastguard Worker     void clear();
100*ec779b8eSAndroid Build Coastguard Worker 
101*ec779b8eSAndroid Build Coastguard Worker     // Frees the object. Will free the memory if the object owned it, i.e. if
102*ec779b8eSAndroid Build Coastguard Worker     // a NULL pointer was passed to CreateInstance as pMem.
103*ec779b8eSAndroid Build Coastguard Worker     void free();
104*ec779b8eSAndroid Build Coastguard Worker 
105*ec779b8eSAndroid Build Coastguard Worker     // Sets gain value. Actual change will only take place upon commit().
106*ec779b8eSAndroid Build Coastguard Worker     // This value will be remembered even if the filter is in disabled() state.
107*ec779b8eSAndroid Build Coastguard Worker     // band     The band to set the gain for.
108*ec779b8eSAndroid Build Coastguard Worker     // millibel Gain value in millibel (1/100 of decibel).
109*ec779b8eSAndroid Build Coastguard Worker     void setGain(int band, int32_t millibel);
110*ec779b8eSAndroid Build Coastguard Worker 
111*ec779b8eSAndroid Build Coastguard Worker     // Gets gain of a certain band. This is always the last value set (or
112*ec779b8eSAndroid Build Coastguard Worker     // default value after reset).
113*ec779b8eSAndroid Build Coastguard Worker     // band     The band to get the gain for.
114*ec779b8eSAndroid Build Coastguard Worker     // returns  Gain value in millibel (1/100 of decibel).
115*ec779b8eSAndroid Build Coastguard Worker     int32_t getGain(int band) const;
116*ec779b8eSAndroid Build Coastguard Worker 
117*ec779b8eSAndroid Build Coastguard Worker     // Sets cutoff frequency value. Actual change will only take place upon
118*ec779b8eSAndroid Build Coastguard Worker     // commit().
119*ec779b8eSAndroid Build Coastguard Worker     // This value will be remembered even if the filter is in disabled() state.
120*ec779b8eSAndroid Build Coastguard Worker     // band       The band to set the frequency for.
121*ec779b8eSAndroid Build Coastguard Worker     // millihertz Frequency value in mHz.
122*ec779b8eSAndroid Build Coastguard Worker     void setFrequency(int band, uint32_t millihertz);
123*ec779b8eSAndroid Build Coastguard Worker 
124*ec779b8eSAndroid Build Coastguard Worker     // Gets frequency of a certain band. This is always the last value set (or
125*ec779b8eSAndroid Build Coastguard Worker     // default value after reset).
126*ec779b8eSAndroid Build Coastguard Worker     // band     The band to get the frequency for.
127*ec779b8eSAndroid Build Coastguard Worker     // returns  Frequency value in mHz.
128*ec779b8eSAndroid Build Coastguard Worker     uint32_t getFrequency(int band) const;
129*ec779b8eSAndroid Build Coastguard Worker 
130*ec779b8eSAndroid Build Coastguard Worker     // Sets bandwidth value. Actual change will only take place upon commit().
131*ec779b8eSAndroid Build Coastguard Worker     // This value will be remembered even if the filter is in disabled() state.
132*ec779b8eSAndroid Build Coastguard Worker     // If called on the first or last band, this call is ignored.
133*ec779b8eSAndroid Build Coastguard Worker     // band  The band to set the frequency for.
134*ec779b8eSAndroid Build Coastguard Worker     // cents Bandwidth value in cents (1/1200 octave).
135*ec779b8eSAndroid Build Coastguard Worker     void setBandwidth(int band, uint32_t cents);
136*ec779b8eSAndroid Build Coastguard Worker 
137*ec779b8eSAndroid Build Coastguard Worker     // Gets bandwidth of a certain band. This is always the last value set (or
138*ec779b8eSAndroid Build Coastguard Worker     // default value after reset). For the first and last bands, 0 is always
139*ec779b8eSAndroid Build Coastguard Worker     // returned.
140*ec779b8eSAndroid Build Coastguard Worker     // band     The band to get the bandwidth for.
141*ec779b8eSAndroid Build Coastguard Worker     // returns  Bandwidth value in cents (1/1200 octave).
142*ec779b8eSAndroid Build Coastguard Worker     uint32_t getBandwidth(int band) const;
143*ec779b8eSAndroid Build Coastguard Worker 
144*ec779b8eSAndroid Build Coastguard Worker     // Gets lower and upper boundaries of a band.
145*ec779b8eSAndroid Build Coastguard Worker     // For the low shelf, the low bound is 0 and the high bound is the band
146*ec779b8eSAndroid Build Coastguard Worker     // frequency.
147*ec779b8eSAndroid Build Coastguard Worker     // For the high shelf, the low bound is the band frequency and the high
148*ec779b8eSAndroid Build Coastguard Worker     // bound is Nyquist.
149*ec779b8eSAndroid Build Coastguard Worker     // For the peaking filters, they are the gain[dB]/2 points.
150*ec779b8eSAndroid Build Coastguard Worker     void getBandRange(int band, uint32_t & low, uint32_t & high) const;
151*ec779b8eSAndroid Build Coastguard Worker 
152*ec779b8eSAndroid Build Coastguard Worker     // Gets a human-readable name for a preset ID. Will return "Custom" if
153*ec779b8eSAndroid Build Coastguard Worker     // PRESET_CUSTOM is passed.
154*ec779b8eSAndroid Build Coastguard Worker     // preset       The preset ID. Must be less than number of presets.
155*ec779b8eSAndroid Build Coastguard Worker     const char * getPresetName(int preset) const;
156*ec779b8eSAndroid Build Coastguard Worker 
157*ec779b8eSAndroid Build Coastguard Worker     // Gets the number of presets.
158*ec779b8eSAndroid Build Coastguard Worker     int getNumPresets() const;
159*ec779b8eSAndroid Build Coastguard Worker 
160*ec779b8eSAndroid Build Coastguard Worker     // Gets the currently set preset ID.
161*ec779b8eSAndroid Build Coastguard Worker     // Will return PRESET_CUSTOM in case the EQ parameters have been modified
162*ec779b8eSAndroid Build Coastguard Worker     // manually since a preset was set.
163*ec779b8eSAndroid Build Coastguard Worker     int getPreset() const;
164*ec779b8eSAndroid Build Coastguard Worker 
165*ec779b8eSAndroid Build Coastguard Worker     // Sets the current preset by ID.
166*ec779b8eSAndroid Build Coastguard Worker     // All the band parameters will be overridden.
167*ec779b8eSAndroid Build Coastguard Worker     // Change will not be applied until commit() is called.
168*ec779b8eSAndroid Build Coastguard Worker     // preset       The preset ID. Must be less than number of presets.
169*ec779b8eSAndroid Build Coastguard Worker     //              PRESET_CUSTOM is NOT a valid value here.
170*ec779b8eSAndroid Build Coastguard Worker     void setPreset(int preset);
171*ec779b8eSAndroid Build Coastguard Worker 
172*ec779b8eSAndroid Build Coastguard Worker     // Applies all parameter changes done to this point in time.
173*ec779b8eSAndroid Build Coastguard Worker     // If the filter is disabled, the new parameters will take place when it is
174*ec779b8eSAndroid Build Coastguard Worker     // enabled again. Does not introduce artifacts, unless immediate is set.
175*ec779b8eSAndroid Build Coastguard Worker     // immediate    Whether to apply change abruptly (ignored if filter is
176*ec779b8eSAndroid Build Coastguard Worker     // disabled).
177*ec779b8eSAndroid Build Coastguard Worker    void commit(bool immediate = false);
178*ec779b8eSAndroid Build Coastguard Worker 
179*ec779b8eSAndroid Build Coastguard Worker     // Process a buffer of input data. The input and output should contain
180*ec779b8eSAndroid Build Coastguard Worker     // frameCount * nChannels interlaced samples. Processing can be done
181*ec779b8eSAndroid Build Coastguard Worker     // in-place, by passing the same buffer as both arguments.
182*ec779b8eSAndroid Build Coastguard Worker     // pIn          Input buffer.
183*ec779b8eSAndroid Build Coastguard Worker     // pOut         Output buffer.
184*ec779b8eSAndroid Build Coastguard Worker     // frameCount   Number of frames to produce on each call to process().
185*ec779b8eSAndroid Build Coastguard Worker     void process(const audio_sample_t * pIn, audio_sample_t * pOut,
186*ec779b8eSAndroid Build Coastguard Worker                  int frameCount);
187*ec779b8eSAndroid Build Coastguard Worker 
188*ec779b8eSAndroid Build Coastguard Worker     // Enables the filter, so it would start processing input. Does not
189*ec779b8eSAndroid Build Coastguard Worker     // introduce artifacts, unless immediate is set.
190*ec779b8eSAndroid Build Coastguard Worker     // immediate    Whether to apply change abruptly.
191*ec779b8eSAndroid Build Coastguard Worker     void enable(bool immediate = false);
192*ec779b8eSAndroid Build Coastguard Worker 
193*ec779b8eSAndroid Build Coastguard Worker     // Disabled (bypasses) the filter. Does not introduce artifacts, unless
194*ec779b8eSAndroid Build Coastguard Worker     // immediate is set.
195*ec779b8eSAndroid Build Coastguard Worker     // immediate    Whether to apply change abruptly.
196*ec779b8eSAndroid Build Coastguard Worker     void disable(bool immediate = false);
197*ec779b8eSAndroid Build Coastguard Worker 
198*ec779b8eSAndroid Build Coastguard Worker     // Returns the band with the maximum influence on a given frequency.
199*ec779b8eSAndroid Build Coastguard Worker     // Result is unaffected by whether EQ is enabled or not, or by whether
200*ec779b8eSAndroid Build Coastguard Worker     // changes have been committed or not.
201*ec779b8eSAndroid Build Coastguard Worker     // targetFreq   The target frequency, in millihertz.
202*ec779b8eSAndroid Build Coastguard Worker     int getMostRelevantBand(uint32_t targetFreq) const;
203*ec779b8eSAndroid Build Coastguard Worker 
204*ec779b8eSAndroid Build Coastguard Worker private:
205*ec779b8eSAndroid Build Coastguard Worker     // Bottom frequency, in mHz.
206*ec779b8eSAndroid Build Coastguard Worker     static const int kMinFreq = 20000;
207*ec779b8eSAndroid Build Coastguard Worker     // Sample rate, in Hz.
208*ec779b8eSAndroid Build Coastguard Worker     int mSampleRate;
209*ec779b8eSAndroid Build Coastguard Worker     // Number of peaking filters. Total number of bands is +2.
210*ec779b8eSAndroid Build Coastguard Worker     int mNumPeaking;
211*ec779b8eSAndroid Build Coastguard Worker     // Preset configurations.
212*ec779b8eSAndroid Build Coastguard Worker     const PresetConfig * mpPresets;
213*ec779b8eSAndroid Build Coastguard Worker     // Number of elements in mpPresets;
214*ec779b8eSAndroid Build Coastguard Worker     int mNumPresets;
215*ec779b8eSAndroid Build Coastguard Worker     // Current preset.
216*ec779b8eSAndroid Build Coastguard Worker     int mCurPreset;
217*ec779b8eSAndroid Build Coastguard Worker 
218*ec779b8eSAndroid Build Coastguard Worker     // Memory space to free when instance is deleted, or NULL if no memory is
219*ec779b8eSAndroid Build Coastguard Worker     // owned.
220*ec779b8eSAndroid Build Coastguard Worker     void * mpMem;
221*ec779b8eSAndroid Build Coastguard Worker     // The low-shelving filter.
222*ec779b8eSAndroid Build Coastguard Worker     AudioShelvingFilter * mpLowShelf;
223*ec779b8eSAndroid Build Coastguard Worker     // The high-shelving filter.
224*ec779b8eSAndroid Build Coastguard Worker     AudioShelvingFilter * mpHighShelf;
225*ec779b8eSAndroid Build Coastguard Worker     // An array of size mNumPeaking of peaking filters.
226*ec779b8eSAndroid Build Coastguard Worker     AudioPeakingFilter * mpPeakingFilters;
227*ec779b8eSAndroid Build Coastguard Worker 
228*ec779b8eSAndroid Build Coastguard Worker     // Constructor. Resets the filter (see reset()). Must call init() doing
229*ec779b8eSAndroid Build Coastguard Worker     // anything else.
230*ec779b8eSAndroid Build Coastguard Worker     // pMem       Memory buffer for bands.
231*ec779b8eSAndroid Build Coastguard Worker     // nChannels  Number of input/output channels (interlaced).
232*ec779b8eSAndroid Build Coastguard Worker     // sampleRate The input/output sample rate, in Hz.
233*ec779b8eSAndroid Build Coastguard Worker     // ownMem     Whether pMem is owned by me.
234*ec779b8eSAndroid Build Coastguard Worker     // presets      The presets configuration. May be NULL, but in that case the
235*ec779b8eSAndroid Build Coastguard Worker     //              client is required not to call preset-related functions.
236*ec779b8eSAndroid Build Coastguard Worker     //              This array is owned by the client and is not copied. It
237*ec779b8eSAndroid Build Coastguard Worker     //              must be kept valid by the client as long as the instance is
238*ec779b8eSAndroid Build Coastguard Worker     //              alive.
239*ec779b8eSAndroid Build Coastguard Worker     // nPresets     Number of elements in the presets array.
240*ec779b8eSAndroid Build Coastguard Worker     AudioEqualizer(void * pMem, int nBands, int nChannels, int sampleRate,
241*ec779b8eSAndroid Build Coastguard Worker                    bool ownMem, const PresetConfig * presets, int nPresets);
242*ec779b8eSAndroid Build Coastguard Worker };
243*ec779b8eSAndroid Build Coastguard Worker 
244*ec779b8eSAndroid Build Coastguard Worker }
245*ec779b8eSAndroid Build Coastguard Worker 
246*ec779b8eSAndroid Build Coastguard Worker #endif // AUDIOEQUALIZER_H_
247