EffectBundle.cpp revision 2c8e5cab3faa6d360e222b7a6c40a80083d021ac
12c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*
22c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2010-2010 NXP Software
32c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2009 The Android Open Source Project
42c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
52c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
62c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * you may not use this file except in compliance with the License.
72c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * You may obtain a copy of the License at
82c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
92c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Unless required by applicable law or agreed to in writing, software
122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * See the License for the specific language governing permissions and
152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * limitations under the License.
162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */
172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define LOG_TAG "Bundle"
192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define LVM_BUNDLE                // Include all the bundle code
212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define LOG_NDEBUG 0
222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include <cutils/log.h>
242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include <assert.h>
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include <stdlib.h>
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include <string.h>
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include <new>
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include <EffectBundle.h>
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifdef LVM_BUNDLE
312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define LVM_MAX_SESSIONS        32
322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define MAX_NUM_BANDS           5
332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define MAX_CALL_SIZE           256
342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif  /* end LVM_BUNDLE */
352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint framecountag = 0;
382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// effect_interface_t interface implementation for bass boost
392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentextern "C" const struct effect_interface_s gLvmEffectInterface;
402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define LVM_ERROR_CHECK(LvmStatus, callingFunc, calledFunc){\
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (LvmStatus == LVM_NULLADDRESS){\
432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tLVM_ERROR : Parameter error - "\
442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    "null pointer returned by %s in %s\n\n\n\n", callingFunc, calledFunc);\
452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }\
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (LvmStatus == LVM_ALIGNMENTERROR){\
472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tLVM_ERROR : Parameter error - "\
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    "bad alignment returned by %s in %s\n\n\n\n", callingFunc, calledFunc);\
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }\
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (LvmStatus == LVM_INVALIDNUMSAMPLES){\
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tLVM_ERROR : Parameter error - "\
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    "bad number of samples returned by %s in %s\n\n\n\n", callingFunc, calledFunc);\
532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }\
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (LvmStatus == LVM_OUTOFRANGE){\
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tLVM_ERROR : Parameter error - "\
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    "out of range returned by %s in %s\n", callingFunc, calledFunc);\
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }\
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Namespaces
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentnamespace android {
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentnamespace {
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* local functions */
692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define CHECK_ARG(cond) {                     \
702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (!(cond)) {                            \
712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLVM_ERROR : Invalid argument: "#cond);      \
722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -EINVAL;                       \
732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }                                         \
742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint LvmInitFlag = LVM_FALSE;
772c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentSessionContext GlobalSessionMemory[32];
782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// NXP SW BassBoost UUID
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentconst effect_descriptor_t gBassBoostDescriptor = {
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {0x0634f220, 0xddd4, 0x11db, 0xa0fc, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b }},
822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {0x8631f300, 0x72e2, 0x11df, 0xb57e, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // uuid
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EFFECT_API_VERSION,
842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_LAST),
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        0, // TODO
862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        1,
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        "Dynamic Bass Boost",
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        "NXP Software Ltd.",
892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent};
902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// NXP SW Virtualizer UUID
922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentconst effect_descriptor_t gVirtualizerDescriptor = {
932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {0x37cc2c00, 0xdddd, 0x11db, 0x8577, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // Virtualizer ID
942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {0x1d4033c0, 0x8557, 0x11df, 0x9f2d, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // NXP SW UUID gen july 01 2010
952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EFFECT_API_VERSION,
962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_LAST),
972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        0, // TODO
982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        1,
992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        "Virtualizer",
1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        "NXP Software Ltd.",
1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent};
1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// NXP SW Equalizer UUID
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentconst effect_descriptor_t gEqualizerDescriptor = {
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {0x0bed4300, 0xddd6, 0x11db, 0x8f34, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // type
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {0xce772f20, 0x847d, 0x11df, 0xbb17, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // uuid Eq NXP
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EFFECT_API_VERSION,
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_LAST),
1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        0, // TODO
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        1,
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        "Equalizer",
1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        "NXP Software Ltd.",
1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent};
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// NXP SW Volume UUID
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentconst effect_descriptor_t gVolumeDescriptor = {
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {0x09e8ede0, 0xddde, 0x11db, 0xb4f6, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b }},
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        //{0x8631f300, 0x72e2, 0x11df, 0xb57e, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b }}, // uuid
1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {0x119341a0, 0x8469, 0x11df, 0x81f9, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b }}, //uuid VOL NXP
1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EFFECT_API_VERSION,
1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_LAST),
1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        0, // TODO
1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        1,
1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        "Volume",
1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        "NXP Software Ltd.",
1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent};
1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//--- local function prototypes
1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LvmGlobalBundle_init      (void);
1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint  LvmBundle_init            (EffectContext *pContext);
1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint  LvmEffect_enable          (EffectContext *pContext);
1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint  LvmEffect_disable         (EffectContext *pContext);
1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LvmEffect_free            (EffectContext *pContext);
1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint  Effect_configure       (EffectContext *pContext, effect_config_t *pConfig);
1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint  BassBoost_setParameter    (EffectContext *pContext, int32_t *pParam, void *pValue);
1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint  BassBoost_getParameter    (EffectContext *pContext,
1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                               int32_t        *pParam,
1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                               size_t         *pValueSize,
1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                               void           *pValue);
1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint  Virtualizer_setParameter  (EffectContext *pContext, int32_t *pParam, void *pValue);
1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint  Virtualizer_getParameter  (EffectContext *pContext,
1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                               int32_t        *pParam,
1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                               size_t         *pValueSize,
1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                               void           *pValue);
1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint  Equalizer_setParameter    (EffectContext *pContext, int32_t *pParam, void *pValue);
1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint  Equalizer_getParameter    (EffectContext *pContext,
1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                int32_t       *pParam,
1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                size_t        *pValueSize,
1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                void          *pValue);
1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint  Volume_setParameter       (EffectContext *pContext, int32_t *pParam, void *pValue);
1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint  Volume_getParameter       (EffectContext *pContext,
1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                int32_t       *pParam,
1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                size_t        *pValueSize,
1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                void          *pValue);
1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Effect Library Interface Implementation */
1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentextern "C" int EffectQueryNumberEffects(uint32_t *pNumEffects){
1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\n\tEffectQueryNumberEffects start");
1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pNumEffects = 4;
1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEffectQueryNumberEffects creating %d effects", *pNumEffects);
1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEffectQueryNumberEffects end\n");
1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 0;
1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}     /* end EffectQueryNumberEffects */
1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentextern "C" int EffectQueryEffect(uint32_t index, effect_descriptor_t *pDescriptor){
1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\n\tEffectQueryEffect start");
1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEffectQueryEffect processing index %d", index);
1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pDescriptor == NULL){
1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	LOGV("\tLVM_ERROR : EffectQueryEffect was passed NULL pointer");
1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -EINVAL;
1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (index > 3){
1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	LOGV("\tLVM_ERROR : EffectQueryEffect index out of range %d", index);
1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -ENOENT;
1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(index == LVM_BASS_BOOST){
1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectQueryEffect processing LVM_BASS_BOOST");
1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        memcpy(pDescriptor, &gBassBoostDescriptor,   sizeof(effect_descriptor_t));
1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }else if(index == LVM_VIRTUALIZER){
1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectQueryEffect processing LVM_VIRTUALIZER");
1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        memcpy(pDescriptor, &gVirtualizerDescriptor, sizeof(effect_descriptor_t));
1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    } else if(index == LVM_EQUALIZER){
2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectQueryEffect processing LVM_EQUALIZER");
2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        memcpy(pDescriptor, &gEqualizerDescriptor,   sizeof(effect_descriptor_t));
2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    } else if(index == LVM_VOLUME){
2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectQueryEffect processing LVM_VOLUME");
2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        memcpy(pDescriptor, &gVolumeDescriptor, sizeof(effect_descriptor_t));
2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEffectQueryEffect end\n");
2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 0;
2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}     /* end EffectQueryEffect */
2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentextern "C" int EffectCreate(effect_uuid_t       *uuid,
2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            int32_t             sessionId,
2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            int32_t             ioId,
2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            effect_interface_t  *pInterface){
2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int ret;
2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int i;
2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    EffectContext *pContext = new EffectContext;
2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\n\tEffectCreate start session %d", sessionId);
2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pInterface == NULL || uuid == NULL){
2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	LOGV("\tLVM_ERROR : EffectCreate() called with NULL pointer");
2232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -EINVAL;
2242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((sessionId < 0)||(sessionId >= LVM_MAX_SESSIONS)){
2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLVM_ERROR : EffectCreate sessionId is less than 0");
2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -EINVAL;
2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmInitFlag == LVM_FALSE){
2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LvmInitFlag = LVM_TRUE;
2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectCreate - Initializing all global memory");
2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LvmGlobalBundle_init();
2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    // If this is the first create in this session
2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(GlobalSessionMemory[sessionId].bBundledEffectsEnabled == LVM_FALSE){
2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectCreate - This is the first effect in current session %d", sessionId);
2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectCreate - Setting up Bundled Effects Instance for session %d", sessionId);
2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[sessionId].bBundledEffectsEnabled = LVM_TRUE;
2422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[sessionId].pBundledContext        = new BundledEffectContext;
2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext = GlobalSessionMemory[sessionId].pBundledContext;
2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext->SessionNo            = sessionId;
2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext->hInstance            = NULL;
2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext->bVolumeEnabled       = LVM_FALSE;
2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext->bEqualizerEnabled    = LVM_FALSE;
2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext->bBassEnabled         = LVM_FALSE;
2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext->bVirtualizerEnabled  = LVM_FALSE;
2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext->NumberEffectsEnabled = 0;
2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext->NumberEffectsCalled  = 0;
2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Saved strength is used to return the exact strength that was used in the set to the get
2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * because we map the original strength range of 0:1000 to 1:15, and this will avoid
2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * quantisation like effect when returning
2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext->BassStrengthSaved    = 0;
2592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext->VirtStrengthSaved    = 0;
2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext->CurPreset            = PRESET_CUSTOM;
2612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext->levelSaved           = 0;
2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext->bMuteEnabled         = LVM_FALSE;
2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectCreate - Calling LvmBundle_init");
2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ret = LvmBundle_init(pContext);
2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (ret < 0){
2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tLVM_ERROR : EffectCreate() Bundle init failed");
2692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            delete pContext->pBundledContext;
2702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            delete pContext;
2712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return ret;
2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else{
2752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext = GlobalSessionMemory[sessionId].pBundledContext;
2762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEffectCreate - pBundledContext is %p", pContext->pBundledContext);
2792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    // Create each Effect
2812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (memcmp(uuid, &gBassBoostDescriptor.uuid, sizeof(effect_uuid_t)) == 0){
2822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        // Create Bass Boost
2832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectCreate - Effect to be created is LVM_BASS_BOOST");
2842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[sessionId].bBassInstantiated = LVM_TRUE;
2852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->itfe       = &gLvmEffectInterface;
2872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->EffectType = LVM_BASS_BOOST;
2882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    } else if (memcmp(uuid, &gVirtualizerDescriptor.uuid, sizeof(effect_uuid_t)) == 0){
2892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        // Create Virtualizer
2902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectCreate - Effect to be created is LVM_VIRTUALIZER");
2912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[sessionId].bVirtualizerInstantiated = LVM_TRUE;
2922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->itfe       = &gLvmEffectInterface;
2942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->EffectType = LVM_VIRTUALIZER;
2952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    } else if (memcmp(uuid, &gEqualizerDescriptor.uuid, sizeof(effect_uuid_t)) == 0){
2962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        // Create Equalizer
2972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectCreate - Effect to be created is LVM_EQUALIZER");
2982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[sessionId].bEqualizerInstantiated = LVM_TRUE;
2992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->itfe       = &gLvmEffectInterface;
3012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->EffectType = LVM_EQUALIZER;
3022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    } else if (memcmp(uuid, &gVolumeDescriptor.uuid, sizeof(effect_uuid_t)) == 0){
3032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        // Create Volume
3042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectCreate - Effect to be created is LVM_VOLUME");
3052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[sessionId].bVolumeInstantiated = LVM_TRUE;
3062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->itfe       = &gLvmEffectInterface;
3082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->EffectType = LVM_VOLUME;
3092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else{
3112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     	LOGV("\tLVM_ERROR : EffectCreate() invalid UUID");
3122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -EINVAL;
3132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pInterface = (effect_interface_t)pContext;
3162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEffectCreate end..\n\n");
3172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 0;
3182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} /* end EffectCreate */
3192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentextern "C" int EffectRelease(effect_interface_t interface){
3232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\n\tEffectRelease start %p", interface);
3242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    EffectContext * pContext = (EffectContext *)interface;
3252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pContext == NULL){
3272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	LOGV("\tLVM_ERROR : EffectRelease called with NULL pointer");
3282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -EINVAL;
3292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    // Clear the instantiated flag for the effect
3322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pContext->EffectType == LVM_BASS_BOOST) {
3332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectRelease LVM_BASS_BOOST Clearing global intstantiated flag");
3342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[pContext->pBundledContext->SessionNo].bBassInstantiated = LVM_FALSE;
3352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    } else if(pContext->EffectType == LVM_VIRTUALIZER) {
3362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectRelease LVM_VIRTUALIZER Clearing global intstantiated flag");
3372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[pContext->pBundledContext->SessionNo].bVirtualizerInstantiated = LVM_FALSE;
3382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    } else if(pContext->EffectType == LVM_EQUALIZER) {
3392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectRelease LVM_EQUALIZER Clearing global intstantiated flag");
3402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[pContext->pBundledContext->SessionNo].bEqualizerInstantiated = LVM_FALSE;
3412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    } else if(pContext->EffectType == LVM_VOLUME) {
3422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffectRelease LVM_VOLUME Clearing global intstantiated flag");
3432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[pContext->pBundledContext->SessionNo].bVolumeInstantiated = LVM_FALSE;
3442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    } else {
3452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLVM_ERROR : EffectRelease : Unsupported effect\n\n\n\n\n\n\n");
3462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    // if all effects are no longer instantiaed free the lvm memory and delete BundledEffectContext
3492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((GlobalSessionMemory[pContext->pBundledContext->SessionNo].bBassInstantiated == LVM_FALSE)&&
3502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       (GlobalSessionMemory[pContext->pBundledContext->SessionNo].bVolumeInstantiated == LVM_FALSE)&&
3512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       (GlobalSessionMemory[pContext->pBundledContext->SessionNo].bEqualizerInstantiated == LVM_FALSE)&&
3522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       (GlobalSessionMemory[pContext->pBundledContext->SessionNo].bVirtualizerInstantiated == LVM_FALSE))
3532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       LOGV("\tEffectRelease: All effects are no longer instantiated\n");
3552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       GlobalSessionMemory[pContext->pBundledContext->SessionNo].bBundledEffectsEnabled = LVM_FALSE;
3562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       GlobalSessionMemory[pContext->pBundledContext->SessionNo].pBundledContext = LVM_NULL;
3572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       LOGV("\tEffectRelease: Freeing LVM Bundle memory\n");
3582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       LvmEffect_free(pContext);
3592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       LOGV("\tEffectRelease: Deleting LVM Bundle context\n");
3602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       delete pContext->pBundledContext;
3612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    // free the effect context for current effect
3642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    delete pContext;
3652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEffectRelease end\n");
3672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 0;
3682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} /* end EffectRelease */
3702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LvmGlobalBundle_init(){
3872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tLvmGlobalBundle_init start");
3882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for(int i=0; i<LVM_MAX_SESSIONS; i++){
3892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[i].bBundledEffectsEnabled   = LVM_FALSE;
3902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[i].bVolumeInstantiated      = LVM_FALSE;
3912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[i].bEqualizerInstantiated   = LVM_FALSE;
3922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[i].bBassInstantiated        = LVM_FALSE;
3932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[i].bVirtualizerInstantiated = LVM_FALSE;
3942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        GlobalSessionMemory[i].pBundledContext          = LVM_NULL;
3952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return;
3972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
3982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
3992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// LvmBundle_init()
4002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
4012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose: Initialize engine with default configuration, creates instance
4022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// with all effects disabled.
4032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
4042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
4052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
4062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
4072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
4082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
4092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
4102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint LvmBundle_init(EffectContext *pContext){
4122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int status;
4132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tLvmBundle_init start");
4152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.inputCfg.accessMode                           = EFFECT_BUFFER_ACCESS_READ;
4172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.inputCfg.channels                             = CHANNEL_STEREO;
4182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.inputCfg.format                               = SAMPLE_FORMAT_PCM_S15;
4192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.inputCfg.samplingRate                         = 44100;
4202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.inputCfg.bufferProvider.getBuffer             = NULL;
4212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.inputCfg.bufferProvider.releaseBuffer         = NULL;
4222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.inputCfg.bufferProvider.cookie                = NULL;
4232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.inputCfg.mask                                 = EFFECT_CONFIG_ALL;
4242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.outputCfg.accessMode                          = EFFECT_BUFFER_ACCESS_ACCUMULATE;
4252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.outputCfg.channels                            = CHANNEL_STEREO;
4262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.outputCfg.format                              = SAMPLE_FORMAT_PCM_S15;
4272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.outputCfg.samplingRate                        = 44100;
4282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.outputCfg.bufferProvider.getBuffer            = NULL;
4292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.outputCfg.bufferProvider.releaseBuffer        = NULL;
4302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.outputCfg.bufferProvider.cookie               = NULL;
4312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->config.outputCfg.mask                                = EFFECT_CONFIG_ALL;
4322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    CHECK_ARG(pContext != NULL);
4342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pContext->pBundledContext->hInstance != NULL){
4362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLvmBundle_init pContext->pBassBoost != NULL "
4372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                "-> Calling pContext->pBassBoost->free()");
4382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LvmEffect_free(pContext);
4402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLvmBundle_init pContext->pBassBoost != NULL "
4422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                "-> Called pContext->pBassBoost->free()");
4432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #ifdef LVM_BUNDLE
4462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;          /* Function call status */
4472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t     params;                         /* Control Parameters */
4482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_InstParams_t        InstParams;                     /* Instance parameters */
4492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_EQNB_BandDef_t      BandDefs[MAX_NUM_BANDS];        /* Equaliser band definitions */
4502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_HeadroomParams_t    HeadroomParams;                 /* Headroom parameters */
4512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_HeadroomBandDef_t   HeadroomBandDef[LVM_HEADROOM_MAX_NBANDS];
4522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_MemTab_t            MemTab;                         /* Memory allocation table */
4532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    bool                    bMallocFailure = LVM_FALSE;
4542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Set the capabilities */
4562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    InstParams.BufferMode       = LVM_MANAGED_BUFFERS;
4572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    InstParams.MaxBlockSize     = MAX_CALL_SIZE;
4582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    InstParams.EQNB_NumBands    = MAX_NUM_BANDS;
4592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    InstParams.PSA_Included     = LVM_PSA_ON;
4602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Allocate memory, forcing alignment */
4622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetMemoryTable(LVM_NULL,
4632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                  &MemTab,
4642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                  &InstParams);
4652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetMemoryTable", "LvmBundle_init")
4672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
4682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tCreateInstance Succesfully called LVM_GetMemoryTable\n");
4702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Allocate memory */
4722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (int i=0; i<LVM_NR_MEMORY_REGIONS; i++){
4732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (MemTab.Region[i].Size != 0){
4742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            MemTab.Region[i].pBaseAddress = malloc(MemTab.Region[i].Size);
4752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (MemTab.Region[i].pBaseAddress == LVM_NULL){
4772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tLVM_ERROR : CreateInstance Failed to allocate %ld bytes for region %u\n",
4782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        MemTab.Region[i].Size, i );
4792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                bMallocFailure = LVM_TRUE;
4802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }else{
4812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tCreateInstance allocated %ld bytes for region %u at %p\n",
4822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress);
4832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
4842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
4852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* If one or more of the memory regions failed to allocate, free the regions that were
4882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * succesfully allocated and return with an error
4892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
4902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(bMallocFailure == LVM_TRUE){
4912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        for (int i=0; i<LVM_NR_MEMORY_REGIONS; i++){
4922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (MemTab.Region[i].pBaseAddress == LVM_NULL){
4932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tLVM_ERROR : CreateInstance Failed to allocate %ld bytes for region %u - Not freeing\n",
4942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        MemTab.Region[i].Size, i );
4952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }else{
4962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tLVM_ERROR : CreateInstance Failed: but allocated %ld bytes for region %u at %p- free\n",
4972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress);
4982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                free(MemTab.Region[i].pBaseAddress);
4992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
5002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
5012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -EINVAL;
5022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
5032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tCreateInstance Succesfully malloc'd memory\n");
5042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Initialise */
5062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->pBundledContext->hInstance = LVM_NULL;                        /* Initialise to NULL */
5072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetInstanceHandle(&pContext->pBundledContext->hInstance,/* Init sets the instance handle */
5092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      &MemTab,
5102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      &InstParams);
5112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetInstanceHandle", "LvmBundle_init")
5132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
5142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tCreateInstance Succesfully called LVM_GetInstanceHandle\n");
5162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Set the initial process parameters */
5182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* General parameters */
5192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.OperatingMode          = LVM_MODE_ON;
5202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.SampleRate             = LVM_FS_44100;
5212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.SourceFormat           = LVM_STEREO;
5222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.SpeakerType            = LVM_HEADPHONES;
5232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Concert Sound parameters */
5252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.VirtualizerOperatingMode   = LVM_MODE_OFF;
5262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.VirtualizerType            = LVM_CONCERTSOUND;
5272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.VirtualizerReverbLevel     = 100;
5282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.CS_EffectLevel             = LVM_CS_EFFECT_HIGH;
5292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* N-Band Equaliser parameters */
5312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.EQNB_OperatingMode     = LVM_EQNB_OFF;
5322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.EQNB_NBands            = FIVEBAND_NUMBANDS;
5332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.pEQNB_BandDefinition   = &BandDefs[0];
5342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (int i=0; i<FIVEBAND_NUMBANDS; i++)
5352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
5362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        BandDefs[i].Frequency = EQNB_5BandPresetsFrequencies[i];
5372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        BandDefs[i].QFactor   = EQNB_5BandPresetsQFactors[i];
5382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        BandDefs[i].Gain      = EQNB_5BandNormalPresets[i];
5392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
5402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Volume Control parameters */
5422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.VC_EffectLevel         = 0;
5432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.VC_Balance             = 0;
5442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Treble Enhancement parameters */
5462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.TE_OperatingMode       = LVM_TE_OFF;
5472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.TE_EffectLevel         = 0;
5482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* PSA Control parameters */
5502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.PSA_Enable             = LVM_PSA_OFF;
5512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.PSA_PeakDecayRate      = (LVM_PSA_DecaySpeed_en)0;
5522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Bass Enhancement parameters */
5542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.BE_OperatingMode       = LVM_BE_OFF;
5552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.BE_EffectLevel         = 0;
5562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.BE_CentreFreq          = LVM_BE_CENTRE_90Hz;
5572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.BE_HPF                 = LVM_BE_HPF_ON;
5582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* PSA Control parameters */
5602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.PSA_Enable             = LVM_PSA_OFF;
5612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    params.PSA_PeakDecayRate      = LVM_PSA_SPEED_MEDIUM;
5622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance,     /* Activate the initial settings */
5642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                         &params);
5652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "LvmBundle_init")
5672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
5682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tCreateInstance Succesfully called LVM_SetControlParameters\n");
5702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Set the headroom parameters */
5722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    HeadroomBandDef[0].Limit_Low          = 20;
5732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    HeadroomBandDef[0].Limit_High         = 4999;
5742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    HeadroomBandDef[0].Headroom_Offset    = 3;
5752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    HeadroomBandDef[1].Limit_Low          = 5000;
5762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    HeadroomBandDef[1].Limit_High         = 24000;
5772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    HeadroomBandDef[1].Headroom_Offset    = 4;
5782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    HeadroomParams.pHeadroomDefinition    = &HeadroomBandDef[0];
5792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    HeadroomParams.Headroom_OperatingMode = LVM_HEADROOM_ON;
5802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    HeadroomParams.NHeadroomBands         = 2;
5812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_SetHeadroomParams(pContext->pBundledContext->hInstance,
5832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      &HeadroomParams);
5842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_SetHeadroomParams", "LvmBundle_init")
5862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
5872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tCreateInstance Succesfully called LVM_SetHeadroomParams\n");
5892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #endif    /* end LVM_BUNDLE */
5902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tLvmBundle_init End");
5922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 0;
5932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}   /* end LvmBundle_init */
5942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
5982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// LvmBundle_process()
5992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
6002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
6012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Apply LVM Bundle effects
6022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
6032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
6042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pIn:        pointer to stereo 16 bit input data
6052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pOut:       pointer to stereo 16 bit output data
6062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  frameCount: Frames to process
6072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
6082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  strength    strength to be applied
6092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
6102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  Outputs:
6112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pOut:       pointer to updated stereo 16 bit output data
6122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
6132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
6142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint LvmBundle_process(LVM_INT16        *pIn,
6162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             LVM_INT16        *pOut,
6172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             int              frameCount,
6182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             EffectContext *pContext){
6192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t     ActiveParams;                           /* Current control Parameters */
6212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
6222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #ifdef LVM_BUNDLE
6252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LVM_INT16				*pOutTmp;
6262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	if (pContext->config.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_WRITE){
6272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		//LOGV("\tprocess: mBehavior is EFFECT_BUFFER_ACCESS_WRITE %d\n",
6282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		//		pContext->config.outputCfg.accessMode);
6292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		pOutTmp = pOut;
6302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	}else if (pContext->config.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE){
6312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		//LOGV("\tprocess: mBehavior is EFFECT_BUFFER_ACCESS_ACCUMULATE %d\n",
6322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		//		pContext->config.outputCfg.accessMode);
6332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		pOutTmp = (LVM_INT16 *)malloc(frameCount * sizeof(LVM_INT16) * 2);
6342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		if(pOutTmp == NULL){
6352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent			LOGV("\tLVM_ERROR : LvmBundle_process failed to allocate memory for EFFECT_BUFFER_ACCESS_ACCUMULATE mode");
6362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent			return -EINVAL;
6372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		}
6382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	}else{
6392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		LOGV("LVM_ERROR : LvmBundle_process invalid access mode");
6402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		return -EINVAL;
6412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	}
6422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	/* Process the samples */
6442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,  /* Get the current settings */
6452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                         &ActiveParams);
6462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "LvmEffect_enable")
6482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
6492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\t%d %d %d\n",ActiveParams.BE_OperatingMode, ActiveParams.VirtualizerOperatingMode, ActiveParams.EQNB_OperatingMode);
6502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_Process(pContext->pBundledContext->hInstance, /* Instance handle */
6532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            pIn,                                  /* Input buffer */
6542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            pOutTmp,                              /* Output buffer */
6552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            (LVM_UINT16)frameCount,               /* Number of samples to read */
6562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            0);                                   /* Audo Time */
6572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_Process", "LvmBundle_process")
6582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
6592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	if (pContext->config.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE){
6612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		for (int i=0; i<frameCount*2; i++){
6622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent			pOut[i] +=  pOutTmp[i];
6632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		}
6642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		free(pOutTmp);
6652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	}
6662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #else
6672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    memcpy(pOut, pIn, frameCount*sizeof(LVM_INT16)*2); // 2 is for stereo input
6682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #endif    /* end LVM_BUNDLE */
6692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 0;
6702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}    /* end LvmBundle_process */
6712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
6732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// LvmEffect_enable()
6742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
6752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose: Enable the effect in the bundle
6762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
6772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
6782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
6792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
6802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
6812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
6822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
6832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint LvmEffect_enable(EffectContext *pContext){
6852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tLvmEffect_enable start");
6862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #ifdef LVM_BUNDLE
6882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t     ActiveParams;                           /* Current control Parameters */
6892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
6902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,  /* Get the current settings */
6922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                         &ActiveParams);
6932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "LvmEffect_enable")
6952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
6962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tLvmEffect_enable Succesfully called LVM_GetControlParameters\n");
6972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pContext->EffectType == LVM_BASS_BOOST) {
6992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLvmEffect_enable : Enabling LVM_BASS_BOOST");
7002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ActiveParams.BE_OperatingMode       = LVM_BE_ON;
7012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
7022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pContext->EffectType == LVM_VIRTUALIZER) {
7032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLvmEffect_enable : Enabling LVM_VIRTUALIZER");
7042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ActiveParams.VirtualizerOperatingMode   = LVM_MODE_ON;
7052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
7062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pContext->EffectType == LVM_EQUALIZER) {
7072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLvmEffect_enable : Enabling LVM_EQUALIZER");
7082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ActiveParams.EQNB_OperatingMode     = LVM_EQNB_ON;
7092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
7102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pContext->EffectType == LVM_VOLUME) {
7112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLvmEffect_enable : Enabling LVM_VOLUME");
7122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
7132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
7152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "LvmEffect_enable")
7162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
7172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tLvmEffect_enable Succesfully called LVM_SetControlParameters\n");
7182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #endif    /* end LVM_BUNDLE */
7192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tLvmEffect_enable end");
7212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 0;
7222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
7232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
7262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// LvmEffect_disable()
7272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
7282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose: Disable the effect in the bundle
7292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
7302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
7312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
7322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
7332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
7342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
7352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
7362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint LvmEffect_disable(EffectContext *pContext){
7382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tLvmEffect_disable start");
7392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #ifdef LVM_BUNDLE
7412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t     ActiveParams;                           /* Current control Parameters */
7422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
7432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,  /* Get the current settings */
7452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                         &ActiveParams);
7462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "LvmEffect_disable")
7482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
7492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tLvmEffect_disable Succesfully called LVM_GetControlParameters\n");
7502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pContext->EffectType == LVM_BASS_BOOST) {
7522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLvmEffect_disable : Disabling LVM_BASS_BOOST");
7532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ActiveParams.BE_OperatingMode       = LVM_BE_OFF;
7542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
7552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pContext->EffectType == LVM_VIRTUALIZER) {
7562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLvmEffect_enable : Enabling LVM_VIRTUALIZER");
7572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ActiveParams.VirtualizerOperatingMode   = LVM_MODE_OFF;
7582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
7592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pContext->EffectType == LVM_EQUALIZER) {
7602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLvmEffect_enable : Enabling LVM_EQUALIZER");
7612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ActiveParams.EQNB_OperatingMode     = LVM_EQNB_OFF;
7622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
7632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pContext->EffectType == LVM_VOLUME) {
7642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLvmEffect_enable : Enabling LVM_VOLUME");
7652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
7662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
7682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "LvmEffect_disable")
7692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
7702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tLvmEffect_enable Succesfully called LVM_SetControlParameters\n");
7712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #endif    /* end LVM_BUNDLE */
7722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tLvmEffect_enable end");
7742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 0;
7752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
7762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
7792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// LvmEffect_free()
7802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
7812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose: Free all memory associated with the Bundle.
7822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
7832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
7842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
7852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
7862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
7872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
7882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
7892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LvmEffect_free(EffectContext *pContext){
7912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #ifdef LVM_BUNDLE
7922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;         /* Function call status */
7932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t     params;                        /* Control Parameters */
7942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_MemTab_t            MemTab;
7952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Free the algorithm memory */
7972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetMemoryTable(pContext->pBundledContext->hInstance,
7982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                   &MemTab,
7992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                   LVM_NULL);
8002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetMemoryTable", "LvmEffect_free")
8022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (int i=0; i<LVM_NR_MEMORY_REGIONS; i++){
8042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (MemTab.Region[i].Size != 0){
8052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (MemTab.Region[i].pBaseAddress != NULL){
8062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tfree() - START freeing %ld bytes for region %u at %p\n",
8072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress);
8082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                free(MemTab.Region[i].pBaseAddress);
8102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tfree() - END   freeing %ld bytes for region %u at %p\n",
8122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress);
8132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }else{
8142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tLVM_ERROR : free() - trying to free with NULL pointer %ld bytes "
8152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "for region %u at %p ERROR\n",
8162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress);
8172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
8182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
8192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
8202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #endif    /* end LVM_BUNDLE */
8212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}    /* end LvmEffect_free */
8222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
8242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Effect_configure()
8252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
8262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose: Set input and output audio configuration.
8272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
8282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
8292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
8302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pConfig:    pointer to effect_config_t structure holding input and output
8312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//      configuration parameters
8322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
8332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
8342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
8352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
8362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint Effect_configure(EffectContext *pContext, effect_config_t *pConfig){
8382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEffect_configure start");
8392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    CHECK_ARG(pContext != NULL);
8412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    CHECK_ARG(pConfig != NULL);
8422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    CHECK_ARG(pConfig->inputCfg.samplingRate == pConfig->outputCfg.samplingRate);
8442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    CHECK_ARG(pConfig->inputCfg.channels == pConfig->outputCfg.channels);
8452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    CHECK_ARG(pConfig->inputCfg.format == pConfig->outputCfg.format);
8462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    CHECK_ARG(pConfig->inputCfg.channels == CHANNEL_STEREO);
8472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    CHECK_ARG(pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_WRITE
8482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent              || pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE);
8492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    CHECK_ARG(pConfig->inputCfg.format == SAMPLE_FORMAT_PCM_S15);
8502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEffect_configure calling memcpy");
8522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    memcpy(&pContext->config, pConfig, sizeof(effect_config_t));
8532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEffect_configure End");
8542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 0;
8552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}   /* end Effect_configure */
8562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
8822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// BassGetStrength()
8832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
8842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
8852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// get the effect strength currently being used, what is actually returned is the strengh that was
8862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// previously used in the set, this is because the app uses a strength in the range 0-1000 while
8872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// the bassboost uses 1-15, so to avoid a quantisation the original set value is used. However the
8882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// actual used value is checked to make sure it corresponds to the one being returned
8892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
8902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
8912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
8922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
8932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
8942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentuint32_t BassGetStrength(EffectContext *pContext){
8962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tBassGetStrength() (0-1000) -> %d\n", pContext->pBundledContext->BassStrengthSaved);
8972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #ifdef LVM_BUNDLE
8992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t     ActiveParams;                           /* Current control Parameters */
9002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
9012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,  /* Get the current settings */
9032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                         &ActiveParams);
9042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "BassGetStrength")
9062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
9072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tBassGetStrength Succesfully returned from LVM_GetControlParameters\n");
9092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Check that the strength returned matches the strength that was set earlier */
9112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(ActiveParams.BE_EffectLevel != (LVM_INT16)((15*pContext->pBundledContext->BassStrengthSaved)/1000)){
9122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLVM_ERROR : BassGetStrength module strength does not match savedStrength %d %d\n",
9132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                ActiveParams.BE_EffectLevel, pContext->pBundledContext->BassStrengthSaved);
9142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -EINVAL;
9152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
9162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tBassGetStrength() (0-15)   -> %d\n", ActiveParams.BE_EffectLevel );
9182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #endif    /* end LVM_BUNDLE */
9192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tBassGetStrength() (saved)  -> %d\n", pContext->pBundledContext->BassStrengthSaved );
9212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return pContext->pBundledContext->BassStrengthSaved;
9222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}    /* end BassGetStrength */
9232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
9252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// BassSetStrength()
9262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
9272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
9282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Apply the strength to the BassBosst. Must first be converted from the range 0-1000 to 1-15
9292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
9302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
9312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
9322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  strength    strength to be applied
9332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
9342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
9352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid BassSetStrength(EffectContext *pContext, uint32_t strength){
9372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tBassSetStrength(%d)", strength);
9382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->pBundledContext->BassStrengthSaved = (int)strength;
9402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #ifdef LVM_BUNDLE
9422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t     ActiveParams;              /* Current control Parameters */
9432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;     /* Function call status */
9442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Get the current settings */
9462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,
9472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                         &ActiveParams);
9482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "BassSetStrength")
9502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tsetStrength Succesfully returned from LVM_GetControlParameters\n");
9512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Bass Enhancement parameters */
9532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//    ActiveParams.BE_OperatingMode  = LVM_BE_ON;
9542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    ActiveParams.BE_EffectLevel    = (LVM_INT16)((15*strength)/1000);
9552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    ActiveParams.BE_CentreFreq     = LVM_BE_CENTRE_90Hz;
9562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tBassSetStrength() (0-15)   -> %d\n", ActiveParams.BE_EffectLevel );
9582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Activate the initial settings */
9602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
9612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "BassSetStrength")
9632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tBassSetStrength Succesfully called LVM_SetControlParameters\n");
9642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #endif    /* end LVM_BUNDLE */
9652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}    /* end BassSetStrength */
9662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
9682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// VirtualizerGetStrength()
9692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
9702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
9712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// get the effect strength currently being used, what is actually returned is the strengh that was
9722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// previously used in the set, this is because the app uses a strength in the range 0-1000 while
9732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// the Virtualizer uses 1-100, so to avoid a quantisation the original set value is used. However the
9742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// actual used value is checked to make sure it corresponds to the one being returned
9752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
9762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
9772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
9782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
9792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
9802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentuint32_t VirtualizerGetStrength(EffectContext *pContext){
9822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVirtualizerGetStrength() (0-1000) -> %d\n", pContext->pBundledContext->VirtStrengthSaved );
9832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #ifdef LVM_BUNDLE
9852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t     ActiveParams;                           /* Current control Parameters */
9862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
9872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
9892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VirtualizerGetStrength")
9912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
9922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVirtualizerGetStrength Succesfully returned from LVM_GetControlParameters\n");
9942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVirtualizerGetStrength() (0-100)   -> %d\n", ActiveParams.VirtualizerReverbLevel*10);
9952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #endif    /* end LVM_BUNDLE */
9962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return ActiveParams.VirtualizerReverbLevel*10;
9982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}    /* end getStrength */
9992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
10012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// VirtualizerSetStrength()
10022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
10032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
10042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Apply the strength to the Virtualizer. Must first be converted from the range 0-1000 to 1-15
10052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
10062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
10072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
10082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  strength    strength to be applied
10092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
10102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
10112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid VirtualizerSetStrength(EffectContext *pContext, uint32_t strength){
10132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVirtualizerSetStrength(%d)", strength);
10142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->pBundledContext->VirtStrengthSaved = (int)strength;
10162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #ifdef LVM_BUNDLE
10182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t     ActiveParams;              /* Current control Parameters */
10192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;     /* Function call status */
10202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Get the current settings */
10222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,&ActiveParams);
10232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VirtualizerSetStrength")
10252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVirtualizerSetStrength Succesfully returned from LVM_GetControlParameters\n");
10262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Virtualizer parameters */
10282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    ActiveParams.VirtualizerReverbLevel    = (LVM_INT16)(strength/10);
10292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVirtualizerSetStrength() (0-1000)   -> %d\n", strength );
10312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVirtualizerSetStrength() (0- 100)   -> %d\n", ActiveParams.VirtualizerReverbLevel );
10322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Activate the initial settings */
10342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
10352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "VirtualizerSetStrength")
10362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVirtualizerSetStrength Succesfully called LVM_SetControlParameters\n");
10372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #endif    /* end LVM_BUNDLE */
10382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}    /* end setStrength */
10392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
10412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// EqualizerGetBandLevel()
10422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
10432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose: Retrieve the gain currently being used for the band passed in
10442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
10452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
10462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  band:       band number
10472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
10482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
10492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
10502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
10512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
10522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint32_t EqualizerGetBandLevel(EffectContext *pContext, int32_t band){
10532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	int32_t Gain =0;
10552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	#ifdef LVM_BUNDLE
10572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LVM_ControlParams_t     ActiveParams;                           /* Current control Parameters */
10582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
10592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LVM_EQNB_BandDef_t      *BandDef;
10602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,        /* Get the current settings */
10622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent										 &ActiveParams);
10632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "getBandLevel")
10652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	BandDef = ActiveParams.pEQNB_BandDefinition;
10672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	Gain    = (int32_t)BandDef[band].Gain*100;    // Convert to millibels
10682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LOGV("\tgetBandLevel() -> %d\n", Gain );
10702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LOGV("\tgetBandLevel Succesfully returned from LVM_GetControlParameters\n");
10712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	#endif    /* end LVM_BUNDLE */
10722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	return Gain;
10742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
10752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
10772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// EqualizerSetBandLevel()
10782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
10792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
10802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  Sets gain value for the given band.
10812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
10822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
10832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  band:       band number
10842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  Gain:       Gain to be applied in millibels
10852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
10862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
10872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
10882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
10892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//---------------------------------------------------------------------------
10902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid EqualizerSetBandLevel(EffectContext *pContext, int band, int Gain){
10912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	int gainRounded;
10922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	if(Gain > 0){
10932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		gainRounded = (int)((Gain+50)/100);
10942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	}else{
10952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		gainRounded = (int)((Gain-50)/100);
10962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	}
10972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tsetBandLevel(%d)->(%d)", Gain, gainRounded);
10982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #ifdef LVM_BUNDLE
11002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t     ActiveParams;              /* Current control Parameters */
11012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;     /* Function call status */
11022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LVM_EQNB_BandDef_t      *BandDef;
11032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
11042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Get the current settings */
11052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
11062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "setBandLevel")
11072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tsetBandLevel Succesfully returned from LVM_GetControlParameters\n");
11082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tsetBandLevel() just Got -> %d\n", ActiveParams.pEQNB_BandDefinition[band].Gain);
11092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
11102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Set local EQ parameters */
11112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	BandDef = ActiveParams.pEQNB_BandDefinition;
11122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	ActiveParams.pEQNB_BandDefinition[band].Gain = gainRounded;
11132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
11142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Activate the initial settings */
11152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
11162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "setBandLevel")
11172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tsetBandLevel() just Set -> %d\n", ActiveParams.pEQNB_BandDefinition[band].Gain);
11182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
11192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Get the current settings to check they were applied ok, might not work as process not called*/
11202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
11212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "setBandLevel")
11222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tLVM_ERROR : remove this test setBandLevel Succesfully returned from LVM_GetControlParameters\n");
11232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tsetBandLevel() just Got -> %d\n", ActiveParams.pEQNB_BandDefinition[band].Gain);
11242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tsetBandLevel Succesfully called LVM_SetControlParameters\n");
11252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #endif    /* end LVM_BUNDLE */
11262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
11272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->pBundledContext->CurPreset = PRESET_CUSTOM;
11282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return;
11292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
11302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
11312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// EqualizerGetCentreFrequency()
11322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
11332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose: Retrieve the frequency being used for the band passed in
11342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
11352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
11362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  band:       band number
11372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
11382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
11392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
11402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
11412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
11422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint32_t EqualizerGetCentreFrequency(EffectContext *pContext, int32_t band){
11432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	int32_t Frequency =0;
11442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
11452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	#ifdef LVM_BUNDLE
11462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LVM_ControlParams_t     ActiveParams;                           /* Current control Parameters */
11472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
11482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LVM_EQNB_BandDef_t      *BandDef;
11492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
11502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,        /* Get the current settings */
11512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent										 &ActiveParams);
11522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
11532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "getCentreFrequency")
11542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
11552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	BandDef   = ActiveParams.pEQNB_BandDefinition;
11562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	Frequency = (int32_t)BandDef[band].Frequency*1000;     // Convert to millibels
11572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
11582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LOGV("\tgetCentreFrequency() -> %d\n", Frequency );
11592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	LOGV("\tgetCentreFrequency Succesfully returned from LVM_GetControlParameters\n");
11602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	#endif    /* end LVM_BUNDLE */
11612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
11622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	return Frequency;
11632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
11642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
11652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
11662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// EqualizerGetBandFreqRange(
11672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
11682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
11692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
11702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Gets lower and upper boundaries of a band.
11712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// For the high shelf, the low bound is the band frequency and the high
11722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// bound is Nyquist.
11732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// For the peaking filters, they are the gain[dB]/2 points.
11742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
11752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
11762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  band:       band number
11772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
11782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
11792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
11802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pLow:       lower band range
11812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pLow:       upper band range
11822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
11832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint32_t EqualizerGetBandFreqRange(EffectContext *pContext, int32_t band, uint32_t *pLow, uint32_t *pHi){
11842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	*pLow = bandFreqRange[band][0];
11852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	*pHi  = bandFreqRange[band][1];
11862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	return 0;
11872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
11882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
11892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
11902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// EqualizerGetBand(
11912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
11922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
11932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
11942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Returns the band with the maximum influence on a given frequency.
11952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Result is unaffected by whether EQ is enabled or not, or by whether
11962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// changes have been committed or not.
11972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
11982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
11992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  targetFreq   The target frequency, in millihertz.
12002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:    effect engine context
12012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
12022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
12032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pLow:       lower band range
12042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pLow:       upper band range
12052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
12062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint32_t EqualizerGetBand(EffectContext *pContext, uint32_t targetFreq){
12072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int band = 0;
12082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
12092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	if(targetFreq < bandFreqRange[0][0]){
12102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		return -EINVAL;
12112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	}else if(targetFreq == bandFreqRange[0][0]){
12122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		return 0;
12132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	}
12142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	for(int i=0; i<FIVEBAND_NUMBANDS;i++){
12152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		if((targetFreq > bandFreqRange[i][0])&&(targetFreq <= bandFreqRange[i][1])){
12162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent			band = i;
12172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent		}
12182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	}
12192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return band;
12202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
12212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
12222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
12232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// EqualizerGetPreset(
12242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
12252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
12262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
12272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Gets the currently set preset ID.
12282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Will return PRESET_CUSTOM in case the EQ parameters have been modified
12292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// manually since a preset was set.
12302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
12312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
12322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:    effect engine context
12332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
12342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
12352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint32_t EqualizerGetPreset(EffectContext *pContext){
12362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	return pContext->pBundledContext->CurPreset;
12372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
12382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
12392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
12402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// EqualizerSetPreset(
12412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
12422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
12432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
12442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Sets the current preset by ID.
12452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// All the band parameters will be overridden.
12462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
12472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
12482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:    effect engine context
12492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  preset       The preset ID.
12502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
12512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
12522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid EqualizerSetPreset(EffectContext *pContext, int preset){
12532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
12542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tsetPreset(%d)", preset);
12552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->pBundledContext->CurPreset = preset;
12562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
12572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #ifdef LVM_BUNDLE
12582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t     ActiveParams;              /* Current control Parameters */
12592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;     /* Function call status */
12602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
12612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Get the current settings */
12622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
12632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "setPreset")
12642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tsetPreset Succesfully returned from LVM_GetControlParameters\n");
12652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
12662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    //ActiveParams.pEQNB_BandDefinition = &BandDefs[0];
12672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (int i=0; i<FIVEBAND_NUMBANDS; i++)
12682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
12692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	ActiveParams.pEQNB_BandDefinition[i].Frequency = EQNB_5BandPresetsFrequencies[i];
12702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	ActiveParams.pEQNB_BandDefinition[i].QFactor   = EQNB_5BandPresetsQFactors[i];
12712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	ActiveParams.pEQNB_BandDefinition[i].Gain
12722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	= EQNB_5BandNormalPresets[i + preset * FIVEBAND_NUMBANDS];
12732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
12742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Activate the new settings */
12752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
12762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "setPreset")
12772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tsetPreset Succesfully called LVM_SetControlParameters\n");
12782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #endif    /* end LVM_BUNDLE */
12792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
12802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return;
12812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
12822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint32_t EqualizerGetNumPresets(){
12832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	return 10;
12842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
12852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
12862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
12872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// EqualizerGetPresetName(
12882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
12892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
12902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Gets a human-readable name for a preset ID. Will return "Custom" if
12912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// PRESET_CUSTOM is passed.
12922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
12932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
12942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// preset       The preset ID. Must be less than number of presets.
12952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
12962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//-------------------------------------------------------------------------
12972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentconst char * EqualizerGetPresetName(int32_t preset){
12982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEqualizerGetPresetName start(%d)", preset);
12992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (preset == PRESET_CUSTOM) {
13002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return "Custom";
13012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    } else {
13022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return gEqualizerPresets[preset].name;
13032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
13042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEqualizerGetPresetName end(%d)", preset);
13052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent	return 0;
13062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
13072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
13092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// VolumeSetVolumeLevel()
13102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
13112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
13122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
13132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
13142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
13152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  level       level to be applied
13162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
13172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
13182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint VolumeSetVolumeLevel(EffectContext *pContext, int16_t level){
13202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeSetVolumeLevel start(%d)", level);
13212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #ifdef LVM_BUNDLE
13232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t     ActiveParams;              /* Current control Parameters */
13242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;     /* Function call status */
13252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Get the current settings */
13272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
13282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VolumeSetVolumeLevel")
13292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
13302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeSetVolumeLevel Succesfully returned from LVM_GetControlParameters\n");
13312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Volume parameters */
13332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    ActiveParams.VC_EffectLevel  = (LVM_INT16)(level/100);
13342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeSetVolumeLevel() (-96dB -> 0dB)   -> %d\n", ActiveParams.VC_EffectLevel );
13352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Activate the initial settings */
13372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
13382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "VolumeSetVolumeLevel")
13392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
13402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeSetVolumeLevel Succesfully called LVM_SetControlParameters\n");
13422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeSetVolumeLevel end");
13432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #endif    /* end LVM_BUNDLE */
13442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 0;
13452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}    /* end setVolumeLevel */
13462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
13482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// VolumeGetVolumeLevel()
13492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
13502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
13512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
13522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
13532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
13542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
13552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
13562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint VolumeGetVolumeLevel(EffectContext *pContext, int16_t *level){
13582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeGetVolumeLevel start");
13602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #ifdef LVM_BUNDLE
13612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t     ActiveParams;                           /* Current control Parameters */
13622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en     LvmStatus = LVM_SUCCESS;                /* Function call status */
13632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
13652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VolumeGetVolumeLevel")
13662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
13672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeGetVolumeLevel() (-96dB -> 0dB) -> %d\n", ActiveParams.VC_EffectLevel );
13692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeGetVolumeLevel Succesfully returned from LVM_GetControlParameters\n");
13702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #endif    /* end LVM_BUNDLE */
13712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *level = ActiveParams.VC_EffectLevel*100;     // Convert dB to millibels
13732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeGetVolumeLevel end");
13742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 0;
13752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}    /* end VolumeGetVolumeLevel */
13762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
13782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// VolumeSetMute()
13792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
13802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
13812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
13822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
13832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
13842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  mute:       enable/disable flag
13852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
13862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
13872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint32_t VolumeSetMute(EffectContext *pContext, uint32_t mute){
13892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeSetMute start()");
13902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->pBundledContext->bMuteEnabled = mute;
13922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #ifdef LVM_BUNDLE
13942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t     ActiveParams;              /* Current control Parameters */
13952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en     LvmStatus=LVM_SUCCESS;     /* Function call status */
13962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
13972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Get the current settings */
13982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
13992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VolumeSetMute")
14002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
14012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeSetMute Succesfully returned from LVM_GetControlParameters\n");
14032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeSetMute() to %d, level was %d\n", mute, ActiveParams.BE_EffectLevel );
14042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Set appropriate volume level */
14062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pContext->pBundledContext->bMuteEnabled == LVM_TRUE){
14072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	pContext->pBundledContext->levelSaved = ActiveParams.VC_EffectLevel;
14082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	ActiveParams.VC_EffectLevel           = -96;
14092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }else{
14102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	ActiveParams.VC_EffectLevel  = pContext->pBundledContext->levelSaved;
14112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
14122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Activate the initial settings */
14142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams);
14152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "VolumeSetMute")
14162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LvmStatus != LVM_SUCCESS) return -EINVAL;
14172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeSetMute Succesfully called LVM_SetControlParameters\n");
14192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    #endif    /* end LVM_BUNDLE */
14202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeSetMute start()");
14212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 0;
14222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}    /* end setMute */
14232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
14252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// VolumeSetMute()
14262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
14272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
14282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
14292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
14302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pContext:   effect engine context
14312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
14322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Ourputs:
14332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  mute:       enable/disable flag
14342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
14352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint32_t VolumeGetMute(EffectContext *pContext, uint32_t *mute){
14372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeGetMute start");
14382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((pContext->pBundledContext->bMuteEnabled == LVM_FALSE)||(pContext->pBundledContext->bMuteEnabled == LVM_TRUE)){
14392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	*mute = pContext->pBundledContext->bMuteEnabled;
14402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	return 0;
14412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }else{
14422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	LOGV("\tLVM_ERROR : VolumeGetMute read an invalid value from context %d", pContext->pBundledContext->bMuteEnabled);
14432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	return -EINVAL;
14442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
14452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolumeGetMute start");
14462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}    /* end getMute */
14472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
14642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// BassBoost_getParameter()
14652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
14662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
14672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Get a BassBoost parameter
14682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
14692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
14702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pBassBoost       - handle to instance data
14712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pParam           - pointer to parameter
14722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pValue           - pointer to variable to hold retrieved value
14732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pValueSize       - pointer to value size: maximum size as input
14742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
14752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
14762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  *pValue updated with parameter value
14772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  *pValueSize updated with actual value size
14782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
14792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
14802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Side Effects:
14812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
14822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
14832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint BassBoost_getParameter(EffectContext     *pContext,
14852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           int32_t              *pParam,
14862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           size_t               *pValueSize,
14872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           void                 *pValue){
14882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int status = 0;
14892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int32_t param = *pParam++;
14902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int32_t param2;
14912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    char *name;
14922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tBassBoost_getParameter start");
14942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
14952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    switch (param){
14962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case BASSBOOST_PARAM_STRENGTH_SUP:
14972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            //if (*pValueSize != sizeof(uint32_t)){
14982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            //    LOGV("\tLVM_ERROR : BassBoost_getParameter() invalid pValueSize1 %d", *pValueSize);
14992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            //    return -EINVAL;
15002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            //}
15012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            //*pValueSize = sizeof(uint32_t);
15022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            //break;
15032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case BASSBOOST_PARAM_STRENGTH:
15042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (*pValueSize != sizeof(int16_t)){
15052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tLVM_ERROR : BassBoost_getParameter() invalid pValueSize2 %d", *pValueSize);
15062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                return -EINVAL;
15072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
15082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *pValueSize = sizeof(int16_t);
15092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
15102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
15112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        default:
15122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	LOGV("\tLVM_ERROR : BassBoost_getParameter() invalid param %d", param);
15132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return -EINVAL;
15142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
15152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
15162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    switch (param){
15172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case BASSBOOST_PARAM_STRENGTH_SUP:
15182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *(uint32_t *)pValue = 1;
15192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
15202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tBassBoost_getParameter() BASSBOOST_PARAM_STRENGTH_SUP Value is %d",
15212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    *(uint32_t *)pValue);
15222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
15232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
15242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case BASSBOOST_PARAM_STRENGTH:
15252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *(int16_t *)pValue = BassGetStrength(pContext);
15262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
15272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tBassBoost_getParameter() BASSBOOST_PARAM_STRENGTH Value is %d",
15282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    *(int16_t *)pValue);
15292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
15302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
15312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        default:
15322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tLVM_ERROR : BassBoost_getParameter() invalid param %d", param);
15332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            status = -EINVAL;
15342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
15352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
15362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
15372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tBassBoost_getParameter end");
15382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return status;
15392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} /* end BassBoost_getParameter */
15402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
15412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
15422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
15432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// BassBoost_setParameter()
15442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
15452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
15462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Set a BassBoost parameter
15472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
15482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
15492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pBassBoost       - handle to instance data
15502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pParam           - pointer to parameter
15512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pValue           - pointer to value
15522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
15532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
15542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
15552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
15562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
15572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint BassBoost_setParameter (EffectContext *pContext, int32_t *pParam, void *pValue){
15582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int status = 0;
15592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int16_t strength;
15602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
15612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tBassBoost_setParameter start");
15622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
15632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    switch (*pParam){
15642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case BASSBOOST_PARAM_STRENGTH:
15652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            strength = *(int16_t *)pValue;
15662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tBassBoost_setParameter() BASSBOOST_PARAM_STRENGTH value is %d", strength);
15672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tBassBoost_setParameter() Calling pBassBoost->BassSetStrength");
15682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            BassSetStrength(pContext, (int32_t)strength);
15692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tBassBoost_setParameter() Called pBassBoost->BassSetStrength");
15702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent           break;
15712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        default:
15722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tLVM_ERROR : BassBoost_setParameter() invalid param %d", *pParam);
15732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
15742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
15752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
15762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tBassBoost_setParameter end");
15772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return status;
15782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} /* end BassBoost_setParameter */
15792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
15802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
15812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Virtualizer_getParameter()
15822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
15832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
15842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Get a Virtualizer parameter
15852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
15862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
15872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pVirtualizer     - handle to instance data
15882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pParam           - pointer to parameter
15892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pValue           - pointer to variable to hold retrieved value
15902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pValueSize       - pointer to value size: maximum size as input
15912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
15922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
15932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  *pValue updated with parameter value
15942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  *pValueSize updated with actual value size
15952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
15962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
15972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Side Effects:
15982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
15992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
16002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint Virtualizer_getParameter(EffectContext        *pContext,
16022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                             int32_t              *pParam,
16032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                             size_t               *pValueSize,
16042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                             void                 *pValue){
16052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int status = 0;
16062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int32_t param = *pParam++;
16072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int32_t param2;
16082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    char *name;
16092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVirtualizer_getParameter start");
16112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    switch (param){
16132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VIRTUALIZER_PARAM_STRENGTH_SUP:
16142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            //if (*pValueSize != sizeof(uint32_t)){
16152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            //    LOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid pValueSize1 %d", *pValueSize);
16162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            //    return -EINVAL;
16172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            //}
16182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            //*pValueSize = sizeof(uint32_t);
16192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            //break;
16202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VIRTUALIZER_PARAM_STRENGTH:
16212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (*pValueSize != sizeof(int16_t)){
16222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid pValueSize2 %d", *pValueSize);
16232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                return -EINVAL;
16242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
16252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *pValueSize = sizeof(int16_t);
16262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
16272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        default:
16292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid param %d", param);
16302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return -EINVAL;
16312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
16322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    switch (param){
16342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VIRTUALIZER_PARAM_STRENGTH_SUP:
16352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *(uint32_t *)pValue = 1;
16362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tVirtualizer_getParameter() VIRTUALIZER_PARAM_STRENGTH_SUP Value is %d",
16382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    *(uint32_t *)pValue);
16392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
16402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VIRTUALIZER_PARAM_STRENGTH:
16422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *(int16_t *)pValue = VirtualizerGetStrength(pContext);
16432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tVirtualizer_getParameter() VIRTUALIZER_PARAM_STRENGTH Value is %d",
16452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    *(int16_t *)pValue);
16462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
16472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        default:
16492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid param %d", param);
16502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            status = -EINVAL;
16512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
16522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
16532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVirtualizer_getParameter end");
16552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return status;
16562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} /* end Virtualizer_getParameter */
16572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
16602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Virtualizer_setParameter()
16612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
16622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
16632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Set a Virtualizer parameter
16642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
16652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
16662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pVirtualizer     - handle to instance data
16672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pParam           - pointer to parameter
16682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pValue           - pointer to value
16692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
16702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
16712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
16722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
16732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint Virtualizer_setParameter (EffectContext *pContext, int32_t *pParam, void *pValue){
16752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int status = 0;
16762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int16_t strength;
16772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVirtualizer_setParameter start");
16792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    switch (*pParam){
16812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VIRTUALIZER_PARAM_STRENGTH:
16822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            strength = *(int16_t *)pValue;
16832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tVirtualizer_setParameter() VIRTUALIZER_PARAM_STRENGTH value is %d", strength);
16842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tVirtualizer_setParameter() Calling pVirtualizer->setStrength");
16852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            VirtualizerSetStrength(pContext, (int32_t)strength);
16862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tVirtualizer_setParameter() Called pVirtualizer->setStrength");
16872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent           break;
16882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        default:
16892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tLVM_ERROR : Virtualizer_setParameter() invalid param %d", *pParam);
16902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
16912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
16922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVirtualizer_setParameter end");
16942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return status;
16952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} /* end Virtualizer_setParameter */
16962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
16972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
16982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Equalizer_getParameter()
16992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
17002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
17012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Get a Equalizer parameter
17022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
17032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
17042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pEqualizer       - handle to instance data
17052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pParam           - pointer to parameter
17062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pValue           - pointer to variable to hold retrieved value
17072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pValueSize       - pointer to value size: maximum size as input
17082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
17092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
17102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  *pValue updated with parameter value
17112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  *pValueSize updated with actual value size
17122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
17132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
17142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Side Effects:
17152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
17162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
17172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint Equalizer_getParameter(EffectContext     *pContext,
17182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           int32_t           *pParam,
17192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           size_t            *pValueSize,
17202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           void              *pValue){
17212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int status = 0;
17222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int bMute = 0;
17232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int32_t param = *pParam++;
17242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int32_t param2;
17252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    char *name;
17262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
17272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEqualizer_getParameter start");
17282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
17292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    switch (param) {
17302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_NUM_BANDS:
17312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_CUR_PRESET:
17322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_GET_NUM_OF_PRESETS:
17332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (*pValueSize < sizeof(int16_t)) {
17342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	LOGV("\tLVM_ERROR : Equalizer_getParameter() invalid pValueSize 1  %d", *pValueSize);
17352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return -EINVAL;
17362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
17372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *pValueSize = sizeof(int16_t);
17382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
17392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
17402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_LEVEL_RANGE:
17412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_BAND_FREQ_RANGE:
17422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (*pValueSize < 2 * sizeof(int32_t)) {
17432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	LOGV("\tLVM_ERROR : Equalizer_getParameter() invalid pValueSize 2  %d", *pValueSize);
17442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return -EINVAL;
17452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
17462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *pValueSize = 2 * sizeof(int32_t);
17472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
17482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_BAND_LEVEL:
17492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_GET_BAND:
17502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_CENTER_FREQ:
17512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (*pValueSize < sizeof(int32_t)) {
17522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	LOGV("\tLVM_ERROR : Equalizer_getParameter() invalid pValueSize 1  %d", *pValueSize);
17532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return -EINVAL;
17542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
17552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *pValueSize = sizeof(int32_t);
17562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
17572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
17582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_GET_PRESET_NAME:
17592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
17602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
17612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    default:
17622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    	LOGV("\tLVM_ERROR : Equalizer_getParameter unknown param %d", param);
17632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -EINVAL;
17642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
17652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
17662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    switch (param) {
17672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_NUM_BANDS:
17682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *(int16_t *)pValue = FIVEBAND_NUMBANDS;
17692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEqualizer_getParameter() EQ_PARAM_NUM_BANDS %d", *(int16_t *)pValue);
17702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
17712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
17722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_LEVEL_RANGE:
17732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *(int32_t *)pValue = -1500;
17742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *((int32_t *)pValue + 1) = 1500;
17752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEqualizer_getParameter() EQ_PARAM_LEVEL_RANGE min %d, max %d", *(int32_t *)pValue, *((int32_t *)pValue + 1));
17762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
17772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
17782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_BAND_LEVEL:
17792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        param2 = *pParam;
17802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (param2 >= FIVEBAND_NUMBANDS) {
17812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            status = -EINVAL;
17822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
17832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
17842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *(int32_t *)pValue = EqualizerGetBandLevel(pContext, param2);
17852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEqualizer_getParameter() EQ_PARAM_BAND_LEVEL band %d, level %d", param2, *(int32_t *)pValue);
17862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
17872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
17882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_CENTER_FREQ:
17892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        param2 = *pParam;
17902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (param2 >= FIVEBAND_NUMBANDS) {
17912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            status = -EINVAL;
17922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
17932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
17942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *(int32_t *)pValue = EqualizerGetCentreFrequency(pContext, param2);
17952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEqualizer_getParameter() EQ_PARAM_CENTER_FREQ band %d, frequency %d", param2, *(int32_t *)pValue);
17962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
17972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
17982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_BAND_FREQ_RANGE:
17992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        param2 = *pParam;
18002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (param2 >= FIVEBAND_NUMBANDS) {
18012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            status = -EINVAL;
18022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
18032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
18042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EqualizerGetBandFreqRange(pContext, param2, (uint32_t *)pValue, ((uint32_t *)pValue + 1));
18052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEqualizer_getParameter() EQ_PARAM_BAND_FREQ_RANGE band %d, min %d, max %d", param2, *(int32_t *)pValue, *((int32_t *)pValue + 1));
18062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
18072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
18082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_GET_BAND:
18092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        param2 = *pParam;
18102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *(int32_t *)pValue = EqualizerGetBand(pContext, param2);
18112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEqualizer_getParameter() EQ_PARAM_GET_BAND frequency %d, band %d", param2, *(int32_t *)pValue);
18122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
18132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
18142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_CUR_PRESET:
18152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *(int16_t *)pValue = EqualizerGetPreset(pContext);
18162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEqualizer_getParameter() EQ_PARAM_CUR_PRESET %d", *(int32_t *)pValue);
18172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
18182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
18192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_GET_NUM_OF_PRESETS:
18202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *(int16_t *)pValue = EqualizerGetNumPresets();
18212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEqualizer_getParameter() EQ_PARAM_GET_NUM_OF_PRESETS %d", *(int16_t *)pValue);
18222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
18232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
18242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_GET_PRESET_NAME:
18252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        param2 = *pParam;
18262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (param2 >= EqualizerGetNumPresets()) {
18272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        //if (param2 >= 20) {     // AGO FIX
18282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            status = -EINVAL;
18292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
18302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
18312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        name = (char *)pValue;
18322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        strncpy(name, EqualizerGetPresetName(param2), *pValueSize - 1);
18332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        name[*pValueSize - 1] = 0;
18342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *pValueSize = strlen(name) + 1;
18352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEqualizer_getParameter() EQ_PARAM_GET_PRESET_NAME preset %d, name %s len %d", param2, gEqualizerPresets[param2].name, *pValueSize);
18362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
18372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
18382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    default:
18392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLVM_ERROR : Equalizer_getParameter() invalid param %d", param);
18402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        status = -EINVAL;
18412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
18422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
18432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
18442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEqualizer_getParameter end");
18452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return status;
18462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} /* end Equalizer_getParameter */
18472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
18482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
18492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Equalizer_setParameter()
18502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
18512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
18522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Set a Equalizer parameter
18532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
18542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
18552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pEqualizer    - handle to instance data
18562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pParam        - pointer to parameter
18572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pValue        - pointer to value
18582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
18592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
18602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
18612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
18622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint Equalizer_setParameter (EffectContext *pContext, int32_t *pParam, void *pValue){
18632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int status = 0;
18642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int32_t preset;
18652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int32_t band;
18662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int32_t level;
18672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int32_t param = *pParam++;
18682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
18692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEqualizer_setParameter start");
18702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    switch (param) {
18712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_CUR_PRESET:
18722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        preset = *(int16_t *)pValue;
18732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
18742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEqualizer_setParameter() EQ_PARAM_CUR_PRESET %d", preset);
18752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if ((preset >= EqualizerGetNumPresets())||(preset < 0)) {
18762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            status = -EINVAL;
18772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
18782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
18792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EqualizerSetPreset(pContext, preset);
18802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
18812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    case EQ_PARAM_BAND_LEVEL:
18822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        band =  *pParam;
18832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        level = *(int32_t *)pValue;
18842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEqualizer_setParameter() EQ_PARAM_BAND_LEVEL band %d, level %d", band, level);
18852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (band >= FIVEBAND_NUMBANDS) {
18862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            status = -EINVAL;
18872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
18882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
18892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EqualizerSetBandLevel(pContext, band, level);
18902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
18912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    default:
18922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLVM_ERROR : setParameter() invalid param %d", param);
18932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        break;
18942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
18952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
18962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEqualizer_setParameter end");
18972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return status;
18982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} /* end Equalizer_setParameter */
18992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
19002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
19012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Volume_getParameter()
19022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
19032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
19042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Get a Volume parameter
19052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
19062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
19072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pVolume          - handle to instance data
19082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pParam           - pointer to parameter
19092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pValue           - pointer to variable to hold retrieved value
19102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pValueSize       - pointer to value size: maximum size as input
19112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
19122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
19132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  *pValue updated with parameter value
19142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  *pValueSize updated with actual value size
19152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
19162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
19172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Side Effects:
19182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
19192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
19202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
19212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint Volume_getParameter(EffectContext     *pContext,
19222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        int32_t           *pParam,
19232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        size_t            *pValueSize,
19242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        void              *pValue){
19252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int status = 0;
19262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int bMute = 0;
19272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int32_t param = *pParam++;
19282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int32_t param2;
19292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    char *name;
19302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
19312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolume_getParameter start");
19322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
19332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    switch (param){
19342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VOLUME_PARAM_LEVEL:
19352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VOLUME_PARAM_MAXLEVEL:
19362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VOLUME_PARAM_STEREOPOSITION:
19372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (*pValueSize < sizeof(int16_t)){
19382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tLVM_ERROR : Volume_getParameter() invalid pValueSize 1  %d", *pValueSize);
19392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                return -EINVAL;
19402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
19412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *pValueSize = sizeof(int16_t);
19422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
19432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
19442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VOLUME_PARAM_MUTE:
19452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VOLUME_PARAM_ENABLESTEREOPOSITION:
19462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (*pValueSize < sizeof(int32_t)){
19472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tLVM_ERROR : Volume_getParameter() invalid pValueSize 2  %d", *pValueSize);
19482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                return -EINVAL;
19492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
19502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *pValueSize = sizeof(int32_t);
19512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
19522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
19532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        default:
19542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	LOGV("\tLVM_ERROR : EVolume_getParameter unknown param %d", param);
19552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return -EINVAL;
19562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
19572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
19582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    switch (param){
19592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VOLUME_PARAM_LEVEL:
19602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            status = VolumeGetVolumeLevel(pContext, (int16_t *)(pValue));
19612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent			LOGV("\tVolume_getParameter() VOLUME_PARAM_LEVEL Value is %d",
19622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent					*(int16_t *)pValue);
19632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
19642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
19652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VOLUME_PARAM_MAXLEVEL:
19662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *(int16_t *)pValue = 0;
19672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tVolume_getParameter() VOLUME_PARAM_MAXLEVEL Value is %d",
19682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    *(int16_t *)pValue);
19692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
19702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
19712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VOLUME_PARAM_STEREOPOSITION:
19722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *(int16_t *)pValue = 0;
19732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tVolume_getParameter() VOLUME_PARAM_STEREOPOSITION Value is %d",
19742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    *(int16_t *)pValue);
19752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
19762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
19772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VOLUME_PARAM_MUTE:
19782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	status = VolumeGetMute(pContext, (uint32_t *)pValue);
19792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent			LOGV("\tVolume_getParameter() VOLUME_PARAM_MUTE Value is %d",
19802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent					*(uint32_t *)pValue);
19812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
19822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
19832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VOLUME_PARAM_ENABLESTEREOPOSITION:
19842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *(int32_t *)pValue = 0;
19852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tVolume_getParameter() VOLUME_PARAM_ENABLESTEREOPOSITION Value is %d",
19862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    *(uint32_t *)pValue);
19872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
19882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
19892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        default:
19902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tLVM_ERROR : Volume_getParameter() invalid param %d", param);
19912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            status = -EINVAL;
19922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
19932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
19942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
19952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolume_getParameter end");
19962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return status;
19972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} /* end Volume_getParameter */
19982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
19992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
20012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Volume_setParameter()
20022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
20032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Purpose:
20042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Set a Volume parameter
20052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
20062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Inputs:
20072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pVolume       - handle to instance data
20082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pParam        - pointer to parameter
20092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//  pValue        - pointer to value
20102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
20112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// Outputs:
20122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//
20132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//----------------------------------------------------------------------------
20142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentint Volume_setParameter (EffectContext *pContext, int32_t *pParam, void *pValue){
20162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int      status = 0;
20172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int16_t  level;
20182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    uint32_t mute;
20192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolume_setParameter start");
20212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    switch (*pParam){
20232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VOLUME_PARAM_LEVEL:
20242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            level = *(int16_t *)pValue;
20252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tVolume_setParameter() VOLUME_PARAM_LEVEL value is %d", level);
20262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tVolume_setParameter() Calling pVolume->setVolumeLevel");
20272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            status = VolumeSetVolumeLevel(pContext, (int16_t)level);
20282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tVolume_setParameter() Called pVolume->setVolumeLevel");
20292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
20302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VOLUME_PARAM_MUTE:
20322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	mute = *(uint32_t *)pValue;
20332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	LOGV("\tVolume_setParameter() Calling pVolume->setMute, mute is %d", mute);
20342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	LOGV("\tVolume_setParameter() Calling pVolume->setMute");
20352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	status = VolumeSetMute(pContext, mute);
20362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	LOGV("\tVolume_setParameter() Called pVolume->setMute");
20372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	break;
20382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VOLUME_PARAM_ENABLESTEREOPOSITION:
20402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	LOGV("\tVolume_setParameter() VOLUME_PARAM_ENABLESTEREOPOSITION called");
20412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	break;
20422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case VOLUME_PARAM_STEREOPOSITION:
20442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	LOGV("\tVolume_setParameter() VOLUME_PARAM_STEREOPOSITION called");
20452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        	break;
20462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        default:
20482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tLVM_ERROR : Volume_setParameter() invalid param %d", *pParam);
20492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
20502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
20512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tVolume_setParameter end");
20532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return status;
20542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} /* end Volume_setParameter */
20552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} // namespace
20562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} // namespace
20572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Effect Control Interface Implementation: Process */
20792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentextern "C" int Effect_process(effect_interface_t     self,
20802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 audio_buffer_t         *inBuffer,
20812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 audio_buffer_t         *outBuffer){
20822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    EffectContext * pContext = (EffectContext *) self;
20832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int    status = 0;
20842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    //LOGV("\tIn Effect_process");
20862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pContext == NULL){
20882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLVM_ERROR : Effect_process() ERROR pContext == NULL");
20892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -EINVAL;
20902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
20912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (inBuffer == NULL  || inBuffer->raw == NULL  ||
20922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            outBuffer == NULL || outBuffer->raw == NULL ||
20932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            inBuffer->frameCount != outBuffer->frameCount){
20942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLVM_ERROR : Effect_process() ERROR NULL INPUT POINTER OR FRAME COUNT IS WRONG");
20952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -EINVAL;
20962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
20972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
20982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pContext->pBundledContext->bBassEnabled == LVM_FALSE)&&(pContext->EffectType == LVM_BASS_BOOST)){
20992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLVM_ERROR : Effect_process() ERROR LVM_BASS_BOOST Effect is not enabled");
21002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -ENODATA;
21012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
21022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pContext->pBundledContext->bVolumeEnabled == LVM_FALSE)&&(pContext->EffectType == LVM_VOLUME)){
21032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLVM_ERROR : Effect_process() ERROR LVM_VOLUME Effect is not enabled");
21042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -ENODATA;
21052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
21062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pContext->pBundledContext->bEqualizerEnabled == LVM_FALSE)&&(pContext->EffectType == LVM_EQUALIZER)){
21072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLVM_ERROR : Effect_process() ERROR LVM_EQUALIZER Effect is not enabled");
21082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -ENODATA;
21092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
21102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pContext->pBundledContext->bVirtualizerEnabled == LVM_FALSE)&&(pContext->EffectType == LVM_VIRTUALIZER)){
21112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLVM_ERROR : Effect_process() ERROR LVM_VIRTUALIZER Effect is not enabled");
21122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -ENODATA;
21132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
21142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
21152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->pBundledContext->NumberEffectsCalled++;
21162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
21172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pContext->pBundledContext->NumberEffectsCalled == pContext->pBundledContext->NumberEffectsEnabled){
21182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffect_process() Calling process with %d frames, %d effects enabled,    %d called: Effect %d", outBuffer->frameCount, pContext->pBundledContext->NumberEffectsEnabled, pContext->pBundledContext->NumberEffectsCalled, pContext->EffectType);
21192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pContext->pBundledContext->NumberEffectsCalled = 0;
21202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Process all the available frames, block processing is handled internalLY by the LVM bundle */
21212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        status = android::LvmBundle_process(    (LVM_INT16 *)inBuffer->raw,
21222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                (LVM_INT16 *)outBuffer->raw,
21232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                outBuffer->frameCount,
21242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                pContext);
21252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        //LOGV("\tEffect_process() Called  process with %d frames, %d effects enabled,    %d called: Effect %d", outBuffer->frameCount, pContext->pBundledContext->NumberEffectsEnabled, pContext->pBundledContext->NumberEffectsCalled, pContext->EffectType);
21262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }else{
21272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffect_process() Not Calling process with %d frames, %d effects enabled, %d called: Effect %d", outBuffer->frameCount, pContext->pBundledContext->NumberEffectsEnabled, pContext->pBundledContext->NumberEffectsCalled, pContext->EffectType);
21282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        memcpy(outBuffer->raw, inBuffer->raw, outBuffer->frameCount*sizeof(LVM_INT16)*2); // 2 is for stereo input
21292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
21302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return status;
21312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}   /* end Effect_process */
21322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
21332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Effect Control Interface Implementation: Command */
21342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentextern "C" int Effect_command(effect_interface_t  self,
21352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 int                 cmdCode,
21362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 int                 cmdSize,
21372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 void                *pCmdData,
21382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 int                 *replySize,
21392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 void                *pReplyData){
21402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    EffectContext * pContext = (EffectContext *) self;
21412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int retsize;
21422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    int status = 0;
21432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
21442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\t\nEffect_command start");
21452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
21462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pContext->EffectType == LVM_BASS_BOOST){
21472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffect_command setting command for LVM_BASS_BOOST");
21482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
21492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pContext->EffectType == LVM_VIRTUALIZER){
21502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffect_command setting command for LVM_VIRTUALIZER");
21512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
21522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pContext->EffectType == LVM_EQUALIZER){
21532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffect_command setting command for LVM_EQUALIZER");
21542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
21552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pContext->EffectType == LVM_VOLUME){
21562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tEffect_command setting command for LVM_VOLUME");
21572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
21582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
21592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pContext == NULL){
21602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LOGV("\tLVM_ERROR : Effect_command ERROR pContext == NULL");
21612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return -EINVAL;
21622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
21632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
21642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEffect_command INPUTS are: command %d cmdSize %d",cmdCode, cmdSize);
21652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
21662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    // Incase we disable an effect, next time process is called the number of effect called could be greater
21672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pContext->pBundledContext->NumberEffectsCalled = 0;
21682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
21692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEffect_command NumberEffectsCalled = %d, NumberEffectsEnabled = %d", pContext->pBundledContext->NumberEffectsCalled, pContext->pBundledContext->NumberEffectsEnabled);
21702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
21712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    switch (cmdCode){
21722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case EFFECT_CMD_INIT:
21732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_INIT start");
21742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pContext->EffectType == LVM_BASS_BOOST){
21752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_INIT for LVM_BASS_BOOST");
21762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
21772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if (pReplyData == NULL || *replySize != sizeof(int)){
21782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : BassBoost_command cmdCode Case: "
21792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            "EFFECT_CMD_INIT: ERROR");
21802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
21812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
21822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
21832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                android::BassSetStrength(pContext, 0);
21842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
21852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pContext->EffectType == LVM_VIRTUALIZER){
21862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_INIT for LVM_VIRTUALIZER");
21872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
21882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if (pReplyData == NULL || *replySize != sizeof(int)){
21892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : Virtualizer_command cmdCode Case: "
21902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            "EFFECT_CMD_INIT: ERROR");
21912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
21922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
21932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
21942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                android::VirtualizerSetStrength(pContext, 0);
21952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
21962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pContext->EffectType == LVM_EQUALIZER){
21972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_INIT for LVM_EQUALIZER");
21982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
21992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if (pReplyData == NULL || *replySize != sizeof(int)){
22002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : Equalizer_command cmdCode Case: "
22012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            "EFFECT_CMD_INIT: ERROR");
22022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
22032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
22042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                android::EqualizerSetPreset(pContext, 0);
22062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
22072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pContext->EffectType == LVM_VOLUME){
22082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tEffect_command cmdCode Case: "
22092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "EFFECT_CMD_INIT start");
22102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if (pReplyData == NULL || *replySize != sizeof(int)){
22122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : Volume_command cmdCode Case: "
22132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            "EFFECT_CMD_INIT: ERROR");
22142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
22152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
22162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                status = android::VolumeSetVolumeLevel(pContext, 0);
22182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if(status == -EINVAL){
22192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                	return -EINVAL;
22202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
22212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
22222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
22232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case EFFECT_CMD_CONFIGURE:
22252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_CONFIGURE start");
22262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (pCmdData    == NULL||
22272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                cmdSize     != sizeof(effect_config_t)||
22282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pReplyData  == NULL||
22292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                *replySize  != sizeof(int)){
22302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tLVM_ERROR : Effect_command cmdCode Case: "
22312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "EFFECT_CMD_CONFIGURE: ERROR");
22322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                return -EINVAL;
22332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
22342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *(int *) pReplyData = android::Effect_configure(pContext, (effect_config_t *) pCmdData);
22352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_CONFIGURE end");
22362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
22372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case EFFECT_CMD_RESET:
22392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_RESET start");
22402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            android::Effect_configure(pContext, &pContext->config);
22412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_RESET end");
22422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
22432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case EFFECT_CMD_GET_PARAM:{
22452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_GET_PARAM start");
22462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pContext->EffectType == LVM_BASS_BOOST){
22482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if (pCmdData == NULL || cmdSize < (int)(sizeof(effect_param_t) + sizeof(int32_t)) ||
22492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        pReplyData == NULL ||*replySize < (int) (sizeof(effect_param_t) + sizeof(int32_t))){
22502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : BassBoost_command cmdCode Case: "
22512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            "EFFECT_CMD_GET_PARAM: ERROR");
22522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
22532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
22542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                effect_param_t *p = (effect_param_t *)pCmdData;
22552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize);
22572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                p = (effect_param_t *)pReplyData;
22592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
22612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                p->status = android::BassBoost_getParameter(pContext,
22632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                            (int32_t *)p->data,
22642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                            (size_t  *)&p->vsize,
22652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                            p->data + voffset);
22662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                *replySize = sizeof(effect_param_t) + voffset + p->vsize;
22682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tBassBoost_command EFFECT_CMD_GET_PARAM "
22702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "*pCmdData %d, *replySize %d, *pReplyData %d ",
22712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)),
22722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *replySize,
22732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int16_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset));
22742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
22752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pContext->EffectType == LVM_VIRTUALIZER){
22772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if (pCmdData == NULL || cmdSize < (int)(sizeof(effect_param_t) + sizeof(int32_t)) ||
22782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        pReplyData == NULL ||*replySize < (int) (sizeof(effect_param_t) + sizeof(int32_t))){
22792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : Virtualizer_command cmdCode Case: "
22802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            "EFFECT_CMD_GET_PARAM: ERROR");
22812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
22822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
22832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                effect_param_t *p = (effect_param_t *)pCmdData;
22842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize);
22862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                p = (effect_param_t *)pReplyData;
22882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
22902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                p->status = android::Virtualizer_getParameter(pContext,
22922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                             (int32_t *)p->data,
22932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                             (size_t  *)&p->vsize,
22942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                              p->data + voffset);
22952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                *replySize = sizeof(effect_param_t) + voffset + p->vsize;
22972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
22982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tVirtualizer_command EFFECT_CMD_GET_PARAM "
22992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "*pCmdData %d, *replySize %d, *pReplyData %d ",
23002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)),
23012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *replySize,
23022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int16_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset));
23032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
23042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pContext->EffectType == LVM_EQUALIZER){
23052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tEqualizer_command cmdCode Case: "
23062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "EFFECT_CMD_GET_PARAM start");
23072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if (pCmdData == NULL || cmdSize < (int)(sizeof(effect_param_t) + sizeof(int32_t)) ||
23082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pReplyData == NULL || *replySize < (int) (sizeof(effect_param_t) + sizeof(int32_t))) {
23092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : Equalizer_command cmdCode Case: "
23102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            "EFFECT_CMD_GET_PARAM");
23112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
23122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
23132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                effect_param_t *p = (effect_param_t *)pCmdData;
23142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize);
23162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                p = (effect_param_t *)pReplyData;
23182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
23202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                p->status = android::Equalizer_getParameter(pContext, (int32_t *)p->data, &p->vsize,
23222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        p->data + voffset);
23232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                *replySize = sizeof(effect_param_t) + voffset + p->vsize;
23252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tEqualizer_command EFFECT_CMD_GET_PARAM *pCmdData %d, *replySize %d, *pReplyData %08x %08x",
23272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), *replySize,
23282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int32_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset),
23292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int32_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset + sizeof(int32_t)));
23302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
23312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pContext->EffectType == LVM_VOLUME){
23322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tVolume_command cmdCode Case: "
23332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "EFFECT_CMD_GET_PARAM start");
23342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if (pCmdData == NULL || cmdSize < (int)(sizeof(effect_param_t) + sizeof(int32_t)) ||
23352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        pReplyData == NULL ||*replySize < (int) (sizeof(effect_param_t) + sizeof(int32_t))){
23362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : Volume_command cmdCode Case: "
23372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            "EFFECT_CMD_GET_PARAM: ERROR");
23382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
23392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
23402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                effect_param_t *p = (effect_param_t *)pCmdData;
23412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize);
23432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                p = (effect_param_t *)pReplyData;
23452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
23472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                p->status = android::Volume_getParameter(pContext,
23492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                         (int32_t *)p->data,
23502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                         (size_t  *)&p->vsize,
23512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                         p->data + voffset);
23522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                *replySize = sizeof(effect_param_t) + voffset + p->vsize;
23542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tVolume_command EFFECT_CMD_GET_PARAM "
23562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "*pCmdData %d, *replySize %d, *pReplyData %d ",
23572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)),
23582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *replySize,
23592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int16_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset));
23602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
23612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_GET_PARAM end");
23622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        } break;
23632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case EFFECT_CMD_SET_PARAM:{
23642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_SET_PARAM start");
23652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pContext->EffectType == LVM_BASS_BOOST){
23662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tBassBoost_command EFFECT_CMD_SET_PARAM param %d, *replySize %d, value %d ",
23672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)),
23682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *replySize,
23692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int16_t *)((char *)pCmdData + sizeof(effect_param_t) + sizeof(int32_t)));
23702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if (    pCmdData   == NULL||
23722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        cmdSize    != (int)(sizeof(effect_param_t) + sizeof(int32_t) + sizeof(int16_t))||
23732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        pReplyData == NULL||
23742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *replySize != sizeof(int32_t)){
23752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : BassBoost_command cmdCode Case: "
23762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            "EFFECT_CMD_SET_PARAM: ERROR");
23772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
23782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
23792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                effect_param_t *p = (effect_param_t *) pCmdData;
23802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if (p->psize != sizeof(int32_t)){
23822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : BassBoost_command cmdCode Case: "
23832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            "EFFECT_CMD_SET_PARAM: ERROR, psize is not sizeof(int32_t)");
23842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
23852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
23862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tnBassBoost_command cmdSize is %d\n"
23882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                		"\tsizeof(effect_param_t) is  %d\n"
23892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                		"\tp->psize is %d\n"
23902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                		"\tp->vsize is %d"
23912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                		"\n",
23922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                		cmdSize, sizeof(effect_param_t), p->psize, p->vsize );
23932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                *(int *)pReplyData = android::BassBoost_setParameter(pContext,
23952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                    (int32_t *)p->data,
23962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                    p->data + p->psize);
23972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
23982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pContext->EffectType == LVM_VIRTUALIZER){
23992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tVirtualizer_command EFFECT_CMD_SET_PARAM param %d, *replySize %d, value %d ",
24002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)),
24012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *replySize,
24022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int16_t *)((char *)pCmdData + sizeof(effect_param_t) + sizeof(int32_t)));
24032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
24042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if (    pCmdData   == NULL||
24052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        cmdSize    != (int)(sizeof(effect_param_t) + sizeof(int32_t) + sizeof(int16_t))||
24062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        pReplyData == NULL||
24072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *replySize != sizeof(int32_t)){
24082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : Virtualizer_command cmdCode Case: "
24092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            "EFFECT_CMD_SET_PARAM: ERROR");
24102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
24112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
24122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                effect_param_t *p = (effect_param_t *) pCmdData;
24132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
24142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if (p->psize != sizeof(int32_t)){
24152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : Virtualizer_command cmdCode Case: "
24162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            "EFFECT_CMD_SET_PARAM: ERROR, psize is not sizeof(int32_t)");
24172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
24182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
24192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
24202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tnVirtualizer_command cmdSize is %d\n"
24212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "\tsizeof(effect_param_t) is  %d\n"
24222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "\tp->psize is %d\n"
24232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "\tp->vsize is %d"
24242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "\n",
24252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        cmdSize, sizeof(effect_param_t), p->psize, p->vsize );
24262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
24272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                *(int *)pReplyData = android::Virtualizer_setParameter(pContext,
24282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                      (int32_t *)p->data,
24292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                       p->data + p->psize);
24302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
24312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pContext->EffectType == LVM_EQUALIZER){
24322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tEqualizer_command cmdCode Case: "
24332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "EFFECT_CMD_SET_PARAM start");
24342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tEqualizer_command EFFECT_CMD_SET_PARAM param %d, *replySize %d, value %d ",
24352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)),
24362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *replySize,
24372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int16_t *)((char *)pCmdData + sizeof(effect_param_t) + sizeof(int32_t)));
24382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
24392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if (pCmdData == NULL || cmdSize < (int)(sizeof(effect_param_t) + sizeof(int32_t)) ||
24402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pReplyData == NULL || *replySize != sizeof(int32_t)) {
24412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : Equalizer_command cmdCode Case: "
24422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            "EFFECT_CMD_SET_PARAM: ERROR");
24432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
24442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
24452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                effect_param_t *p = (effect_param_t *) pCmdData;
24462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
24472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                *(int *)pReplyData = android::Equalizer_setParameter(pContext,
24482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                    (int32_t *)p->data,
24492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                     p->data + p->psize);
24502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
24512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pContext->EffectType == LVM_VOLUME){
24522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tVolume_command cmdCode Case: "
24532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "EFFECT_CMD_SET_PARAM start");
24542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tVolume_command EFFECT_CMD_SET_PARAM param %d, *replySize %d, value %d ",
24552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)),
24562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *replySize,
24572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *(int16_t *)((char *)pCmdData + sizeof(effect_param_t) + sizeof(int32_t)));
24582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
24592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if (    pCmdData   == NULL||
24602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        cmdSize    < (int)(sizeof(effect_param_t) + sizeof(int32_t))||
24612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        pReplyData == NULL||
24622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        *replySize != sizeof(int32_t)){
24632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : Volume_command cmdCode Case: "
24642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            "EFFECT_CMD_SET_PARAM: ERROR");
24652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
24662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
24672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                effect_param_t *p = (effect_param_t *) pCmdData;
24682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
24692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                *(int *)pReplyData = android::Volume_setParameter(pContext,
24702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                 (int32_t *)p->data,
24712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                 p->data + p->psize);
24722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
24732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_SET_PARAM end");
24742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        } break;
24752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
24762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case EFFECT_CMD_ENABLE:
24772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_ENABLE start");
24782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (pReplyData == NULL || *replySize != sizeof(int)){
24792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tLVM_ERROR : Effect_command cmdCode Case: EFFECT_CMD_ENABLE: ERROR");
24802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                return -EINVAL;
24812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
24822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            switch (pContext->EffectType){
24832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                case LVM_BASS_BOOST:
24842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    if(pContext->pBundledContext->bBassEnabled == LVM_TRUE){
24852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         LOGV("\tLVM_ERROR : BassBoost_command cmdCode Case: "
24862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 "EFFECT_CMD_ENABLE: ERROR-Effect is already enabled");
24872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         return -EINVAL;
24882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    }
24892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pContext->pBundledContext->bBassEnabled = LVM_TRUE;
24902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_ENABLE LVM_BASS_BOOST enabled");
24912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    break;
24922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                case LVM_EQUALIZER:
24932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    if(pContext->pBundledContext->bEqualizerEnabled == LVM_TRUE){
24942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         LOGV("\tLVM_ERROR : Equalizer_command cmdCode Case: "
24952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 "EFFECT_CMD_ENABLE: ERROR-Effect is already enabled");
24962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         return -EINVAL;
24972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    }
24982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pContext->pBundledContext->bEqualizerEnabled = LVM_TRUE;
24992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_ENABLE LVM_EQUALIZER enabled");
25002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    break;
25012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                case LVM_VIRTUALIZER:
25022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    if(pContext->pBundledContext->bVirtualizerEnabled == LVM_TRUE){
25032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         LOGV("\tLVM_ERROR : Virtualizer_command cmdCode Case: "
25042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 "EFFECT_CMD_ENABLE: ERROR-Effect is already enabled");
25052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         return -EINVAL;
25062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    }
25072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pContext->pBundledContext->bVirtualizerEnabled = LVM_TRUE;
25082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_ENABLE LVM_VIRTUALIZER enabled");
25092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    break;
25102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                case LVM_VOLUME:
25112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    if(pContext->pBundledContext->bVolumeEnabled == LVM_TRUE){
25122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         LOGV("\tLVM_ERROR : Volume_command cmdCode Case: "
25132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 "EFFECT_CMD_ENABLE: ERROR-Effect is already enabled");
25142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         return -EINVAL;
25152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    }
25162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pContext->pBundledContext->bVolumeEnabled = LVM_TRUE;
25172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_ENABLE LVM_VOLUME enabled");
25182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    break;
25192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                default:
25202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : Effect_command cmdCode Case: "
25212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "EFFECT_CMD_ENABLE: ERROR, invalid Effect Type");
25222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
25232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
25242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *(int *)pReplyData = 0;
25252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pContext->pBundledContext->NumberEffectsEnabled++;
25262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            android::LvmEffect_enable(pContext);
25272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_ENABLE NumberEffectsEnabled = %d", pContext->pBundledContext->NumberEffectsEnabled);
25282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_ENABLE end");
25292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
25302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
25312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case EFFECT_CMD_DISABLE:
25322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_DISABLE start");
25332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (pReplyData == NULL || *replySize != sizeof(int)){
25342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LOGV("\tLVM_ERROR : Effect_command cmdCode Case: EFFECT_CMD_DISABLE: ERROR");
25352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                return -EINVAL;
25362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
25372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            switch (pContext->EffectType){
25382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                case LVM_BASS_BOOST:
25392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    if(pContext->pBundledContext->bBassEnabled == LVM_FALSE){
25402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         LOGV("\tLVM_ERROR : BassBoost_command cmdCode Case: "
25412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 "EFFECT_CMD_DISABLE: ERROR-Effect is not yet enabled");
25422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         return -EINVAL;
25432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    }
25442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pContext->pBundledContext->bBassEnabled = LVM_FALSE;
25452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_DISABLE LVM_BASS_BOOST disabled");
25462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    break;
25472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                case LVM_EQUALIZER:
25482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    if(pContext->pBundledContext->bEqualizerEnabled == LVM_FALSE){
25492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         LOGV("\tLVM_ERROR : Equalizer_command cmdCode Case: "
25502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 "EFFECT_CMD_DISABLE: ERROR-Effect is not yet enabled");
25512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         return -EINVAL;
25522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    }
25532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pContext->pBundledContext->bEqualizerEnabled = LVM_FALSE;
25542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_DISABLE LVM_EQUALIZER disabled");
25552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    break;
25562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                case LVM_VIRTUALIZER:
25572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    if(pContext->pBundledContext->bVirtualizerEnabled == LVM_FALSE){
25582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         LOGV("\tLVM_ERROR : Virtualizer_command cmdCode Case: "
25592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 "EFFECT_CMD_DISABLE: ERROR-Effect is not yet enabled");
25602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         return -EINVAL;
25612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    }
25622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pContext->pBundledContext->bVirtualizerEnabled = LVM_FALSE;
25632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_DISABLE LVM_VIRTUALIZER disabled");
25642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    break;
25652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                case LVM_VOLUME:
25662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    if(pContext->pBundledContext->bVolumeEnabled == LVM_FALSE){
25672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         LOGV("\tLVM_ERROR : Volume_command cmdCode Case: "
25682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 "EFFECT_CMD_DISABLE: ERROR-Effect is not yet enabled");
25692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         return -EINVAL;
25702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    }
25712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pContext->pBundledContext->bVolumeEnabled = LVM_FALSE;
25722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_DISABLE LVM_VOLUME disabled");
25732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    break;
25742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    break;
25752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                default:
25762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LOGV("\tLVM_ERROR : Effect_command cmdCode Case: "
25772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        "EFFECT_CMD_DISABLE: ERROR, invalid Effect Type");
25782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    return -EINVAL;
25792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
25802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            *(int *)pReplyData = 0;
25812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pContext->pBundledContext->NumberEffectsEnabled--;
25822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            android::LvmEffect_disable(pContext);
25832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_DISABLE NumberEffectsEnabled = %d", pContext->pBundledContext->NumberEffectsEnabled);
25842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: EFFECT_CMD_DISABLE end");
25852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
25862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
25872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case EFFECT_CMD_SET_DEVICE:
25882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case EFFECT_CMD_SET_VOLUME:
25892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent//        case EFFECT_CMD_SET_AUDIO_MODE:// AGO add this
25902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tEffect_command cmdCode Case: "
25912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    "EFFECT_CMD_SET_DEVICE/EFFECT_CMD_SET_VOLUME/EFFECT_CMD_SET_AUDIO_MODE start");
25922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
25932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
25942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        default:
25952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LOGV("\tLVM_ERROR : Effect_command cmdCode Case: DEFAULT start %d ERROR",cmdCode);
25962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return -EINVAL;
25972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
25982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
25992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LOGV("\tEffect_command end...\n\n");
26002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 0;
26012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}    /* end Effect_command */
26022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
26032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// effect_interface_t interface implementation for effect
26042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentconst struct effect_interface_s gLvmEffectInterface = {
26052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    Effect_process,
26062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    Effect_command
26072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent};    /* end gLvmEffectInterface */
26082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
26092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2610