LVCS_Control.c revision 2c8e5cab3faa6d360e222b7a6c40a80083d021ac
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     $Author: nxp007753 $
212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     $Revision: 1246 $
222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     $Date: 2010-07-16 11:07:10 +0200 (Fri, 16 Jul 2010) $
232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent*************************************************************************************/
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Includes                                                                        */
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVCS.h"
332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVCS_Private.h"
342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVCS_Tables.h"
352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVCS_GetParameters                                     */
392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Request the Concert Sound parameters. The current parameter set is returned     */
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  via the parameter pointer.                                                      */
432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance                Instance handle                                        */
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams                  Pointer to an empty parameter structure                */
472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVCS_Success             Always succeeds                                        */
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function may be interrupted by the LVCS_Process function               */
532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVCS_ReturnStatus_en LVCS_GetParameters(LVCS_Handle_t   hInstance,
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        LVCS_Params_t   *pParams)
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVCS_Instance_t     *pInstance =(LVCS_Instance_t  *)hInstance;
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pParams = pInstance->Params;
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVCS_SUCCESS);
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVCS_Control                                            */
712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Sets or changes the Concert Sound parameters.                                   */
742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance               Instance handle                                         */
772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams                 Pointer to a parameter structure                        */
782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVCS_Success            Succeeded                                               */
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function must not be interrupted by the LVCS_Process function          */
842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVCS_ReturnStatus_en LVCS_Control(LVCS_Handle_t      hInstance,
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                  LVCS_Params_t      *pParams)
892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16                   Offset;
912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVCS_Instance_t             *pInstance =(LVCS_Instance_t  *)hInstance;
922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVCS_ReturnStatus_en        err;
932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVCS_Modes_en               OperatingModeSave = pInstance->Params.OperatingMode;
942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pParams->SampleRate != pInstance->Params.SampleRate)
962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->MSBypassMixer.MixerStream[0],LVCS_BYPASS_MIXER_TC,pParams->SampleRate,2);
982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->MSBypassMixer.MixerStream[1],LVCS_BYPASS_MIXER_TC,pParams->SampleRate,2);
1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->TimerParams.SamplingRate = LVCS_SampleRateTable[pParams->SampleRate];
1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * If the reverb level has changed
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pInstance->Params.ReverbLevel != pParams->ReverbLevel)
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_ReverbGeneratorInit(hInstance,pParams);
1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * If the sample rate or speaker has changed then perform a full re-initialisation
1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pInstance->Params.SampleRate != pParams->SampleRate) ||
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       (pInstance->Params.SpeakerType != pParams->SpeakerType))
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        const LVCS_VolCorrect_t *pLVCS_VolCorrectTable;
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Output device
1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->OutputDevice = LVCS_HEADPHONE;
1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Get the volume correction parameters
1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Use internal coefficient table */
1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pLVCS_VolCorrectTable = (LVCS_VolCorrect_t*)&LVCS_VolCorrectTable[0];
1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Offset = (LVM_INT16)(pParams->SpeakerType + pParams->SourceFormat*(1+LVCS_EX_HEADPHONES));
1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->VolCorrect = pLVCS_VolCorrectTable[Offset];
1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_SEnhancerInit(hInstance,
1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           pParams);
1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_ReverbGeneratorInit(hInstance,
1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 pParams);
1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_EqualiserInit(hInstance,
1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           pParams);
1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_BypassMixInit(hInstance,
1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           pParams);
1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check if the effect level or source format has changed
1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else if ((pInstance->Params.EffectLevel != pParams->EffectLevel) ||
1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            (pInstance->Params.SourceFormat != pParams->SourceFormat))
1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        const LVCS_VolCorrect_t *pLVCS_VolCorrectTable;
1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Get the volume correction parameters
1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Use internal coefficient table */
1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pLVCS_VolCorrectTable = (LVCS_VolCorrect_t*)&LVCS_VolCorrectTable[0];
1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Offset = (LVM_INT16)(pParams->SpeakerType + pParams->SourceFormat*(1+LVCS_EX_HEADPHONES));
1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->VolCorrect = pLVCS_VolCorrectTable[Offset];
1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Update the effect level and alpha-mixer gains */
1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_BypassMixInit(hInstance,
1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           pParams);
1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(err != LVCS_SUCCESS)
1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return err;
1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params = *pParams;
1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update the instance parameters
1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params = *pParams;
1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Stay on the current operating mode until the transition is done */
1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((pParams->OperatingMode != OperatingModeSave) ||
1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       (pInstance->bInOperatingModeTransition == LVM_TRUE)){
1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Set the reverb delay timeout */
1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(pInstance->bInOperatingModeTransition != LVM_TRUE){
1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->bTimerDone = LVM_FALSE;
1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->TimerParams.TimeInMs = (LVM_INT16)(((pInstance->Reverberation.DelaySize << 2)/pInstance->TimerParams.SamplingRate) + 1);
1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVM_Timer_Init ( &pInstance->TimerInstance,
1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                             &pInstance->TimerParams);
1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Update the effect level and alpha-mixer gains */
1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        err=LVCS_BypassMixInit(hInstance,
1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           pParams);
1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Change transition bypass mixer settings if needed depending on transition type */
2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(pParams->OperatingMode != LVCS_OFF){
2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVM_INT32 Current1;
2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVM_INT32 Current2;
2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Current1 = LVC_Mixer_GetCurrent(&pInstance->MSBypassMixer.MixerStream[0]);
2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Current2 = LVC_Mixer_GetCurrent(&pInstance->MSBypassMixer.MixerStream[1]);
2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pInstance->bInOperatingModeTransition != LVM_TRUE)
2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                Current1 = 0x00000000;
2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                Current2 = LVM_MAXINT_16;
2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->MSBypassMixer.MixerStream[0].CallbackSet = 1;
2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->MSBypassMixer.MixerStream[1].CallbackSet = 1;
2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_Init(&pInstance->MSBypassMixer.MixerStream[0],LVM_MAXINT_16,Current1);
2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_Init(&pInstance->MSBypassMixer.MixerStream[1],0,Current2);
2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVM_INT32 Current1;
2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVM_INT32 Current2;
2232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Current1 = LVC_Mixer_GetCurrent(&pInstance->MSBypassMixer.MixerStream[0]);
2252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Current2 = LVC_Mixer_GetCurrent(&pInstance->MSBypassMixer.MixerStream[1]);
2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pInstance->bInOperatingModeTransition != LVM_TRUE)
2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                Current1 = LVM_MAXINT_16;
2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                Current2 = 0x00000000;
2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->MSBypassMixer.MixerStream[0].CallbackSet = 1;
2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->MSBypassMixer.MixerStream[1].CallbackSet = 1;
2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->Params.OperatingMode = OperatingModeSave;
2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_Init(&pInstance->MSBypassMixer.MixerStream[0],0x00000000,Current1);
2362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_Init(&pInstance->MSBypassMixer.MixerStream[1],LVM_MAXINT_16,Current2);
2372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_SetTimeConstant(&pInstance->MSBypassMixer.MixerStream[0],LVCS_BYPASS_MIXER_TC,pParams->SampleRate,2);
2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_SetTimeConstant(&pInstance->MSBypassMixer.MixerStream[1],LVCS_BYPASS_MIXER_TC,pParams->SampleRate,2);
2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Set transition flag */
2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->bInOperatingModeTransition = LVM_TRUE;
2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVCS_SUCCESS);
2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVCS_TimerCallBack                                          */
2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  CallBack function of the Timer.                                                     */
2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVCS_TimerCallBack (void* hInstance, void* pCallBackParams, LVM_INT32 CallbackParam)
2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
2592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVCS_Instance_t     *pInstance  = (LVCS_Instance_t  *)hInstance;
2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Avoid warnings because pCallBackParams and CallbackParam are not used*/
2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((pCallBackParams != LVM_NULL) || (CallbackParam != 0)){
2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pCallBackParams = hInstance;
2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CallbackParam = 0;
2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return;
2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->bTimerDone = LVM_TRUE;
2692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return;
2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
274