Eric Laurent | 135ad07 | 2010-05-21 06:05:13 -0700 | [diff] [blame^] | 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_ |