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