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;
123d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent
12409d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent        LVC_Mixer_Init(&pInstance->BypassMix.Mixer_Instance.MixerStream[0],0,0);
12509d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent
12609d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent
12709d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent        {
12809d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            LVM_UINT32          Gain;
12909d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            const Gain_t        *pOutputGainTable = (Gain_t*)&LVCS_OutputGainTable[0];
13009d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            Gain = (LVM_UINT32)(pOutputGainTable[Offset].Loss * LVM_MAXINT_16);
13109d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            Gain = (LVM_UINT32)pOutputGainTable[Offset].UnprocLoss * (Gain >> 15);
13209d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            Gain=Gain>>15;
13309d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            /*
13409d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent             * Apply the gain correction and shift, note the result is in Q3.13 format
13509d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent             */
13609d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            Gain = (Gain * pInstance->VolCorrect.GainMin) >>12;
13709d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent
13809d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            LVC_Mixer_Init(&pInstance->BypassMix.Mixer_Instance.MixerStream[1],0,Gain);
13909d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMix.Mixer_Instance.MixerStream[0],
14009d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent                    LVCS_BYPASS_MIXER_TC,pParams->SampleRate,2);
14109d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMix.Mixer_Instance.MixerStream[1],
14209d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent                    LVCS_BYPASS_MIXER_TC,pParams->SampleRate,2);
14309d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent
14409d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent        }
14509d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent
14609d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent
1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_SEnhancerInit(hInstance,
1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           pParams);
1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_ReverbGeneratorInit(hInstance,
1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 pParams);
1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_EqualiserInit(hInstance,
1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           pParams);
1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_BypassMixInit(hInstance,
1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           pParams);
1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check if the effect level or source format has changed
1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else if ((pInstance->Params.EffectLevel != pParams->EffectLevel) ||
1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            (pInstance->Params.SourceFormat != pParams->SourceFormat))
1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        const LVCS_VolCorrect_t *pLVCS_VolCorrectTable;
1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Get the volume correction parameters
1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Use internal coefficient table */
1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pLVCS_VolCorrectTable = (LVCS_VolCorrect_t*)&LVCS_VolCorrectTable[0];
1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Offset = (LVM_INT16)(pParams->SpeakerType + pParams->SourceFormat*(1+LVCS_EX_HEADPHONES));
1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->VolCorrect = pLVCS_VolCorrectTable[Offset];
1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Update the effect level and alpha-mixer gains */
1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_BypassMixInit(hInstance,
1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           pParams);
1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(err != LVCS_SUCCESS)
1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return err;
1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params = *pParams;
1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update the instance parameters
1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params = *pParams;
1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Stay on the current operating mode until the transition is done */
1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((pParams->OperatingMode != OperatingModeSave) ||
2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       (pInstance->bInOperatingModeTransition == LVM_TRUE)){
2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Set the reverb delay timeout */
2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(pInstance->bInOperatingModeTransition != LVM_TRUE){
2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->bTimerDone = LVM_FALSE;
2052d3bf535004f7310fe04a4b5f46b6747cdb3c93fEric Laurent            pInstance->TimerParams.TimeInMs =
2062d3bf535004f7310fe04a4b5f46b6747cdb3c93fEric Laurent            (LVM_INT16)(((pInstance->Reverberation.DelaySize << 2)
2072d3bf535004f7310fe04a4b5f46b6747cdb3c93fEric Laurent            /pInstance->TimerParams.SamplingRate) + 1);
2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVM_Timer_Init ( &pInstance->TimerInstance,
2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                             &pInstance->TimerParams);
2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Update the effect level and alpha-mixer gains */
2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_BypassMixInit(hInstance,
2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           pParams);
2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Change transition bypass mixer settings if needed depending on transition type */
2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(pParams->OperatingMode != LVCS_OFF){
21809d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            pInstance->MSTarget0=LVM_MAXINT_16;
21909d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            pInstance->MSTarget1=0;
2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->Params.OperatingMode = OperatingModeSave;
22409d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            pInstance->MSTarget1=LVM_MAXINT_16;
22509d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            pInstance->MSTarget0=0;
2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Set transition flag */
2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->bInOperatingModeTransition = LVM_TRUE;
2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVCS_SUCCESS);
2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
2372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVCS_TimerCallBack                                          */
2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  CallBack function of the Timer.                                                     */
2422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVCS_TimerCallBack (void* hInstance, void* pCallBackParams, LVM_INT32 CallbackParam)
2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVCS_Instance_t     *pInstance  = (LVCS_Instance_t  *)hInstance;
2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Avoid warnings because pCallBackParams and CallbackParam are not used*/
2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((pCallBackParams != LVM_NULL) || (CallbackParam != 0)){
2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pCallBackParams = hInstance;
2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CallbackParam = 0;
2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return;
2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->bTimerDone = LVM_TRUE;
2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return;
2592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
261