Home | History | Annotate | Download | only in Bundle
      1 /*
      2  * Copyright (C) 2010 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 ANDROID_EFFECTBUNDLE_H_
     18 #define ANDROID_EFFECTBUNDLE_H_
     19 
     20 #include <audio_effects/effect_bassboost.h>
     21 #include <audio_effects/effect_equalizer.h>
     22 #include <audio_effects/effect_virtualizer.h>
     23 #include <LVM.h>
     24 #include <limits.h>
     25 
     26 #if __cplusplus
     27 extern "C" {
     28 #endif
     29 
     30 #define FIVEBAND_NUMBANDS          5
     31 #define MAX_NUM_BANDS              5
     32 #define MAX_CALL_SIZE              256
     33 #define LVM_MAX_SESSIONS           32
     34 #define LVM_UNUSED_SESSION         INT_MAX
     35 #define BASS_BOOST_CUP_LOAD_ARM9E  150    // Expressed in 0.1 MIPS
     36 #define VIRTUALIZER_CUP_LOAD_ARM9E 120    // Expressed in 0.1 MIPS
     37 #define EQUALIZER_CUP_LOAD_ARM9E   220    // Expressed in 0.1 MIPS
     38 #define VOLUME_CUP_LOAD_ARM9E      0      // Expressed in 0.1 MIPS
     39 #define BUNDLE_MEM_USAGE           25     // Expressed in kB
     40 //#define LVM_PCM
     41 
     42 #ifndef OPENSL_ES_H_
     43 static const effect_uuid_t SL_IID_VOLUME_ = { 0x09e8ede0, 0xddde, 0x11db, 0xb4f6,
     44                                             { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } };
     45 const effect_uuid_t * const SL_IID_VOLUME = &SL_IID_VOLUME_;
     46 #endif //OPENSL_ES_H_
     47 
     48 typedef enum
     49 {
     50     LVM_BASS_BOOST,
     51     LVM_VIRTUALIZER,
     52     LVM_EQUALIZER,
     53     LVM_VOLUME
     54 } lvm_effect_en;
     55 
     56 // Preset configuration.
     57 struct PresetConfig {
     58     // Human-readable name.
     59     const char * name;
     60     // An array of size nBands where each element is a configuration for the
     61     // corresponding band.
     62     //const BandConfig * bandConfigs;
     63 };
     64 
     65 /* BundledEffectContext : One per session */
     66 struct BundledEffectContext{
     67     LVM_Handle_t                    hInstance;                /* Instance handle */
     68     int                             SessionNo;                /* Current session number */
     69     int                             SessionId;                /* Current session id */
     70     bool                            bVolumeEnabled;           /* Flag for Volume */
     71     bool                            bEqualizerEnabled;        /* Flag for EQ */
     72     bool                            bBassEnabled;             /* Flag for Bass */
     73     bool                            bBassTempDisabled;        /* Flag for Bass to be re-enabled */
     74     bool                            bVirtualizerEnabled;      /* Flag for Virtualizer */
     75     bool                            bVirtualizerTempDisabled; /* Flag for effect to be re-enabled */
     76     audio_devices_t                 nOutputDevice;            /* Output device for the effect */
     77     audio_devices_t                 nVirtualizerForcedDevice; /* Forced device virtualization mode*/
     78     int                             NumberEffectsEnabled;     /* Effects in this session */
     79     int                             NumberEffectsCalled;      /* Effects called so far */
     80     bool                            firstVolume;              /* No smoothing on first Vol change */
     81     // Saved parameters for each effect */
     82     // Bass Boost
     83     int                             BassStrengthSaved;        /* Conversion between Get/Set */
     84     // Equalizer
     85     int                             CurPreset;                /* Current preset being used */
     86     // Virtualzer
     87     int                             VirtStrengthSaved;        /* Conversion between Get/Set */
     88     // Volume
     89     int                             levelSaved;     /* for when mute is set, level must be saved */
     90     int                             positionSaved;
     91     bool                            bMuteEnabled;   /* Must store as mute = -96dB level */
     92     bool                            bStereoPositionEnabled;
     93     LVM_Fs_en                       SampleRate;
     94     int                             SamplesPerSecond;
     95     int                             SamplesToExitCountEq;
     96     int                             SamplesToExitCountBb;
     97     int                             SamplesToExitCountVirt;
     98     effect_buffer_t                 *workBuffer;
     99     int                             frameCount;
    100     int32_t                         bandGaindB[FIVEBAND_NUMBANDS];
    101     int                             volume;
    102     #ifdef LVM_PCM
    103     FILE                            *PcmInPtr;
    104     FILE                            *PcmOutPtr;
    105     #endif
    106 #if defined(BUILD_FLOAT) && !defined(NATIVE_FLOAT_BUFFER)
    107     LVM_FLOAT                       *pInputBuffer;
    108     LVM_FLOAT                       *pOutputBuffer;
    109 #endif
    110 };
    111 
    112 /* SessionContext : One session */
    113 struct SessionContext{
    114     bool                            bBundledEffectsEnabled;
    115     bool                            bVolumeInstantiated;
    116     bool                            bEqualizerInstantiated;
    117     bool                            bBassInstantiated;
    118     bool                            bVirtualizerInstantiated;
    119     BundledEffectContext            *pBundledContext;
    120 };
    121 
    122 struct EffectContext{
    123     const struct effect_interface_s *itfe;
    124     effect_config_t                 config;
    125     lvm_effect_en                   EffectType;
    126     BundledEffectContext            *pBundledContext;
    127 };
    128 
    129 
    130 /* enumerated parameter settings for Volume effect */
    131 typedef enum
    132 {
    133     VOLUME_PARAM_LEVEL,                       // type SLmillibel = typedef SLuint16 (set & get)
    134     VOLUME_PARAM_MAXLEVEL,                    // type SLmillibel = typedef SLuint16 (get)
    135     VOLUME_PARAM_MUTE,                        // type SLboolean  = typedef SLuint32 (set & get)
    136     VOLUME_PARAM_ENABLESTEREOPOSITION,        // type SLboolean  = typedef SLuint32 (set & get)
    137     VOLUME_PARAM_STEREOPOSITION,              // type SLpermille = typedef SLuint16 (set & get)
    138 } t_volume_params;
    139 
    140 static const int PRESET_CUSTOM = -1;
    141 
    142 static const uint32_t bandFreqRange[FIVEBAND_NUMBANDS][2] = {
    143                                        {30000, 120000},
    144                                        {120001, 460000},
    145                                        {460001, 1800000},
    146                                        {1800001, 7000000},
    147                                        {7000001, 20000000}};
    148 
    149 //Note: If these frequencies change, please update LimitLevel values accordingly.
    150 static const LVM_UINT16  EQNB_5BandPresetsFrequencies[] = {
    151                                        60,           /* Frequencies in Hz */
    152                                        230,
    153                                        910,
    154                                        3600,
    155                                        14000};
    156 
    157 static const LVM_UINT16 EQNB_5BandPresetsQFactors[] = {
    158                                        96,               /* Q factor multiplied by 100 */
    159                                        96,
    160                                        96,
    161                                        96,
    162                                        96};
    163 
    164 static const LVM_INT16 EQNB_5BandNormalPresets[] = {
    165                                        3, 0, 0, 0, 3,       /* Normal Preset */
    166                                        8, 5, -3, 5, 6,      /* Classical Preset */
    167                                        15, -6, 7, 13, 10,   /* Dance Preset */
    168                                        0, 0, 0, 0, 0,       /* Flat Preset */
    169                                        6, -2, -2, 6, -3,    /* Folk Preset */
    170                                        8, -8, 13, -1, -4,   /* Heavy Metal Preset */
    171                                        10, 6, -4, 5, 8,     /* Hip Hop Preset */
    172                                        8, 5, -4, 5, 9,      /* Jazz Preset */
    173                                       -6, 4, 9, 4, -5,      /* Pop Preset */
    174                                        10, 6, -1, 8, 10};   /* Rock Preset */
    175 
    176 static const LVM_INT16 EQNB_5BandSoftPresets[] = {
    177                                         3, 0, 0, 0, 3,      /* Normal Preset */
    178                                         5, 3, -2, 4, 4,     /* Classical Preset */
    179                                         6, 0, 2, 4, 1,      /* Dance Preset */
    180                                         0, 0, 0, 0, 0,      /* Flat Preset */
    181                                         3, 0, 0, 2, -1,     /* Folk Preset */
    182                                         4, 1, 9, 3, 0,      /* Heavy Metal Preset */
    183                                         5, 3, 0, 1, 3,      /* Hip Hop Preset */
    184                                         4, 2, -2, 2, 5,     /* Jazz Preset */
    185                                        -1, 2, 5, 1, -2,     /* Pop Preset */
    186                                         5, 3, -1, 3, 5};    /* Rock Preset */
    187 
    188 static const PresetConfig gEqualizerPresets[] = {
    189                                         {"Normal"},
    190                                         {"Classical"},
    191                                         {"Dance"},
    192                                         {"Flat"},
    193                                         {"Folk"},
    194                                         {"Heavy Metal"},
    195                                         {"Hip Hop"},
    196                                         {"Jazz"},
    197                                         {"Pop"},
    198                                         {"Rock"}};
    199 
    200 /* The following tables have been computed using the actual levels measured by the output of
    201  * white noise or pink noise (IEC268-1) for the EQ and BassBoost Effects. These are estimates of
    202  * the actual energy that 'could' be present in the given band.
    203  * If the frequency values in EQNB_5BandPresetsFrequencies change, these values might need to be
    204  * updated.
    205  */
    206 
    207 static const float LimitLevel_bandEnergyCoefficient[FIVEBAND_NUMBANDS] = {
    208         7.56, 9.69, 9.59, 7.37, 2.88};
    209 
    210 static const float LimitLevel_bandEnergyCrossCoefficient[FIVEBAND_NUMBANDS-1] = {
    211         126.0, 115.0, 125.0, 104.0 };
    212 
    213 static const float LimitLevel_bassBoostEnergyCrossCoefficient[FIVEBAND_NUMBANDS] = {
    214         221.21, 208.10, 28.16, 0.0, 0.0 };
    215 
    216 static const float LimitLevel_bassBoostEnergyCoefficient = 9.00;
    217 
    218 static const float LimitLevel_virtualizerContribution = 1.9;
    219 
    220 #if __cplusplus
    221 }  // extern "C"
    222 #endif
    223 
    224 
    225 #endif /*ANDROID_EFFECTBUNDLE_H_*/
    226