12c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*
22c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2004-2010 NXP Software
32c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2010 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/************************************************************************************/
192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Includes                                                                        */
212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVCS.h"
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVCS_Private.h"
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVCS_Tables.h"
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVCS_GetParameters                                     */
312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Request the Concert Sound parameters. The current parameter set is returned     */
342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  via the parameter pointer.                                                      */
352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance                Instance handle                                        */
382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams                  Pointer to an empty parameter structure                */
392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVCS_Success             Always succeeds                                        */
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function may be interrupted by the LVCS_Process function               */
452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVCS_ReturnStatus_en LVCS_GetParameters(LVCS_Handle_t   hInstance,
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        LVCS_Params_t   *pParams)
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVCS_Instance_t     *pInstance =(LVCS_Instance_t  *)hInstance;
532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pParams = pInstance->Params;
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVCS_SUCCESS);
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVCS_Control                                            */
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Sets or changes the Concert Sound parameters.                                   */
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance               Instance handle                                         */
692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams                 Pointer to a parameter structure                        */
702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVCS_Success            Succeeded                                               */
732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function must not be interrupted by the LVCS_Process function          */
762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
792c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVCS_ReturnStatus_en LVCS_Control(LVCS_Handle_t      hInstance,
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                  LVCS_Params_t      *pParams)
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16                   Offset;
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVCS_Instance_t             *pInstance =(LVCS_Instance_t  *)hInstance;
842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVCS_ReturnStatus_en        err;
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVCS_Modes_en               OperatingModeSave = pInstance->Params.OperatingMode;
862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pParams->SampleRate != pInstance->Params.SampleRate)
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->TimerParams.SamplingRate = LVCS_SampleRateTable[pParams->SampleRate];
902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * If the reverb level has changed
942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pInstance->Params.ReverbLevel != pParams->ReverbLevel)
962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_ReverbGeneratorInit(hInstance,pParams);
982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * If the sample rate or speaker has changed then perform a full re-initialisation
1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pInstance->Params.SampleRate != pParams->SampleRate) ||
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       (pInstance->Params.SpeakerType != pParams->SpeakerType))
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        const LVCS_VolCorrect_t *pLVCS_VolCorrectTable;
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Output device
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->OutputDevice = LVCS_HEADPHONE;
1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Get the volume correction parameters
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Use internal coefficient table */
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pLVCS_VolCorrectTable = (LVCS_VolCorrect_t*)&LVCS_VolCorrectTable[0];
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Offset = (LVM_INT16)(pParams->SpeakerType + pParams->SourceFormat*(1+LVCS_EX_HEADPHONES));
1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->VolCorrect = pLVCS_VolCorrectTable[Offset];
1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
122d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent        pInstance->CompressGain = pInstance->VolCorrect.CompMin;
123d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifdef BUILD_FLOAT
124d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri        LVC_Mixer_Init(&pInstance->BypassMix.Mixer_Instance.MixerStream[0], 0, 0);
125d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else
12609d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent        LVC_Mixer_Init(&pInstance->BypassMix.Mixer_Instance.MixerStream[0],0,0);
127d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif
12809d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent        {
129d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifndef BUILD_FLOAT
13009d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            LVM_UINT32          Gain;
13109d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            const Gain_t        *pOutputGainTable = (Gain_t*)&LVCS_OutputGainTable[0];
13209d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            Gain = (LVM_UINT32)(pOutputGainTable[Offset].Loss * LVM_MAXINT_16);
13309d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            Gain = (LVM_UINT32)pOutputGainTable[Offset].UnprocLoss * (Gain >> 15);
13409d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            Gain=Gain>>15;
13509d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            /*
13609d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent             * Apply the gain correction and shift, note the result is in Q3.13 format
13709d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent             */
13809d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            Gain = (Gain * pInstance->VolCorrect.GainMin) >>12;
13909d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent
14009d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            LVC_Mixer_Init(&pInstance->BypassMix.Mixer_Instance.MixerStream[1],0,Gain);
14109d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMix.Mixer_Instance.MixerStream[0],
14209d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent                    LVCS_BYPASS_MIXER_TC,pParams->SampleRate,2);
14309d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMix.Mixer_Instance.MixerStream[1],
14409d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent                    LVCS_BYPASS_MIXER_TC,pParams->SampleRate,2);
145d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else
146d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri            LVM_FLOAT          Gain;
147d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri            const Gain_t        *pOutputGainTable = (Gain_t*)&LVCS_OutputGainTable[0];
148d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri            Gain = (LVM_FLOAT)(pOutputGainTable[Offset].Loss);
149d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri            Gain = (LVM_FLOAT)pOutputGainTable[Offset].UnprocLoss * (Gain);
15009d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent
151d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri            /*
152d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri             * Apply the gain correction
153d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri             */
154d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri            Gain = (Gain * pInstance->VolCorrect.GainMin);
155d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri
156d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri            LVC_Mixer_Init(&pInstance->BypassMix.Mixer_Instance.MixerStream[1], 0, Gain);
157d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMix.Mixer_Instance.MixerStream[0],
158d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                    LVCS_BYPASS_MIXER_TC, pParams->SampleRate, 2);
159d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMix.Mixer_Instance.MixerStream[1],
160d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                    LVCS_BYPASS_MIXER_TC, pParams->SampleRate, 2);
161d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif
16209d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent        }
16309d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent
16409d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent
1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_SEnhancerInit(hInstance,
1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           pParams);
1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_ReverbGeneratorInit(hInstance,
1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 pParams);
1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_EqualiserInit(hInstance,
1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           pParams);
1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_BypassMixInit(hInstance,
1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           pParams);
1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check if the effect level or source format has changed
1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else if ((pInstance->Params.EffectLevel != pParams->EffectLevel) ||
1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            (pInstance->Params.SourceFormat != pParams->SourceFormat))
1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        const LVCS_VolCorrect_t *pLVCS_VolCorrectTable;
1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Get the volume correction parameters
1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Use internal coefficient table */
1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pLVCS_VolCorrectTable = (LVCS_VolCorrect_t*)&LVCS_VolCorrectTable[0];
1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Offset = (LVM_INT16)(pParams->SpeakerType + pParams->SourceFormat*(1+LVCS_EX_HEADPHONES));
1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->VolCorrect = pLVCS_VolCorrectTable[Offset];
1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Update the effect level and alpha-mixer gains */
1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_BypassMixInit(hInstance,
1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           pParams);
2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(err != LVCS_SUCCESS)
2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return err;
2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params = *pParams;
2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update the instance parameters
2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params = *pParams;
2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Stay on the current operating mode until the transition is done */
2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((pParams->OperatingMode != OperatingModeSave) ||
2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       (pInstance->bInOperatingModeTransition == LVM_TRUE)){
2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Set the reverb delay timeout */
2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(pInstance->bInOperatingModeTransition != LVM_TRUE){
2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->bTimerDone = LVM_FALSE;
2232d3bf535004f7310fe04a4b5f46b6747cdb3c93fEric Laurent            pInstance->TimerParams.TimeInMs =
2242d3bf535004f7310fe04a4b5f46b6747cdb3c93fEric Laurent            (LVM_INT16)(((pInstance->Reverberation.DelaySize << 2)
2252d3bf535004f7310fe04a4b5f46b6747cdb3c93fEric Laurent            /pInstance->TimerParams.SamplingRate) + 1);
2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVM_Timer_Init ( &pInstance->TimerInstance,
2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                             &pInstance->TimerParams);
2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Update the effect level and alpha-mixer gains */
2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_BypassMixInit(hInstance,
2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           pParams);
2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Change transition bypass mixer settings if needed depending on transition type */
2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(pParams->OperatingMode != LVCS_OFF){
23609d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            pInstance->MSTarget0=LVM_MAXINT_16;
23709d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            pInstance->MSTarget1=0;
2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->Params.OperatingMode = OperatingModeSave;
24209d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            pInstance->MSTarget1=LVM_MAXINT_16;
24309d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            pInstance->MSTarget0=0;
2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Set transition flag */
2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->bInOperatingModeTransition = LVM_TRUE;
2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVCS_SUCCESS);
2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVCS_TimerCallBack                                          */
2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
2592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  CallBack function of the Timer.                                                     */
2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVCS_TimerCallBack (void* hInstance, void* pCallBackParams, LVM_INT32 CallbackParam)
2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVCS_Instance_t     *pInstance  = (LVCS_Instance_t  *)hInstance;
2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Avoid warnings because pCallBackParams and CallbackParam are not used*/
2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((pCallBackParams != LVM_NULL) || (CallbackParam != 0)){
2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pCallBackParams = hInstance;
2692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CallbackParam = 0;
2702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return;
2712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->bTimerDone = LVM_TRUE;
2742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return;
2772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
2782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
279