LVM_Control.c revision 09d5ca3766d4bab91cdaad7206716a5747ebad77
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 $
2109d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent     $Revision: 1316 $
2209d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent     $Date: 2010-07-23 11:53:24 +0200 (Fri, 23 Jul 2010) $
232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent*****************************************************************************************/
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Includes                                                                             */
302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "VectorArithmetic.h"
342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "ScalarArithmetic.h"
352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Coeffs.h"
362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Tables.h"
372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Private.h"
382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:           LVM_SetControlParameters                                         */
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Sets or changes the LifeVibes module parameters.                                    */
452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance          Instance handle                                                  */
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams            Pointer to a parameter structure                                 */
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_SUCCESS        Succeeded                                                        */
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_NULLADDRESS    When hInstance, pParams or any control pointers are NULL         */
532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_OUTOFRANGE     When any of the control parameters are out of range              */
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1. This function may be interrupted by the LVM_Process function                     */
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_ReturnStatus_en LVM_SetControlParameters(LVM_Handle_t           hInstance,
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                             LVM_ControlParams_t    *pParams)
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t    *pInstance =(LVM_Instance_t  *)hInstance;
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pParams == LVM_NULL) || (hInstance == LVM_NULL))
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_NULLADDRESS);
692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->NewParams = *pParams;
722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(
742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* General parameters */
752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ((pParams->OperatingMode != LVM_MODE_OFF) && (pParams->OperatingMode != LVM_MODE_ON))                                         ||
762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ((pParams->SampleRate != LVM_FS_8000) && (pParams->SampleRate != LVM_FS_11025) && (pParams->SampleRate != LVM_FS_12000)       &&
772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pParams->SampleRate != LVM_FS_16000) && (pParams->SampleRate != LVM_FS_22050) && (pParams->SampleRate != LVM_FS_24000)       &&
782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pParams->SampleRate != LVM_FS_32000) && (pParams->SampleRate != LVM_FS_44100) && (pParams->SampleRate != LVM_FS_48000))      ||
792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ((pParams->SourceFormat != LVM_STEREO) && (pParams->SourceFormat != LVM_MONOINSTEREO) && (pParams->SourceFormat != LVM_MONO)) ||
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pParams->SpeakerType > LVM_EX_HEADPHONES))
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Cinema Sound parameters
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((pParams->VirtualizerOperatingMode != LVM_MODE_OFF) && (pParams->VirtualizerOperatingMode != LVM_MODE_ON))
892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pParams->VirtualizerType != LVM_CONCERTSOUND)
942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pParams->VirtualizerReverbLevel > LVM_VIRTUALIZER_MAX_REVERB_LEVEL)
992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pParams->CS_EffectLevel < LVM_CS_MIN_EFFECT_LEVEL)
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * N-Band Equalizer
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pParams->EQNB_NBands > pInstance->InstParams.EQNB_NumBands)
1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Definition pointer */
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pParams->pEQNB_BandDefinition == LVM_NULL) &&
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pParams->EQNB_NBands != 0))
1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_NULLADDRESS);
1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Copy the filter definitions for the Equaliser
1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_INT16           i;
1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (pParams->EQNB_NBands != 0)
1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            for (i=0; i<pParams->EQNB_NBands; i++)
1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pInstance->pEQNB_BandDefs[i] = pParams->pEQNB_BandDefinition[i];
1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->NewParams.pEQNB_BandDefinition = pInstance->pEQNB_BandDefs;
1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if( /* N-Band Equaliser parameters */
1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ((pParams->EQNB_OperatingMode != LVM_EQNB_OFF) && (pParams->EQNB_OperatingMode != LVM_EQNB_ON)) ||
1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pParams->EQNB_NBands > pInstance->InstParams.EQNB_NumBands))
1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Band parameters*/
1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_INT16 i;
1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        for(i = 0; i < pParams->EQNB_NBands; i++)
1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(((pParams->pEQNB_BandDefinition[i].Frequency < LVM_EQNB_MIN_BAND_FREQ)  ||
1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                (pParams->pEQNB_BandDefinition[i].Frequency > LVM_EQNB_MAX_BAND_FREQ)) ||
1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                ((pParams->pEQNB_BandDefinition[i].Gain     < LVM_EQNB_MIN_BAND_GAIN)  ||
1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                (pParams->pEQNB_BandDefinition[i].Gain      > LVM_EQNB_MAX_BAND_GAIN)) ||
1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                ((pParams->pEQNB_BandDefinition[i].QFactor  < LVM_EQNB_MIN_QFACTOR)     ||
1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                (pParams->pEQNB_BandDefinition[i].QFactor   > LVM_EQNB_MAX_QFACTOR)))
1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                return (LVM_OUTOFRANGE);
1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Bass Enhancement parameters
1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(((pParams->BE_OperatingMode != LVM_BE_OFF) && (pParams->BE_OperatingMode != LVM_BE_ON))                      ||
1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ((pParams->BE_EffectLevel < LVM_BE_MIN_EFFECTLEVEL ) || (pParams->BE_EffectLevel > LVM_BE_MAX_EFFECTLEVEL ))||
1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ((pParams->BE_CentreFreq != LVM_BE_CENTRE_55Hz) && (pParams->BE_CentreFreq != LVM_BE_CENTRE_66Hz)           &&
1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pParams->BE_CentreFreq != LVM_BE_CENTRE_78Hz) && (pParams->BE_CentreFreq != LVM_BE_CENTRE_90Hz))           ||
1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ((pParams->BE_HPF != LVM_BE_HPF_OFF) && (pParams->BE_HPF != LVM_BE_HPF_ON)))
1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Volume Control parameters
1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((pParams->VC_EffectLevel < LVM_VC_MIN_EFFECTLEVEL ) || (pParams->VC_EffectLevel > LVM_VC_MAX_EFFECTLEVEL ))
1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((pParams->VC_Balance < LVM_VC_BALANCE_MIN ) || (pParams->VC_Balance > LVM_VC_BALANCE_MAX ))
1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * PSA parameters
1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if( (pParams->PSA_PeakDecayRate > LVPSA_SPEED_HIGH) ||
1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pParams->PSA_Enable > LVM_PSA_ON))
1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    * Set the flag to indicate there are new parameters to use
1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *
1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    * Protect the copy of the new parameters from interrupts to avoid possible problems
1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    * with loss control parameters. This problem can occur if this control function is called more
2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    * than once before a call to the process function. If the process function interrupts
2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    * the copy to NewParams then one frame may have mixed parameters, some old and some new.
2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    */
2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->ControlPending = LVM_TRUE;
2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->NoSmoothVolume = LVM_FALSE;
2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVM_SUCCESS);
2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:             LVM_GetControlParameters                                       */
2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Request the LifeVibes module parameters. The current parameter set is returned      */
2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  via the parameter pointer.                                                          */
2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance            Instance handle                                                */
2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams              Pointer to an empty parameter structure                        */
2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
2232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_SUCCESS          Succeeded                                                      */
2242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_NULLADDRESS      when any of hInstance or pParams is NULL                       */
2252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1. This function may be interrupted by the LVM_Process function                     */
2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_ReturnStatus_en LVM_GetControlParameters(LVM_Handle_t           hInstance,
2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                             LVM_ControlParams_t    *pParams)
2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t    *pInstance =(LVM_Instance_t  *)hInstance;
2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check pointer
2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pParams == LVM_NULL) || (hInstance == LVM_NULL))
2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
2422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_NULLADDRESS);
2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pParams = pInstance->NewParams;
2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Copy the filter definitions for the Equaliser
2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_INT16           i;
2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (pInstance->NewParams.EQNB_NBands != 0)
2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        for (i=0; i<pInstance->NewParams.EQNB_NBands; i++)
2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->pEQNB_UserDefs[i] = pInstance->pEQNB_BandDefs[i];
2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pParams->pEQNB_BandDefinition = pInstance->pEQNB_UserDefs;
2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVM_SUCCESS);
2612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVM_SetTrebleBoost                                          */
2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
2692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Enable the treble boost when the settings are appropriate, i.e. non-zero gain       */
2702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  and the sample rate is high enough for the effect to be heard.                      */
2712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInstance               Pointer to the instance structure                           */
2742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams                 Pointer to the parameters to use                            */
2752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
2772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVM_SetTrebleBoost(LVM_Instance_t         *pInstance,
2782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        LVM_ControlParams_t    *pParams)
2792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
2802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    extern FO_C16_LShx_Coefs_t  LVM_TrebleBoostCoefs[];
2812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16               Offset;
2822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16               EffectLevel = 0;
2832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Load the coefficients
2862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pParams->TE_OperatingMode == LVM_TE_ON) &&
2882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pParams->SampleRate >= TrebleBoostMinRate) &&
2892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pParams->OperatingMode == LVM_MODE_ON) &&
2902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pParams->TE_EffectLevel > 0))
2912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
2922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if((pParams->TE_EffectLevel == LVM_TE_LOW_MIPS) &&
2932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            ((pParams->SpeakerType == LVM_HEADPHONES)||
2942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            (pParams->SpeakerType == LVM_EX_HEADPHONES)))
2952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->TE_Active = LVM_FALSE;
2972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
2992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
3002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            EffectLevel = pParams->TE_EffectLevel;
3012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->TE_Active = LVM_TRUE;
3022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
3032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(pInstance->TE_Active == LVM_TRUE)
3052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
3062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
3072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Load the coefficients and enabled the treble boost
3082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
3092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Offset = (LVM_INT16)(EffectLevel - 1 + TrebleBoostSteps * (pParams->SampleRate - TrebleBoostMinRate));
3102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            FO_2I_D16F32Css_LShx_TRC_WRA_01_Init(&pInstance->pTE_State->TrebleBoost_State,
3112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                            &pInstance->pTE_Taps->TrebleBoost_Taps,
3122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                            &LVM_TrebleBoostCoefs[Offset]);
3132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
3152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Clear the taps
3162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
31709d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent            LoadConst_16((LVM_INT16)0,                                     /* Value */
31809d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent                         (void *)&pInstance->pTE_Taps->TrebleBoost_Taps,  /* Destination.\
31909d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent                                                     Cast to void: no dereferencing in function */
3202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         (LVM_UINT16)(sizeof(pInstance->pTE_Taps->TrebleBoost_Taps)/sizeof(LVM_INT16))); /* Number of words */
3212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
3222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
3242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
3262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Disable the treble boost
3272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
3282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->TE_Active = LVM_FALSE;
3292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return;
3322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
3332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
3362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVM_SetVolume                                               */
3382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
3402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Converts the input volume demand from dBs to linear.                            */
3412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
3432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInstance           Pointer to the instance                                     */
3442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams             Initialisation parameters                                   */
3452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
3472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid    LVM_SetVolume(LVM_Instance_t         *pInstance,
3482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                      LVM_ControlParams_t    *pParams)
3492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
3502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16      dBShifts;                                   /* 6dB shifts */
3522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16      dBOffset;                                   /* Table offset */
3532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16       Volume = 0;                                 /* Required volume in dBs */
3542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
3562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Limit the gain to the maximum allowed
3572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
3582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     if  (pParams->VC_EffectLevel > 0)
3592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     {
3602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         Volume = 0;
3612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     }
3622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     else
3632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     {
3642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         Volume = pParams->VC_EffectLevel;
3652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     }
3662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     /* Compensate this volume in PSA plot */
3682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     if(Volume > -60)  /* Limit volume loss to PSA Limits*/
3692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         pInstance->PSA_GainOffset=(LVM_INT16)(-Volume);/* Loss is compensated by Gain*/
3702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     else
3712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         pInstance->PSA_GainOffset=(LVM_INT16)60;/* Loss is compensated by Gain*/
3722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_AVLFixedVolume = 0;
3742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
3762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set volume control and AVL volumes according to headroom and volume user setting
3772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
3782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pParams->OperatingMode == LVM_MODE_ON)
3792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Default Situation with no AVL and no RS */
3812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(pParams->EQNB_OperatingMode == LVM_EQNB_ON)
3822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
3832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(Volume > -pInstance->Headroom)
3842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                Volume = (LVM_INT16)-pInstance->Headroom;
3852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
3862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
3892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Activate volume control if necessary
3902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
3912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_Active   = LVM_TRUE;
3922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (Volume != 0)
3932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->VC_VolumedB = Volume;
3952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
3972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->VC_VolumedB = 0;
3992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
4022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Calculate the required gain and shifts
4032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
4042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    dBOffset = (LVM_UINT16)((-Volume) % 6);             /* Get the dBs 0-5 */
4052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    dBShifts = (LVM_UINT16)(Volume / -6);               /* Get the 6dB shifts */
4062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
4092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set the parameters
4102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
4112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(dBShifts == 0)
4122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_SetTarget(&pInstance->VC_Volume.MixerStream[0],
4142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                (LVM_INT32)LVM_VolumeTable[dBOffset]);
4152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
4172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_SetTarget(&pInstance->VC_Volume.MixerStream[0],
4192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                (((LVM_INT32)LVM_VolumeTable[dBOffset])>>dBShifts));
4202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_Volume.MixerStream[0].CallbackSet = 1;
4222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pInstance->NoSmoothVolume == LVM_TRUE)
4232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_SetTimeConstant(&pInstance->VC_Volume.MixerStream[0],0,pInstance->Params.SampleRate,2);
4252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
4272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_Volume.MixerStream[0],LVM_VC_MIXER_TIME,pInstance->Params.SampleRate,2);
4292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
4312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
4342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
4352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVM_SetHeadroom                                             */
4362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
4372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
4382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Find suitable headroom based on EQ settings.                                    */
4392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
4402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
4412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInstance           Pointer to the instance                                     */
4422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams             Initialisation parameters                                   */
4432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
4442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
4452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  void                Nothing                                                     */
4462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
4472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
4482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
4492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
4502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid    LVM_SetHeadroom(LVM_Instance_t         *pInstance,
4512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        LVM_ControlParams_t    *pParams)
4522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
4532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16   ii, jj;
4542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16   Headroom = 0;
4552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16   MaxGain = 0;
4562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pParams->EQNB_OperatingMode == LVEQNB_ON) && (pInstance->HeadroomParams.Headroom_OperatingMode == LVM_HEADROOM_ON))
4592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Find typical headroom value */
4612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        for(jj = 0; jj < pInstance->HeadroomParams.NHeadroomBands; jj++)
4622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
4632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            MaxGain = 0;
4642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            for( ii = 0; ii < pParams->EQNB_NBands; ii++)
4652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
4662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                if((pParams->pEQNB_BandDefinition[ii].Frequency >= pInstance->HeadroomParams.pHeadroomDefinition[jj].Limit_Low) &&
4672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                   (pParams->pEQNB_BandDefinition[ii].Frequency <= pInstance->HeadroomParams.pHeadroomDefinition[jj].Limit_High))
4682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                {
4692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    if(pParams->pEQNB_BandDefinition[ii].Gain > MaxGain)
4702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    {
4712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        MaxGain = pParams->pEQNB_BandDefinition[ii].Gain;
4722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    }
4732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                }
4742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
4752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if((MaxGain - pInstance->HeadroomParams.pHeadroomDefinition[jj].Headroom_Offset) > Headroom){
4772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                Headroom = (LVM_INT16)(MaxGain - pInstance->HeadroomParams.pHeadroomDefinition[jj].Headroom_Offset);
4782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
4792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
4802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Saturate */
4822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(Headroom < 0)
4832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Headroom = 0;
4842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Headroom = (LVM_UINT16)Headroom ;
4862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
4882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
4912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVM_ApplyNewSettings                                        */
4932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
4952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Applies changes to parametres. This function makes no assumptions about what        */
4962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  each module needs for initialisation and hence passes all parameters to all the     */
4972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  the modules in turn.                                                                */
4982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
5012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance               Instance handle                                             */
5022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
5042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_Success             Succeeded                                                   */
5052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
5072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5082c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_ReturnStatus_en LVM_ApplyNewSettings(LVM_Handle_t   hInstance)
5092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
5102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t         *pInstance =(LVM_Instance_t *)hInstance;
5112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t    LocalParams;
5122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16              Count = 5;
5132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Copy the new parameters but make sure they didn't change while copying
5172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    do
5192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
5202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->ControlPending = LVM_FALSE;
5212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LocalParams = pInstance->NewParams;
5222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->HeadroomParams = pInstance->NewHeadroomParams;
5232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Count--;
5242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    } while ((pInstance->ControlPending != LVM_FALSE) &&
5252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             (Count > 0));
5262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Clear all internal data if format change*/
5282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(LocalParams.SourceFormat != pInstance->Params.SourceFormat)
5292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
5302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_ClearAudioBuffers(pInstance);
5312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->ControlPending = LVM_FALSE;
5322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
5332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update the treble boost if required
5362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pInstance->Params.SampleRate != LocalParams.SampleRate) ||
5382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.TE_EffectLevel != LocalParams.TE_EffectLevel) ||
5392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.TE_OperatingMode != LocalParams.TE_OperatingMode) ||
5402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.OperatingMode != LocalParams.OperatingMode) ||
5412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.SpeakerType != LocalParams.SpeakerType))
5422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
5432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_SetTrebleBoost(pInstance,
5442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           &LocalParams);
5452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
5462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update the headroom if required
5492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_SetHeadroom(pInstance,                      /* Instance pointer */
5512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        &LocalParams);                  /* New parameters */
5522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update the volume if required
5552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
5572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_SetVolume(pInstance,                      /* Instance pointer */
5582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                      &LocalParams);                  /* New parameters */
5592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
5602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Apply balance changes*/
5612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pInstance->Params.VC_Balance != LocalParams.VC_Balance)
5622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
5632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Configure Mixer module for gradual changes to volume*/
5642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(LocalParams.VC_Balance < 0)
5652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
5662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVM_INT32 Target;
5672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /* Drop in right channel volume*/
5682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Target = LVM_MAXINT_16;
5692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_SetTarget(&pInstance->VC_BalanceMix.MixerStream[0],Target);
5702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[0],LVM_VC_MIXER_TIME,LocalParams.SampleRate,1);
5712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Target = dB_to_Lin32((LVM_INT16)(LocalParams.VC_Balance<<4));
5732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_SetTarget(&pInstance->VC_BalanceMix.MixerStream[1],Target);
5742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[1],LVM_VC_MIXER_TIME,LocalParams.SampleRate,1);
5752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
5762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else if(LocalParams.VC_Balance >0)
5772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
5782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVM_INT32 Target;
5792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /* Drop in left channel volume*/
5802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Target = dB_to_Lin32((LVM_INT16)((-LocalParams.VC_Balance)<<4));
5812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_SetTarget(&pInstance->VC_BalanceMix.MixerStream[0],Target);
5822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[0],LVM_VC_MIXER_TIME,LocalParams.SampleRate,1);
5832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Target = LVM_MAXINT_16;
5852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_SetTarget(&pInstance->VC_BalanceMix.MixerStream[1],Target);
5862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[1],LVM_VC_MIXER_TIME,LocalParams.SampleRate,1);
5872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
5882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
5892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
5902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVM_INT32 Target;
5912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /* No drop*/
5922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Target = LVM_MAXINT_16;
5932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_SetTarget(&pInstance->VC_BalanceMix.MixerStream[0],Target);
5942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[0],LVM_VC_MIXER_TIME,LocalParams.SampleRate,1);
5952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_SetTarget(&pInstance->VC_BalanceMix.MixerStream[1],Target);
5972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[1],LVM_VC_MIXER_TIME,LocalParams.SampleRate,1);
5982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
5992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
6002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
6012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update the bass enhancement
6022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
6032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
6042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVDBE_ReturnStatus_en       DBE_Status;
6052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVDBE_Params_t              DBE_Params;
6062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVDBE_Handle_t              *hDBEInstance = pInstance->hDBEInstance;
6072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
6102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the new parameters
6112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
6122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(LocalParams.OperatingMode == LVM_MODE_OFF)
6132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
6142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            DBE_Params.OperatingMode = LVDBE_OFF;
6152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
6162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
6172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
6182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            DBE_Params.OperatingMode    = (LVDBE_Mode_en)LocalParams.BE_OperatingMode;
6192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
6202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_Params.SampleRate       = (LVDBE_Fs_en)LocalParams.SampleRate;
6212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_Params.EffectLevel      = LocalParams.BE_EffectLevel;
6222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_Params.CentreFrequency  = (LVDBE_CentreFreq_en)LocalParams.BE_CentreFreq;
6232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_Params.HPFSelect        = (LVDBE_FilterSelect_en)LocalParams.BE_HPF;
6242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_Params.HeadroomdB       = 0;
6252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_Params.VolumeControl    = LVDBE_VOLUME_OFF;
6262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_Params.VolumedB         = 0;
6272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
6292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Make the changes
6302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
6312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_Status = LVDBE_Control(hDBEInstance,
6322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                   &DBE_Params);
6332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
6362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Quit if the changes were not accepted
6372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
6382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (DBE_Status != LVDBE_SUCCESS)
6392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
6402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return((LVM_ReturnStatus_en)DBE_Status);
6412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
6422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
6452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the control flag
6462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
6472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->DBE_Active = LVM_TRUE;
6482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
6492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
6512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update the N-Band Equaliser
6522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
6532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
6542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVEQNB_ReturnStatus_en      EQNB_Status;
6552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVEQNB_Params_t             EQNB_Params;
6562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVEQNB_Handle_t             *hEQNBInstance = pInstance->hEQNBInstance;
6572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
6602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the new parameters
6612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
6622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(LocalParams.OperatingMode == LVM_MODE_OFF)
6642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
6652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            EQNB_Params.OperatingMode    = LVEQNB_BYPASS;
6662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
6672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
6682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
6692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            EQNB_Params.OperatingMode    = (LVEQNB_Mode_en)LocalParams.EQNB_OperatingMode;
6702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
6712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_Params.SampleRate       = (LVEQNB_Fs_en)LocalParams.SampleRate;
6732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_Params.NBands           = LocalParams.EQNB_NBands;
6742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_Params.pBandDefinition  = (LVEQNB_BandDef_t *)LocalParams.pEQNB_BandDefinition;
6752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (LocalParams.SourceFormat == LVM_STEREO)    /* Mono format not supported */
6762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
6772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            EQNB_Params.SourceFormat = LVEQNB_STEREO;
6782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
6792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
6802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
6812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            EQNB_Params.SourceFormat = LVEQNB_MONOINSTEREO;     /* Force to Mono-in-Stereo mode */
6822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
6832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
6862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the control flag
6872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
6882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if ((LocalParams.OperatingMode == LVM_MODE_ON) &&
6892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            (LocalParams.EQNB_OperatingMode == LVM_EQNB_ON))
6902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
6912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->EQNB_Active = LVM_TRUE;
6922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
6932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
6942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
6952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            EQNB_Params.OperatingMode = LVEQNB_BYPASS;
6962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
6972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
6992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Make the changes
7002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_Status = LVEQNB_Control(hEQNBInstance,
7022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                     &EQNB_Params);
7032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
7062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Quit if the changes were not accepted
7072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (EQNB_Status != LVEQNB_SUCCESS)
7092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
7102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return((LVM_ReturnStatus_en)EQNB_Status);
7112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
7122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
7142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
7172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update concert sound
7182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
7192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
7202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVCS_ReturnStatus_en        CS_Status;
7212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVCS_Params_t               CS_Params;
7222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVCS_Handle_t               *hCSInstance = pInstance->hCSInstance;
7232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_Mode_en                 CompressorMode=LVM_MODE_ON;
7242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
7262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the new parameters
7272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(LocalParams.VirtualizerOperatingMode == LVM_MODE_ON)
7292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
7302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            CS_Params.OperatingMode    = LVCS_ON;
7312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
7322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
7332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
7342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            CS_Params.OperatingMode    = LVCS_OFF;
7352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
7362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if((LocalParams.TE_OperatingMode == LVM_TE_ON) && (LocalParams.TE_EffectLevel == LVM_TE_LOW_MIPS))
7382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
7392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            CS_Params.SpeakerType  = LVCS_EX_HEADPHONES;
7402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
7412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
7422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
7432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            CS_Params.SpeakerType  = LVCS_HEADPHONES;
7442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
7452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (LocalParams.SourceFormat == LVM_STEREO)    /* Mono format not supported */
7472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
7482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            CS_Params.SourceFormat = LVCS_STEREO;
7492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
7502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
7512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
7522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            CS_Params.SourceFormat = LVCS_MONOINSTEREO;          /* Force to Mono-in-Stereo mode */
7532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
7542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CS_Params.SampleRate  = LocalParams.SampleRate;
7552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CS_Params.ReverbLevel = LocalParams.VirtualizerReverbLevel;
7562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CS_Params.EffectLevel = LocalParams.CS_EffectLevel;
7572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
7602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the control flag
7612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if ((LocalParams.OperatingMode == LVM_MODE_ON) &&
7632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            (LocalParams.VirtualizerOperatingMode != LVCS_OFF))
7642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
7652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->CS_Active = LVM_TRUE;
7662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
7672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
7682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
7692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            CS_Params.OperatingMode = LVCS_OFF;
7702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
7712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CS_Params.CompressorMode=CompressorMode;
7732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
7752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Make the changes
7762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CS_Status = LVCS_Control(hCSInstance,
7782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 &CS_Params);
7792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
7822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Quit if the changes were not accepted
7832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (CS_Status != LVCS_SUCCESS)
7852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
7862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return((LVM_ReturnStatus_en)CS_Status);
7872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
7882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
7902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
7922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update the Power Spectrum Analyser
7932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
7942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
7952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVPSA_RETURN                PSA_Status;
7962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVPSA_ControlParams_t       PSA_Params;
7972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pLVPSA_Handle_t             *hPSAInstance = pInstance->hPSAInstance;
7982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
8012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the new parameters
8022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
8032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        PSA_Params.Fs = LocalParams.SampleRate;
8042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        PSA_Params.LevelDetectionSpeed = (LVPSA_LevelDetectSpeed_en)LocalParams.PSA_PeakDecayRate;
8052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
8072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Make the changes
8082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
8092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(pInstance->InstParams.PSA_Included==LVM_PSA_ON)
8102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
8112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            PSA_Status = LVPSA_Control(hPSAInstance,
8122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                &PSA_Params);
8132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (PSA_Status != LVPSA_OK)
8152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
8162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                return((LVM_ReturnStatus_en)PSA_Status);
8172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
8182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
8202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Apply new settings
8212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
8222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            PSA_Status = LVPSA_ApplyNewSettings ((LVPSA_InstancePr_t*)hPSAInstance);
8232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(PSA_Status != LVPSA_OK)
8242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
8252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                return((LVM_ReturnStatus_en)PSA_Status);
8262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
8272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
8282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
8292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
8312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update the parameters and clear the flag
8322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
8332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params =  LocalParams;
8342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVM_SUCCESS);
8372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
8382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
8412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
8422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVM_SetHeadroomParams                                       */
8432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
8442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
8452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  This function is used to set the automatiuc headroom management parameters.         */
8462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
8472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
8482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance               Instance Handle                                             */
8492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pHeadroomParams         Pointer to headroom parameter structure                     */
8502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
8512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
8522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_Success             Succeeded                                                   */
8532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
8542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
8552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function may be interrupted by the LVM_Process function                    */
8562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
8572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
8582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8592c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_ReturnStatus_en LVM_SetHeadroomParams(LVM_Handle_t              hInstance,
8602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                          LVM_HeadroomParams_t      *pHeadroomParams)
8612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
8622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t      *pInstance =(LVM_Instance_t  *)hInstance;
8632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16          ii, NBands;
8642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Check for NULL pointers */
8662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((hInstance == LVM_NULL) || (pHeadroomParams == LVM_NULL))
8672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
8682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_NULLADDRESS);
8692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
8702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pHeadroomParams->NHeadroomBands != 0) && (pHeadroomParams->pHeadroomDefinition == LVM_NULL))
8712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
8722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_NULLADDRESS);
8732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
8742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Consider only the LVM_HEADROOM_MAX_NBANDS first bands*/
8762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pHeadroomParams->NHeadroomBands > LVM_HEADROOM_MAX_NBANDS)
8772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
8782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        NBands = LVM_HEADROOM_MAX_NBANDS;
8792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
8802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
8812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
8822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        NBands = pHeadroomParams->NHeadroomBands;
8832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
8842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->NewHeadroomParams.NHeadroomBands = NBands;
8852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Copy settings in memory */
8872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for(ii = 0; ii < NBands; ii++)
8882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
8892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pHeadroom_BandDefs[ii] = pHeadroomParams->pHeadroomDefinition[ii];
8902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
8912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->NewHeadroomParams.pHeadroomDefinition = pInstance->pHeadroom_BandDefs;
8932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->NewHeadroomParams.Headroom_OperatingMode = pHeadroomParams->Headroom_OperatingMode;
8942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->ControlPending = LVM_TRUE;
8952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVM_SUCCESS);
8972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
8982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
9002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVM_GetHeadroomParams                                       */
9022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
9042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  This function is used to get the automatic headroom management parameters.          */
9052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
9072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance               Instance Handle                                             */
9082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pHeadroomParams         Pointer to headroom parameter structure (output)            */
9092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
9112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_SUCCESS             Succeeded                                                   */
9122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_NULLADDRESS         When hInstance or pHeadroomParams are NULL                  */
9132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
9152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function may be interrupted by the LVM_Process function                    */
9162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
9182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9192c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_ReturnStatus_en LVM_GetHeadroomParams(LVM_Handle_t          hInstance,
9202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                          LVM_HeadroomParams_t  *pHeadroomParams)
9212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
9222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t      *pInstance =(LVM_Instance_t  *)hInstance;
9232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16          ii;
9242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Check for NULL pointers */
9262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((hInstance == LVM_NULL) || (pHeadroomParams == LVM_NULL))
9272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
9282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_NULLADDRESS);
9292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
9302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pHeadroomParams->NHeadroomBands = pInstance->NewHeadroomParams.NHeadroomBands;
9322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Copy settings in memory */
9352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for(ii = 0; ii < pInstance->NewHeadroomParams.NHeadroomBands; ii++)
9362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
9372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pHeadroom_UserDefs[ii] = pInstance->pHeadroom_BandDefs[ii];
9382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
9392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pHeadroomParams->pHeadroomDefinition = pInstance->pHeadroom_UserDefs;
9422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pHeadroomParams->Headroom_OperatingMode = pInstance->NewHeadroomParams.Headroom_OperatingMode;
9432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVM_SUCCESS);
9442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
9452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
9472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVM_AlgoCallBack                                            */
9492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
9512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  This is the callback function of the algorithm.                                     */
9522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
9542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pBundleHandle           Pointer to the Instance Handle                              */
9552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pData                   Pointer to the data                                         */
9562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  callbackId              ID of the callback                                          */
9572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
9592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function may be interrupted by the LVM_Process function                    */
9602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
9622c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_INT32 LVM_AlgoCallBack( void          *pBundleHandle,
9632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            void          *pData,
9642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            LVM_INT16     callbackId)
9652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
9662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t      *pInstance =(LVM_Instance_t  *)pBundleHandle;
9672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    (void) pData;
9692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    switch(callbackId & 0xFF00){
9712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case ALGORITHM_CS_ID:
9722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            switch(callbackId & 0x00FF)
9732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
9742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                case LVCS_EVENT_ALGOFF:
9752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pInstance->CS_Active = LVM_FALSE;
9762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    break;
9772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                default:
9782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    break;
9792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
9802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
9812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        case ALGORITHM_EQNB_ID:
9822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            switch(callbackId & 0x00FF)
9832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
9842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                case LVEQNB_EVENT_ALGOFF:
9852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pInstance->EQNB_Active = LVM_FALSE;
9862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    break;
9872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                default:
9882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    break;
9892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
9902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
9912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        default:
9922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            break;
9932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
9942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 0;
9962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
9972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
9992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
10002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVM_VCCallBack                                              */
10012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
10022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
10032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  This is the callback function of the Volume control.                                */
10042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
10052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
10062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pBundleHandle           Pointer to the Instance Handle                              */
10072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pGeneralPurpose         Pointer to the data                                         */
10082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  CallBackParam           ID of the callback                                          */
10092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
10102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
10112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function may be interrupted by the LVM_Process function                    */
10122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
10132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
10142c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_INT32    LVM_VCCallBack(void*   pBundleHandle,
10152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            void*   pGeneralPurpose,
10162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            short   CallBackParam)
10172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
10182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t *pInstance =(LVM_Instance_t  *)pBundleHandle;
10192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32    Target;
10202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    (void) pGeneralPurpose;
10222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    (void) CallBackParam;
10232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* When volume mixer has reached 0 dB target then stop it to avoid
10252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       unnecessary processing. */
10262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    Target = LVC_Mixer_GetTarget(&pInstance->VC_Volume.MixerStream[0]);
10272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(Target == 0x7FFF)
10292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
10302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->VC_Active = LVM_FALSE;
10312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
10322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 1;
10332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
1034