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