EffectBundle.h revision 1b6c677c4bad5c1aea4f01277cf5aa234ad4cab4
12c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*
22c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2010 The Android Open Source Project
32c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
42c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
52c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * you may not use this file except in compliance with the License.
62c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * You may obtain a copy of the License at
72c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
82c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
92c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Unless required by applicable law or agreed to in writing, software
112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * See the License for the specific language governing permissions and
142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * limitations under the License.
152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */
162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifndef ANDROID_EFFECTBUNDLE_H_
182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define ANDROID_EFFECTBUNDLE_H_
192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
206d8b694d999e9be7d5dcc336535832a80fb6f61fEric Laurent#include <audio_effects/effect_bassboost.h>
216d8b694d999e9be7d5dcc336535832a80fb6f61fEric Laurent#include <audio_effects/effect_equalizer.h>
226d8b694d999e9be7d5dcc336535832a80fb6f61fEric Laurent#include <audio_effects/effect_virtualizer.h>
232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include <LVM.h>
24e0aed6ddcb4e3c301b80aa26706b6052dab42c41Eric Laurent#include <limits.h>
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#if __cplusplus
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentextern "C" {
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
30d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent#define FIVEBAND_NUMBANDS          5
31d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent#define MAX_NUM_BANDS              5
32d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent#define MAX_CALL_SIZE              256
33d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent#define LVM_MAX_SESSIONS           32
34e0aed6ddcb4e3c301b80aa26706b6052dab42c41Eric Laurent#define LVM_UNUSED_SESSION         INT_MAX
35d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent#define BASS_BOOST_CUP_LOAD_ARM9E  150    // Expressed in 0.1 MIPS
36d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent#define VIRTUALIZER_CUP_LOAD_ARM9E 120    // Expressed in 0.1 MIPS
37d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent#define EQUALIZER_CUP_LOAD_ARM9E   220    // Expressed in 0.1 MIPS
38d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent#define VOLUME_CUP_LOAD_ARM9E      0      // Expressed in 0.1 MIPS
39d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent#define BUNDLE_MEM_USAGE           25     // Expressed in kB
40163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent//#define LVM_PCM
411b6c677c4bad5c1aea4f01277cf5aa234ad4cab4Eric Laurent#define MAX_BAND_GAIN_DB           4
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4323e1de74359f4bb1763aef0adfebe073122b032cEric Laurent#ifndef OPENSL_ES_H_
44163fbcf84010b98e0374110454d85b804bc8d13bEric Laurentstatic const effect_uuid_t SL_IID_VOLUME_ = { 0x09e8ede0, 0xddde, 0x11db, 0xb4f6,
45163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                            { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } };
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentconst effect_uuid_t * const SL_IID_VOLUME = &SL_IID_VOLUME_;
4723e1de74359f4bb1763aef0adfebe073122b032cEric Laurent#endif //OPENSL_ES_H_
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurenttypedef enum
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_BASS_BOOST,
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_VIRTUALIZER,
53163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    LVM_EQUALIZER,
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_VOLUME
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} lvm_effect_en;
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Preset configuration.
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentstruct PresetConfig {
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    // Human-readable name.
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    const char * name;
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    // An array of size nBands where each element is a configuration for the
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    // corresponding band.
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    //const BandConfig * bandConfigs;
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent};
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* BundledEffectContext : One per session */
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentstruct BundledEffectContext{
68163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    LVM_Handle_t                    hInstance;                /* Instance handle */
69163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    int                             SessionNo;                /* Current session number */
70c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    int                             SessionId;                /* Current session id */
71163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    bool                            bVolumeEnabled;           /* Flag for Volume */
72163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    bool                            bEqualizerEnabled;        /* Flag for EQ */
73163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    bool                            bBassEnabled;             /* Flag for Bass */
74163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    bool                            bBassTempDisabled;        /* Flag for Bass to be re-enabled */
75163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    bool                            bVirtualizerEnabled;      /* Flag for Virtualizer */
76163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    bool                            bVirtualizerTempDisabled; /* Flag for effect to be re-enabled */
77163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    int                             NumberEffectsEnabled;     /* Effects in this session */
78163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    int                             NumberEffectsCalled;      /* Effects called so far */
79d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent    bool                            firstVolume;              /* No smoothing on first Vol change */
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    // Saved parameters for each effect */
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    // Bass Boost
82163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    int                             BassStrengthSaved;        /* Conversion between Get/Set */
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    // Equalizer
84163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    int                             CurPreset;                /* Current preset being used */
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    // Virtualzer
86163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    int                             VirtStrengthSaved;        /* Conversion between Get/Set */
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    // Volume
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int                             levelSaved;     /* for when mute is set, level must be saved */
89163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    int                             positionSaved;
90163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    bool                            bMuteEnabled;   /* Must store as mute = -96dB level */
91163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    bool                            bStereoPositionEnabled;
92163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    LVM_Fs_en                       SampleRate;
93c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    int                             SamplesPerSecond;
94c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    int                             SamplesToExitCountEq;
95c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    int                             SamplesToExitCountBb;
96c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    int                             SamplesToExitCountVirt;
97dac69110ed1073bf0a9827a3f78698896dd05d97Eric Laurent    LVM_INT16                       *workBuffer;
98dac69110ed1073bf0a9827a3f78698896dd05d97Eric Laurent    int                             frameCount;
991b6c677c4bad5c1aea4f01277cf5aa234ad4cab4Eric Laurent    int32_t                         bandGaindB[FIVEBAND_NUMBANDS];
100163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    #ifdef LVM_PCM
101163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    FILE                            *PcmInPtr;
102163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    FILE                            *PcmOutPtr;
103163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    #endif
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent};
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* SessionContext : One session */
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentstruct SessionContext{
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    bool                            bBundledEffectsEnabled;
109163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    bool                            bVolumeInstantiated;
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    bool                            bEqualizerInstantiated;
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    bool                            bBassInstantiated;
112163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    bool                            bVirtualizerInstantiated;
113163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    BundledEffectContext            *pBundledContext;
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent};
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentstruct EffectContext{
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    const struct effect_interface_s *itfe;
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    effect_config_t                 config;
1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    lvm_effect_en                   EffectType;
120163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent    BundledEffectContext            *pBundledContext;
1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent};
1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* enumerated parameter settings for Volume effect */
1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurenttypedef enum
1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    VOLUME_PARAM_LEVEL,                       // type SLmillibel = typedef SLuint16 (set & get)
1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    VOLUME_PARAM_MAXLEVEL,                    // type SLmillibel = typedef SLuint16 (get)
1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    VOLUME_PARAM_MUTE,                        // type SLboolean  = typedef SLuint32 (set & get)
1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    VOLUME_PARAM_ENABLESTEREOPOSITION,        // type SLboolean  = typedef SLuint32 (set & get)
1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    VOLUME_PARAM_STEREOPOSITION,              // type SLpermille = typedef SLuint16 (set & get)
1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} t_volume_params;
1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentstatic const int PRESET_CUSTOM = -1;
1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentstatic const uint32_t bandFreqRange[FIVEBAND_NUMBANDS][2] = {
137163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       {30000, 120000},
138163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       {120001, 460000},
139163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       {460001, 1800000},
140163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       {1800001, 7000000},
141163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       {7000001, 1}};
1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentstatic const LVM_UINT16  EQNB_5BandPresetsFrequencies[] = {
144163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       60,           /* Frequencies in Hz */
145163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       230,
146163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       910,
147163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       3600,
148163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       14000};
1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentstatic const LVM_UINT16 EQNB_5BandPresetsQFactors[] = {
151163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       96,               /* Q factor multiplied by 100 */
152163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       96,
153163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       96,
154163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       96,
155163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       96};
1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentstatic const LVM_INT16 EQNB_5BandNormalPresets[] = {
158163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       3, 0, 0, 0, 3,       /* Normal Preset */
1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       8, 5, -3, 5, 6,      /* Classical Preset */
1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       15, -6, 7, 13, 10,   /* Dance Preset */
1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       0, 0, 0, 0, 0,       /* Flat Preset */
1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       6, -2, -2, 6, -3,    /* Folk Preset */
1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       8, -8, 13, -1, -4,   /* Heavy Metal Preset */
1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       10, 6, -4, 5, 8,     /* Hip Hop Preset */
1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       8, 5, -4, 5, 9,      /* Jazz Preset */
1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      -6, 4, 9, 4, -5,      /* Pop Preset */
1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       10, 6, -1, 8, 10};   /* Rock Preset */
1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
169163fbcf84010b98e0374110454d85b804bc8d13bEric Laurentstatic const LVM_INT16 EQNB_5BandSoftPresets[] = {
170163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        3, 0, 0, 0, 3,      /* Normal Preset */
171163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        5, 3, -2, 4, 4,     /* Classical Preset */
172163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        6, 0, 2, 4, 1,      /* Dance Preset */
173163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        0, 0, 0, 0, 0,      /* Flat Preset */
174163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        3, 0, 0, 2, -1,     /* Folk Preset */
175163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        4, 1, 9, 3, 0,      /* Heavy Metal Preset */
176163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        5, 3, 0, 1, 3,      /* Hip Hop Preset */
177163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        4, 2, -2, 2, 5,     /* Jazz Preset */
178163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                       -1, 2, 5, 1, -2,     /* Pop Preset */
179163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        5, 3, -1, 3, 5};    /* Rock Preset */
180163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent
1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentstatic const PresetConfig gEqualizerPresets[] = {
182163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        {"Normal"},
183163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        {"Classical"},
184163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        {"Dance"},
185163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        {"Flat"},
186163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        {"Folk"},
187163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        {"Heavy Metal"},
188163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        {"Hip Hop"},
189163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        {"Jazz"},
190163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        {"Pop"},
191163fbcf84010b98e0374110454d85b804bc8d13bEric Laurent                                        {"Rock"}};
1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#if __cplusplus
1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}  // extern "C"
1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif
1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif /*ANDROID_EFFECTBUNDLE_H_*/
199