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 "LVEQNB.h"
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVEQNB_Private.h"
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "VectorArithmetic.h"
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "BIQUAD.h"
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Defines                                                                             */
332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define     LOW_FREQ            298             /* 32768/110 for low test frequency */
372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define     HIGH_FREQ           386             /* 32768/85 for high test frequency */
382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVEQNB_GetParameters                                       */
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Request the N-Band equaliser parameters. The current parameter set is returned via  */
452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  the parameter pointer.                                                              */
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance                Instance handle                                            */
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams                  Pointer to an empty parameter structure                    */
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVEQNB_SUCCESS          Succeeds                                                    */
532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVEQNB_NULLADDRESS      Instance or pParams  is NULL pointer                        */
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function may be interrupted by the LVEQNB_Process function                 */
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVEQNB_ReturnStatus_en LVEQNB_GetParameters(LVEQNB_Handle_t     hInstance,
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                            LVEQNB_Params_t     *pParams)
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVEQNB_Instance_t    *pInstance =(LVEQNB_Instance_t  *)hInstance;
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent   /*
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check for error conditions
682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((hInstance == LVM_NULL) || (pParams == LVM_NULL))
702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return LVEQNB_NULLADDRESS;
722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pParams = pInstance->Params;
752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVEQNB_SUCCESS);
772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVEQNB_GetCapabilities                                 */
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Get the N-Band equaliser capabilities. The current capabilities are returned    */
862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  via the pointer.                                                                */
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance                Instance handle                                        */
902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pCapabilities            Pointer to an empty capability structure               */
912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVEQNB_Success           Succeeds                                               */
942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVEQNB_NULLADDRESS       hInstance or pCapabilities is NULL                     */
952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function may be interrupted by the LVEQNB_Process function             */
982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVEQNB_ReturnStatus_en LVEQNB_GetCapabilities(LVEQNB_Handle_t           hInstance,
1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                              LVEQNB_Capabilities_t     *pCapabilities)
1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVEQNB_Instance_t    *pInstance =(LVEQNB_Instance_t  *)hInstance;
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((hInstance == LVM_NULL) || (pCapabilities == LVM_NULL))
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return LVEQNB_NULLADDRESS;
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pCapabilities = pInstance->Capabilities;
1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVEQNB_SUCCESS);
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVEQNB_SetFilters                                           */
1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Sets the filter type based on the definition.                                   */
1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInstance           Pointer to the instance                                     */
1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams             Initialisation parameters                                   */
1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  void                Nothing                                                     */
1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1. To select the biquad type the follow rules are applied:                      */
1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          Double precision    if (fc <= fs/110)                                   */
1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          Double precision    if (fs/110 < fc < fs/85) & (Q>3)                    */
1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          Single precision    otherwise                                           */
1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid    LVEQNB_SetFilters(LVEQNB_Instance_t     *pInstance,
1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                          LVEQNB_Params_t       *pParams)
1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
143d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifdef HIGHER_FS
144d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri    extern const LVM_UINT32   LVEQNB_SampleRateTab[];           /* Sample rate table */
145d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else
1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    extern const LVM_UINT16   LVEQNB_SampleRateTab[];           /* Sample rate table */
147d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif
148d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri
1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16          i;                                      /* Filter band index */
1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT32          fs = (LVM_UINT32)LVEQNB_SampleRateTab[(LVM_UINT16)pParams->SampleRate];  /* Sample rate */
1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT32          fc;                                     /* Filter centre frequency */
1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           QFactor;                                /* Filter Q factor */
1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->NBands = pParams->NBands;
1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (i=0; i<pParams->NBands; i++)
1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Get the filter settings
1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        fc = (LVM_UINT32)pParams->pBandDefinition[i].Frequency;     /* Get the band centre frequency */
1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        QFactor = (LVM_INT16)pParams->pBandDefinition[i].QFactor;   /* Get the band Q factor */
1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
165d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifdef BUILD_FLOAT
166d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri        pInstance->pBiquadType[i] = LVEQNB_SinglePrecision_Float; /* Default to single precision */
167d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else
1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * For each filter set the type of biquad required
1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pBiquadType[i] = LVEQNB_SinglePrecision;         /* Default to single precision */
172d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif
173d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifndef BUILD_FLOAT
1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if ((fc << 15) <= (LOW_FREQ * fs))
1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * fc <= fs/110
1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->pBiquadType[i] = LVEQNB_DoublePrecision;
1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else if (((fc << 15) <= (HIGH_FREQ * fs)) && (QFactor > 300))
1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * (fs/110 < fc < fs/85) & (Q>3)
1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->pBiquadType[i] = LVEQNB_DoublePrecision;
1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
188d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif
1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Check for out of range frequencies
1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (fc > (fs >> 1))
1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->pBiquadType[i] = LVEQNB_OutOfRange;
1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Copy the filter definition to persistant memory
2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pBandDefinitions[i] = pParams->pBandDefinition[i];
2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVEQNB_SetCoefficients                                      */
2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Sets the filter coefficients. This uses the type to select single or double     */
2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  precision coefficients.                                                         */
2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInstance           Pointer to the instance                                     */
2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams             Initialisation parameters                                   */
2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid    LVEQNB_SetCoefficients(LVEQNB_Instance_t     *pInstance)
2232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
2242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16              i;                          /* Filter band index */
2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVEQNB_BiquadType_en    BiquadType;                 /* Filter biquad type */
2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set the coefficients for each band by the init function
2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (i=0; i<pInstance->Params.NBands; i++)
2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Check band type for correct initialisation method and recalculate the coefficients
2372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        BiquadType = pInstance->pBiquadType[i];
2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        switch  (BiquadType)
2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
241d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifdef BUILD_FLOAT
242d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri            case    LVEQNB_SinglePrecision_Float:
243d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri            {
244d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                PK_FLOAT_Coefs_t      Coefficients;
245d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                /*
246d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                 * Calculate the single precision coefficients
247d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                 */
248d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                LVEQNB_SinglePrecCoefs((LVM_UINT16)pInstance->Params.SampleRate,
249d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                                       &pInstance->pBandDefinitions[i],
250d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                                       &Coefficients);
251d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                /*
252d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                 * Set the coefficients
253d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                 */
254d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                PK_2I_D32F32CssGss_TRC_WRA_01_Init(&pInstance->pEQNB_FilterState_Float[i],
255d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                                                   &pInstance->pEQNB_Taps_Float[i],
256d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                                                   &Coefficients);
257d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                break;
258d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri            }
259d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else
2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            case    LVEQNB_DoublePrecision:
2612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                PK_C32_Coefs_t      Coefficients;
2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /*
2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 * Calculate the double precision coefficients
2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 */
2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVEQNB_DoublePrecCoefs((LVM_UINT16)pInstance->Params.SampleRate,
2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       &pInstance->pBandDefinitions[i],
2692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       &Coefficients);
2702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /*
2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 * Set the coefficients
2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 */
2742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                PK_2I_D32F32CllGss_TRC_WRA_01_Init(&pInstance->pEQNB_FilterState[i],
2752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                   &pInstance->pEQNB_Taps[i],
2762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                   &Coefficients);
2772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                break;
2782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
2792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            case    LVEQNB_SinglePrecision:
2812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
2822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                PK_C16_Coefs_t      Coefficients;
2832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /*
2852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 * Calculate the single precision coefficients
2862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 */
2872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVEQNB_SinglePrecCoefs((LVM_UINT16)pInstance->Params.SampleRate,
2882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       &pInstance->pBandDefinitions[i],
2892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       &Coefficients);
2902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /*
2922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 * Set the coefficients
2932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 */
2942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                PK_2I_D32F32CssGss_TRC_WRA_01_Init(&pInstance->pEQNB_FilterState[i],
2952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                   &pInstance->pEQNB_Taps[i],
2962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                   &Coefficients);
2972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                break;
2982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
299d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif
3002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            default:
3012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                break;
3022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
3032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
3062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
3092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVEQNB_ClearFilterHistory                                   */
3112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
3132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Clears the filter data history                                                  */
3142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
3162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInstance           Pointer to the instance                                     */
3172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
3182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
319d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifndef BUILD_FLOAT
3202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid    LVEQNB_ClearFilterHistory(LVEQNB_Instance_t     *pInstance)
3212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
3222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16       *pTapAddress;
3232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16       NumTaps;
3242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pTapAddress = (LVM_INT16 *)pInstance->pEQNB_Taps;
3272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    NumTaps     = (LVM_INT16)((pInstance->Capabilities.MaxBands * sizeof(Biquad_2I_Order2_Taps_t))/sizeof(LVM_INT16));
3282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (NumTaps != 0)
3302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LoadConst_16(0,                                 /* Clear the history, value 0 */
3322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                     pTapAddress,                       /* Destination */
3332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                     NumTaps);                          /* Number of words */
3342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
336d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else
337d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katurivoid    LVEQNB_ClearFilterHistory(LVEQNB_Instance_t     *pInstance)
338d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri{
339d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri    LVM_FLOAT       *pTapAddress;
340d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri    LVM_INT16       NumTaps;
3412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
342d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri    pTapAddress = (LVM_FLOAT *)pInstance->pEQNB_Taps_Float;
343d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri    NumTaps     = (LVM_INT16)((pInstance->Capabilities.MaxBands * \
344d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                                    sizeof(Biquad_2I_Order2_FLOAT_Taps_t)) / sizeof(LVM_FLOAT));
3452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
346d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri    if (NumTaps != 0)
347d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri    {
348d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri        LoadConst_Float(0,                                 /* Clear the history, value 0 */
349d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                        pTapAddress,                       /* Destination */
350d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                        NumTaps);                          /* Number of words */
351d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri    }
352d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri}
353d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif
3542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
3552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
3562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVEQNB_Control                                              */
3572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
3582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
3592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Sets or changes the LifeVibes module parameters.                                    */
3602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
3612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
3622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance               Instance handle                                             */
3632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams                 Pointer to a parameter structure                            */
3642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
3652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
3662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVEQNB_Success          Always succeeds                                             */
3672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVEQNB_NULLADDRESS      Instance or pParams  is NULL pointer                        */
3682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVEQNB_NULLADDRESS      NULL address for the equaliser filter definitions and the   */
3692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                          number of bands is non-zero                                 */
3702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
3712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
3722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function may be interrupted by the LVEQNB_Process function                 */
3732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
3742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
3752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3762c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVEQNB_ReturnStatus_en LVEQNB_Control(LVEQNB_Handle_t        hInstance,
3772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      LVEQNB_Params_t        *pParams)
3782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
3792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVEQNB_Instance_t    *pInstance = (LVEQNB_Instance_t  *)hInstance;
3812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16            bChange    = LVM_FALSE;
3822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16            i = 0;
3832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVEQNB_Mode_en       OperatingModeSave ;
3842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
3862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check for error conditions
3872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
3882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((hInstance == LVM_NULL) || (pParams == LVM_NULL))
3892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return LVEQNB_NULLADDRESS;
3912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((pParams->NBands !=0) && (pParams->pBandDefinition==LVM_NULL))
3942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return LVEQNB_NULLADDRESS;
3962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    OperatingModeSave = pInstance->Params.OperatingMode;
3992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Set the alpha factor of the mixer */
4012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pParams->SampleRate != pInstance->Params.SampleRate)
4022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMixer.MixerStream[0],LVEQNB_BYPASS_MIXER_TC,(LVM_Fs_en)pParams->SampleRate,2);
4042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMixer.MixerStream[1],LVEQNB_BYPASS_MIXER_TC,(LVM_Fs_en)pParams->SampleRate,2);
4052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if( (pInstance->Params.NBands            !=  pParams->NBands          ) ||
4092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.OperatingMode     !=  pParams->OperatingMode   ) ||
4102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.pBandDefinition   !=  pParams->pBandDefinition ) ||
4112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.SampleRate        !=  pParams->SampleRate      ) ||
4122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.SourceFormat      !=  pParams->SourceFormat    ))
4132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        bChange = LVM_TRUE;
4162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
4182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        for(i = 0; i < pParams->NBands; i++)
4202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
4212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if((pInstance->pBandDefinitions[i].Frequency  != pParams->pBandDefinition[i].Frequency )||
4232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                (pInstance->pBandDefinitions[i].Gain       != pParams->pBandDefinition[i].Gain      )||
4242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                (pInstance->pBandDefinitions[i].QFactor    != pParams->pBandDefinition[i].QFactor   ))
4252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
4262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                bChange = LVM_TRUE;
4282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
4292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
4302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(bChange){
4342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
4362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * If the sample rate has changed clear the history
4372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
4382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (pInstance->Params.SampleRate != pParams->SampleRate)
4392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
4402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVEQNB_ClearFilterHistory(pInstance);           /* Clear the history */
4412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
4422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
4442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Update the instance parameters
4452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
4462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params = *pParams;
4472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
4502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Reset the filters except if the algo is switched off
4512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
4522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(pParams->OperatingMode != LVEQNB_BYPASS){
4532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
4542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Reset the filters as all parameters could have changed
4552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
4562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVEQNB_SetFilters(pInstance,                        /* Instance pointer */
4572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              pParams);                         /* New parameters */
4582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
4602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Update the filters
4612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
4622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVEQNB_SetCoefficients(pInstance);                  /* Instance pointer */
4632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
4642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(pParams->OperatingMode != OperatingModeSave)
4662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
4672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pParams->OperatingMode == LVEQNB_ON)
4682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
469d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifdef BUILD_FLOAT
470d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[0], 1.0f);
471d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[1], 0.0f);
472d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else
4732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[0],LVM_MAXINT_16);
4742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[1],0);
475d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif
4762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pInstance->BypassMixer.MixerStream[0].CallbackSet        = 1;
4772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pInstance->BypassMixer.MixerStream[1].CallbackSet        = 1;
4782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
4792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            else
4802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
4812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /* Stay on the ON operating mode until the transition is done */
4822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pInstance->Params.OperatingMode = LVEQNB_ON;
483d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifdef BUILD_FLOAT
484d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[0], 0.0f);
485d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri                LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[1], 1.0f);
486d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else
4872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[0],0);
4882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[1],LVM_MAXINT_16);
489d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif
4902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pInstance->BypassMixer.MixerStream[0].CallbackSet        = 1;
4912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pInstance->BypassMixer.MixerStream[1].CallbackSet        = 1;
4922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
4932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMixer.MixerStream[0],LVEQNB_BYPASS_MIXER_TC,(LVM_Fs_en)pParams->SampleRate,2);
4942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMixer.MixerStream[1],LVEQNB_BYPASS_MIXER_TC,(LVM_Fs_en)pParams->SampleRate,2);
4952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->bInOperatingModeTransition = LVM_TRUE;
4962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
4972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVEQNB_SUCCESS);
5002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
5012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
5042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVEQNB_BypassMixerCallBack                                  */
5062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
5082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  CallBack function of the mixer                                                      */
5092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  transition                                                                          */
5102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
5112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
5122c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_INT32 LVEQNB_BypassMixerCallBack (void* hInstance,
5132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      void *pGeneralPurpose,
5142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      LVM_INT16 CallbackParam)
5152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
5162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVEQNB_Instance_t      *pInstance =(LVEQNB_Instance_t  *)hInstance;
5172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Callback            CallBack  = pInstance->Capabilities.CallBack;
5182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    (void) pGeneralPurpose;
5202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     /*
5222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent      * Send an ALGOFF event if the ON->OFF switch transition is finished
5232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent      */
524d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifdef BUILD_FLOAT
525d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri    if((LVC_Mixer_GetTarget(&pInstance->BypassMixer.MixerStream[0]) == 0) &&
526d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri       (CallbackParam == 0)){
527d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else
5282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((LVC_Mixer_GetTarget(&pInstance->BypassMixer.MixerStream[0]) == 0x00000000) &&
5292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       (CallbackParam == 0)){
530d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif
5312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params.OperatingMode = LVEQNB_BYPASS;
5322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (CallBack != LVM_NULL){
5332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            CallBack(pInstance->Capabilities.pBundleInstance, LVM_NULL, ALGORITHM_EQNB_ID|LVEQNB_EVENT_ALGOFF);
5342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
5352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
5362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     *  Exit transition state
5392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->bInOperatingModeTransition = LVM_FALSE;
5412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 1;
5432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
544