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