Home | History | Annotate | Download | only in Bundle
      1 /*
      2  * Copyright (C) 2010-2010 NXP Software
      3  * Copyright (C) 2009 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 #define LOG_TAG "Bundle"
     19 #define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
     20 //#define LOG_NDEBUG 0
     21 
     22 #include <assert.h>
     23 #include <inttypes.h>
     24 #include <new>
     25 #include <stdlib.h>
     26 #include <string.h>
     27 
     28 #include <cutils/log.h>
     29 #include "EffectBundle.h"
     30 #include "math.h"
     31 
     32 
     33 // effect_handle_t interface implementation for bass boost
     34 extern "C" const struct effect_interface_s gLvmEffectInterface;
     35 
     36 #define LVM_ERROR_CHECK(LvmStatus, callingFunc, calledFunc){\
     37         if (LvmStatus == LVM_NULLADDRESS){\
     38             ALOGV("\tLVM_ERROR : Parameter error - "\
     39                     "null pointer returned by %s in %s\n\n\n\n", callingFunc, calledFunc);\
     40         }\
     41         if (LvmStatus == LVM_ALIGNMENTERROR){\
     42             ALOGV("\tLVM_ERROR : Parameter error - "\
     43                     "bad alignment returned by %s in %s\n\n\n\n", callingFunc, calledFunc);\
     44         }\
     45         if (LvmStatus == LVM_INVALIDNUMSAMPLES){\
     46             ALOGV("\tLVM_ERROR : Parameter error - "\
     47                     "bad number of samples returned by %s in %s\n\n\n\n", callingFunc, calledFunc);\
     48         }\
     49         if (LvmStatus == LVM_OUTOFRANGE){\
     50             ALOGV("\tLVM_ERROR : Parameter error - "\
     51                     "out of range returned by %s in %s\n", callingFunc, calledFunc);\
     52         }\
     53     }
     54 
     55 
     56 static inline int16_t clamp16(int32_t sample)
     57 {
     58     // check overflow for both positive and negative values:
     59     // all bits above short range must me equal to sign bit
     60     if ((sample>>15) ^ (sample>>31))
     61         sample = 0x7FFF ^ (sample>>31);
     62     return sample;
     63 }
     64 
     65 // Namespaces
     66 namespace android {
     67 namespace {
     68 
     69 // Flag to allow a one time init of global memory, only happens on first call ever
     70 int LvmInitFlag = LVM_FALSE;
     71 SessionContext GlobalSessionMemory[LVM_MAX_SESSIONS];
     72 int SessionIndex[LVM_MAX_SESSIONS];
     73 
     74 /* local functions */
     75 #define CHECK_ARG(cond) {                     \
     76     if (!(cond)) {                            \
     77         ALOGV("\tLVM_ERROR : Invalid argument: "#cond);      \
     78         return -EINVAL;                       \
     79     }                                         \
     80 }
     81 
     82 
     83 // NXP SW BassBoost UUID
     84 const effect_descriptor_t gBassBoostDescriptor = {
     85         {0x0634f220, 0xddd4, 0x11db, 0xa0fc, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b }},
     86         {0x8631f300, 0x72e2, 0x11df, 0xb57e, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // uuid
     87         EFFECT_CONTROL_API_VERSION,
     88         (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_FIRST | EFFECT_FLAG_DEVICE_IND
     89         | EFFECT_FLAG_VOLUME_CTRL),
     90         BASS_BOOST_CUP_LOAD_ARM9E,
     91         BUNDLE_MEM_USAGE,
     92         "Dynamic Bass Boost",
     93         "NXP Software Ltd.",
     94 };
     95 
     96 // NXP SW Virtualizer UUID
     97 const effect_descriptor_t gVirtualizerDescriptor = {
     98         {0x37cc2c00, 0xdddd, 0x11db, 0x8577, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
     99         {0x1d4033c0, 0x8557, 0x11df, 0x9f2d, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
    100         EFFECT_CONTROL_API_VERSION,
    101         (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_LAST | EFFECT_FLAG_DEVICE_IND
    102         | EFFECT_FLAG_VOLUME_CTRL),
    103         VIRTUALIZER_CUP_LOAD_ARM9E,
    104         BUNDLE_MEM_USAGE,
    105         "Virtualizer",
    106         "NXP Software Ltd.",
    107 };
    108 
    109 // NXP SW Equalizer UUID
    110 const effect_descriptor_t gEqualizerDescriptor = {
    111         {0x0bed4300, 0xddd6, 0x11db, 0x8f34, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // type
    112         {0xce772f20, 0x847d, 0x11df, 0xbb17, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // uuid Eq NXP
    113         EFFECT_CONTROL_API_VERSION,
    114         (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_FIRST | EFFECT_FLAG_VOLUME_CTRL),
    115         EQUALIZER_CUP_LOAD_ARM9E,
    116         BUNDLE_MEM_USAGE,
    117         "Equalizer",
    118         "NXP Software Ltd.",
    119 };
    120 
    121 // NXP SW Volume UUID
    122 const effect_descriptor_t gVolumeDescriptor = {
    123         {0x09e8ede0, 0xddde, 0x11db, 0xb4f6, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b }},
    124         {0x119341a0, 0x8469, 0x11df, 0x81f9, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b }}, //uuid VOL NXP
    125         EFFECT_CONTROL_API_VERSION,
    126         (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_LAST | EFFECT_FLAG_VOLUME_CTRL),
    127         VOLUME_CUP_LOAD_ARM9E,
    128         BUNDLE_MEM_USAGE,
    129         "Volume",
    130         "NXP Software Ltd.",
    131 };
    132 
    133 //--- local function prototypes
    134 void LvmGlobalBundle_init      (void);
    135 int  LvmBundle_init            (EffectContext *pContext);
    136 int  LvmEffect_enable          (EffectContext *pContext);
    137 int  LvmEffect_disable         (EffectContext *pContext);
    138 void LvmEffect_free            (EffectContext *pContext);
    139 int  Effect_setConfig          (EffectContext *pContext, effect_config_t *pConfig);
    140 void Effect_getConfig          (EffectContext *pContext, effect_config_t *pConfig);
    141 int  BassBoost_setParameter    (EffectContext *pContext, void *pParam, void *pValue);
    142 int  BassBoost_getParameter    (EffectContext *pContext,
    143                                void           *pParam,
    144                                uint32_t       *pValueSize,
    145                                void           *pValue);
    146 int  Virtualizer_setParameter  (EffectContext *pContext, void *pParam, void *pValue);
    147 int  Virtualizer_getParameter  (EffectContext *pContext,
    148                                void           *pParam,
    149                                uint32_t       *pValueSize,
    150                                void           *pValue);
    151 int  Equalizer_setParameter    (EffectContext *pContext, void *pParam, void *pValue);
    152 int  Equalizer_getParameter    (EffectContext *pContext,
    153                                 void          *pParam,
    154                                 uint32_t      *pValueSize,
    155                                 void          *pValue);
    156 int  Volume_setParameter       (EffectContext *pContext, void *pParam, void *pValue);
    157 int  Volume_getParameter       (EffectContext *pContext,
    158                                 void          *pParam,
    159                                 uint32_t      *pValueSize,
    160                                 void          *pValue);
    161 int Effect_setEnabled(EffectContext *pContext, bool enabled);
    162 
    163 /* Effect Library Interface Implementation */
    164 
    165 extern "C" int EffectCreate(const effect_uuid_t *uuid,
    166                             int32_t             sessionId,
    167                             int32_t             ioId __unused,
    168                             effect_handle_t  *pHandle){
    169     int ret = 0;
    170     int sessionNo;
    171     int i;
    172     EffectContext *pContext = NULL;
    173     bool newBundle = false;
    174     SessionContext *pSessionContext;
    175 
    176     ALOGV("\n\tEffectCreate start session %d", sessionId);
    177 
    178     if (pHandle == NULL || uuid == NULL){
    179         ALOGV("\tLVM_ERROR : EffectCreate() called with NULL pointer");
    180         ret = -EINVAL;
    181         goto exit;
    182     }
    183 
    184     if(LvmInitFlag == LVM_FALSE){
    185         LvmInitFlag = LVM_TRUE;
    186         ALOGV("\tEffectCreate - Initializing all global memory");
    187         LvmGlobalBundle_init();
    188     }
    189 
    190     // Find next available sessionNo
    191     for(i=0; i<LVM_MAX_SESSIONS; i++){
    192         if((SessionIndex[i] == LVM_UNUSED_SESSION)||(SessionIndex[i] == sessionId)){
    193             sessionNo       = i;
    194             SessionIndex[i] = sessionId;
    195             ALOGV("\tEffectCreate: Allocating SessionNo %d for SessionId %d\n", sessionNo,sessionId);
    196             break;
    197         }
    198     }
    199 
    200     if(i==LVM_MAX_SESSIONS){
    201         ALOGV("\tLVM_ERROR : Cannot find memory to allocate for current session");
    202         ret = -EINVAL;
    203         goto exit;
    204     }
    205 
    206     pContext = new EffectContext;
    207 
    208     // If this is the first create in this session
    209     if(GlobalSessionMemory[sessionNo].bBundledEffectsEnabled == LVM_FALSE){
    210         ALOGV("\tEffectCreate - This is the first effect in current sessionId %d sessionNo %d",
    211                 sessionId, sessionNo);
    212 
    213         GlobalSessionMemory[sessionNo].bBundledEffectsEnabled = LVM_TRUE;
    214         GlobalSessionMemory[sessionNo].pBundledContext        = new BundledEffectContext;
    215         newBundle = true;
    216 
    217         pContext->pBundledContext = GlobalSessionMemory[sessionNo].pBundledContext;
    218         pContext->pBundledContext->SessionNo                = sessionNo;
    219         pContext->pBundledContext->SessionId                = sessionId;
    220         pContext->pBundledContext->hInstance                = NULL;
    221         pContext->pBundledContext->bVolumeEnabled           = LVM_FALSE;
    222         pContext->pBundledContext->bEqualizerEnabled        = LVM_FALSE;
    223         pContext->pBundledContext->bBassEnabled             = LVM_FALSE;
    224         pContext->pBundledContext->bBassTempDisabled        = LVM_FALSE;
    225         pContext->pBundledContext->bVirtualizerEnabled      = LVM_FALSE;
    226         pContext->pBundledContext->bVirtualizerTempDisabled = LVM_FALSE;
    227         pContext->pBundledContext->nOutputDevice            = AUDIO_DEVICE_NONE;
    228         pContext->pBundledContext->nVirtualizerForcedDevice = AUDIO_DEVICE_NONE;
    229         pContext->pBundledContext->NumberEffectsEnabled     = 0;
    230         pContext->pBundledContext->NumberEffectsCalled      = 0;
    231         pContext->pBundledContext->firstVolume              = LVM_TRUE;
    232         pContext->pBundledContext->volume                   = 0;
    233 
    234         #ifdef LVM_PCM
    235         char fileName[256];
    236         snprintf(fileName, 256, "/data/tmp/bundle_%p_pcm_in.pcm", pContext->pBundledContext);
    237         pContext->pBundledContext->PcmInPtr = fopen(fileName, "w");
    238         if (pContext->pBundledContext->PcmInPtr == NULL) {
    239             ALOGV("cannot open %s", fileName);
    240             ret = -EINVAL;
    241             goto exit;
    242         }
    243 
    244         snprintf(fileName, 256, "/data/tmp/bundle_%p_pcm_out.pcm", pContext->pBundledContext);
    245         pContext->pBundledContext->PcmOutPtr = fopen(fileName, "w");
    246         if (pContext->pBundledContext->PcmOutPtr == NULL) {
    247             ALOGV("cannot open %s", fileName);
    248             fclose(pContext->pBundledContext->PcmInPtr);
    249            pContext->pBundledContext->PcmInPtr = NULL;
    250            ret = -EINVAL;
    251            goto exit;
    252         }
    253         #endif
    254 
    255         /* Saved strength is used to return the exact strength that was used in the set to the get
    256          * because we map the original strength range of 0:1000 to 1:15, and this will avoid
    257          * quantisation like effect when returning
    258          */
    259         pContext->pBundledContext->BassStrengthSaved        = 0;
    260         pContext->pBundledContext->VirtStrengthSaved        = 0;
    261         pContext->pBundledContext->CurPreset                = PRESET_CUSTOM;
    262         pContext->pBundledContext->levelSaved               = 0;
    263         pContext->pBundledContext->bMuteEnabled             = LVM_FALSE;
    264         pContext->pBundledContext->bStereoPositionEnabled   = LVM_FALSE;
    265         pContext->pBundledContext->positionSaved            = 0;
    266         pContext->pBundledContext->workBuffer               = NULL;
    267         pContext->pBundledContext->frameCount               = -1;
    268         pContext->pBundledContext->SamplesToExitCountVirt   = 0;
    269         pContext->pBundledContext->SamplesToExitCountBb     = 0;
    270         pContext->pBundledContext->SamplesToExitCountEq     = 0;
    271 
    272         for (int i = 0; i < FIVEBAND_NUMBANDS; i++) {
    273             pContext->pBundledContext->bandGaindB[i] = EQNB_5BandSoftPresets[i];
    274         }
    275 
    276         ALOGV("\tEffectCreate - Calling LvmBundle_init");
    277         ret = LvmBundle_init(pContext);
    278 
    279         if (ret < 0){
    280             ALOGV("\tLVM_ERROR : EffectCreate() Bundle init failed");
    281             goto exit;
    282         }
    283     }
    284     else{
    285         ALOGV("\tEffectCreate - Assigning memory for previously created effect on sessionNo %d",
    286                 sessionNo);
    287         pContext->pBundledContext =
    288                 GlobalSessionMemory[sessionNo].pBundledContext;
    289     }
    290     ALOGV("\tEffectCreate - pBundledContext is %p", pContext->pBundledContext);
    291 
    292     pSessionContext = &GlobalSessionMemory[pContext->pBundledContext->SessionNo];
    293 
    294     // Create each Effect
    295     if (memcmp(uuid, &gBassBoostDescriptor.uuid, sizeof(effect_uuid_t)) == 0){
    296         // Create Bass Boost
    297         ALOGV("\tEffectCreate - Effect to be created is LVM_BASS_BOOST");
    298         pSessionContext->bBassInstantiated = LVM_TRUE;
    299         pContext->pBundledContext->SamplesToExitCountBb = 0;
    300 
    301         pContext->itfe       = &gLvmEffectInterface;
    302         pContext->EffectType = LVM_BASS_BOOST;
    303     } else if (memcmp(uuid, &gVirtualizerDescriptor.uuid, sizeof(effect_uuid_t)) == 0){
    304         // Create Virtualizer
    305         ALOGV("\tEffectCreate - Effect to be created is LVM_VIRTUALIZER");
    306         pSessionContext->bVirtualizerInstantiated=LVM_TRUE;
    307         pContext->pBundledContext->SamplesToExitCountVirt = 0;
    308 
    309         pContext->itfe       = &gLvmEffectInterface;
    310         pContext->EffectType = LVM_VIRTUALIZER;
    311     } else if (memcmp(uuid, &gEqualizerDescriptor.uuid, sizeof(effect_uuid_t)) == 0){
    312         // Create Equalizer
    313         ALOGV("\tEffectCreate - Effect to be created is LVM_EQUALIZER");
    314         pSessionContext->bEqualizerInstantiated = LVM_TRUE;
    315         pContext->pBundledContext->SamplesToExitCountEq = 0;
    316 
    317         pContext->itfe       = &gLvmEffectInterface;
    318         pContext->EffectType = LVM_EQUALIZER;
    319     } else if (memcmp(uuid, &gVolumeDescriptor.uuid, sizeof(effect_uuid_t)) == 0){
    320         // Create Volume
    321         ALOGV("\tEffectCreate - Effect to be created is LVM_VOLUME");
    322         pSessionContext->bVolumeInstantiated = LVM_TRUE;
    323 
    324         pContext->itfe       = &gLvmEffectInterface;
    325         pContext->EffectType = LVM_VOLUME;
    326     }
    327     else{
    328         ALOGV("\tLVM_ERROR : EffectCreate() invalid UUID");
    329         ret = -EINVAL;
    330         goto exit;
    331     }
    332 
    333 exit:
    334     if (ret != 0) {
    335         if (pContext != NULL) {
    336             if (newBundle) {
    337                 GlobalSessionMemory[sessionNo].bBundledEffectsEnabled = LVM_FALSE;
    338                 SessionIndex[sessionNo] = LVM_UNUSED_SESSION;
    339                 delete pContext->pBundledContext;
    340             }
    341             delete pContext;
    342         }
    343         *pHandle = (effect_handle_t)NULL;
    344     } else {
    345         *pHandle = (effect_handle_t)pContext;
    346     }
    347     ALOGV("\tEffectCreate end..\n\n");
    348     return ret;
    349 } /* end EffectCreate */
    350 
    351 extern "C" int EffectRelease(effect_handle_t handle){
    352     ALOGV("\n\tEffectRelease start %p", handle);
    353     EffectContext * pContext = (EffectContext *)handle;
    354 
    355     ALOGV("\tEffectRelease start handle: %p, context %p", handle, pContext->pBundledContext);
    356     if (pContext == NULL){
    357         ALOGV("\tLVM_ERROR : EffectRelease called with NULL pointer");
    358         return -EINVAL;
    359     }
    360 
    361     SessionContext *pSessionContext = &GlobalSessionMemory[pContext->pBundledContext->SessionNo];
    362 
    363     // Clear the instantiated flag for the effect
    364     // protect agains the case where an effect is un-instantiated without being disabled
    365     if(pContext->EffectType == LVM_BASS_BOOST) {
    366         ALOGV("\tEffectRelease LVM_BASS_BOOST Clearing global intstantiated flag");
    367         pSessionContext->bBassInstantiated = LVM_FALSE;
    368         if(pContext->pBundledContext->SamplesToExitCountBb > 0){
    369             pContext->pBundledContext->NumberEffectsEnabled--;
    370         }
    371         pContext->pBundledContext->SamplesToExitCountBb = 0;
    372     } else if(pContext->EffectType == LVM_VIRTUALIZER) {
    373         ALOGV("\tEffectRelease LVM_VIRTUALIZER Clearing global intstantiated flag");
    374         pSessionContext->bVirtualizerInstantiated = LVM_FALSE;
    375         if(pContext->pBundledContext->SamplesToExitCountVirt > 0){
    376             pContext->pBundledContext->NumberEffectsEnabled--;
    377         }
    378         pContext->pBundledContext->SamplesToExitCountVirt = 0;
    379     } else if(pContext->EffectType == LVM_EQUALIZER) {
    380         ALOGV("\tEffectRelease LVM_EQUALIZER Clearing global intstantiated flag");
    381         pSessionContext->bEqualizerInstantiated =LVM_FALSE;
    382         if(pContext->pBundledContext->SamplesToExitCountEq > 0){
    383             pContext->pBundledContext->NumberEffectsEnabled--;
    384         }
    385         pContext->pBundledContext->SamplesToExitCountEq = 0;
    386     } else if(pContext->EffectType == LVM_VOLUME) {
    387         ALOGV("\tEffectRelease LVM_VOLUME Clearing global intstantiated flag");
    388         pSessionContext->bVolumeInstantiated = LVM_FALSE;
    389         if (pContext->pBundledContext->bVolumeEnabled == LVM_TRUE){
    390             pContext->pBundledContext->NumberEffectsEnabled--;
    391         }
    392     } else {
    393         ALOGV("\tLVM_ERROR : EffectRelease : Unsupported effect\n\n\n\n\n\n\n");
    394     }
    395 
    396     // Disable effect, in this case ignore errors (return codes)
    397     // if an effect has already been disabled
    398     Effect_setEnabled(pContext, LVM_FALSE);
    399 
    400     // if all effects are no longer instantiaed free the lvm memory and delete BundledEffectContext
    401     if ((pSessionContext->bBassInstantiated == LVM_FALSE) &&
    402             (pSessionContext->bVolumeInstantiated == LVM_FALSE) &&
    403             (pSessionContext->bEqualizerInstantiated ==LVM_FALSE) &&
    404             (pSessionContext->bVirtualizerInstantiated==LVM_FALSE))
    405     {
    406         #ifdef LVM_PCM
    407         if (pContext->pBundledContext->PcmInPtr != NULL) {
    408             fclose(pContext->pBundledContext->PcmInPtr);
    409             pContext->pBundledContext->PcmInPtr = NULL;
    410         }
    411         if (pContext->pBundledContext->PcmOutPtr != NULL) {
    412             fclose(pContext->pBundledContext->PcmOutPtr);
    413             pContext->pBundledContext->PcmOutPtr = NULL;
    414         }
    415         #endif
    416 
    417 
    418         // Clear the SessionIndex
    419         for(int i=0; i<LVM_MAX_SESSIONS; i++){
    420             if(SessionIndex[i] == pContext->pBundledContext->SessionId){
    421                 SessionIndex[i] = LVM_UNUSED_SESSION;
    422                 ALOGV("\tEffectRelease: Clearing SessionIndex SessionNo %d for SessionId %d\n",
    423                         i, pContext->pBundledContext->SessionId);
    424                 break;
    425             }
    426         }
    427 
    428         ALOGV("\tEffectRelease: All effects are no longer instantiated\n");
    429         pSessionContext->bBundledEffectsEnabled = LVM_FALSE;
    430         pSessionContext->pBundledContext = LVM_NULL;
    431         ALOGV("\tEffectRelease: Freeing LVM Bundle memory\n");
    432         LvmEffect_free(pContext);
    433         ALOGV("\tEffectRelease: Deleting LVM Bundle context %p\n", pContext->pBundledContext);
    434         if (pContext->pBundledContext->workBuffer != NULL) {
    435             free(pContext->pBundledContext->workBuffer);
    436         }
    437         delete pContext->pBundledContext;
    438         pContext->pBundledContext = LVM_NULL;
    439     }
    440     // free the effect context for current effect
    441     delete pContext;
    442 
    443     ALOGV("\tEffectRelease end\n");
    444     return 0;
    445 
    446 } /* end EffectRelease */
    447 
    448 extern "C" int EffectGetDescriptor(const effect_uuid_t *uuid,
    449                                    effect_descriptor_t *pDescriptor) {
    450     const effect_descriptor_t *desc = NULL;
    451 
    452     if (pDescriptor == NULL || uuid == NULL){
    453         ALOGV("EffectGetDescriptor() called with NULL pointer");
    454         return -EINVAL;
    455     }
    456 
    457     if (memcmp(uuid, &gBassBoostDescriptor.uuid, sizeof(effect_uuid_t)) == 0) {
    458         desc = &gBassBoostDescriptor;
    459     } else if (memcmp(uuid, &gVirtualizerDescriptor.uuid, sizeof(effect_uuid_t)) == 0) {
    460         desc = &gVirtualizerDescriptor;
    461     } else if (memcmp(uuid, &gEqualizerDescriptor.uuid, sizeof(effect_uuid_t)) == 0) {
    462         desc = &gEqualizerDescriptor;
    463     } else if (memcmp(uuid, &gVolumeDescriptor.uuid, sizeof(effect_uuid_t)) == 0) {
    464         desc = &gVolumeDescriptor;
    465     }
    466 
    467     if (desc == NULL) {
    468         return  -EINVAL;
    469     }
    470 
    471     *pDescriptor = *desc;
    472 
    473     return 0;
    474 } /* end EffectGetDescriptor */
    475 
    476 void LvmGlobalBundle_init(){
    477     ALOGV("\tLvmGlobalBundle_init start");
    478     for(int i=0; i<LVM_MAX_SESSIONS; i++){
    479         GlobalSessionMemory[i].bBundledEffectsEnabled   = LVM_FALSE;
    480         GlobalSessionMemory[i].bVolumeInstantiated      = LVM_FALSE;
    481         GlobalSessionMemory[i].bEqualizerInstantiated   = LVM_FALSE;
    482         GlobalSessionMemory[i].bBassInstantiated        = LVM_FALSE;
    483         GlobalSessionMemory[i].bVirtualizerInstantiated = LVM_FALSE;
    484         GlobalSessionMemory[i].pBundledContext          = LVM_NULL;
    485 
    486         SessionIndex[i] = LVM_UNUSED_SESSION;
    487     }
    488     return;
    489 }
    490 //----------------------------------------------------------------------------
    491 // LvmBundle_init()
    492 //----------------------------------------------------------------------------
    493 // Purpose: Initialize engine with default configuration, creates instance
    494 // with all effects disabled.
    495 //
    496 // Inputs:
    497 //  pContext:   effect engine context
    498 //
    499 // Outputs:
    500 //
    501 //----------------------------------------------------------------------------
    502 
    503 int LvmBundle_init(EffectContext *pContext){
    504     int status;
    505 
    506     ALOGV("\tLvmBundle_init start");
    507 
    508     pContext->config.inputCfg.accessMode                    = EFFECT_BUFFER_ACCESS_READ;
    509     pContext->config.inputCfg.channels                      = AUDIO_CHANNEL_OUT_STEREO;
    510     pContext->config.inputCfg.format                        = AUDIO_FORMAT_PCM_16_BIT;
    511     pContext->config.inputCfg.samplingRate                  = 44100;
    512     pContext->config.inputCfg.bufferProvider.getBuffer      = NULL;
    513     pContext->config.inputCfg.bufferProvider.releaseBuffer  = NULL;
    514     pContext->config.inputCfg.bufferProvider.cookie         = NULL;
    515     pContext->config.inputCfg.mask                          = EFFECT_CONFIG_ALL;
    516     pContext->config.outputCfg.accessMode                   = EFFECT_BUFFER_ACCESS_ACCUMULATE;
    517     pContext->config.outputCfg.channels                     = AUDIO_CHANNEL_OUT_STEREO;
    518     pContext->config.outputCfg.format                       = AUDIO_FORMAT_PCM_16_BIT;
    519     pContext->config.outputCfg.samplingRate                 = 44100;
    520     pContext->config.outputCfg.bufferProvider.getBuffer     = NULL;
    521     pContext->config.outputCfg.bufferProvider.releaseBuffer = NULL;
    522     pContext->config.outputCfg.bufferProvider.cookie        = NULL;
    523     pContext->config.outputCfg.mask                         = EFFECT_CONFIG_ALL;
    524 
    525     CHECK_ARG(pContext != NULL);
    526 
    527     if (pContext->pBundledContext->hInstance != NULL){
    528         ALOGV("\tLvmBundle_init pContext->pBassBoost != NULL "
    529                 "-> Calling pContext->pBassBoost->free()");
    530 
    531         LvmEffect_free(pContext);
    532 
    533         ALOGV("\tLvmBundle_init pContext->pBassBoost != NULL "
    534                 "-> Called pContext->pBassBoost->free()");
    535     }
    536 
    537     LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;          /* Function call status */
    538     LVM_ControlParams_t     params;                         /* Control Parameters */
    539     LVM_InstParams_t        InstParams;                     /* Instance parameters */
    540     LVM_EQNB_BandDef_t      BandDefs[MAX_NUM_BANDS];        /* Equaliser band definitions */
    541     LVM_HeadroomParams_t    HeadroomParams;                 /* Headroom parameters */
    542     LVM_HeadroomBandDef_t   HeadroomBandDef[LVM_HEADROOM_MAX_NBANDS];
    543     LVM_MemTab_t            MemTab;                         /* Memory allocation table */
    544     bool                    bMallocFailure = LVM_FALSE;
    545 
    546     /* Set the capabilities */
    547     InstParams.BufferMode       = LVM_UNMANAGED_BUFFERS;
    548     InstParams.MaxBlockSize     = MAX_CALL_SIZE;
    549     InstParams.EQNB_NumBands    = MAX_NUM_BANDS;
    550     InstParams.PSA_Included     = LVM_PSA_ON;
    551 
    552     /* Allocate memory, forcing alignment */
    553     LvmStatus = LVM_GetMemoryTable(LVM_NULL,
    554                                   &MemTab,
    555                                   &InstParams);
    556 
    557     LVM_ERROR_CHECK(LvmStatus, "LVM_GetMemoryTable", "LvmBundle_init")
    558     if(LvmStatus != LVM_SUCCESS) return -EINVAL;
    559 
    560     ALOGV("\tCreateInstance Succesfully called LVM_GetMemoryTable\n");
    561 
    562     /* Allocate memory */
    563     for (int i=0; i<LVM_NR_MEMORY_REGIONS; i++){
    564         if (MemTab.Region[i].Size != 0){
    565             MemTab.Region[i].pBaseAddress = malloc(MemTab.Region[i].Size);
    566 
    567             if (MemTab.Region[i].pBaseAddress == LVM_NULL){
    568                 ALOGV("\tLVM_ERROR :LvmBundle_init CreateInstance Failed to allocate %" PRIu32
    569                         " bytes for region %u\n", MemTab.Region[i].Size, i );
    570                 bMallocFailure = LVM_TRUE;
    571             }else{
    572                 ALOGV("\tLvmBundle_init CreateInstance allocated %" PRIu32
    573                         " bytes for region %u at %p\n",
    574                         MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress);
    575             }
    576         }
    577     }
    578 
    579     /* If one or more of the memory regions failed to allocate, free the regions that were
    580      * succesfully allocated and return with an error
    581      */
    582     if(bMallocFailure == LVM_TRUE){
    583         for (int i=0; i<LVM_NR_MEMORY_REGIONS; i++){
    584             if (MemTab.Region[i].pBaseAddress == LVM_NULL){
    585                 ALOGV("\tLVM_ERROR :LvmBundle_init CreateInstance Failed to allocate %" PRIu32
    586                         " bytes for region %u Not freeing\n", MemTab.Region[i].Size, i );
    587             }else{
    588                 ALOGV("\tLVM_ERROR :LvmBundle_init CreateInstance Failed: but allocated %" PRIu32
    589                      " bytes for region %u at %p- free\n",
    590                      MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress);
    591                 free(MemTab.Region[i].pBaseAddress);
    592             }
    593         }
    594         return -EINVAL;
    595     }
    596     ALOGV("\tLvmBundle_init CreateInstance Succesfully malloc'd memory\n");
    597 
    598     /* Initialise */
    599     pContext->pBundledContext->hInstance = LVM_NULL;
    600 
    601     /* Init sets the instance handle */
    602     LvmStatus = LVM_GetInstanceHandle(&pContext->pBundledContext->hInstance,
    603                                       &MemTab,
    604                                       &InstParams);
    605 
    606     LVM_ERROR_CHECK(LvmStatus, "LVM_GetInstanceHandle", "LvmBundle_init")
    607     if(LvmStatus != LVM_SUCCESS) return -EINVAL;
    608 
    609     ALOGV("\tLvmBundle_init CreateInstance Succesfully called LVM_GetInstanceHandle\n");
    610 
    611     /* Set the initial process parameters */
    612     /* General parameters */
    613     params.OperatingMode          = LVM_MODE_ON;
    614     params.SampleRate             = LVM_FS_44100;
    615     params.SourceFormat           = LVM_STEREO;
    616     params.SpeakerType            = LVM_HEADPHONES;
    617 
    618     pContext->pBundledContext->SampleRate = LVM_FS_44100;
    619 
    620     /* Concert Sound parameters */
    621     params.VirtualizerOperatingMode   = LVM_MODE_OFF;
    622     params.VirtualizerType            = LVM_CONCERTSOUND;
    623     params.VirtualizerReverbLevel     = 100;
    624     params.CS_EffectLevel             = LVM_CS_EFFECT_NONE;
    625 
    626     /* N-Band Equaliser parameters */
    627     params.EQNB_OperatingMode     = LVM_EQNB_OFF;
    628     params.EQNB_NBands            = FIVEBAND_NUMBANDS;
    629     params.pEQNB_BandDefinition   = &BandDefs[0];
    630 
    631     for (int i=0; i<FIVEBAND_NUMBANDS; i++)
    632     {
    633         BandDefs[i].Frequency = EQNB_5BandPresetsFrequencies[i];
    634         BandDefs[i].QFactor   = EQNB_5BandPresetsQFactors[i];
    635         BandDefs[i].Gain      = EQNB_5BandSoftPresets[i];
    636     }
    637 
    638     /* Volume Control parameters */
    639     params.VC_EffectLevel         = 0;
    640     params.VC_Balance             = 0;
    641 
    642     /* Treble Enhancement parameters */
    643     params.TE_OperatingMode       = LVM_TE_OFF;
    644     params.TE_EffectLevel         = 0;
    645 
    646     /* PSA Control parameters */
    647     params.PSA_Enable             = LVM_PSA_OFF;
    648     params.PSA_PeakDecayRate      = (LVM_PSA_DecaySpeed_en)0;
    649 
    650     /* Bass Enhancement parameters */
    651     params.BE_OperatingMode       = LVM_BE_OFF;
    652     params.BE_EffectLevel         = 0;
    653     params.BE_CentreFreq          = LVM_BE_CENTRE_90Hz;
    654     params.BE_HPF                 = LVM_BE_HPF_ON;
    655 
    656     /* PSA Control parameters */
    657     params.PSA_Enable             = LVM_PSA_OFF;
    658     params.PSA_PeakDecayRate      = LVM_PSA_SPEED_MEDIUM;
    659 
    660     /* TE Control parameters */
    661     params.TE_OperatingMode       = LVM_TE_OFF;
    662     params.TE_EffectLevel         = 0;
    663 
    664     /* Activate the initial settings */
    665     LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance,
    666                                          &params);
    667 
    668     LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "LvmBundle_init")
    669     if(LvmStatus != LVM_SUCCESS) return -EINVAL;
    670 
    671     ALOGV("\tLvmBundle_init CreateInstance Succesfully called LVM_SetControlParameters\n");
    672 
    673     /* Set the headroom parameters */
    674     HeadroomBandDef[0].Limit_Low          = 20;
    675     HeadroomBandDef[0].Limit_High         = 4999;
    676     HeadroomBandDef[0].Headroom_Offset    = 0;
    677     HeadroomBandDef[1].Limit_Low          = 5000;
    678     HeadroomBandDef[1].Limit_High         = 24000;
    679     HeadroomBandDef[1].Headroom_Offset    = 0;
    680     HeadroomParams.pHeadroomDefinition    = &HeadroomBandDef[0];
    681     HeadroomParams.Headroom_OperatingMode = LVM_HEADROOM_ON;
    682     HeadroomParams.NHeadroomBands         = 2;
    683 
    684     LvmStatus = LVM_SetHeadroomParams(pContext->pBundledContext->hInstance,
    685                                       &HeadroomParams);
    686 
    687     LVM_ERROR_CHECK(LvmStatus, "LVM_SetHeadroomParams", "LvmBundle_init")
    688     if(LvmStatus != LVM_SUCCESS) return -EINVAL;
    689 
    690     ALOGV("\tLvmBundle_init CreateInstance Succesfully called LVM_SetHeadroomParams\n");
    691     ALOGV("\tLvmBundle_init End");
    692     return 0;
    693 }   /* end LvmBundle_init */
    694 
    695 
    696 //----------------------------------------------------------------------------
    697 // LvmBundle_process()
    698 //----------------------------------------------------------------------------
    699 // Purpose:
    700 // Apply LVM Bundle effects
    701 //
    702 // Inputs:
    703 //  pIn:        pointer to stereo 16 bit input data
    704 //  pOut:       pointer to stereo 16 bit output data
    705 //  frameCount: Frames to process
    706 //  pContext:   effect engine context
    707 //  strength    strength to be applied
    708 //
    709 //  Outputs:
    710 //  pOut:       pointer to updated stereo 16 bit output data
    711 //
    712 //----------------------------------------------------------------------------
    713 
    714 int LvmBundle_process(LVM_INT16        *pIn,
    715                       LVM_INT16        *pOut,
    716                       int              frameCount,
    717                       EffectContext    *pContext){
    718 
    719     LVM_ControlParams_t     ActiveParams;                           /* Current control Parameters */
    720     LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
    721     LVM_INT16               *pOutTmp;
    722 
    723     if (pContext->config.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_WRITE){
    724         pOutTmp = pOut;
    725     } else if (pContext->config.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE){
    726         if (pContext->pBundledContext->frameCount != frameCount) {
    727             if (pContext->pBundledContext->workBuffer != NULL) {
    728                 free(pContext->pBundledContext->workBuffer);
    729             }
    730             pContext->pBundledContext->workBuffer =
    731                     (LVM_INT16 *)calloc(frameCount, sizeof(LVM_INT16) * 2);
    732             if (pContext->pBundledContext->workBuffer == NULL) {
    733                 return -ENOMEM;
    734             }
    735             pContext->pBundledContext->frameCount = frameCount;
    736         }
    737         pOutTmp = pContext->pBundledContext->workBuffer;
    738     } else {
    739         ALOGV("LVM_ERROR : LvmBundle_process invalid access mode");
    740         return -EINVAL;
    741     }
    742 
    743     #ifdef LVM_PCM
    744     fwrite(pIn, frameCount*sizeof(LVM_INT16)*2, 1, pContext->pBundledContext->PcmInPtr);
    745     fflush(pContext->pBundledContext->PcmInPtr);
    746     #endif
    747 
    748     //ALOGV("Calling LVM_Process");
    749 
    750     /* Process the samples */
    751     LvmStatus = LVM_Process(pContext->pBundledContext->hInstance, /* Instance handle */
    752                             pIn,                                  /* Input buffer */
    753                             pOutTmp,                              /* Output buffer */
    754                             (LVM_UINT16)frameCount,               /* Number of samples to read */
    755                             0);                                   /* Audo Time */
    756 
    757     LVM_ERROR_CHECK(LvmStatus, "LVM_Process", "LvmBundle_process")
    758     if(LvmStatus != LVM_SUCCESS) return -EINVAL;
    759 
    760     #ifdef LVM_PCM
    761     fwrite(pOutTmp, frameCount*sizeof(LVM_INT16)*2, 1, pContext->pBundledContext->PcmOutPtr);
    762     fflush(pContext->pBundledContext->PcmOutPtr);
    763     #endif
    764 
    765     if (pContext->config.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE){
    766         for (int i=0; i<frameCount*2; i++){
    767             pOut[i] = clamp16((LVM_INT32)pOut[i] + (LVM_INT32)pOutTmp[i]);
    768         }
    769     }
    770     return 0;
    771 }    /* end LvmBundle_process */
    772 
    773 
    774 //----------------------------------------------------------------------------
    775 // EqualizerUpdateActiveParams()
    776 //----------------------------------------------------------------------------
    777 // Purpose: Update ActiveParams for Equalizer
    778 //
    779 // Inputs:
    780 //  pContext:   effect engine context
    781 //
    782 // Outputs:
    783 //
    784 //----------------------------------------------------------------------------
    785 void EqualizerUpdateActiveParams(EffectContext *pContext) {
    786     LVM_ControlParams_t     ActiveParams;              /* Current control Parameters */
    787     LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;     /* Function call status */
    788 
    789     /* Get the current settings */
    790     LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
    791     LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "EqualizerUpdateActiveParams")
    792     //ALOGV("\tEqualizerUpdateActiveParams Succesfully returned from LVM_GetControlParameters\n");
    793     //ALOGV("\tEqualizerUpdateActiveParams just Got -> %d\n",
    794     //          ActiveParams.pEQNB_BandDefinition[band].Gain);
    795 
    796 
    797     for (int i = 0; i < FIVEBAND_NUMBANDS; i++) {
    798            ActiveParams.pEQNB_BandDefinition[i].Frequency = EQNB_5BandPresetsFrequencies[i];
    799            ActiveParams.pEQNB_BandDefinition[i].QFactor   = EQNB_5BandPresetsQFactors[i];
    800            ActiveParams.pEQNB_BandDefinition[i].Gain = pContext->pBundledContext->bandGaindB[i];
    801        }
    802 
    803     /* Activate the initial settings */
    804     LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
    805     LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "EqualizerUpdateActiveParams")
    806     //ALOGV("\tEqualizerUpdateActiveParams just Set -> %d\n",
    807     //          ActiveParams.pEQNB_BandDefinition[band].Gain);
    808 
    809 }
    810 
    811 //----------------------------------------------------------------------------
    812 // LvmEffect_limitLevel()
    813 //----------------------------------------------------------------------------
    814 // Purpose: limit the overall level to a value less than 0 dB preserving
    815 //          the overall EQ band gain and BassBoost relative levels.
    816 //
    817 // Inputs:
    818 //  pContext:   effect engine context
    819 //
    820 // Outputs:
    821 //
    822 //----------------------------------------------------------------------------
    823 void LvmEffect_limitLevel(EffectContext *pContext) {
    824     LVM_ControlParams_t     ActiveParams;              /* Current control Parameters */
    825     LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;     /* Function call status */
    826 
    827     /* Get the current settings */
    828     LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
    829     LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "LvmEffect_limitLevel")
    830     //ALOGV("\tLvmEffect_limitLevel Succesfully returned from LVM_GetControlParameters\n");
    831     //ALOGV("\tLvmEffect_limitLevel just Got -> %d\n",
    832     //          ActiveParams.pEQNB_BandDefinition[band].Gain);
    833 
    834     int gainCorrection = 0;
    835     //Count the energy contribution per band for EQ and BassBoost only if they are active.
    836     float energyContribution = 0;
    837     float energyCross = 0;
    838     float energyBassBoost = 0;
    839     float crossCorrection = 0;
    840 
    841     //EQ contribution
    842     if (pContext->pBundledContext->bEqualizerEnabled == LVM_TRUE) {
    843         for (int i = 0; i < FIVEBAND_NUMBANDS; i++) {
    844             float bandFactor = pContext->pBundledContext->bandGaindB[i]/15.0;
    845             float bandCoefficient = LimitLevel_bandEnergyCoefficient[i];
    846             float bandEnergy = bandFactor * bandCoefficient * bandCoefficient;
    847             if (bandEnergy > 0)
    848                 energyContribution += bandEnergy;
    849         }
    850 
    851         //cross EQ coefficients
    852         float bandFactorSum = 0;
    853         for (int i = 0; i < FIVEBAND_NUMBANDS-1; i++) {
    854             float bandFactor1 = pContext->pBundledContext->bandGaindB[i]/15.0;
    855             float bandFactor2 = pContext->pBundledContext->bandGaindB[i+1]/15.0;
    856 
    857             if (bandFactor1 > 0 && bandFactor2 > 0) {
    858                 float crossEnergy = bandFactor1 * bandFactor2 *
    859                         LimitLevel_bandEnergyCrossCoefficient[i];
    860                 bandFactorSum += bandFactor1 * bandFactor2;
    861 
    862                 if (crossEnergy > 0)
    863                     energyCross += crossEnergy;
    864             }
    865         }
    866         bandFactorSum -= 1.0;
    867         if (bandFactorSum > 0)
    868             crossCorrection = bandFactorSum * 0.7;
    869     }
    870 
    871     //BassBoost contribution
    872     if (pContext->pBundledContext->bBassEnabled == LVM_TRUE) {
    873         float boostFactor = (pContext->pBundledContext->BassStrengthSaved)/1000.0;
    874         float boostCoefficient = LimitLevel_bassBoostEnergyCoefficient;
    875 
    876         energyContribution += boostFactor * boostCoefficient * boostCoefficient;
    877 
    878         for (int i = 0; i < FIVEBAND_NUMBANDS; i++) {
    879             float bandFactor = pContext->pBundledContext->bandGaindB[i]/15.0;
    880             float bandCrossCoefficient = LimitLevel_bassBoostEnergyCrossCoefficient[i];
    881             float bandEnergy = boostFactor * bandFactor *
    882                     bandCrossCoefficient;
    883             if (bandEnergy > 0)
    884                 energyBassBoost += bandEnergy;
    885         }
    886     }
    887 
    888     //Virtualizer contribution
    889     if (pContext->pBundledContext->bVirtualizerEnabled == LVM_TRUE) {
    890         energyContribution += LimitLevel_virtualizerContribution *
    891                 LimitLevel_virtualizerContribution;
    892     }
    893 
    894     double totalEnergyEstimation = sqrt(energyContribution + energyCross + energyBassBoost) -
    895             crossCorrection;
    896     ALOGV(" TOTAL energy estimation: %0.2f", totalEnergyEstimation);
    897 
    898     //roundoff
    899     int maxLevelRound = (int)(totalEnergyEstimation + 0.99);
    900     if (maxLevelRound + pContext->pBundledContext->volume > 0) {
    901         gainCorrection = maxLevelRound + pContext->pBundledContext->volume;
    902     }
    903 
    904     ActiveParams.VC_EffectLevel  = pContext->pBundledContext->volume - gainCorrection;
    905     if (ActiveParams.VC_EffectLevel < -96) {
    906         ActiveParams.VC_EffectLevel = -96;
    907     }
    908     ALOGV("\tVol:%d, GainCorrection: %d, Actual vol: %d", pContext->pBundledContext->volume,
    909             gainCorrection, ActiveParams.VC_EffectLevel);
    910 
    911     /* Activate the initial settings */
    912     LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
    913     LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "LvmEffect_limitLevel")
    914     //ALOGV("\tLvmEffect_limitLevel just Set -> %d\n",
    915     //          ActiveParams.pEQNB_BandDefinition[band].Gain);
    916 
    917     //ALOGV("\tLvmEffect_limitLevel just set (-96dB -> 0dB) -> %d\n",ActiveParams.VC_EffectLevel );
    918     if (pContext->pBundledContext->firstVolume == LVM_TRUE){
    919         LvmStatus = LVM_SetVolumeNoSmoothing(pContext->pBundledContext->hInstance, &ActiveParams);
    920         LVM_ERROR_CHECK(LvmStatus, "LVM_SetVolumeNoSmoothing", "LvmBundle_process")
    921         ALOGV("\tLVM_VOLUME: Disabling Smoothing for first volume change to remove spikes/clicks");
    922         pContext->pBundledContext->firstVolume = LVM_FALSE;
    923     }
    924 }
    925 
    926 //----------------------------------------------------------------------------
    927 // LvmEffect_enable()
    928 //----------------------------------------------------------------------------
    929 // Purpose: Enable the effect in the bundle
    930 //
    931 // Inputs:
    932 //  pContext:   effect engine context
    933 //
    934 // Outputs:
    935 //
    936 //----------------------------------------------------------------------------
    937 
    938 int LvmEffect_enable(EffectContext *pContext){
    939     //ALOGV("\tLvmEffect_enable start");
    940 
    941     LVM_ControlParams_t     ActiveParams;                           /* Current control Parameters */
    942     LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
    943 
    944     /* Get the current settings */
    945     LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,
    946                                          &ActiveParams);
    947 
    948     LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "LvmEffect_enable")
    949     if(LvmStatus != LVM_SUCCESS) return -EINVAL;
    950     //ALOGV("\tLvmEffect_enable Succesfully called LVM_GetControlParameters\n");
    951 
    952     if(pContext->EffectType == LVM_BASS_BOOST) {
    953         ALOGV("\tLvmEffect_enable : Enabling LVM_BASS_BOOST");
    954         ActiveParams.BE_OperatingMode       = LVM_BE_ON;
    955     }
    956     if(pContext->EffectType == LVM_VIRTUALIZER) {
    957         ALOGV("\tLvmEffect_enable : Enabling LVM_VIRTUALIZER");
    958         ActiveParams.VirtualizerOperatingMode   = LVM_MODE_ON;
    959     }
    960     if(pContext->EffectType == LVM_EQUALIZER) {
    961         ALOGV("\tLvmEffect_enable : Enabling LVM_EQUALIZER");
    962         ActiveParams.EQNB_OperatingMode     = LVM_EQNB_ON;
    963     }
    964     if(pContext->EffectType == LVM_VOLUME) {
    965         ALOGV("\tLvmEffect_enable : Enabling LVM_VOLUME");
    966     }
    967 
    968     LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
    969     LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "LvmEffect_enable")
    970     if(LvmStatus != LVM_SUCCESS) return -EINVAL;
    971 
    972     //ALOGV("\tLvmEffect_enable Succesfully called LVM_SetControlParameters\n");
    973     //ALOGV("\tLvmEffect_enable end");
    974     LvmEffect_limitLevel(pContext);
    975     return 0;
    976 }
    977 
    978 //----------------------------------------------------------------------------
    979 // LvmEffect_disable()
    980 //----------------------------------------------------------------------------
    981 // Purpose: Disable the effect in the bundle
    982 //
    983 // Inputs:
    984 //  pContext:   effect engine context
    985 //
    986 // Outputs:
    987 //
    988 //----------------------------------------------------------------------------
    989 
    990 int LvmEffect_disable(EffectContext *pContext){
    991     //ALOGV("\tLvmEffect_disable start");
    992 
    993     LVM_ControlParams_t     ActiveParams;                           /* Current control Parameters */
    994     LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
    995     /* Get the current settings */
    996     LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,
    997                                          &ActiveParams);
    998 
    999     LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "LvmEffect_disable")
   1000     if(LvmStatus != LVM_SUCCESS) return -EINVAL;
   1001     //ALOGV("\tLvmEffect_disable Succesfully called LVM_GetControlParameters\n");
   1002 
   1003     if(pContext->EffectType == LVM_BASS_BOOST) {
   1004         ALOGV("\tLvmEffect_disable : Disabling LVM_BASS_BOOST");
   1005         ActiveParams.BE_OperatingMode       = LVM_BE_OFF;
   1006     }
   1007     if(pContext->EffectType == LVM_VIRTUALIZER) {
   1008         ALOGV("\tLvmEffect_disable : Disabling LVM_VIRTUALIZER");
   1009         ActiveParams.VirtualizerOperatingMode   = LVM_MODE_OFF;
   1010     }
   1011     if(pContext->EffectType == LVM_EQUALIZER) {
   1012         ALOGV("\tLvmEffect_disable : Disabling LVM_EQUALIZER");
   1013         ActiveParams.EQNB_OperatingMode     = LVM_EQNB_OFF;
   1014     }
   1015     if(pContext->EffectType == LVM_VOLUME) {
   1016         ALOGV("\tLvmEffect_disable : Disabling LVM_VOLUME");
   1017     }
   1018 
   1019     LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
   1020     LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "LvmEffect_disable")
   1021     if(LvmStatus != LVM_SUCCESS) return -EINVAL;
   1022 
   1023     //ALOGV("\tLvmEffect_disable Succesfully called LVM_SetControlParameters\n");
   1024     //ALOGV("\tLvmEffect_disable end");
   1025     LvmEffect_limitLevel(pContext);
   1026     return 0;
   1027 }
   1028 
   1029 //----------------------------------------------------------------------------
   1030 // LvmEffect_free()
   1031 //----------------------------------------------------------------------------
   1032 // Purpose: Free all memory associated with the Bundle.
   1033 //
   1034 // Inputs:
   1035 //  pContext:   effect engine context
   1036 //
   1037 // Outputs:
   1038 //
   1039 //----------------------------------------------------------------------------
   1040 
   1041 void LvmEffect_free(EffectContext *pContext){
   1042     LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;         /* Function call status */
   1043     LVM_ControlParams_t     params;                        /* Control Parameters */
   1044     LVM_MemTab_t            MemTab;
   1045 
   1046     /* Free the algorithm memory */
   1047     LvmStatus = LVM_GetMemoryTable(pContext->pBundledContext->hInstance,
   1048                                    &MemTab,
   1049                                    LVM_NULL);
   1050 
   1051     LVM_ERROR_CHECK(LvmStatus, "LVM_GetMemoryTable", "LvmEffect_free")
   1052 
   1053     for (int i=0; i<LVM_NR_MEMORY_REGIONS; i++){
   1054         if (MemTab.Region[i].Size != 0){
   1055             if (MemTab.Region[i].pBaseAddress != NULL){
   1056                 ALOGV("\tLvmEffect_free - START freeing %" PRIu32 " bytes for region %u at %p\n",
   1057                         MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress);
   1058 
   1059                 free(MemTab.Region[i].pBaseAddress);
   1060 
   1061                 ALOGV("\tLvmEffect_free - END   freeing %" PRIu32 " bytes for region %u at %p\n",
   1062                         MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress);
   1063             }else{
   1064                 ALOGV("\tLVM_ERROR : LvmEffect_free - trying to free with NULL pointer %" PRIu32
   1065                         " bytes for region %u at %p ERROR\n",
   1066                         MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress);
   1067             }
   1068         }
   1069     }
   1070 }    /* end LvmEffect_free */
   1071 
   1072 //----------------------------------------------------------------------------
   1073 // Effect_setConfig()
   1074 //----------------------------------------------------------------------------
   1075 // Purpose: Set input and output audio configuration.
   1076 //
   1077 // Inputs:
   1078 //  pContext:   effect engine context
   1079 //  pConfig:    pointer to effect_config_t structure holding input and output
   1080 //      configuration parameters
   1081 //
   1082 // Outputs:
   1083 //
   1084 //----------------------------------------------------------------------------
   1085 
   1086 int Effect_setConfig(EffectContext *pContext, effect_config_t *pConfig){
   1087     LVM_Fs_en   SampleRate;
   1088     //ALOGV("\tEffect_setConfig start");
   1089 
   1090     CHECK_ARG(pContext != NULL);
   1091     CHECK_ARG(pConfig != NULL);
   1092 
   1093     CHECK_ARG(pConfig->inputCfg.samplingRate == pConfig->outputCfg.samplingRate);
   1094     CHECK_ARG(pConfig->inputCfg.channels == pConfig->outputCfg.channels);
   1095     CHECK_ARG(pConfig->inputCfg.format == pConfig->outputCfg.format);
   1096     CHECK_ARG(pConfig->inputCfg.channels == AUDIO_CHANNEL_OUT_STEREO);
   1097     CHECK_ARG(pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_WRITE
   1098               || pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE);
   1099     CHECK_ARG(pConfig->inputCfg.format == AUDIO_FORMAT_PCM_16_BIT);
   1100 
   1101     pContext->config = *pConfig;
   1102 
   1103     switch (pConfig->inputCfg.samplingRate) {
   1104     case 8000:
   1105         SampleRate = LVM_FS_8000;
   1106         pContext->pBundledContext->SamplesPerSecond = 8000*2; // 2 secs Stereo
   1107         break;
   1108     case 16000:
   1109         SampleRate = LVM_FS_16000;
   1110         pContext->pBundledContext->SamplesPerSecond = 16000*2; // 2 secs Stereo
   1111         break;
   1112     case 22050:
   1113         SampleRate = LVM_FS_22050;
   1114         pContext->pBundledContext->SamplesPerSecond = 22050*2; // 2 secs Stereo
   1115         break;
   1116     case 32000:
   1117         SampleRate = LVM_FS_32000;
   1118         pContext->pBundledContext->SamplesPerSecond = 32000*2; // 2 secs Stereo
   1119         break;
   1120     case 44100:
   1121         SampleRate = LVM_FS_44100;
   1122         pContext->pBundledContext->SamplesPerSecond = 44100*2; // 2 secs Stereo
   1123         break;
   1124     case 48000:
   1125         SampleRate = LVM_FS_48000;
   1126         pContext->pBundledContext->SamplesPerSecond = 48000*2; // 2 secs Stereo
   1127         break;
   1128     default:
   1129         ALOGV("\tEffect_setConfig invalid sampling rate %d", pConfig->inputCfg.samplingRate);
   1130         return -EINVAL;
   1131     }
   1132 
   1133     if(pContext->pBundledContext->SampleRate != SampleRate){
   1134 
   1135         LVM_ControlParams_t     ActiveParams;
   1136         LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;
   1137 
   1138         ALOGV("\tEffect_setConfig change sampling rate to %d", SampleRate);
   1139 
   1140         /* Get the current settings */
   1141         LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,
   1142                                          &ActiveParams);
   1143 
   1144         LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "Effect_setConfig")
   1145         if(LvmStatus != LVM_SUCCESS) return -EINVAL;
   1146 
   1147         ActiveParams.SampleRate = SampleRate;
   1148 
   1149         LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
   1150 
   1151         LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "Effect_setConfig")
   1152         ALOGV("\tEffect_setConfig Succesfully called LVM_SetControlParameters\n");
   1153         pContext->pBundledContext->SampleRate = SampleRate;
   1154 
   1155     }else{
   1156         //ALOGV("\tEffect_setConfig keep sampling rate at %d", SampleRate);
   1157     }
   1158 
   1159     //ALOGV("\tEffect_setConfig End....");
   1160     return 0;
   1161 }   /* end Effect_setConfig */
   1162 
   1163 //----------------------------------------------------------------------------
   1164 // Effect_getConfig()
   1165 //----------------------------------------------------------------------------
   1166 // Purpose: Get input and output audio configuration.
   1167 //
   1168 // Inputs:
   1169 //  pContext:   effect engine context
   1170 //  pConfig:    pointer to effect_config_t structure holding input and output
   1171 //      configuration parameters
   1172 //
   1173 // Outputs:
   1174 //
   1175 //----------------------------------------------------------------------------
   1176 
   1177 void Effect_getConfig(EffectContext *pContext, effect_config_t *pConfig)
   1178 {
   1179     *pConfig = pContext->config;
   1180 }   /* end Effect_getConfig */
   1181 
   1182 //----------------------------------------------------------------------------
   1183 // BassGetStrength()
   1184 //----------------------------------------------------------------------------
   1185 // Purpose:
   1186 // get the effect strength currently being used, what is actually returned is the strengh that was
   1187 // previously used in the set, this is because the app uses a strength in the range 0-1000 while
   1188 // the bassboost uses 1-15, so to avoid a quantisation the original set value is used. However the
   1189 // actual used value is checked to make sure it corresponds to the one being returned
   1190 //
   1191 // Inputs:
   1192 //  pContext:   effect engine context
   1193 //
   1194 //----------------------------------------------------------------------------
   1195 
   1196 uint32_t BassGetStrength(EffectContext *pContext){
   1197     //ALOGV("\tBassGetStrength() (0-1000) -> %d\n", pContext->pBundledContext->BassStrengthSaved);
   1198 
   1199     LVM_ControlParams_t     ActiveParams;                           /* Current control Parameters */
   1200     LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
   1201     /* Get the current settings */
   1202     LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,
   1203                                          &ActiveParams);
   1204 
   1205     LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "BassGetStrength")
   1206     if(LvmStatus != LVM_SUCCESS) return -EINVAL;
   1207 
   1208     //ALOGV("\tBassGetStrength Succesfully returned from LVM_GetControlParameters\n");
   1209 
   1210     /* Check that the strength returned matches the strength that was set earlier */
   1211     if(ActiveParams.BE_EffectLevel !=
   1212        (LVM_INT16)((15*pContext->pBundledContext->BassStrengthSaved)/1000)){
   1213         ALOGV("\tLVM_ERROR : BassGetStrength module strength does not match savedStrength %d %d\n",
   1214                 ActiveParams.BE_EffectLevel, pContext->pBundledContext->BassStrengthSaved);
   1215         return -EINVAL;
   1216     }
   1217 
   1218     //ALOGV("\tBassGetStrength() (0-15)   -> %d\n", ActiveParams.BE_EffectLevel );
   1219     //ALOGV("\tBassGetStrength() (saved)  -> %d\n", pContext->pBundledContext->BassStrengthSaved );
   1220     return pContext->pBundledContext->BassStrengthSaved;
   1221 }    /* end BassGetStrength */
   1222 
   1223 //----------------------------------------------------------------------------
   1224 // BassSetStrength()
   1225 //----------------------------------------------------------------------------
   1226 // Purpose:
   1227 // Apply the strength to the BassBosst. Must first be converted from the range 0-1000 to 1-15
   1228 //
   1229 // Inputs:
   1230 //  pContext:   effect engine context
   1231 //  strength    strength to be applied
   1232 //
   1233 //----------------------------------------------------------------------------
   1234 
   1235 void BassSetStrength(EffectContext *pContext, uint32_t strength){
   1236     //ALOGV("\tBassSetStrength(%d)", strength);
   1237 
   1238     pContext->pBundledContext->BassStrengthSaved = (int)strength;
   1239 
   1240     LVM_ControlParams_t     ActiveParams;              /* Current control Parameters */
   1241     LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;     /* Function call status */
   1242 
   1243     /* Get the current settings */
   1244     LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,
   1245                                          &ActiveParams);
   1246 
   1247     LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "BassSetStrength")
   1248     //ALOGV("\tBassSetStrength Succesfully returned from LVM_GetControlParameters\n");
   1249 
   1250     /* Bass Enhancement parameters */
   1251     ActiveParams.BE_EffectLevel    = (LVM_INT16)((15*strength)/1000);
   1252     ActiveParams.BE_CentreFreq     = LVM_BE_CENTRE_90Hz;
   1253 
   1254     //ALOGV("\tBassSetStrength() (0-15)   -> %d\n", ActiveParams.BE_EffectLevel );
   1255 
   1256     /* Activate the initial settings */
   1257     LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
   1258 
   1259     LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "BassSetStrength")
   1260     //ALOGV("\tBassSetStrength Succesfully called LVM_SetControlParameters\n");
   1261 
   1262     LvmEffect_limitLevel(pContext);
   1263 }    /* end BassSetStrength */
   1264 
   1265 //----------------------------------------------------------------------------
   1266 // VirtualizerGetStrength()
   1267 //----------------------------------------------------------------------------
   1268 // Purpose:
   1269 // get the effect strength currently being used, what is actually returned is the strengh that was
   1270 // previously used in the set, this is because the app uses a strength in the range 0-1000 while
   1271 // the Virtualizer uses 1-100, so to avoid a quantisation the original set value is used.However the
   1272 // actual used value is checked to make sure it corresponds to the one being returned
   1273 //
   1274 // Inputs:
   1275 //  pContext:   effect engine context
   1276 //
   1277 //----------------------------------------------------------------------------
   1278 
   1279 uint32_t VirtualizerGetStrength(EffectContext *pContext){
   1280     //ALOGV("\tVirtualizerGetStrength (0-1000) -> %d\n",pContext->pBundledContext->VirtStrengthSaved);
   1281 
   1282     LVM_ControlParams_t     ActiveParams;                           /* Current control Parameters */
   1283     LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
   1284 
   1285     LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
   1286 
   1287     LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VirtualizerGetStrength")
   1288     if(LvmStatus != LVM_SUCCESS) return -EINVAL;
   1289 
   1290     //ALOGV("\tVirtualizerGetStrength Succesfully returned from LVM_GetControlParameters\n");
   1291     //ALOGV("\tVirtualizerGetStrength() (0-100)   -> %d\n", ActiveParams.VirtualizerReverbLevel*10);
   1292     return pContext->pBundledContext->VirtStrengthSaved;
   1293 }    /* end getStrength */
   1294 
   1295 //----------------------------------------------------------------------------
   1296 // VirtualizerSetStrength()
   1297 //----------------------------------------------------------------------------
   1298 // Purpose:
   1299 // Apply the strength to the Virtualizer. Must first be converted from the range 0-1000 to 1-15
   1300 //
   1301 // Inputs:
   1302 //  pContext:   effect engine context
   1303 //  strength    strength to be applied
   1304 //
   1305 //----------------------------------------------------------------------------
   1306 
   1307 void VirtualizerSetStrength(EffectContext *pContext, uint32_t strength){
   1308     //ALOGV("\tVirtualizerSetStrength(%d)", strength);
   1309     LVM_ControlParams_t     ActiveParams;              /* Current control Parameters */
   1310     LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;     /* Function call status */
   1311 
   1312     pContext->pBundledContext->VirtStrengthSaved = (int)strength;
   1313 
   1314     /* Get the current settings */
   1315     LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,&ActiveParams);
   1316 
   1317     LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VirtualizerSetStrength")
   1318     //ALOGV("\tVirtualizerSetStrength Succesfully returned from LVM_GetControlParameters\n");
   1319 
   1320     /* Virtualizer parameters */
   1321     ActiveParams.CS_EffectLevel             = (int)((strength*32767)/1000);
   1322 
   1323     ALOGV("\tVirtualizerSetStrength() (0-1000)   -> %d\n", strength );
   1324     ALOGV("\tVirtualizerSetStrength() (0- 100)   -> %d\n", ActiveParams.CS_EffectLevel );
   1325 
   1326     /* Activate the initial settings */
   1327     LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
   1328     LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "VirtualizerSetStrength")
   1329     //ALOGV("\tVirtualizerSetStrength Succesfully called LVM_SetControlParameters\n\n");
   1330     LvmEffect_limitLevel(pContext);
   1331 }    /* end setStrength */
   1332 
   1333 //----------------------------------------------------------------------------
   1334 // VirtualizerIsDeviceSupported()
   1335 //----------------------------------------------------------------------------
   1336 // Purpose:
   1337 // Check if an audio device type is supported by this implementation
   1338 //
   1339 // Inputs:
   1340 //  deviceType   the type of device that affects the processing (e.g. for binaural vs transaural)
   1341 // Output:
   1342 //  -EINVAL      if the configuration is not supported or it is unknown
   1343 //  0            if the configuration is supported
   1344 //----------------------------------------------------------------------------
   1345 int VirtualizerIsDeviceSupported(audio_devices_t deviceType) {
   1346     switch (deviceType) {
   1347     case AUDIO_DEVICE_OUT_WIRED_HEADSET:
   1348     case AUDIO_DEVICE_OUT_WIRED_HEADPHONE:
   1349     case AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES:
   1350         return 0;
   1351     default :
   1352         return -EINVAL;
   1353     }
   1354 }
   1355 
   1356 //----------------------------------------------------------------------------
   1357 // VirtualizerIsConfigurationSupported()
   1358 //----------------------------------------------------------------------------
   1359 // Purpose:
   1360 // Check if a channel mask + audio device type is supported by this implementation
   1361 //
   1362 // Inputs:
   1363 //  channelMask  the channel mask of the input to virtualize
   1364 //  deviceType   the type of device that affects the processing (e.g. for binaural vs transaural)
   1365 // Output:
   1366 //  -EINVAL      if the configuration is not supported or it is unknown
   1367 //  0            if the configuration is supported
   1368 //----------------------------------------------------------------------------
   1369 int VirtualizerIsConfigurationSupported(audio_channel_mask_t channelMask,
   1370         audio_devices_t deviceType) {
   1371     uint32_t channelCount = audio_channel_count_from_out_mask(channelMask);
   1372     if ((channelCount == 0) || (channelCount > 2)) {
   1373         return -EINVAL;
   1374     }
   1375 
   1376     return VirtualizerIsDeviceSupported(deviceType);
   1377 }
   1378 
   1379 //----------------------------------------------------------------------------
   1380 // VirtualizerForceVirtualizationMode()
   1381 //----------------------------------------------------------------------------
   1382 // Purpose:
   1383 // Force the virtualization mode to that of the given audio device
   1384 //
   1385 // Inputs:
   1386 //  pContext     effect engine context
   1387 //  forcedDevice the type of device whose virtualization mode we'll always use
   1388 // Output:
   1389 //  -EINVAL      if the device is not supported or is unknown
   1390 //  0            if the device is supported and the virtualization mode forced
   1391 //
   1392 //----------------------------------------------------------------------------
   1393 int VirtualizerForceVirtualizationMode(EffectContext *pContext, audio_devices_t forcedDevice) {
   1394     ALOGV("VirtualizerForceVirtualizationMode: forcedDev=0x%x enabled=%d tmpDisabled=%d",
   1395             forcedDevice, pContext->pBundledContext->bVirtualizerEnabled,
   1396             pContext->pBundledContext->bVirtualizerTempDisabled);
   1397     int status = 0;
   1398     bool useVirtualizer = false;
   1399 
   1400     if (VirtualizerIsDeviceSupported(forcedDevice) != 0) {
   1401         if (forcedDevice != AUDIO_DEVICE_NONE) {
   1402             //forced device is not supported, make it behave as a reset of forced mode
   1403             forcedDevice = AUDIO_DEVICE_NONE;
   1404             // but return an error
   1405             status = -EINVAL;
   1406         }
   1407     }
   1408 
   1409     if (forcedDevice == AUDIO_DEVICE_NONE) {
   1410         // disabling forced virtualization mode:
   1411         // verify whether the virtualization should be enabled or disabled
   1412         if (VirtualizerIsDeviceSupported(pContext->pBundledContext->nOutputDevice) == 0) {
   1413             useVirtualizer = (pContext->pBundledContext->bVirtualizerEnabled == LVM_TRUE);
   1414         }
   1415         pContext->pBundledContext->nVirtualizerForcedDevice = AUDIO_DEVICE_NONE;
   1416     } else {
   1417         // forcing virtualization mode: here we already know the device is supported
   1418         pContext->pBundledContext->nVirtualizerForcedDevice = AUDIO_DEVICE_OUT_WIRED_HEADPHONE;
   1419         // only enable for a supported mode, when the effect is enabled
   1420         useVirtualizer = (pContext->pBundledContext->bVirtualizerEnabled == LVM_TRUE);
   1421     }
   1422 
   1423     if (useVirtualizer) {
   1424         if (pContext->pBundledContext->bVirtualizerTempDisabled == LVM_TRUE) {
   1425             ALOGV("\tVirtualizerForceVirtualizationMode re-enable LVM_VIRTUALIZER");
   1426             android::LvmEffect_enable(pContext);
   1427             pContext->pBundledContext->bVirtualizerTempDisabled = LVM_FALSE;
   1428         } else {
   1429             ALOGV("\tVirtualizerForceVirtualizationMode leaving LVM_VIRTUALIZER enabled");
   1430         }
   1431     } else {
   1432         if (pContext->pBundledContext->bVirtualizerTempDisabled == LVM_FALSE) {
   1433             ALOGV("\tVirtualizerForceVirtualizationMode disable LVM_VIRTUALIZER");
   1434             android::LvmEffect_disable(pContext);
   1435             pContext->pBundledContext->bVirtualizerTempDisabled = LVM_TRUE;
   1436         } else {
   1437             ALOGV("\tVirtualizerForceVirtualizationMode leaving LVM_VIRTUALIZER disabled");
   1438         }
   1439     }
   1440 
   1441     ALOGV("\tafter VirtualizerForceVirtualizationMode: enabled=%d tmpDisabled=%d",
   1442             pContext->pBundledContext->bVirtualizerEnabled,
   1443             pContext->pBundledContext->bVirtualizerTempDisabled);
   1444 
   1445     return status;
   1446 }
   1447 //----------------------------------------------------------------------------
   1448 // VirtualizerGetSpeakerAngles()
   1449 //----------------------------------------------------------------------------
   1450 // Purpose:
   1451 // Get the virtual speaker angles for a channel mask + audio device type
   1452 // configuration which is guaranteed to be supported by this implementation
   1453 //
   1454 // Inputs:
   1455 //  channelMask:   the channel mask of the input to virtualize
   1456 //  deviceType     the type of device that affects the processing (e.g. for binaural vs transaural)
   1457 // Input/Output:
   1458 //  pSpeakerAngles the array of integer where each speaker angle is written as a triplet in the
   1459 //                 following format:
   1460 //                    int32_t a bit mask with a single value selected for each speaker, following
   1461 //                            the convention of the audio_channel_mask_t type
   1462 //                    int32_t a value in degrees expressing the speaker azimuth, where 0 is in front
   1463 //                            of the user, 180 behind, -90 to the left, 90 to the right of the user
   1464 //                    int32_t a value in degrees expressing the speaker elevation, where 0 is the
   1465 //                            horizontal plane, +90 is directly above the user, -90 below
   1466 //
   1467 //----------------------------------------------------------------------------
   1468 void VirtualizerGetSpeakerAngles(audio_channel_mask_t channelMask __unused,
   1469         audio_devices_t deviceType __unused, int32_t *pSpeakerAngles) {
   1470     // the channel count is guaranteed to be 1 or 2
   1471     // the device is guaranteed to be of type headphone
   1472     // this virtualizer is always 2in with speakers at -90 and 90deg of azimuth, 0deg of elevation
   1473     *pSpeakerAngles++ = (int32_t) AUDIO_CHANNEL_OUT_FRONT_LEFT;
   1474     *pSpeakerAngles++ = -90; // azimuth
   1475     *pSpeakerAngles++ = 0;   // elevation
   1476     *pSpeakerAngles++ = (int32_t) AUDIO_CHANNEL_OUT_FRONT_RIGHT;
   1477     *pSpeakerAngles++ = 90;  // azimuth
   1478     *pSpeakerAngles   = 0;   // elevation
   1479 }
   1480 
   1481 //----------------------------------------------------------------------------
   1482 // VirtualizerGetVirtualizationMode()
   1483 //----------------------------------------------------------------------------
   1484 // Purpose:
   1485 // Retrieve the current device whose processing mode is used by this effect
   1486 //
   1487 // Output:
   1488 //   AUDIO_DEVICE_NONE if the effect is not virtualizing
   1489 //   or the device type if the effect is virtualizing
   1490 //----------------------------------------------------------------------------
   1491 audio_devices_t VirtualizerGetVirtualizationMode(EffectContext *pContext) {
   1492     audio_devices_t virtDevice = AUDIO_DEVICE_NONE;
   1493     if ((pContext->pBundledContext->bVirtualizerEnabled == LVM_TRUE)
   1494             && (pContext->pBundledContext->bVirtualizerTempDisabled == LVM_FALSE)) {
   1495         if (pContext->pBundledContext->nVirtualizerForcedDevice != AUDIO_DEVICE_NONE) {
   1496             // virtualization mode is forced, return that device
   1497             virtDevice = pContext->pBundledContext->nVirtualizerForcedDevice;
   1498         } else {
   1499             // no forced mode, return the current device
   1500             virtDevice = pContext->pBundledContext->nOutputDevice;
   1501         }
   1502     }
   1503     ALOGV("VirtualizerGetVirtualizationMode() returning 0x%x", virtDevice);
   1504     return virtDevice;
   1505 }
   1506 
   1507 //----------------------------------------------------------------------------
   1508 // EqualizerGetBandLevel()
   1509 //----------------------------------------------------------------------------
   1510 // Purpose: Retrieve the gain currently being used for the band passed in
   1511 //
   1512 // Inputs:
   1513 //  band:       band number
   1514 //  pContext:   effect engine context
   1515 //
   1516 // Outputs:
   1517 //
   1518 //----------------------------------------------------------------------------
   1519 int32_t EqualizerGetBandLevel(EffectContext *pContext, int32_t band){
   1520     //ALOGV("\tEqualizerGetBandLevel -> %d\n", pContext->pBundledContext->bandGaindB[band] );
   1521     return pContext->pBundledContext->bandGaindB[band] * 100;
   1522 }
   1523 
   1524 //----------------------------------------------------------------------------
   1525 // EqualizerSetBandLevel()
   1526 //----------------------------------------------------------------------------
   1527 // Purpose:
   1528 //  Sets gain value for the given band.
   1529 //
   1530 // Inputs:
   1531 //  band:       band number
   1532 //  Gain:       Gain to be applied in millibels
   1533 //  pContext:   effect engine context
   1534 //
   1535 // Outputs:
   1536 //
   1537 //---------------------------------------------------------------------------
   1538 void EqualizerSetBandLevel(EffectContext *pContext, int band, short Gain){
   1539     int gainRounded;
   1540     if(Gain > 0){
   1541         gainRounded = (int)((Gain+50)/100);
   1542     }else{
   1543         gainRounded = (int)((Gain-50)/100);
   1544     }
   1545     //ALOGV("\tEqualizerSetBandLevel(%d)->(%d)", Gain, gainRounded);
   1546     pContext->pBundledContext->bandGaindB[band] = gainRounded;
   1547     pContext->pBundledContext->CurPreset = PRESET_CUSTOM;
   1548 
   1549     EqualizerUpdateActiveParams(pContext);
   1550     LvmEffect_limitLevel(pContext);
   1551 }
   1552 
   1553 //----------------------------------------------------------------------------
   1554 // EqualizerGetCentreFrequency()
   1555 //----------------------------------------------------------------------------
   1556 // Purpose: Retrieve the frequency being used for the band passed in
   1557 //
   1558 // Inputs:
   1559 //  band:       band number
   1560 //  pContext:   effect engine context
   1561 //
   1562 // Outputs:
   1563 //
   1564 //----------------------------------------------------------------------------
   1565 int32_t EqualizerGetCentreFrequency(EffectContext *pContext, int32_t band){
   1566     int32_t Frequency =0;
   1567 
   1568     LVM_ControlParams_t     ActiveParams;                           /* Current control Parameters */
   1569     LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
   1570     LVM_EQNB_BandDef_t      *BandDef;
   1571     /* Get the current settings */
   1572     LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,
   1573                                          &ActiveParams);
   1574 
   1575     LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "EqualizerGetCentreFrequency")
   1576 
   1577     BandDef   = ActiveParams.pEQNB_BandDefinition;
   1578     Frequency = (int32_t)BandDef[band].Frequency*1000;     // Convert to millibels
   1579 
   1580     //ALOGV("\tEqualizerGetCentreFrequency -> %d\n", Frequency );
   1581     //ALOGV("\tEqualizerGetCentreFrequency Succesfully returned from LVM_GetControlParameters\n");
   1582     return Frequency;
   1583 }
   1584 
   1585 //----------------------------------------------------------------------------
   1586 // EqualizerGetBandFreqRange(
   1587 //----------------------------------------------------------------------------
   1588 // Purpose:
   1589 //
   1590 // Gets lower and upper boundaries of a band.
   1591 // For the high shelf, the low bound is the band frequency and the high
   1592 // bound is Nyquist.
   1593 // For the peaking filters, they are the gain[dB]/2 points.
   1594 //
   1595 // Inputs:
   1596 //  band:       band number
   1597 //  pContext:   effect engine context
   1598 //
   1599 // Outputs:
   1600 //  pLow:       lower band range
   1601 //  pLow:       upper band range
   1602 //----------------------------------------------------------------------------
   1603 int32_t EqualizerGetBandFreqRange(EffectContext *pContext __unused, int32_t band, uint32_t *pLow,
   1604                                   uint32_t *pHi){
   1605     *pLow = bandFreqRange[band][0];
   1606     *pHi  = bandFreqRange[band][1];
   1607     return 0;
   1608 }
   1609 
   1610 //----------------------------------------------------------------------------
   1611 // EqualizerGetBand(
   1612 //----------------------------------------------------------------------------
   1613 // Purpose:
   1614 //
   1615 // Returns the band with the maximum influence on a given frequency.
   1616 // Result is unaffected by whether EQ is enabled or not, or by whether
   1617 // changes have been committed or not.
   1618 //
   1619 // Inputs:
   1620 //  targetFreq   The target frequency, in millihertz.
   1621 //  pContext:    effect engine context
   1622 //
   1623 // Outputs:
   1624 //  pLow:       lower band range
   1625 //  pLow:       upper band range
   1626 //----------------------------------------------------------------------------
   1627 int32_t EqualizerGetBand(EffectContext *pContext __unused, uint32_t targetFreq){
   1628     int band = 0;
   1629 
   1630     if(targetFreq < bandFreqRange[0][0]){
   1631         return -EINVAL;
   1632     }else if(targetFreq == bandFreqRange[0][0]){
   1633         return 0;
   1634     }
   1635     for(int i=0; i<FIVEBAND_NUMBANDS;i++){
   1636         if((targetFreq > bandFreqRange[i][0])&&(targetFreq <= bandFreqRange[i][1])){
   1637             band = i;
   1638         }
   1639     }
   1640     return band;
   1641 }
   1642 
   1643 //----------------------------------------------------------------------------
   1644 // EqualizerGetPreset(
   1645 //----------------------------------------------------------------------------
   1646 // Purpose:
   1647 //
   1648 // Gets the currently set preset ID.
   1649 // Will return PRESET_CUSTOM in case the EQ parameters have been modified
   1650 // manually since a preset was set.
   1651 //
   1652 // Inputs:
   1653 //  pContext:    effect engine context
   1654 //
   1655 //----------------------------------------------------------------------------
   1656 int32_t EqualizerGetPreset(EffectContext *pContext){
   1657     return pContext->pBundledContext->CurPreset;
   1658 }
   1659 
   1660 //----------------------------------------------------------------------------
   1661 // EqualizerSetPreset(
   1662 //----------------------------------------------------------------------------
   1663 // Purpose:
   1664 //
   1665 // Sets the current preset by ID.
   1666 // All the band parameters will be overridden.
   1667 //
   1668 // Inputs:
   1669 //  pContext:    effect engine context
   1670 //  preset       The preset ID.
   1671 //
   1672 //----------------------------------------------------------------------------
   1673 void EqualizerSetPreset(EffectContext *pContext, int preset){
   1674 
   1675     //ALOGV("\tEqualizerSetPreset(%d)", preset);
   1676     pContext->pBundledContext->CurPreset = preset;
   1677 
   1678     //ActiveParams.pEQNB_BandDefinition = &BandDefs[0];
   1679     for (int i=0; i<FIVEBAND_NUMBANDS; i++)
   1680     {
   1681         pContext->pBundledContext->bandGaindB[i] =
   1682                 EQNB_5BandSoftPresets[i + preset * FIVEBAND_NUMBANDS];
   1683     }
   1684 
   1685     EqualizerUpdateActiveParams(pContext);
   1686     LvmEffect_limitLevel(pContext);
   1687 
   1688     //ALOGV("\tEqualizerSetPreset Succesfully called LVM_SetControlParameters\n");
   1689     return;
   1690 }
   1691 
   1692 int32_t EqualizerGetNumPresets(){
   1693     return sizeof(gEqualizerPresets) / sizeof(PresetConfig);
   1694 }
   1695 
   1696 //----------------------------------------------------------------------------
   1697 // EqualizerGetPresetName(
   1698 //----------------------------------------------------------------------------
   1699 // Purpose:
   1700 // Gets a human-readable name for a preset ID. Will return "Custom" if
   1701 // PRESET_CUSTOM is passed.
   1702 //
   1703 // Inputs:
   1704 // preset       The preset ID. Must be less than number of presets.
   1705 //
   1706 //-------------------------------------------------------------------------
   1707 const char * EqualizerGetPresetName(int32_t preset){
   1708     //ALOGV("\tEqualizerGetPresetName start(%d)", preset);
   1709     if (preset == PRESET_CUSTOM) {
   1710         return "Custom";
   1711     } else {
   1712         return gEqualizerPresets[preset].name;
   1713     }
   1714     //ALOGV("\tEqualizerGetPresetName end(%d)", preset);
   1715     return 0;
   1716 }
   1717 
   1718 //----------------------------------------------------------------------------
   1719 // VolumeSetVolumeLevel()
   1720 //----------------------------------------------------------------------------
   1721 // Purpose:
   1722 //
   1723 // Inputs:
   1724 //  pContext:   effect engine context
   1725 //  level       level to be applied
   1726 //
   1727 //----------------------------------------------------------------------------
   1728 
   1729 int VolumeSetVolumeLevel(EffectContext *pContext, int16_t level){
   1730 
   1731     if (level > 0 || level < -9600) {
   1732         return -EINVAL;
   1733     }
   1734 
   1735     if (pContext->pBundledContext->bMuteEnabled == LVM_TRUE) {
   1736         pContext->pBundledContext->levelSaved = level / 100;
   1737     } else {
   1738         pContext->pBundledContext->volume = level / 100;
   1739     }
   1740 
   1741     LvmEffect_limitLevel(pContext);
   1742 
   1743     return 0;
   1744 }    /* end VolumeSetVolumeLevel */
   1745 
   1746 //----------------------------------------------------------------------------
   1747 // VolumeGetVolumeLevel()
   1748 //----------------------------------------------------------------------------
   1749 // Purpose:
   1750 //
   1751 // Inputs:
   1752 //  pContext:   effect engine context
   1753 //
   1754 //----------------------------------------------------------------------------
   1755 
   1756 int VolumeGetVolumeLevel(EffectContext *pContext, int16_t *level){
   1757 
   1758     if (pContext->pBundledContext->bMuteEnabled == LVM_TRUE) {
   1759         *level = pContext->pBundledContext->levelSaved * 100;
   1760     } else {
   1761         *level = pContext->pBundledContext->volume * 100;
   1762     }
   1763     return 0;
   1764 }    /* end VolumeGetVolumeLevel */
   1765 
   1766 //----------------------------------------------------------------------------
   1767 // VolumeSetMute()
   1768 //----------------------------------------------------------------------------
   1769 // Purpose:
   1770 //
   1771 // Inputs:
   1772 //  pContext:   effect engine context
   1773 //  mute:       enable/disable flag
   1774 //
   1775 //----------------------------------------------------------------------------
   1776 
   1777 int32_t VolumeSetMute(EffectContext *pContext, uint32_t mute){
   1778     //ALOGV("\tVolumeSetMute start(%d)", mute);
   1779 
   1780     pContext->pBundledContext->bMuteEnabled = mute;
   1781 
   1782     /* Set appropriate volume level */
   1783     if(pContext->pBundledContext->bMuteEnabled == LVM_TRUE){
   1784         pContext->pBundledContext->levelSaved = pContext->pBundledContext->volume;
   1785         pContext->pBundledContext->volume = -96;
   1786     }else{
   1787         pContext->pBundledContext->volume = pContext->pBundledContext->levelSaved;
   1788     }
   1789 
   1790     LvmEffect_limitLevel(pContext);
   1791 
   1792     return 0;
   1793 }    /* end setMute */
   1794 
   1795 //----------------------------------------------------------------------------
   1796 // VolumeGetMute()
   1797 //----------------------------------------------------------------------------
   1798 // Purpose:
   1799 //
   1800 // Inputs:
   1801 //  pContext:   effect engine context
   1802 //
   1803 // Ourputs:
   1804 //  mute:       enable/disable flag
   1805 //----------------------------------------------------------------------------
   1806 
   1807 int32_t VolumeGetMute(EffectContext *pContext, uint32_t *mute){
   1808     //ALOGV("\tVolumeGetMute start");
   1809     if((pContext->pBundledContext->bMuteEnabled == LVM_FALSE)||
   1810        (pContext->pBundledContext->bMuteEnabled == LVM_TRUE)){
   1811         *mute = pContext->pBundledContext->bMuteEnabled;
   1812         return 0;
   1813     }else{
   1814         ALOGV("\tLVM_ERROR : VolumeGetMute read an invalid value from context %d",
   1815               pContext->pBundledContext->bMuteEnabled);
   1816         return -EINVAL;
   1817     }
   1818     //ALOGV("\tVolumeGetMute end");
   1819 }    /* end getMute */
   1820 
   1821 int16_t VolumeConvertStereoPosition(int16_t position){
   1822     int16_t convertedPosition = 0;
   1823 
   1824     convertedPosition = (int16_t)(((float)position/1000)*96);
   1825     return convertedPosition;
   1826 
   1827 }
   1828 
   1829 //----------------------------------------------------------------------------
   1830 // VolumeSetStereoPosition()
   1831 //----------------------------------------------------------------------------
   1832 // Purpose:
   1833 //
   1834 // Inputs:
   1835 //  pContext:       effect engine context
   1836 //  position:       stereo position
   1837 //
   1838 // Outputs:
   1839 //----------------------------------------------------------------------------
   1840 
   1841 int VolumeSetStereoPosition(EffectContext *pContext, int16_t position){
   1842 
   1843     LVM_ControlParams_t     ActiveParams;              /* Current control Parameters */
   1844     LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;     /* Function call status */
   1845     LVM_INT16               Balance = 0;
   1846 
   1847 
   1848 
   1849     pContext->pBundledContext->positionSaved = position;
   1850     Balance = VolumeConvertStereoPosition(pContext->pBundledContext->positionSaved);
   1851 
   1852     //ALOGV("\tVolumeSetStereoPosition start pContext->pBundledContext->positionSaved = %d",
   1853     //pContext->pBundledContext->positionSaved);
   1854 
   1855     if(pContext->pBundledContext->bStereoPositionEnabled == LVM_TRUE){
   1856 
   1857         //ALOGV("\tVolumeSetStereoPosition Position to be set is %d %d\n", position, Balance);
   1858         pContext->pBundledContext->positionSaved = position;
   1859         /* Get the current settings */
   1860         LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
   1861         LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VolumeSetStereoPosition")
   1862         if(LvmStatus != LVM_SUCCESS) return -EINVAL;
   1863         //ALOGV("\tVolumeSetStereoPosition Succesfully returned from LVM_GetControlParameters got:"
   1864         //     " %d\n", ActiveParams.VC_Balance);
   1865 
   1866         /* Volume parameters */
   1867         ActiveParams.VC_Balance  = Balance;
   1868         //ALOGV("\tVolumeSetStereoPosition() (-96dB -> +96dB)   -> %d\n", ActiveParams.VC_Balance );
   1869 
   1870         /* Activate the initial settings */
   1871         LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
   1872         LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "VolumeSetStereoPosition")
   1873         if(LvmStatus != LVM_SUCCESS) return -EINVAL;
   1874 
   1875         //ALOGV("\tVolumeSetStereoPosition Succesfully called LVM_SetControlParameters\n");
   1876 
   1877         /* Get the current settings */
   1878         LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
   1879         LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VolumeSetStereoPosition")
   1880         if(LvmStatus != LVM_SUCCESS) return -EINVAL;
   1881         //ALOGV("\tVolumeSetStereoPosition Succesfully returned from LVM_GetControlParameters got: "
   1882         //     "%d\n", ActiveParams.VC_Balance);
   1883     }
   1884     else{
   1885         //ALOGV("\tVolumeSetStereoPosition Position attempting to set, but not enabled %d %d\n",
   1886         //position, Balance);
   1887     }
   1888     //ALOGV("\tVolumeSetStereoPosition end pContext->pBundledContext->positionSaved = %d\n",
   1889     //pContext->pBundledContext->positionSaved);
   1890     return 0;
   1891 }    /* end VolumeSetStereoPosition */
   1892 
   1893 
   1894 //----------------------------------------------------------------------------
   1895 // VolumeGetStereoPosition()
   1896 //----------------------------------------------------------------------------
   1897 // Purpose:
   1898 //
   1899 // Inputs:
   1900 //  pContext:       effect engine context
   1901 //
   1902 // Outputs:
   1903 //  position:       stereo position
   1904 //----------------------------------------------------------------------------
   1905 
   1906 int32_t VolumeGetStereoPosition(EffectContext *pContext, int16_t *position){
   1907     //ALOGV("\tVolumeGetStereoPosition start");
   1908 
   1909     LVM_ControlParams_t     ActiveParams;                           /* Current control Parameters */
   1910     LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
   1911     LVM_INT16               balance;
   1912 
   1913     //ALOGV("\tVolumeGetStereoPosition start pContext->pBundledContext->positionSaved = %d",
   1914     //pContext->pBundledContext->positionSaved);
   1915 
   1916     LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
   1917     LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VolumeGetStereoPosition")
   1918     if(LvmStatus != LVM_SUCCESS) return -EINVAL;
   1919 
   1920     //ALOGV("\tVolumeGetStereoPosition -> %d\n", ActiveParams.VC_Balance);
   1921     //ALOGV("\tVolumeGetStereoPosition Succesfully returned from LVM_GetControlParameters\n");
   1922 
   1923     balance = VolumeConvertStereoPosition(pContext->pBundledContext->positionSaved);
   1924 
   1925     if(pContext->pBundledContext->bStereoPositionEnabled == LVM_TRUE){
   1926         if(balance != ActiveParams.VC_Balance){
   1927             return -EINVAL;
   1928         }
   1929     }
   1930     *position = (LVM_INT16)pContext->pBundledContext->positionSaved;     // Convert dB to millibels
   1931     //ALOGV("\tVolumeGetStereoPosition end returning pContext->pBundledContext->positionSaved =%d\n",
   1932     //pContext->pBundledContext->positionSaved);
   1933     return 0;
   1934 }    /* end VolumeGetStereoPosition */
   1935 
   1936 //----------------------------------------------------------------------------
   1937 // VolumeEnableStereoPosition()
   1938 //----------------------------------------------------------------------------
   1939 // Purpose:
   1940 //
   1941 // Inputs:
   1942 //  pContext:   effect engine context
   1943 //  mute:       enable/disable flag
   1944 //
   1945 //----------------------------------------------------------------------------
   1946 
   1947 int32_t VolumeEnableStereoPosition(EffectContext *pContext, uint32_t enabled){
   1948     //ALOGV("\tVolumeEnableStereoPosition start()");
   1949 
   1950     pContext->pBundledContext->bStereoPositionEnabled = enabled;
   1951 
   1952     LVM_ControlParams_t     ActiveParams;              /* Current control Parameters */
   1953     LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;     /* Function call status */
   1954 
   1955     /* Get the current settings */
   1956     LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
   1957     LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VolumeEnableStereoPosition")
   1958     if(LvmStatus != LVM_SUCCESS) return -EINVAL;
   1959 
   1960     //ALOGV("\tVolumeEnableStereoPosition Succesfully returned from LVM_GetControlParameters\n");
   1961     //ALOGV("\tVolumeEnableStereoPosition to %d, position was %d\n",
   1962     //     enabled, ActiveParams.VC_Balance );
   1963 
   1964     /* Set appropriate stereo position */
   1965     if(pContext->pBundledContext->bStereoPositionEnabled == LVM_FALSE){
   1966         ActiveParams.VC_Balance = 0;
   1967     }else{
   1968         ActiveParams.VC_Balance  =
   1969                             VolumeConvertStereoPosition(pContext->pBundledContext->positionSaved);
   1970     }
   1971 
   1972     /* Activate the initial settings */
   1973     LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
   1974     LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "VolumeEnableStereoPosition")
   1975     if(LvmStatus != LVM_SUCCESS) return -EINVAL;
   1976 
   1977     //ALOGV("\tVolumeEnableStereoPosition Succesfully called LVM_SetControlParameters\n");
   1978     //ALOGV("\tVolumeEnableStereoPosition end()\n");
   1979     return 0;
   1980 }    /* end VolumeEnableStereoPosition */
   1981 
   1982 //----------------------------------------------------------------------------
   1983 // BassBoost_getParameter()
   1984 //----------------------------------------------------------------------------
   1985 // Purpose:
   1986 // Get a BassBoost parameter
   1987 //
   1988 // Inputs:
   1989 //  pBassBoost       - handle to instance data
   1990 //  pParam           - pointer to parameter
   1991 //  pValue           - pointer to variable to hold retrieved value
   1992 //  pValueSize       - pointer to value size: maximum size as input
   1993 //
   1994 // Outputs:
   1995 //  *pValue updated with parameter value
   1996 //  *pValueSize updated with actual value size
   1997 //
   1998 //
   1999 // Side Effects:
   2000 //
   2001 //----------------------------------------------------------------------------
   2002 
   2003 int BassBoost_getParameter(EffectContext     *pContext,
   2004                            void              *pParam,
   2005                            uint32_t          *pValueSize,
   2006                            void              *pValue){
   2007     int status = 0;
   2008     int32_t *pParamTemp = (int32_t *)pParam;
   2009     int32_t param = *pParamTemp++;
   2010     int32_t param2;
   2011     char *name;
   2012 
   2013     //ALOGV("\tBassBoost_getParameter start");
   2014 
   2015     switch (param){
   2016         case BASSBOOST_PARAM_STRENGTH_SUPPORTED:
   2017             if (*pValueSize != sizeof(uint32_t)){
   2018                 ALOGV("\tLVM_ERROR : BassBoost_getParameter() invalid pValueSize1 %d", *pValueSize);
   2019                 return -EINVAL;
   2020             }
   2021             *pValueSize = sizeof(uint32_t);
   2022             break;
   2023         case BASSBOOST_PARAM_STRENGTH:
   2024             if (*pValueSize != sizeof(int16_t)){
   2025                 ALOGV("\tLVM_ERROR : BassBoost_getParameter() invalid pValueSize2 %d", *pValueSize);
   2026                 return -EINVAL;
   2027             }
   2028             *pValueSize = sizeof(int16_t);
   2029             break;
   2030 
   2031         default:
   2032             ALOGV("\tLVM_ERROR : BassBoost_getParameter() invalid param %d", param);
   2033             return -EINVAL;
   2034     }
   2035 
   2036     switch (param){
   2037         case BASSBOOST_PARAM_STRENGTH_SUPPORTED:
   2038             *(uint32_t *)pValue = 1;
   2039 
   2040             //ALOGV("\tBassBoost_getParameter() BASSBOOST_PARAM_STRENGTH_SUPPORTED Value is %d",
   2041             //        *(uint32_t *)pValue);
   2042             break;
   2043 
   2044         case BASSBOOST_PARAM_STRENGTH:
   2045             *(int16_t *)pValue = BassGetStrength(pContext);
   2046 
   2047             //ALOGV("\tBassBoost_getParameter() BASSBOOST_PARAM_STRENGTH Value is %d",
   2048             //        *(int16_t *)pValue);
   2049             break;
   2050 
   2051         default:
   2052             ALOGV("\tLVM_ERROR : BassBoost_getParameter() invalid param %d", param);
   2053             status = -EINVAL;
   2054             break;
   2055     }
   2056 
   2057     //ALOGV("\tBassBoost_getParameter end");
   2058     return status;
   2059 } /* end BassBoost_getParameter */
   2060 
   2061 //----------------------------------------------------------------------------
   2062 // BassBoost_setParameter()
   2063 //----------------------------------------------------------------------------
   2064 // Purpose:
   2065 // Set a BassBoost parameter
   2066 //
   2067 // Inputs:
   2068 //  pBassBoost       - handle to instance data
   2069 //  pParam           - pointer to parameter
   2070 //  pValue           - pointer to value
   2071 //
   2072 // Outputs:
   2073 //
   2074 //----------------------------------------------------------------------------
   2075 
   2076 int BassBoost_setParameter (EffectContext *pContext, void *pParam, void *pValue){
   2077     int status = 0;
   2078     int16_t strength;
   2079     int32_t *pParamTemp = (int32_t *)pParam;
   2080 
   2081     //ALOGV("\tBassBoost_setParameter start");
   2082 
   2083     switch (*pParamTemp){
   2084         case BASSBOOST_PARAM_STRENGTH:
   2085             strength = *(int16_t *)pValue;
   2086             //ALOGV("\tBassBoost_setParameter() BASSBOOST_PARAM_STRENGTH value is %d", strength);
   2087             //ALOGV("\tBassBoost_setParameter() Calling pBassBoost->BassSetStrength");
   2088             BassSetStrength(pContext, (int32_t)strength);
   2089             //ALOGV("\tBassBoost_setParameter() Called pBassBoost->BassSetStrength");
   2090            break;
   2091         default:
   2092             ALOGV("\tLVM_ERROR : BassBoost_setParameter() invalid param %d", *pParamTemp);
   2093             break;
   2094     }
   2095 
   2096     //ALOGV("\tBassBoost_setParameter end");
   2097     return status;
   2098 } /* end BassBoost_setParameter */
   2099 
   2100 //----------------------------------------------------------------------------
   2101 // Virtualizer_getParameter()
   2102 //----------------------------------------------------------------------------
   2103 // Purpose:
   2104 // Get a Virtualizer parameter
   2105 //
   2106 // Inputs:
   2107 //  pVirtualizer     - handle to instance data
   2108 //  pParam           - pointer to parameter
   2109 //  pValue           - pointer to variable to hold retrieved value
   2110 //  pValueSize       - pointer to value size: maximum size as input
   2111 //
   2112 // Outputs:
   2113 //  *pValue updated with parameter value
   2114 //  *pValueSize updated with actual value size
   2115 //
   2116 //
   2117 // Side Effects:
   2118 //
   2119 //----------------------------------------------------------------------------
   2120 
   2121 int Virtualizer_getParameter(EffectContext        *pContext,
   2122                              void                 *pParam,
   2123                              uint32_t             *pValueSize,
   2124                              void                 *pValue){
   2125     int status = 0;
   2126     int32_t *pParamTemp = (int32_t *)pParam;
   2127     int32_t param = *pParamTemp++;
   2128     char *name;
   2129 
   2130     //ALOGV("\tVirtualizer_getParameter start");
   2131 
   2132     switch (param){
   2133         case VIRTUALIZER_PARAM_STRENGTH_SUPPORTED:
   2134             if (*pValueSize != sizeof(uint32_t)){
   2135                 ALOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid pValueSize %d",*pValueSize);
   2136                 return -EINVAL;
   2137             }
   2138             *pValueSize = sizeof(uint32_t);
   2139             break;
   2140         case VIRTUALIZER_PARAM_STRENGTH:
   2141             if (*pValueSize != sizeof(int16_t)){
   2142                 ALOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid pValueSize2 %d",*pValueSize);
   2143                 return -EINVAL;
   2144             }
   2145             *pValueSize = sizeof(int16_t);
   2146             break;
   2147         case VIRTUALIZER_PARAM_VIRTUAL_SPEAKER_ANGLES:
   2148             // return value size can only be interpreted as relative to input value,
   2149             // deferring validity check to below
   2150             break;
   2151         case VIRTUALIZER_PARAM_VIRTUALIZATION_MODE:
   2152             if (*pValueSize != sizeof(uint32_t)){
   2153                 ALOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid pValueSize %d",*pValueSize);
   2154                 return -EINVAL;
   2155             }
   2156             *pValueSize = sizeof(uint32_t);
   2157             break;
   2158         default:
   2159             ALOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid param %d", param);
   2160             return -EINVAL;
   2161     }
   2162 
   2163     switch (param){
   2164         case VIRTUALIZER_PARAM_STRENGTH_SUPPORTED:
   2165             *(uint32_t *)pValue = 1;
   2166 
   2167             //ALOGV("\tVirtualizer_getParameter() VIRTUALIZER_PARAM_STRENGTH_SUPPORTED Value is %d",
   2168             //        *(uint32_t *)pValue);
   2169             break;
   2170 
   2171         case VIRTUALIZER_PARAM_STRENGTH:
   2172             *(int16_t *)pValue = VirtualizerGetStrength(pContext);
   2173 
   2174             //ALOGV("\tVirtualizer_getParameter() VIRTUALIZER_PARAM_STRENGTH Value is %d",
   2175             //        *(int16_t *)pValue);
   2176             break;
   2177 
   2178         case VIRTUALIZER_PARAM_VIRTUAL_SPEAKER_ANGLES: {
   2179             const audio_channel_mask_t channelMask = (audio_channel_mask_t) *pParamTemp++;
   2180             const audio_devices_t deviceType = (audio_devices_t) *pParamTemp;
   2181             uint32_t nbChannels = audio_channel_count_from_out_mask(channelMask);
   2182             if (*pValueSize < 3 * nbChannels * sizeof(int32_t)){
   2183                 ALOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid pValueSize %d",*pValueSize);
   2184                 return -EINVAL;
   2185             }
   2186             // verify the configuration is supported
   2187             status = VirtualizerIsConfigurationSupported(channelMask, deviceType);
   2188             if (status == 0) {
   2189                 ALOGV("VIRTUALIZER_PARAM_VIRTUAL_SPEAKER_ANGLES supports mask=0x%x device=0x%x",
   2190                         channelMask, deviceType);
   2191                 // configuration is supported, get the angles
   2192                 VirtualizerGetSpeakerAngles(channelMask, deviceType, (int32_t *)pValue);
   2193             }
   2194             }
   2195             break;
   2196 
   2197         case VIRTUALIZER_PARAM_VIRTUALIZATION_MODE:
   2198             *(uint32_t *)pValue  = (uint32_t) VirtualizerGetVirtualizationMode(pContext);
   2199             break;
   2200 
   2201         default:
   2202             ALOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid param %d", param);
   2203             status = -EINVAL;
   2204             break;
   2205     }
   2206 
   2207     ALOGV("\tVirtualizer_getParameter end returning status=%d", status);
   2208     return status;
   2209 } /* end Virtualizer_getParameter */
   2210 
   2211 //----------------------------------------------------------------------------
   2212 // Virtualizer_setParameter()
   2213 //----------------------------------------------------------------------------
   2214 // Purpose:
   2215 // Set a Virtualizer parameter
   2216 //
   2217 // Inputs:
   2218 //  pVirtualizer     - handle to instance data
   2219 //  pParam           - pointer to parameter
   2220 //  pValue           - pointer to value
   2221 //
   2222 // Outputs:
   2223 //
   2224 //----------------------------------------------------------------------------
   2225 
   2226 int Virtualizer_setParameter (EffectContext *pContext, void *pParam, void *pValue){
   2227     int status = 0;
   2228     int16_t strength;
   2229     int32_t *pParamTemp = (int32_t *)pParam;
   2230     int32_t param = *pParamTemp++;
   2231 
   2232     //ALOGV("\tVirtualizer_setParameter start");
   2233 
   2234     switch (param){
   2235         case VIRTUALIZER_PARAM_STRENGTH:
   2236             strength = *(int16_t *)pValue;
   2237             //ALOGV("\tVirtualizer_setParameter() VIRTUALIZER_PARAM_STRENGTH value is %d", strength);
   2238             //ALOGV("\tVirtualizer_setParameter() Calling pVirtualizer->setStrength");
   2239             VirtualizerSetStrength(pContext, (int32_t)strength);
   2240             //ALOGV("\tVirtualizer_setParameter() Called pVirtualizer->setStrength");
   2241            break;
   2242 
   2243         case VIRTUALIZER_PARAM_FORCE_VIRTUALIZATION_MODE: {
   2244             const audio_devices_t deviceType = *(audio_devices_t *) pValue;
   2245             status = VirtualizerForceVirtualizationMode(pContext, deviceType);
   2246             //ALOGV("VIRTUALIZER_PARAM_FORCE_VIRTUALIZATION_MODE device=0x%x result=%d",
   2247             //        deviceType, status);
   2248             }
   2249             break;
   2250 
   2251         default:
   2252             ALOGV("\tLVM_ERROR : Virtualizer_setParameter() invalid param %d", param);
   2253             break;
   2254     }
   2255 
   2256     //ALOGV("\tVirtualizer_setParameter end");
   2257     return status;
   2258 } /* end Virtualizer_setParameter */
   2259 
   2260 //----------------------------------------------------------------------------
   2261 // Equalizer_getParameter()
   2262 //----------------------------------------------------------------------------
   2263 // Purpose:
   2264 // Get a Equalizer parameter
   2265 //
   2266 // Inputs:
   2267 //  pEqualizer       - handle to instance data
   2268 //  pParam           - pointer to parameter
   2269 //  pValue           - pointer to variable to hold retrieved value
   2270 //  pValueSize       - pointer to value size: maximum size as input
   2271 //
   2272 // Outputs:
   2273 //  *pValue updated with parameter value
   2274 //  *pValueSize updated with actual value size
   2275 //
   2276 //
   2277 // Side Effects:
   2278 //
   2279 //----------------------------------------------------------------------------
   2280 int Equalizer_getParameter(EffectContext     *pContext,
   2281                            void              *pParam,
   2282                            uint32_t          *pValueSize,
   2283                            void              *pValue){
   2284     int status = 0;
   2285     int bMute = 0;
   2286     int32_t *pParamTemp = (int32_t *)pParam;
   2287     int32_t param = *pParamTemp++;
   2288     int32_t param2;
   2289     char *name;
   2290 
   2291     //ALOGV("\tEqualizer_getParameter start");
   2292 
   2293     switch (param) {
   2294     case EQ_PARAM_NUM_BANDS:
   2295     case EQ_PARAM_CUR_PRESET:
   2296     case EQ_PARAM_GET_NUM_OF_PRESETS:
   2297     case EQ_PARAM_BAND_LEVEL:
   2298     case EQ_PARAM_GET_BAND:
   2299         if (*pValueSize < sizeof(int16_t)) {
   2300             ALOGV("\tLVM_ERROR : Equalizer_getParameter() invalid pValueSize 1  %d", *pValueSize);
   2301             return -EINVAL;
   2302         }
   2303         *pValueSize = sizeof(int16_t);
   2304         break;
   2305 
   2306     case EQ_PARAM_LEVEL_RANGE:
   2307         if (*pValueSize < 2 * sizeof(int16_t)) {
   2308             ALOGV("\tLVM_ERROR : Equalizer_getParameter() invalid pValueSize 2  %d", *pValueSize);
   2309             return -EINVAL;
   2310         }
   2311         *pValueSize = 2 * sizeof(int16_t);
   2312         break;
   2313     case EQ_PARAM_BAND_FREQ_RANGE:
   2314         if (*pValueSize < 2 * sizeof(int32_t)) {
   2315             ALOGV("\tLVM_ERROR : Equalizer_getParameter() invalid pValueSize 3  %d", *pValueSize);
   2316             return -EINVAL;
   2317         }
   2318         *pValueSize = 2 * sizeof(int32_t);
   2319         break;
   2320 
   2321     case EQ_PARAM_CENTER_FREQ:
   2322         if (*pValueSize < sizeof(int32_t)) {
   2323             ALOGV("\tLVM_ERROR : Equalizer_getParameter() invalid pValueSize 5  %d", *pValueSize);
   2324             return -EINVAL;
   2325         }
   2326         *pValueSize = sizeof(int32_t);
   2327         break;
   2328 
   2329     case EQ_PARAM_GET_PRESET_NAME:
   2330         break;
   2331 
   2332     case EQ_PARAM_PROPERTIES:
   2333         if (*pValueSize < (2 + FIVEBAND_NUMBANDS) * sizeof(uint16_t)) {
   2334             ALOGV("\tLVM_ERROR : Equalizer_getParameter() invalid pValueSize 1  %d", *pValueSize);
   2335             return -EINVAL;
   2336         }
   2337         *pValueSize = (2 + FIVEBAND_NUMBANDS) * sizeof(uint16_t);
   2338         break;
   2339 
   2340     default:
   2341         ALOGV("\tLVM_ERROR : Equalizer_getParameter unknown param %d", param);
   2342         return -EINVAL;
   2343     }
   2344 
   2345     switch (param) {
   2346     case EQ_PARAM_NUM_BANDS:
   2347         *(uint16_t *)pValue = (uint16_t)FIVEBAND_NUMBANDS;
   2348         //ALOGV("\tEqualizer_getParameter() EQ_PARAM_NUM_BANDS %d", *(int16_t *)pValue);
   2349         break;
   2350 
   2351     case EQ_PARAM_LEVEL_RANGE:
   2352         *(int16_t *)pValue = -1500;
   2353         *((int16_t *)pValue + 1) = 1500;
   2354         //ALOGV("\tEqualizer_getParameter() EQ_PARAM_LEVEL_RANGE min %d, max %d",
   2355         //      *(int16_t *)pValue, *((int16_t *)pValue + 1));
   2356         break;
   2357 
   2358     case EQ_PARAM_BAND_LEVEL:
   2359         param2 = *pParamTemp;
   2360         if (param2 >= FIVEBAND_NUMBANDS) {
   2361             status = -EINVAL;
   2362             break;
   2363         }
   2364         *(int16_t *)pValue = (int16_t)EqualizerGetBandLevel(pContext, param2);
   2365         //ALOGV("\tEqualizer_getParameter() EQ_PARAM_BAND_LEVEL band %d, level %d",
   2366         //      param2, *(int32_t *)pValue);
   2367         break;
   2368 
   2369     case EQ_PARAM_CENTER_FREQ:
   2370         param2 = *pParamTemp;
   2371         if (param2 >= FIVEBAND_NUMBANDS) {
   2372             status = -EINVAL;
   2373             break;
   2374         }
   2375         *(int32_t *)pValue = EqualizerGetCentreFrequency(pContext, param2);
   2376         //ALOGV("\tEqualizer_getParameter() EQ_PARAM_CENTER_FREQ band %d, frequency %d",
   2377         //      param2, *(int32_t *)pValue);
   2378         break;
   2379 
   2380     case EQ_PARAM_BAND_FREQ_RANGE:
   2381         param2 = *pParamTemp;
   2382         if (param2 >= FIVEBAND_NUMBANDS) {
   2383             status = -EINVAL;
   2384             break;
   2385         }
   2386         EqualizerGetBandFreqRange(pContext, param2, (uint32_t *)pValue, ((uint32_t *)pValue + 1));
   2387         //ALOGV("\tEqualizer_getParameter() EQ_PARAM_BAND_FREQ_RANGE band %d, min %d, max %d",
   2388         //      param2, *(int32_t *)pValue, *((int32_t *)pValue + 1));
   2389         break;
   2390 
   2391     case EQ_PARAM_GET_BAND:
   2392         param2 = *pParamTemp;
   2393         *(uint16_t *)pValue = (uint16_t)EqualizerGetBand(pContext, param2);
   2394         //ALOGV("\tEqualizer_getParameter() EQ_PARAM_GET_BAND frequency %d, band %d",
   2395         //      param2, *(uint16_t *)pValue);
   2396         break;
   2397 
   2398     case EQ_PARAM_CUR_PRESET:
   2399         *(uint16_t *)pValue = (uint16_t)EqualizerGetPreset(pContext);
   2400         //ALOGV("\tEqualizer_getParameter() EQ_PARAM_CUR_PRESET %d", *(int32_t *)pValue);
   2401         break;
   2402 
   2403     case EQ_PARAM_GET_NUM_OF_PRESETS:
   2404         *(uint16_t *)pValue = (uint16_t)EqualizerGetNumPresets();
   2405         //ALOGV("\tEqualizer_getParameter() EQ_PARAM_GET_NUM_OF_PRESETS %d", *(int16_t *)pValue);
   2406         break;
   2407 
   2408     case EQ_PARAM_GET_PRESET_NAME:
   2409         param2 = *pParamTemp;
   2410         if (param2 >= EqualizerGetNumPresets()) {
   2411         //if (param2 >= 20) {     // AGO FIX
   2412             status = -EINVAL;
   2413             break;
   2414         }
   2415         name = (char *)pValue;
   2416         strncpy(name, EqualizerGetPresetName(param2), *pValueSize - 1);
   2417         name[*pValueSize - 1] = 0;
   2418         *pValueSize = strlen(name) + 1;
   2419         //ALOGV("\tEqualizer_getParameter() EQ_PARAM_GET_PRESET_NAME preset %d, name %s len %d",
   2420         //      param2, gEqualizerPresets[param2].name, *pValueSize);
   2421         break;
   2422 
   2423     case EQ_PARAM_PROPERTIES: {
   2424         int16_t *p = (int16_t *)pValue;
   2425         ALOGV("\tEqualizer_getParameter() EQ_PARAM_PROPERTIES");
   2426         p[0] = (int16_t)EqualizerGetPreset(pContext);
   2427         p[1] = (int16_t)FIVEBAND_NUMBANDS;
   2428         for (int i = 0; i < FIVEBAND_NUMBANDS; i++) {
   2429             p[2 + i] = (int16_t)EqualizerGetBandLevel(pContext, i);
   2430         }
   2431     } break;
   2432 
   2433     default:
   2434         ALOGV("\tLVM_ERROR : Equalizer_getParameter() invalid param %d", param);
   2435         status = -EINVAL;
   2436         break;
   2437     }
   2438 
   2439     //GV("\tEqualizer_getParameter end\n");
   2440     return status;
   2441 } /* end Equalizer_getParameter */
   2442 
   2443 //----------------------------------------------------------------------------
   2444 // Equalizer_setParameter()
   2445 //----------------------------------------------------------------------------
   2446 // Purpose:
   2447 // Set a Equalizer parameter
   2448 //
   2449 // Inputs:
   2450 //  pEqualizer    - handle to instance data
   2451 //  pParam        - pointer to parameter
   2452 //  pValue        - pointer to value
   2453 //
   2454 // Outputs:
   2455 //
   2456 //----------------------------------------------------------------------------
   2457 int Equalizer_setParameter (EffectContext *pContext, void *pParam, void *pValue){
   2458     int status = 0;
   2459     int32_t preset;
   2460     int32_t band;
   2461     int32_t level;
   2462     int32_t *pParamTemp = (int32_t *)pParam;
   2463     int32_t param = *pParamTemp++;
   2464 
   2465 
   2466     //ALOGV("\tEqualizer_setParameter start");
   2467     switch (param) {
   2468     case EQ_PARAM_CUR_PRESET:
   2469         preset = (int32_t)(*(uint16_t *)pValue);
   2470 
   2471         //ALOGV("\tEqualizer_setParameter() EQ_PARAM_CUR_PRESET %d", preset);
   2472         if ((preset >= EqualizerGetNumPresets())||(preset < 0)) {
   2473             status = -EINVAL;
   2474             break;
   2475         }
   2476         EqualizerSetPreset(pContext, preset);
   2477         break;
   2478     case EQ_PARAM_BAND_LEVEL:
   2479         band =  *pParamTemp;
   2480         level = (int32_t)(*(int16_t *)pValue);
   2481         //ALOGV("\tEqualizer_setParameter() EQ_PARAM_BAND_LEVEL band %d, level %d", band, level);
   2482         if (band >= FIVEBAND_NUMBANDS) {
   2483             status = -EINVAL;
   2484             break;
   2485         }
   2486         EqualizerSetBandLevel(pContext, band, level);
   2487         break;
   2488     case EQ_PARAM_PROPERTIES: {
   2489         //ALOGV("\tEqualizer_setParameter() EQ_PARAM_PROPERTIES");
   2490         int16_t *p = (int16_t *)pValue;
   2491         if ((int)p[0] >= EqualizerGetNumPresets()) {
   2492             status = -EINVAL;
   2493             break;
   2494         }
   2495         if (p[0] >= 0) {
   2496             EqualizerSetPreset(pContext, (int)p[0]);
   2497         } else {
   2498             if ((int)p[1] != FIVEBAND_NUMBANDS) {
   2499                 status = -EINVAL;
   2500                 break;
   2501             }
   2502             for (int i = 0; i < FIVEBAND_NUMBANDS; i++) {
   2503                 EqualizerSetBandLevel(pContext, i, (int)p[2 + i]);
   2504             }
   2505         }
   2506     } break;
   2507     default:
   2508         ALOGV("\tLVM_ERROR : Equalizer_setParameter() invalid param %d", param);
   2509         status = -EINVAL;
   2510         break;
   2511     }
   2512 
   2513     //ALOGV("\tEqualizer_setParameter end");
   2514     return status;
   2515 } /* end Equalizer_setParameter */
   2516 
   2517 //----------------------------------------------------------------------------
   2518 // Volume_getParameter()
   2519 //----------------------------------------------------------------------------
   2520 // Purpose:
   2521 // Get a Volume parameter
   2522 //
   2523 // Inputs:
   2524 //  pVolume          - handle to instance data
   2525 //  pParam           - pointer to parameter
   2526 //  pValue           - pointer to variable to hold retrieved value
   2527 //  pValueSize       - pointer to value size: maximum size as input
   2528 //
   2529 // Outputs:
   2530 //  *pValue updated with parameter value
   2531 //  *pValueSize updated with actual value size
   2532 //
   2533 //
   2534 // Side Effects:
   2535 //
   2536 //----------------------------------------------------------------------------
   2537 
   2538 int Volume_getParameter(EffectContext     *pContext,
   2539                         void              *pParam,
   2540                         uint32_t          *pValueSize,
   2541                         void              *pValue){
   2542     int status = 0;
   2543     int bMute = 0;
   2544     int32_t *pParamTemp = (int32_t *)pParam;
   2545     int32_t param = *pParamTemp++;;
   2546     char *name;
   2547 
   2548     //ALOGV("\tVolume_getParameter start");
   2549 
   2550     switch (param){
   2551         case VOLUME_PARAM_LEVEL:
   2552         case VOLUME_PARAM_MAXLEVEL:
   2553         case VOLUME_PARAM_STEREOPOSITION:
   2554             if (*pValueSize != sizeof(int16_t)){
   2555                 ALOGV("\tLVM_ERROR : Volume_getParameter() invalid pValueSize 1  %d", *pValueSize);
   2556                 return -EINVAL;
   2557             }
   2558             *pValueSize = sizeof(int16_t);
   2559             break;
   2560 
   2561         case VOLUME_PARAM_MUTE:
   2562         case VOLUME_PARAM_ENABLESTEREOPOSITION:
   2563             if (*pValueSize < sizeof(int32_t)){
   2564                 ALOGV("\tLVM_ERROR : Volume_getParameter() invalid pValueSize 2  %d", *pValueSize);
   2565                 return -EINVAL;
   2566             }
   2567             *pValueSize = sizeof(int32_t);
   2568             break;
   2569 
   2570         default:
   2571             ALOGV("\tLVM_ERROR : Volume_getParameter unknown param %d", param);
   2572             return -EINVAL;
   2573     }
   2574 
   2575     switch (param){
   2576         case VOLUME_PARAM_LEVEL:
   2577             status = VolumeGetVolumeLevel(pContext, (int16_t *)(pValue));
   2578             //ALOGV("\tVolume_getParameter() VOLUME_PARAM_LEVEL Value is %d",
   2579             //        *(int16_t *)pValue);
   2580             break;
   2581 
   2582         case VOLUME_PARAM_MAXLEVEL:
   2583             *(int16_t *)pValue = 0;
   2584             //ALOGV("\tVolume_getParameter() VOLUME_PARAM_MAXLEVEL Value is %d",
   2585             //        *(int16_t *)pValue);
   2586             break;
   2587 
   2588         case VOLUME_PARAM_STEREOPOSITION:
   2589             VolumeGetStereoPosition(pContext, (int16_t *)pValue);
   2590             //ALOGV("\tVolume_getParameter() VOLUME_PARAM_STEREOPOSITION Value is %d",
   2591             //        *(int16_t *)pValue);
   2592             break;
   2593 
   2594         case VOLUME_PARAM_MUTE:
   2595             status = VolumeGetMute(pContext, (uint32_t *)pValue);
   2596             ALOGV("\tVolume_getParameter() VOLUME_PARAM_MUTE Value is %d",
   2597                     *(uint32_t *)pValue);
   2598             break;
   2599 
   2600         case VOLUME_PARAM_ENABLESTEREOPOSITION:
   2601             *(int32_t *)pValue = pContext->pBundledContext->bStereoPositionEnabled;
   2602             //ALOGV("\tVolume_getParameter() VOLUME_PARAM_ENABLESTEREOPOSITION Value is %d",
   2603             //        *(uint32_t *)pValue);
   2604             break;
   2605 
   2606         default:
   2607             ALOGV("\tLVM_ERROR : Volume_getParameter() invalid param %d", param);
   2608             status = -EINVAL;
   2609             break;
   2610     }
   2611 
   2612     //ALOGV("\tVolume_getParameter end");
   2613     return status;
   2614 } /* end Volume_getParameter */
   2615 
   2616 
   2617 //----------------------------------------------------------------------------
   2618 // Volume_setParameter()
   2619 //----------------------------------------------------------------------------
   2620 // Purpose:
   2621 // Set a Volume parameter
   2622 //
   2623 // Inputs:
   2624 //  pVolume       - handle to instance data
   2625 //  pParam        - pointer to parameter
   2626 //  pValue        - pointer to value
   2627 //
   2628 // Outputs:
   2629 //
   2630 //----------------------------------------------------------------------------
   2631 
   2632 int Volume_setParameter (EffectContext *pContext, void *pParam, void *pValue){
   2633     int      status = 0;
   2634     int16_t  level;
   2635     int16_t  position;
   2636     uint32_t mute;
   2637     uint32_t positionEnabled;
   2638     int32_t *pParamTemp = (int32_t *)pParam;
   2639     int32_t param = *pParamTemp++;
   2640 
   2641     //ALOGV("\tVolume_setParameter start");
   2642 
   2643     switch (param){
   2644         case VOLUME_PARAM_LEVEL:
   2645             level = *(int16_t *)pValue;
   2646             //ALOGV("\tVolume_setParameter() VOLUME_PARAM_LEVEL value is %d", level);
   2647             //ALOGV("\tVolume_setParameter() Calling pVolume->setVolumeLevel");
   2648             status = VolumeSetVolumeLevel(pContext, (int16_t)level);
   2649             //ALOGV("\tVolume_setParameter() Called pVolume->setVolumeLevel");
   2650             break;
   2651 
   2652         case VOLUME_PARAM_MUTE:
   2653             mute = *(uint32_t *)pValue;
   2654             //ALOGV("\tVolume_setParameter() Calling pVolume->setMute, mute is %d", mute);
   2655             //ALOGV("\tVolume_setParameter() Calling pVolume->setMute");
   2656             status = VolumeSetMute(pContext, mute);
   2657             //ALOGV("\tVolume_setParameter() Called pVolume->setMute");
   2658             break;
   2659 
   2660         case VOLUME_PARAM_ENABLESTEREOPOSITION:
   2661             positionEnabled = *(uint32_t *)pValue;
   2662             status = VolumeEnableStereoPosition(pContext, positionEnabled);
   2663             status = VolumeSetStereoPosition(pContext, pContext->pBundledContext->positionSaved);
   2664             //ALOGV("\tVolume_setParameter() VOLUME_PARAM_ENABLESTEREOPOSITION called");
   2665             break;
   2666 
   2667         case VOLUME_PARAM_STEREOPOSITION:
   2668             position = *(int16_t *)pValue;
   2669             //ALOGV("\tVolume_setParameter() VOLUME_PARAM_STEREOPOSITION value is %d", position);
   2670             //ALOGV("\tVolume_setParameter() Calling pVolume->VolumeSetStereoPosition");
   2671             status = VolumeSetStereoPosition(pContext, (int16_t)position);
   2672             //ALOGV("\tVolume_setParameter() Called pVolume->VolumeSetStereoPosition");
   2673             break;
   2674 
   2675         default:
   2676             ALOGV("\tLVM_ERROR : Volume_setParameter() invalid param %d", param);
   2677             break;
   2678     }
   2679 
   2680     //ALOGV("\tVolume_setParameter end");
   2681     return status;
   2682 } /* end Volume_setParameter */
   2683 
   2684 /****************************************************************************************
   2685  * Name : LVC_ToDB_s32Tos16()
   2686  *  Input       : Signed 32-bit integer
   2687  *  Output      : Signed 16-bit integer
   2688  *                  MSB (16) = sign bit
   2689  *                  (15->05) = integer part
   2690  *                  (04->01) = decimal part
   2691  *  Returns     : Db value with respect to full scale
   2692  *  Description :
   2693  *  Remarks     :
   2694  ****************************************************************************************/
   2695 
   2696 LVM_INT16 LVC_ToDB_s32Tos16(LVM_INT32 Lin_fix)
   2697 {
   2698     LVM_INT16   db_fix;
   2699     LVM_INT16   Shift;
   2700     LVM_INT16   SmallRemainder;
   2701     LVM_UINT32  Remainder = (LVM_UINT32)Lin_fix;
   2702 
   2703     /* Count leading bits, 1 cycle in assembly*/
   2704     for (Shift = 0; Shift<32; Shift++)
   2705     {
   2706         if ((Remainder & 0x80000000U)!=0)
   2707         {
   2708             break;
   2709         }
   2710         Remainder = Remainder << 1;
   2711     }
   2712 
   2713     /*
   2714      * Based on the approximation equation (for Q11.4 format):
   2715      *
   2716      * dB = -96 * Shift + 16 * (8 * Remainder - 2 * Remainder^2)
   2717      */
   2718     db_fix    = (LVM_INT16)(-96 * Shift);               /* Six dB steps in Q11.4 format*/
   2719     SmallRemainder = (LVM_INT16)((Remainder & 0x7fffffff) >> 24);
   2720     db_fix = (LVM_INT16)(db_fix + SmallRemainder );
   2721     SmallRemainder = (LVM_INT16)(SmallRemainder * SmallRemainder);
   2722     db_fix = (LVM_INT16)(db_fix - (LVM_INT16)((LVM_UINT16)SmallRemainder >> 9));
   2723 
   2724     /* Correct for small offset */
   2725     db_fix = (LVM_INT16)(db_fix - 5);
   2726 
   2727     return db_fix;
   2728 }
   2729 
   2730 //----------------------------------------------------------------------------
   2731 // Effect_setEnabled()
   2732 //----------------------------------------------------------------------------
   2733 // Purpose:
   2734 // Enable or disable effect
   2735 //
   2736 // Inputs:
   2737 //  pContext      - pointer to effect context
   2738 //  enabled       - true if enabling the effect, false otherwise
   2739 //
   2740 // Outputs:
   2741 //
   2742 //----------------------------------------------------------------------------
   2743 
   2744 int Effect_setEnabled(EffectContext *pContext, bool enabled)
   2745 {
   2746     ALOGV("\tEffect_setEnabled() type %d, enabled %d", pContext->EffectType, enabled);
   2747 
   2748     if (enabled) {
   2749         // Bass boost or Virtualizer can be temporarily disabled if playing over device speaker due
   2750         // to their nature.
   2751         bool tempDisabled = false;
   2752         switch (pContext->EffectType) {
   2753             case LVM_BASS_BOOST:
   2754                 if (pContext->pBundledContext->bBassEnabled == LVM_TRUE) {
   2755                      ALOGV("\tEffect_setEnabled() LVM_BASS_BOOST is already enabled");
   2756                      return -EINVAL;
   2757                 }
   2758                 if(pContext->pBundledContext->SamplesToExitCountBb <= 0){
   2759                     pContext->pBundledContext->NumberEffectsEnabled++;
   2760                 }
   2761                 pContext->pBundledContext->SamplesToExitCountBb =
   2762                      (LVM_INT32)(pContext->pBundledContext->SamplesPerSecond*0.1);
   2763                 pContext->pBundledContext->bBassEnabled = LVM_TRUE;
   2764                 tempDisabled = pContext->pBundledContext->bBassTempDisabled;
   2765                 break;
   2766             case LVM_EQUALIZER:
   2767                 if (pContext->pBundledContext->bEqualizerEnabled == LVM_TRUE) {
   2768                     ALOGV("\tEffect_setEnabled() LVM_EQUALIZER is already enabled");
   2769                     return -EINVAL;
   2770                 }
   2771                 if(pContext->pBundledContext->SamplesToExitCountEq <= 0){
   2772                     pContext->pBundledContext->NumberEffectsEnabled++;
   2773                 }
   2774                 pContext->pBundledContext->SamplesToExitCountEq =
   2775                      (LVM_INT32)(pContext->pBundledContext->SamplesPerSecond*0.1);
   2776                 pContext->pBundledContext->bEqualizerEnabled = LVM_TRUE;
   2777                 break;
   2778             case LVM_VIRTUALIZER:
   2779                 if (pContext->pBundledContext->bVirtualizerEnabled == LVM_TRUE) {
   2780                     ALOGV("\tEffect_setEnabled() LVM_VIRTUALIZER is already enabled");
   2781                     return -EINVAL;
   2782                 }
   2783                 if(pContext->pBundledContext->SamplesToExitCountVirt <= 0){
   2784                     pContext->pBundledContext->NumberEffectsEnabled++;
   2785                 }
   2786                 pContext->pBundledContext->SamplesToExitCountVirt =
   2787                      (LVM_INT32)(pContext->pBundledContext->SamplesPerSecond*0.1);
   2788                 pContext->pBundledContext->bVirtualizerEnabled = LVM_TRUE;
   2789                 tempDisabled = pContext->pBundledContext->bVirtualizerTempDisabled;
   2790                 break;
   2791             case LVM_VOLUME:
   2792                 if (pContext->pBundledContext->bVolumeEnabled == LVM_TRUE) {
   2793                     ALOGV("\tEffect_setEnabled() LVM_VOLUME is already enabled");
   2794                     return -EINVAL;
   2795                 }
   2796                 pContext->pBundledContext->NumberEffectsEnabled++;
   2797                 pContext->pBundledContext->bVolumeEnabled = LVM_TRUE;
   2798                 break;
   2799             default:
   2800                 ALOGV("\tEffect_setEnabled() invalid effect type");
   2801                 return -EINVAL;
   2802         }
   2803         if (!tempDisabled) {
   2804             LvmEffect_enable(pContext);
   2805         }
   2806     } else {
   2807         switch (pContext->EffectType) {
   2808             case LVM_BASS_BOOST:
   2809                 if (pContext->pBundledContext->bBassEnabled == LVM_FALSE) {
   2810                     ALOGV("\tEffect_setEnabled() LVM_BASS_BOOST is already disabled");
   2811                     return -EINVAL;
   2812                 }
   2813                 pContext->pBundledContext->bBassEnabled = LVM_FALSE;
   2814                 break;
   2815             case LVM_EQUALIZER:
   2816                 if (pContext->pBundledContext->bEqualizerEnabled == LVM_FALSE) {
   2817                     ALOGV("\tEffect_setEnabled() LVM_EQUALIZER is already disabled");
   2818                     return -EINVAL;
   2819                 }
   2820                 pContext->pBundledContext->bEqualizerEnabled = LVM_FALSE;
   2821                 break;
   2822             case LVM_VIRTUALIZER:
   2823                 if (pContext->pBundledContext->bVirtualizerEnabled == LVM_FALSE) {
   2824                     ALOGV("\tEffect_setEnabled() LVM_VIRTUALIZER is already disabled");
   2825                     return -EINVAL;
   2826                 }
   2827                 pContext->pBundledContext->bVirtualizerEnabled = LVM_FALSE;
   2828                 break;
   2829             case LVM_VOLUME:
   2830                 if (pContext->pBundledContext->bVolumeEnabled == LVM_FALSE) {
   2831                     ALOGV("\tEffect_setEnabled() LVM_VOLUME is already disabled");
   2832                     return -EINVAL;
   2833                 }
   2834                 pContext->pBundledContext->bVolumeEnabled = LVM_FALSE;
   2835                 break;
   2836             default:
   2837                 ALOGV("\tEffect_setEnabled() invalid effect type");
   2838                 return -EINVAL;
   2839         }
   2840         LvmEffect_disable(pContext);
   2841     }
   2842 
   2843     return 0;
   2844 }
   2845 
   2846 //----------------------------------------------------------------------------
   2847 // LVC_Convert_VolToDb()
   2848 //----------------------------------------------------------------------------
   2849 // Purpose:
   2850 // Convery volume in Q24 to dB
   2851 //
   2852 // Inputs:
   2853 //  vol:   Q.24 volume dB
   2854 //
   2855 //-----------------------------------------------------------------------
   2856 
   2857 int16_t LVC_Convert_VolToDb(uint32_t vol){
   2858     int16_t  dB;
   2859 
   2860     dB = LVC_ToDB_s32Tos16(vol <<7);
   2861     dB = (dB +8)>>4;
   2862     dB = (dB <-96) ? -96 : dB ;
   2863 
   2864     return dB;
   2865 }
   2866 
   2867 } // namespace
   2868 } // namespace
   2869 
   2870 extern "C" {
   2871 /* Effect Control Interface Implementation: Process */
   2872 int Effect_process(effect_handle_t     self,
   2873                               audio_buffer_t         *inBuffer,
   2874                               audio_buffer_t         *outBuffer){
   2875     EffectContext * pContext = (EffectContext *) self;
   2876     LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
   2877     int    status = 0;
   2878     int    processStatus = 0;
   2879     LVM_INT16   *in  = (LVM_INT16 *)inBuffer->raw;
   2880     LVM_INT16   *out = (LVM_INT16 *)outBuffer->raw;
   2881 
   2882 //ALOGV("\tEffect_process Start : Enabled = %d     Called = %d (%8d %8d %8d)",
   2883 //pContext->pBundledContext->NumberEffectsEnabled,pContext->pBundledContext->NumberEffectsCalled,
   2884 //    pContext->pBundledContext->SamplesToExitCountBb,
   2885 //    pContext->pBundledContext->SamplesToExitCountVirt,
   2886 //    pContext->pBundledContext->SamplesToExitCountEq);
   2887 
   2888     if (pContext == NULL){
   2889         ALOGV("\tLVM_ERROR : Effect_process() ERROR pContext == NULL");
   2890         return -EINVAL;
   2891     }
   2892 
   2893     //if(pContext->EffectType == LVM_BASS_BOOST){
   2894     //  ALOGV("\tEffect_process: Effect type is BASS_BOOST");
   2895     //}else if(pContext->EffectType == LVM_EQUALIZER){
   2896     //  ALOGV("\tEffect_process: Effect type is LVM_EQUALIZER");
   2897     //}else if(pContext->EffectType == LVM_VIRTUALIZER){
   2898     //  ALOGV("\tEffect_process: Effect type is LVM_VIRTUALIZER");
   2899     //}
   2900 
   2901     if (inBuffer == NULL  || inBuffer->raw == NULL  ||
   2902             outBuffer == NULL || outBuffer->raw == NULL ||
   2903             inBuffer->frameCount != outBuffer->frameCount){
   2904         ALOGV("\tLVM_ERROR : Effect_process() ERROR NULL INPUT POINTER OR FRAME COUNT IS WRONG");
   2905         return -EINVAL;
   2906     }
   2907     if ((pContext->pBundledContext->bBassEnabled == LVM_FALSE)&&
   2908         (pContext->EffectType == LVM_BASS_BOOST)){
   2909         //ALOGV("\tEffect_process() LVM_BASS_BOOST Effect is not enabled");
   2910         if(pContext->pBundledContext->SamplesToExitCountBb > 0){
   2911             pContext->pBundledContext->SamplesToExitCountBb -= outBuffer->frameCount * 2; // STEREO
   2912             //ALOGV("\tEffect_process: Waiting to turn off BASS_BOOST, %d samples left",
   2913             //    pContext->pBundledContext->SamplesToExitCountBb);
   2914         }
   2915         if(pContext->pBundledContext->SamplesToExitCountBb <= 0) {
   2916             status = -ENODATA;
   2917             pContext->pBundledContext->NumberEffectsEnabled--;
   2918             ALOGV("\tEffect_process() this is the last frame for LVM_BASS_BOOST");
   2919         }
   2920     }
   2921     if ((pContext->pBundledContext->bVolumeEnabled == LVM_FALSE)&&
   2922         (pContext->EffectType == LVM_VOLUME)){
   2923         //ALOGV("\tEffect_process() LVM_VOLUME Effect is not enabled");
   2924         status = -ENODATA;
   2925         pContext->pBundledContext->NumberEffectsEnabled--;
   2926     }
   2927     if ((pContext->pBundledContext->bEqualizerEnabled == LVM_FALSE)&&
   2928         (pContext->EffectType == LVM_EQUALIZER)){
   2929         //ALOGV("\tEffect_process() LVM_EQUALIZER Effect is not enabled");
   2930         if(pContext->pBundledContext->SamplesToExitCountEq > 0){
   2931             pContext->pBundledContext->SamplesToExitCountEq -= outBuffer->frameCount * 2; // STEREO
   2932             //ALOGV("\tEffect_process: Waiting to turn off EQUALIZER, %d samples left",
   2933             //    pContext->pBundledContext->SamplesToExitCountEq);
   2934         }
   2935         if(pContext->pBundledContext->SamplesToExitCountEq <= 0) {
   2936             status = -ENODATA;
   2937             pContext->pBundledContext->NumberEffectsEnabled--;
   2938             ALOGV("\tEffect_process() this is the last frame for LVM_EQUALIZER");
   2939         }
   2940     }
   2941     if ((pContext->pBundledContext->bVirtualizerEnabled == LVM_FALSE)&&
   2942         (pContext->EffectType == LVM_VIRTUALIZER)){
   2943         //ALOGV("\tEffect_process() LVM_VIRTUALIZER Effect is not enabled");
   2944         if(pContext->pBundledContext->SamplesToExitCountVirt > 0){
   2945             pContext->pBundledContext->SamplesToExitCountVirt -= outBuffer->frameCount * 2;// STEREO
   2946             //ALOGV("\tEffect_process: Waiting for to turn off VIRTUALIZER, %d samples left",
   2947             //    pContext->pBundledContext->SamplesToExitCountVirt);
   2948         }
   2949         if(pContext->pBundledContext->SamplesToExitCountVirt <= 0) {
   2950             status = -ENODATA;
   2951             pContext->pBundledContext->NumberEffectsEnabled--;
   2952             ALOGV("\tEffect_process() this is the last frame for LVM_VIRTUALIZER");
   2953         }
   2954     }
   2955 
   2956     if(status != -ENODATA){
   2957         pContext->pBundledContext->NumberEffectsCalled++;
   2958     }
   2959 
   2960     if(pContext->pBundledContext->NumberEffectsCalled ==
   2961        pContext->pBundledContext->NumberEffectsEnabled){
   2962         //ALOGV("\tEffect_process     Calling process with %d effects enabled, %d called: Effect %d",
   2963         //pContext->pBundledContext->NumberEffectsEnabled,
   2964         //pContext->pBundledContext->NumberEffectsCalled, pContext->EffectType);
   2965 
   2966         if (status == -ENODATA){
   2967             ALOGV("\tEffect_process() processing last frame");
   2968         }
   2969         pContext->pBundledContext->NumberEffectsCalled = 0;
   2970         /* Process all the available frames, block processing is
   2971            handled internalLY by the LVM bundle */
   2972         processStatus = android::LvmBundle_process(    (LVM_INT16 *)inBuffer->raw,
   2973                                                 (LVM_INT16 *)outBuffer->raw,
   2974                                                 outBuffer->frameCount,
   2975                                                 pContext);
   2976         if (processStatus != 0){
   2977             ALOGV("\tLVM_ERROR : LvmBundle_process returned error %d", processStatus);
   2978             if (status == 0) {
   2979                 status = processStatus;
   2980             }
   2981             return status;
   2982         }
   2983     } else {
   2984         //ALOGV("\tEffect_process Not Calling process with %d effects enabled, %d called: Effect %d",
   2985         //pContext->pBundledContext->NumberEffectsEnabled,
   2986         //pContext->pBundledContext->NumberEffectsCalled, pContext->EffectType);
   2987         // 2 is for stereo input
   2988         if (pContext->config.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) {
   2989             for (size_t i=0; i < outBuffer->frameCount*2; i++){
   2990                 outBuffer->s16[i] =
   2991                         clamp16((LVM_INT32)outBuffer->s16[i] + (LVM_INT32)inBuffer->s16[i]);
   2992             }
   2993         } else if (outBuffer->raw != inBuffer->raw) {
   2994             memcpy(outBuffer->raw, inBuffer->raw, outBuffer->frameCount*sizeof(LVM_INT16)*2);
   2995         }
   2996     }
   2997 
   2998     return status;
   2999 }   /* end Effect_process */
   3000 
   3001 /* Effect Control Interface Implementation: Command */
   3002 int Effect_command(effect_handle_t  self,
   3003                               uint32_t            cmdCode,
   3004                               uint32_t            cmdSize,
   3005                               void                *pCmdData,
   3006                               uint32_t            *replySize,
   3007                               void                *pReplyData){
   3008     EffectContext * pContext = (EffectContext *) self;
   3009     int retsize;
   3010 
   3011     //ALOGV("\t\nEffect_command start");
   3012 
   3013     if(pContext->EffectType == LVM_BASS_BOOST){
   3014         //ALOGV("\tEffect_command setting command for LVM_BASS_BOOST");
   3015     }
   3016     if(pContext->EffectType == LVM_VIRTUALIZER){
   3017         //ALOGV("\tEffect_command setting command for LVM_VIRTUALIZER");
   3018     }
   3019     if(pContext->EffectType == LVM_EQUALIZER){
   3020         //ALOGV("\tEffect_command setting command for LVM_EQUALIZER");
   3021     }
   3022     if(pContext->EffectType == LVM_VOLUME){
   3023         //ALOGV("\tEffect_command setting command for LVM_VOLUME");
   3024     }
   3025 
   3026     if (pContext == NULL){
   3027         ALOGV("\tLVM_ERROR : Effect_command ERROR pContext == NULL");
   3028         return -EINVAL;
   3029     }
   3030 
   3031     //ALOGV("\tEffect_command INPUTS are: command %d cmdSize %d",cmdCode, cmdSize);
   3032 
   3033     // Incase we disable an effect, next time process is
   3034     // called the number of effect called could be greater
   3035     // pContext->pBundledContext->NumberEffectsCalled = 0;
   3036 
   3037     //ALOGV("\tEffect_command NumberEffectsCalled = %d, NumberEffectsEnabled = %d",
   3038     //        pContext->pBundledContext->NumberEffectsCalled,
   3039     //        pContext->pBundledContext->NumberEffectsEnabled);
   3040 
   3041     switch (cmdCode){
   3042         case EFFECT_CMD_INIT:
   3043             if (pReplyData == NULL || replySize == NULL || *replySize != sizeof(int)){
   3044                 ALOGV("\tLVM_ERROR, EFFECT_CMD_INIT: ERROR for effect type %d",
   3045                         pContext->EffectType);
   3046                 return -EINVAL;
   3047             }
   3048             *(int *) pReplyData = 0;
   3049             //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_INIT start");
   3050             if(pContext->EffectType == LVM_BASS_BOOST){
   3051                 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_INIT for LVM_BASS_BOOST");
   3052                 android::BassSetStrength(pContext, 0);
   3053             }
   3054             if(pContext->EffectType == LVM_VIRTUALIZER){
   3055                 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_INIT for LVM_VIRTUALIZER");
   3056                 android::VirtualizerSetStrength(pContext, 0);
   3057             }
   3058             if(pContext->EffectType == LVM_EQUALIZER){
   3059                 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_INIT for LVM_EQUALIZER");
   3060                 android::EqualizerSetPreset(pContext, 0);
   3061             }
   3062             if(pContext->EffectType == LVM_VOLUME){
   3063                 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_INIT for LVM_VOLUME");
   3064                 *(int *) pReplyData = android::VolumeSetVolumeLevel(pContext, 0);
   3065             }
   3066             break;
   3067 
   3068         case EFFECT_CMD_SET_CONFIG:
   3069             //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_SET_CONFIG start");
   3070             if (pCmdData    == NULL || cmdSize     != sizeof(effect_config_t) ||
   3071                     pReplyData  == NULL || replySize == NULL || *replySize  != sizeof(int)) {
   3072                 ALOGV("\tLVM_ERROR : Effect_command cmdCode Case: "
   3073                         "EFFECT_CMD_SET_CONFIG: ERROR");
   3074                 return -EINVAL;
   3075             }
   3076             *(int *) pReplyData = android::Effect_setConfig(pContext, (effect_config_t *) pCmdData);
   3077             //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_SET_CONFIG end");
   3078             break;
   3079 
   3080         case EFFECT_CMD_GET_CONFIG:
   3081             if (pReplyData == NULL || replySize == NULL || *replySize != sizeof(effect_config_t)) {
   3082                 ALOGV("\tLVM_ERROR : Effect_command cmdCode Case: "
   3083                         "EFFECT_CMD_GET_CONFIG: ERROR");
   3084                 return -EINVAL;
   3085             }
   3086 
   3087             android::Effect_getConfig(pContext, (effect_config_t *)pReplyData);
   3088             break;
   3089 
   3090         case EFFECT_CMD_RESET:
   3091             //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_RESET start");
   3092             android::Effect_setConfig(pContext, &pContext->config);
   3093             //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_RESET end");
   3094             break;
   3095 
   3096         case EFFECT_CMD_GET_PARAM:{
   3097             //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_GET_PARAM start");
   3098 
   3099             effect_param_t *p = (effect_param_t *)pCmdData;
   3100             if (SIZE_MAX - sizeof(effect_param_t) < (size_t)p->psize) {
   3101                 android_errorWriteLog(0x534e4554, "26347509");
   3102                 return -EINVAL;
   3103             }
   3104             if (pCmdData == NULL || cmdSize < sizeof(effect_param_t) ||
   3105                     cmdSize < (sizeof(effect_param_t) + p->psize) ||
   3106                     pReplyData == NULL || replySize == NULL ||
   3107                     *replySize < (sizeof(effect_param_t) + p->psize)) {
   3108                 ALOGV("\tLVM_ERROR : EFFECT_CMD_GET_PARAM: ERROR");
   3109                 return -EINVAL;
   3110             }
   3111 
   3112             memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize);
   3113 
   3114             p = (effect_param_t *)pReplyData;
   3115 
   3116             int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
   3117 
   3118             if(pContext->EffectType == LVM_BASS_BOOST){
   3119                 p->status = android::BassBoost_getParameter(pContext,
   3120                                                             p->data,
   3121                                                             &p->vsize,
   3122                                                             p->data + voffset);
   3123                 //ALOGV("\tBassBoost_command EFFECT_CMD_GET_PARAM "
   3124                 //        "*pCmdData %d, *replySize %d, *pReplyData %d ",
   3125                 //        *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)),
   3126                 //        *replySize,
   3127                 //        *(int16_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset));
   3128             }
   3129 
   3130             if(pContext->EffectType == LVM_VIRTUALIZER){
   3131                 p->status = android::Virtualizer_getParameter(pContext,
   3132                                                               (void *)p->data,
   3133                                                               &p->vsize,
   3134                                                               p->data + voffset);
   3135 
   3136                 //ALOGV("\tVirtualizer_command EFFECT_CMD_GET_PARAM "
   3137                 //        "*pCmdData %d, *replySize %d, *pReplyData %d ",
   3138                 //        *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)),
   3139                 //        *replySize,
   3140                 //        *(int16_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset));
   3141             }
   3142             if(pContext->EffectType == LVM_EQUALIZER){
   3143                 //ALOGV("\tEqualizer_command cmdCode Case: "
   3144                 //        "EFFECT_CMD_GET_PARAM start");
   3145                 p->status = android::Equalizer_getParameter(pContext,
   3146                                                             p->data,
   3147                                                             &p->vsize,
   3148                                                             p->data + voffset);
   3149 
   3150                 //ALOGV("\tEqualizer_command EFFECT_CMD_GET_PARAM *pCmdData %d, *replySize %d, "
   3151                 //       "*pReplyData %08x %08x",
   3152                 //        *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), *replySize,
   3153                 //        *(int32_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset),
   3154                 //        *(int32_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset +
   3155                 //        sizeof(int32_t)));
   3156             }
   3157             if(pContext->EffectType == LVM_VOLUME){
   3158                 //ALOGV("\tVolume_command cmdCode Case: EFFECT_CMD_GET_PARAM start");
   3159                 p->status = android::Volume_getParameter(pContext,
   3160                                                          (void *)p->data,
   3161                                                          &p->vsize,
   3162                                                          p->data + voffset);
   3163 
   3164                 //ALOGV("\tVolume_command EFFECT_CMD_GET_PARAM "
   3165                 //        "*pCmdData %d, *replySize %d, *pReplyData %d ",
   3166                 //        *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)),
   3167                 //        *replySize,
   3168                 //        *(int16_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset));
   3169             }
   3170             *replySize = sizeof(effect_param_t) + voffset + p->vsize;
   3171 
   3172             //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_GET_PARAM end");
   3173         } break;
   3174         case EFFECT_CMD_SET_PARAM:{
   3175             //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_SET_PARAM start");
   3176             if(pContext->EffectType == LVM_BASS_BOOST){
   3177                 //ALOGV("\tBassBoost_command EFFECT_CMD_SET_PARAM param %d, *replySize %d, value %d",
   3178                 //       *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)),
   3179                 //       *replySize,
   3180                 //       *(int16_t *)((char *)pCmdData + sizeof(effect_param_t) + sizeof(int32_t)));
   3181 
   3182                 if (pCmdData   == NULL ||
   3183                         cmdSize    != (sizeof(effect_param_t) + sizeof(int32_t) +sizeof(int16_t)) ||
   3184                         pReplyData == NULL || replySize == NULL || *replySize != sizeof(int32_t)) {
   3185                     ALOGV("\tLVM_ERROR : BassBoost_command cmdCode Case: "
   3186                             "EFFECT_CMD_SET_PARAM: ERROR");
   3187                     return -EINVAL;
   3188                 }
   3189                 effect_param_t *p = (effect_param_t *) pCmdData;
   3190 
   3191                 if (p->psize != sizeof(int32_t)){
   3192                     ALOGV("\tLVM_ERROR : BassBoost_command cmdCode Case: "
   3193                             "EFFECT_CMD_SET_PARAM: ERROR, psize is not sizeof(int32_t)");
   3194                     return -EINVAL;
   3195                 }
   3196 
   3197                 //ALOGV("\tnBassBoost_command cmdSize is %d\n"
   3198                 //        "\tsizeof(effect_param_t) is  %d\n"
   3199                 //        "\tp->psize is %d\n"
   3200                 //        "\tp->vsize is %d"
   3201                 //        "\n",
   3202                 //        cmdSize, sizeof(effect_param_t), p->psize, p->vsize );
   3203 
   3204                 *(int *)pReplyData = android::BassBoost_setParameter(pContext,
   3205                                                                     (void *)p->data,
   3206                                                                     p->data + p->psize);
   3207             }
   3208             if(pContext->EffectType == LVM_VIRTUALIZER){
   3209               // Warning this log will fail to properly read an int32_t value, assumes int16_t
   3210               //ALOGV("\tVirtualizer_command EFFECT_CMD_SET_PARAM param %d, *replySize %d, value %d",
   3211               //        *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)),
   3212               //        *replySize,
   3213               //        *(int16_t *)((char *)pCmdData + sizeof(effect_param_t) + sizeof(int32_t)));
   3214 
   3215                 if (pCmdData   == NULL ||
   3216                         // legal parameters are int16_t or int32_t
   3217                         cmdSize    > (sizeof(effect_param_t) + sizeof(int32_t) +sizeof(int32_t)) ||
   3218                         cmdSize    < (sizeof(effect_param_t) + sizeof(int32_t) +sizeof(int16_t)) ||
   3219                         pReplyData == NULL || replySize == NULL || *replySize != sizeof(int32_t)) {
   3220                     ALOGV("\tLVM_ERROR : Virtualizer_command cmdCode Case: "
   3221                             "EFFECT_CMD_SET_PARAM: ERROR");
   3222                     return -EINVAL;
   3223                 }
   3224                 effect_param_t *p = (effect_param_t *) pCmdData;
   3225 
   3226                 if (p->psize != sizeof(int32_t)){
   3227                     ALOGV("\tLVM_ERROR : Virtualizer_command cmdCode Case: "
   3228                             "EFFECT_CMD_SET_PARAM: ERROR, psize is not sizeof(int32_t)");
   3229                     return -EINVAL;
   3230                 }
   3231 
   3232                 //ALOGV("\tnVirtualizer_command cmdSize is %d\n"
   3233                 //        "\tsizeof(effect_param_t) is  %d\n"
   3234                 //        "\tp->psize is %d\n"
   3235                 //        "\tp->vsize is %d"
   3236                 //        "\n",
   3237                 //        cmdSize, sizeof(effect_param_t), p->psize, p->vsize );
   3238 
   3239                 *(int *)pReplyData = android::Virtualizer_setParameter(pContext,
   3240                                                                       (void *)p->data,
   3241                                                                        p->data + p->psize);
   3242             }
   3243             if(pContext->EffectType == LVM_EQUALIZER){
   3244                //ALOGV("\tEqualizer_command cmdCode Case: "
   3245                //        "EFFECT_CMD_SET_PARAM start");
   3246                //ALOGV("\tEqualizer_command EFFECT_CMD_SET_PARAM param %d, *replySize %d, value %d ",
   3247                //        *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)),
   3248                //        *replySize,
   3249                //        *(int16_t *)((char *)pCmdData + sizeof(effect_param_t) + sizeof(int32_t)));
   3250 
   3251                 if (pCmdData == NULL || cmdSize < (sizeof(effect_param_t) + sizeof(int32_t)) ||
   3252                         pReplyData == NULL || replySize == NULL || *replySize != sizeof(int32_t)) {
   3253                     ALOGV("\tLVM_ERROR : Equalizer_command cmdCode Case: "
   3254                             "EFFECT_CMD_SET_PARAM: ERROR");
   3255                     return -EINVAL;
   3256                 }
   3257                 effect_param_t *p = (effect_param_t *) pCmdData;
   3258 
   3259                 *(int *)pReplyData = android::Equalizer_setParameter(pContext,
   3260                                                                     (void *)p->data,
   3261                                                                      p->data + p->psize);
   3262             }
   3263             if(pContext->EffectType == LVM_VOLUME){
   3264                 //ALOGV("\tVolume_command cmdCode Case: EFFECT_CMD_SET_PARAM start");
   3265                 //ALOGV("\tVolume_command EFFECT_CMD_SET_PARAM param %d, *replySize %d, value %d ",
   3266                 //        *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)),
   3267                 //        *replySize,
   3268                 //        *(int16_t *)((char *)pCmdData + sizeof(effect_param_t) +sizeof(int32_t)));
   3269 
   3270                 if (pCmdData   == NULL ||
   3271                         cmdSize    < (sizeof(effect_param_t) + sizeof(int32_t)) ||
   3272                         pReplyData == NULL || replySize == NULL ||
   3273                         *replySize != sizeof(int32_t)) {
   3274                     ALOGV("\tLVM_ERROR : Volume_command cmdCode Case: "
   3275                             "EFFECT_CMD_SET_PARAM: ERROR");
   3276                     return -EINVAL;
   3277                 }
   3278                 effect_param_t *p = (effect_param_t *) pCmdData;
   3279 
   3280                 *(int *)pReplyData = android::Volume_setParameter(pContext,
   3281                                                                  (void *)p->data,
   3282                                                                  p->data + p->psize);
   3283             }
   3284             //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_SET_PARAM end");
   3285         } break;
   3286 
   3287         case EFFECT_CMD_ENABLE:
   3288             ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_ENABLE start");
   3289             if (pReplyData == NULL || replySize == NULL || *replySize != sizeof(int)) {
   3290                 ALOGV("\tLVM_ERROR : Effect_command cmdCode Case: EFFECT_CMD_ENABLE: ERROR");
   3291                 return -EINVAL;
   3292             }
   3293 
   3294             *(int *)pReplyData = android::Effect_setEnabled(pContext, LVM_TRUE);
   3295             break;
   3296 
   3297         case EFFECT_CMD_DISABLE:
   3298             //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_DISABLE start");
   3299             if (pReplyData == NULL || replySize == NULL || *replySize != sizeof(int)) {
   3300                 ALOGV("\tLVM_ERROR : Effect_command cmdCode Case: EFFECT_CMD_DISABLE: ERROR");
   3301                 return -EINVAL;
   3302             }
   3303             *(int *)pReplyData = android::Effect_setEnabled(pContext, LVM_FALSE);
   3304             break;
   3305 
   3306         case EFFECT_CMD_SET_DEVICE:
   3307         {
   3308             ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_SET_DEVICE start");
   3309             if (pCmdData   == NULL){
   3310                 ALOGV("\tLVM_ERROR : Effect_command cmdCode Case: EFFECT_CMD_SET_DEVICE: ERROR");
   3311                 return -EINVAL;
   3312             }
   3313 
   3314             uint32_t device = *(uint32_t *)pCmdData;
   3315             pContext->pBundledContext->nOutputDevice = (audio_devices_t) device;
   3316 
   3317             if (pContext->EffectType == LVM_BASS_BOOST) {
   3318                 if((device == AUDIO_DEVICE_OUT_SPEAKER) ||
   3319                         (device == AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT) ||
   3320                         (device == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER)){
   3321                     ALOGV("\tEFFECT_CMD_SET_DEVICE device is invalid for LVM_BASS_BOOST %d",
   3322                           *(int32_t *)pCmdData);
   3323                     ALOGV("\tEFFECT_CMD_SET_DEVICE temporary disable LVM_BAS_BOOST");
   3324 
   3325                     // If a device doesnt support bassboost the effect must be temporarily disabled
   3326                     // the effect must still report its original state as this can only be changed
   3327                     // by the ENABLE/DISABLE command
   3328 
   3329                     if (pContext->pBundledContext->bBassEnabled == LVM_TRUE) {
   3330                         ALOGV("\tEFFECT_CMD_SET_DEVICE disable LVM_BASS_BOOST %d",
   3331                              *(int32_t *)pCmdData);
   3332                         android::LvmEffect_disable(pContext);
   3333                     }
   3334                     pContext->pBundledContext->bBassTempDisabled = LVM_TRUE;
   3335                 } else {
   3336                     ALOGV("\tEFFECT_CMD_SET_DEVICE device is valid for LVM_BASS_BOOST %d",
   3337                          *(int32_t *)pCmdData);
   3338 
   3339                     // If a device supports bassboost and the effect has been temporarily disabled
   3340                     // previously then re-enable it
   3341 
   3342                     if (pContext->pBundledContext->bBassEnabled == LVM_TRUE) {
   3343                         ALOGV("\tEFFECT_CMD_SET_DEVICE re-enable LVM_BASS_BOOST %d",
   3344                              *(int32_t *)pCmdData);
   3345                         android::LvmEffect_enable(pContext);
   3346                     }
   3347                     pContext->pBundledContext->bBassTempDisabled = LVM_FALSE;
   3348                 }
   3349             }
   3350             if (pContext->EffectType == LVM_VIRTUALIZER) {
   3351                 if (pContext->pBundledContext->nVirtualizerForcedDevice == AUDIO_DEVICE_NONE) {
   3352                     // default case unless configuration is forced
   3353                     if (android::VirtualizerIsDeviceSupported(device) != 0) {
   3354                         ALOGV("\tEFFECT_CMD_SET_DEVICE device is invalid for LVM_VIRTUALIZER %d",
   3355                                 *(int32_t *)pCmdData);
   3356                         ALOGV("\tEFFECT_CMD_SET_DEVICE temporary disable LVM_VIRTUALIZER");
   3357 
   3358                         //If a device doesnt support virtualizer the effect must be temporarily
   3359                         // disabled the effect must still report its original state as this can
   3360                         // only be changed by the ENABLE/DISABLE command
   3361 
   3362                         if (pContext->pBundledContext->bVirtualizerEnabled == LVM_TRUE) {
   3363                             ALOGV("\tEFFECT_CMD_SET_DEVICE disable LVM_VIRTUALIZER %d",
   3364                                     *(int32_t *)pCmdData);
   3365                             android::LvmEffect_disable(pContext);
   3366                         }
   3367                         pContext->pBundledContext->bVirtualizerTempDisabled = LVM_TRUE;
   3368                     } else {
   3369                         ALOGV("\tEFFECT_CMD_SET_DEVICE device is valid for LVM_VIRTUALIZER %d",
   3370                                 *(int32_t *)pCmdData);
   3371 
   3372                         // If a device supports virtualizer and the effect has been temporarily
   3373                         // disabled previously then re-enable it
   3374 
   3375                         if(pContext->pBundledContext->bVirtualizerEnabled == LVM_TRUE){
   3376                             ALOGV("\tEFFECT_CMD_SET_DEVICE re-enable LVM_VIRTUALIZER %d",
   3377                                     *(int32_t *)pCmdData);
   3378                             android::LvmEffect_enable(pContext);
   3379                         }
   3380                         pContext->pBundledContext->bVirtualizerTempDisabled = LVM_FALSE;
   3381                     }
   3382                 } // else virtualization mode is forced to a certain device, nothing to do
   3383             }
   3384             ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_SET_DEVICE end");
   3385             break;
   3386         }
   3387         case EFFECT_CMD_SET_VOLUME:
   3388         {
   3389             uint32_t leftVolume, rightVolume;
   3390             int16_t  leftdB, rightdB;
   3391             int16_t  maxdB, pandB;
   3392             int32_t  vol_ret[2] = {1<<24,1<<24}; // Apply no volume
   3393             int      status = 0;
   3394             LVM_ControlParams_t     ActiveParams;           /* Current control Parameters */
   3395             LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;  /* Function call status */
   3396 
   3397             // if pReplyData is NULL, VOL_CTRL is delegated to another effect
   3398             if(pReplyData == LVM_NULL){
   3399                 break;
   3400             }
   3401 
   3402             if (pCmdData == NULL || cmdSize != 2 * sizeof(uint32_t) || pReplyData == NULL ||
   3403                     replySize == NULL || *replySize < 2*sizeof(int32_t)) {
   3404                 ALOGV("\tLVM_ERROR : Effect_command cmdCode Case: "
   3405                         "EFFECT_CMD_SET_VOLUME: ERROR");
   3406                 return -EINVAL;
   3407             }
   3408 
   3409             leftVolume  = ((*(uint32_t *)pCmdData));
   3410             rightVolume = ((*((uint32_t *)pCmdData + 1)));
   3411 
   3412             if(leftVolume == 0x1000000){
   3413                 leftVolume -= 1;
   3414             }
   3415             if(rightVolume == 0x1000000){
   3416                 rightVolume -= 1;
   3417             }
   3418 
   3419             // Convert volume to dB
   3420             leftdB  = android::LVC_Convert_VolToDb(leftVolume);
   3421             rightdB = android::LVC_Convert_VolToDb(rightVolume);
   3422 
   3423             pandB = rightdB - leftdB;
   3424 
   3425             // Calculate max volume in dB
   3426             maxdB = leftdB;
   3427             if(rightdB > maxdB){
   3428                 maxdB = rightdB;
   3429             }
   3430             //ALOGV("\tEFFECT_CMD_SET_VOLUME Session: %d, SessionID: %d VOLUME is %d dB (%d), "
   3431             //      "effect is %d",
   3432             //pContext->pBundledContext->SessionNo, pContext->pBundledContext->SessionId,
   3433             //(int32_t)maxdB, maxVol<<7, pContext->EffectType);
   3434             //ALOGV("\tEFFECT_CMD_SET_VOLUME: Left is %d, Right is %d", leftVolume, rightVolume);
   3435             //ALOGV("\tEFFECT_CMD_SET_VOLUME: Left %ddB, Right %ddB, Position %ddB",
   3436             //        leftdB, rightdB, pandB);
   3437 
   3438             memcpy(pReplyData, vol_ret, sizeof(int32_t)*2);
   3439             android::VolumeSetVolumeLevel(pContext, (int16_t)(maxdB*100));
   3440 
   3441             /* Get the current settings */
   3442             LvmStatus =LVM_GetControlParameters(pContext->pBundledContext->hInstance,&ActiveParams);
   3443             LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VolumeSetStereoPosition")
   3444             if(LvmStatus != LVM_SUCCESS) return -EINVAL;
   3445 
   3446             /* Volume parameters */
   3447             ActiveParams.VC_Balance  = pandB;
   3448             ALOGV("\t\tVolumeSetStereoPosition() (-96dB -> +96dB)-> %d\n", ActiveParams.VC_Balance );
   3449 
   3450             /* Activate the initial settings */
   3451             LvmStatus =LVM_SetControlParameters(pContext->pBundledContext->hInstance,&ActiveParams);
   3452             LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "VolumeSetStereoPosition")
   3453             if(LvmStatus != LVM_SUCCESS) return -EINVAL;
   3454             break;
   3455          }
   3456         case EFFECT_CMD_SET_AUDIO_MODE:
   3457             break;
   3458         default:
   3459             return -EINVAL;
   3460     }
   3461 
   3462     //ALOGV("\tEffect_command end...\n\n");
   3463     return 0;
   3464 }    /* end Effect_command */
   3465 
   3466 /* Effect Control Interface Implementation: get_descriptor */
   3467 int Effect_getDescriptor(effect_handle_t   self,
   3468                                     effect_descriptor_t *pDescriptor)
   3469 {
   3470     EffectContext * pContext = (EffectContext *) self;
   3471     const effect_descriptor_t *desc;
   3472 
   3473     if (pContext == NULL || pDescriptor == NULL) {
   3474         ALOGV("Effect_getDescriptor() invalid param");
   3475         return -EINVAL;
   3476     }
   3477 
   3478     switch(pContext->EffectType) {
   3479         case LVM_BASS_BOOST:
   3480             desc = &android::gBassBoostDescriptor;
   3481             break;
   3482         case LVM_VIRTUALIZER:
   3483             desc = &android::gVirtualizerDescriptor;
   3484             break;
   3485         case LVM_EQUALIZER:
   3486             desc = &android::gEqualizerDescriptor;
   3487             break;
   3488         case LVM_VOLUME:
   3489             desc = &android::gVolumeDescriptor;
   3490             break;
   3491         default:
   3492             return -EINVAL;
   3493     }
   3494 
   3495     *pDescriptor = *desc;
   3496 
   3497     return 0;
   3498 }   /* end Effect_getDescriptor */
   3499 
   3500 // effect_handle_t interface implementation for effect
   3501 const struct effect_interface_s gLvmEffectInterface = {
   3502     Effect_process,
   3503     Effect_command,
   3504     Effect_getDescriptor,
   3505     NULL,
   3506 };    /* end gLvmEffectInterface */
   3507 
   3508 // This is the only symbol that needs to be exported
   3509 __attribute__ ((visibility ("default")))
   3510 audio_effect_library_t AUDIO_EFFECT_LIBRARY_INFO_SYM = {
   3511     .tag = AUDIO_EFFECT_LIBRARY_TAG,
   3512     .version = EFFECT_LIBRARY_API_VERSION,
   3513     .name = "Effect Bundle Library",
   3514     .implementor = "NXP Software Ltd.",
   3515     .create_effect = android::EffectCreate,
   3516     .release_effect = android::EffectRelease,
   3517     .get_descriptor = android::EffectGetDescriptor,
   3518 };
   3519 
   3520 }
   3521