12c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*
22c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2004-2010 NXP Software
32c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2010 The Android Open Source Project
42c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
52c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
62c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * you may not use this file except in compliance with the License.
72c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * You may obtain a copy of the License at
82c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
92c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Unless required by applicable law or agreed to in writing, software
122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * See the License for the specific language governing permissions and
152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * limitations under the License.
162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */
172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    Includes                                                                          */
212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVDBE.h"
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVDBE_Private.h"
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "VectorArithmetic.h"
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVDBE_Coeffs.h"
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVDBE_Tables.h"
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                  LVDBE_GetParameters                                       */
332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    Request the Dynamic Bass Enhancement parameters. The current parameter set is     */
362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  returned via the parameter pointer.                                                 */
372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance                   Instance handle                                         */
402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams                  Pointer to an empty parameter structure                    */
412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVDBE_SUCCESS            Always succeeds                                            */
442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.    This function may be interrupted by the LVDBE_Process function                */
472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVDBE_ReturnStatus_en LVDBE_GetParameters(LVDBE_Handle_t        hInstance,
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                            LVDBE_Params_t        *pParams)
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVDBE_Instance_t    *pInstance =(LVDBE_Instance_t  *)hInstance;
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pParams = pInstance->Params;
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVDBE_SUCCESS);
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                  LVDBE_GetCapabilities                                 */
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: Dynamic Bass Enhnacement capabilities. The current capabilities are */
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* returned via the pointer.                                                        */
682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance                   Instance handle                                     */
712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pCapabilities              Pointer to an empty capability structure             */
722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVDBE_Success             Always succeeds                                       */
752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.    This function may be interrupted by the LVDBE_Process function            */
782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVDBE_ReturnStatus_en LVDBE_GetCapabilities(LVDBE_Handle_t            hInstance,
822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                              LVDBE_Capabilities_t    *pCapabilities)
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVDBE_Instance_t    *pInstance =(LVDBE_Instance_t  *)hInstance;
862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pCapabilities = pInstance->Capabilities;
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVDBE_SUCCESS);
902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVDBE_SetFilters                                            */
962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Sets the filter coefficients and clears the data history                        */
992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInstance           Pointer to the instance                                     */
1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams             Initialisation parameters                                   */
1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid    LVDBE_SetFilters(LVDBE_Instance_t     *pInstance,
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         LVDBE_Params_t       *pParams)
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Calculate the table offsets
1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16 Offset = (LVM_UINT16)((LVM_UINT16)pParams->SampleRate + (LVM_UINT16)(pParams->CentreFrequency * (1+LVDBE_FS_48000)));
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Setup the high pass filter
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
11909d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent    LoadConst_16(0,                                                 /* Clear the history, value 0 */
12009d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent                 (void *)&pInstance->pData->HPFTaps,                /* Destination Cast to void: \
12109d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent                                                                     no dereferencing in function*/
12209d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent                 sizeof(pInstance->pData->HPFTaps)/sizeof(LVM_INT16));   /* Number of words */
123c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    BQ_2I_D32F32Cll_TRC_WRA_01_Init(&pInstance->pCoef->HPFInstance,         /* Initialise the filter */
1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    &pInstance->pData->HPFTaps,
1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    (BQ_C32_Coefs_t *)&LVDBE_HPF_Table[Offset]);
1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Setup the band pass filter
1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
13109d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent    LoadConst_16(0,                                                 /* Clear the history, value 0 */
13209d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent                 (void *)&pInstance->pData->BPFTaps,                /* Destination Cast to void:\
13309d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent                                                                     no dereferencing in function*/
13409d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent                 sizeof(pInstance->pData->BPFTaps)/sizeof(LVM_INT16));   /* Number of words */
135c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    BP_1I_D32F32Cll_TRC_WRA_02_Init(&pInstance->pCoef->BPFInstance,         /* Initialise the filter */
1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    &pInstance->pData->BPFTaps,
1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    (BP_C32_Coefs_t *)&LVDBE_BPF_Table[Offset]);
1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVDBE_SetAGC                                                */
1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Sets the AGC gain level and attack and decay times constants.                   */
1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInstance           Pointer to the instance                                     */
1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams             Initialisation parameters                                   */
1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid    LVDBE_SetAGC(LVDBE_Instance_t     *pInstance,
1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                     LVDBE_Params_t       *pParams)
1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Get the attack and decay time constants
1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pData->AGCInstance.AGC_Attack = LVDBE_AGC_ATTACK_Table[(LVM_UINT16)pParams->SampleRate];  /* Attack multiplier */
1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pData->AGCInstance.AGC_Decay  = LVDBE_AGC_DECAY_Table[(LVM_UINT16)pParams->SampleRate];   /* Decay multipler */
1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Get the boost gain
1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pParams->HPFSelect == LVDBE_HPF_ON)
1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pData->AGCInstance.AGC_MaxGain   = LVDBE_AGC_HPFGAIN_Table[(LVM_UINT16)pParams->EffectLevel];  /* High pass filter on */
1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pData->AGCInstance.AGC_MaxGain   = LVDBE_AGC_GAIN_Table[(LVM_UINT16)pParams->EffectLevel];     /* High pass filter off */
1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pData->AGCInstance.AGC_GainShift = AGC_GAIN_SHIFT;
1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pData->AGCInstance.AGC_Target = AGC_TARGETLEVEL;
1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVDBE_SetVolume                                             */
1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Converts the input volume demand from dBs to linear.                            */
1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInstance           Pointer to the instance                                     */
1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams             Initialisation parameters                                   */
1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1. The volume should have the following settings:                               */
1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          DBE         Vol Control           Volume setting                        */
1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          ===         ===========         ===================                     */
2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          Off             Off                 HeadroomdB                          */
2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          Off             On              VolumedB+HeadroomdB                     */
2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          On              Off                 HeadroomdB                          */
2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          On              On              VolumedB+HeadroomdB                     */
2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid    LVDBE_SetVolume(LVDBE_Instance_t     *pInstance,
2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        LVDBE_Params_t       *pParams)
2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16      dBShifts;                                   /* 6dB shifts */
2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16      dBOffset;                                   /* Table offset */
2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16       Volume = 0;                                 /* Required volume in dBs */
2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Apply the volume if enabled
2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pParams->VolumeControl == LVDBE_VOLUME_ON)
2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Limit the gain to the maximum allowed
2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if  (pParams->VolumedB > VOLUME_MAX)
2242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Volume = VOLUME_MAX;
2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            Volume = pParams->VolumedB;
2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Calculate the required gain and shifts
2362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    dBOffset = (LVM_UINT16)(6 + Volume % 6);                    /* Get the dBs 0-5 */
2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    dBShifts = (LVM_UINT16)(Volume / -6);                       /* Get the 6dB shifts */
2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * When DBE is enabled use AGC volume
2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pData->AGCInstance.Target = ((LVM_INT32)LVDBE_VolumeTable[dBOffset] << 16);
2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pData->AGCInstance.Target = pInstance->pData->AGCInstance.Target >> dBShifts;
2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pData->AGCInstance.VolumeTC    = LVDBE_VolumeTCTable[(LVM_UINT16)pParams->SampleRate];   /* Volume update time constant */
2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pData->AGCInstance.VolumeShift = VOLUME_SHIFT+1;
2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * When DBE is disabled use the bypass volume control
2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(dBShifts > 0)
2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_SetTarget(&pInstance->pData->BypassVolume.MixerStream[0],(((LVM_INT32)LVDBE_VolumeTable[dBOffset]) >> dBShifts));
2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
2592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_SetTarget(&pInstance->pData->BypassVolume.MixerStream[0],(LVM_INT32)LVDBE_VolumeTable[dBOffset]);
2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pData->BypassVolume.MixerStream[0].CallbackSet = 1;
2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->pData->BypassVolume.MixerStream[0],
2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                LVDBE_MIXER_TC,
2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                (LVM_Fs_en)pInstance->Params.SampleRate,
2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                2);
2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
2712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVDBE_Control                                               */
2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
2752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Sets or changes the Bass Enhancement parameters. Changing the parameters while the  */
2762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  module is processing signals may have the following side effects:                   */
2772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  General parameters:                                                                 */
2792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  ===================                                                                 */
2802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  OperatingMode:      Changing the mode of operation may cause a change in volume     */
2812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                      level or cause pops and clicks.                                 */
2822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  SampleRate:         Changing the sample rate may cause pops and clicks.             */
2842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  EffectLevel:        Changing the effect level may cause pops and clicks             */
2862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  CentreFrequency:    Changing the centre frequency may cause pops and clicks         */
2882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  HPFSelect:          Selecting/de-selecting the high pass filter may cause pops and  */
2902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                      clicks                                                          */
2912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  VolumedB            Changing the volume setting will have no side effects           */
2932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
2962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance               Instance handle                                             */
2972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams                 Pointer to a parameter structure                            */
2982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
2992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
3002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVDBE_SUCCESS           Always succeeds                                             */
3012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
3022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
3032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function must not be interrupted by the LVDBE_Process function             */
3042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
3052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
3062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3072c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVDBE_ReturnStatus_en LVDBE_Control(LVDBE_Handle_t         hInstance,
3082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      LVDBE_Params_t         *pParams)
3092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
3102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVDBE_Instance_t    *pInstance =(LVDBE_Instance_t  *)hInstance;
312c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVMixer3_2St_st     *pBypassMixer_Instance = &pInstance->pData->BypassMixer;
3132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
3162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update the filters
3172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
3182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pInstance->Params.SampleRate != pParams->SampleRate) ||
3192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.CentreFrequency != pParams->CentreFrequency))
3202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVDBE_SetFilters(pInstance,                     /* Instance pointer */
3222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                         pParams);                      /* New parameters */
3232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
3272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update the AGC is the effect level has changed
3282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
3292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pInstance->Params.SampleRate != pParams->SampleRate) ||
3302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.EffectLevel != pParams->EffectLevel) ||
3312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.HPFSelect != pParams->HPFSelect))
3322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVDBE_SetAGC(pInstance,                         /* Instance pointer */
3342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                     pParams);                          /* New parameters */
335c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
336c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LVC_Mixer_SetTimeConstant(&pBypassMixer_Instance->MixerStream[0],
337c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            LVDBE_BYPASS_MIXER_TC,pParams->SampleRate,2);
338c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
339c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LVC_Mixer_SetTimeConstant(&pBypassMixer_Instance->MixerStream[1],
340c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            LVDBE_BYPASS_MIXER_TC,pParams->SampleRate,2);
341c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
342c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
3432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
3472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update the Volume if the volume demand has changed
3482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
3492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((pInstance->Params.VolumedB != pParams->VolumedB) ||
3502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.SampleRate != pParams->SampleRate) ||
3512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.HeadroomdB != pParams->HeadroomdB) ||
3522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.VolumeControl != pParams->VolumeControl))
3532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVDBE_SetVolume(pInstance,                      /* Instance pointer */
3552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                       pParams);                        /* New parameters */
3562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pInstance->Params.OperatingMode==LVDBE_ON && pParams->OperatingMode==LVDBE_OFF)
3592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
360c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LVC_Mixer_SetTarget(&pInstance->pData->BypassMixer.MixerStream[0],0);
361c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LVC_Mixer_SetTarget(&pInstance->pData->BypassMixer.MixerStream[1],0x00007FFF);
3622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pInstance->Params.OperatingMode==LVDBE_OFF && pParams->OperatingMode==LVDBE_ON)
3642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
365c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LVC_Mixer_SetTarget(&pInstance->pData->BypassMixer.MixerStream[0],0x00007FFF);
366c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LVC_Mixer_SetTarget(&pInstance->pData->BypassMixer.MixerStream[1],0);
3672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
3702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update the instance parameters
3712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
3722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params = *pParams;
3732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVDBE_SUCCESS);
3762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
377