LVEQNB_Control.c revision 2c8e5cab3faa6d360e222b7a6c40a80083d021ac
12c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*
22c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2004-2010 NXP Software
32c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2010 The Android Open Source Project
42c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
52c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
62c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * you may not use this file except in compliance with the License.
72c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * You may obtain a copy of the License at
82c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
92c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Unless required by applicable law or agreed to in writing, software
122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * See the License for the specific language governing permissions and
152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * limitations under the License.
162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */
172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************
192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     $Author: nxp007753 $
212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     $Revision: 1223 $
222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     $Date: 2010-07-15 14:27:01 +0200 (Thu, 15 Jul 2010) $
232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Includes                                                                            */
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVEQNB.h"
332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVEQNB_Private.h"
342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "VectorArithmetic.h"
352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "BIQUAD.h"
362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Defines                                                                             */
412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define     LOW_FREQ            298             /* 32768/110 for low test frequency */
452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define     HIGH_FREQ           386             /* 32768/85 for high test frequency */
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVEQNB_GetParameters                                       */
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Request the N-Band equaliser parameters. The current parameter set is returned via  */
532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  the parameter pointer.                                                              */
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance                Instance handle                                            */
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams                  Pointer to an empty parameter structure                    */
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVEQNB_SUCCESS          Succeeds                                                    */
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVEQNB_NULLADDRESS      Instance or pParams  is NULL pointer                        */
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function may be interrupted by the LVEQNB_Process function                 */
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
682c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVEQNB_ReturnStatus_en LVEQNB_GetParameters(LVEQNB_Handle_t     hInstance,
692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                            LVEQNB_Params_t     *pParams)
702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVEQNB_Instance_t    *pInstance =(LVEQNB_Instance_t  *)hInstance;
732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent   /*
752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check for error conditions
762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((hInstance == LVM_NULL) || (pParams == LVM_NULL))
782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return LVEQNB_NULLADDRESS;
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pParams = pInstance->Params;
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVEQNB_SUCCESS);
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVEQNB_GetCapabilities                                 */
912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Get the N-Band equaliser capabilities. The current capabilities are returned    */
942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  via the pointer.                                                                */
952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance                Instance handle                                        */
982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pCapabilities            Pointer to an empty capability structure               */
992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVEQNB_Success           Succeeds                                               */
1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVEQNB_NULLADDRESS       hInstance or pCapabilities is NULL                     */
1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function may be interrupted by the LVEQNB_Process function             */
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVEQNB_ReturnStatus_en LVEQNB_GetCapabilities(LVEQNB_Handle_t           hInstance,
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                              LVEQNB_Capabilities_t     *pCapabilities)
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVEQNB_Instance_t    *pInstance =(LVEQNB_Instance_t  *)hInstance;
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((hInstance == LVM_NULL) || (pCapabilities == LVM_NULL))
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return LVEQNB_NULLADDRESS;
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *pCapabilities = pInstance->Capabilities;
1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVEQNB_SUCCESS);
1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVEQNB_SetFilters                                           */
1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Sets the filter type based on the definition.                                   */
1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInstance           Pointer to the instance                                     */
1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams             Initialisation parameters                                   */
1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                         */
1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  void                Nothing                                                     */
1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                           */
1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1. To select the biquad type the follow rules are applied:                      */
1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          Double precision    if (fc <= fs/110)                                   */
1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          Double precision    if (fs/110 < fc < fs/85) & (Q>3)                    */
1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*          Single precision    otherwise                                           */
1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid    LVEQNB_SetFilters(LVEQNB_Instance_t     *pInstance,
1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                          LVEQNB_Params_t       *pParams)
1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    extern const LVM_UINT16   LVEQNB_SampleRateTab[];           /* Sample rate table */
1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16          i;                                      /* Filter band index */
1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT32          fs = (LVM_UINT32)LVEQNB_SampleRateTab[(LVM_UINT16)pParams->SampleRate];  /* Sample rate */
1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT32          fc;                                     /* Filter centre frequency */
1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           QFactor;                                /* Filter Q factor */
1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->NBands = pParams->NBands;
1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (i=0; i<pParams->NBands; i++)
1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Get the filter settings
1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        fc = (LVM_UINT32)pParams->pBandDefinition[i].Frequency;     /* Get the band centre frequency */
1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        QFactor = (LVM_INT16)pParams->pBandDefinition[i].QFactor;   /* Get the band Q factor */
1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * For each filter set the type of biquad required
1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pBiquadType[i] = LVEQNB_SinglePrecision;         /* Default to single precision */
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        }
1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
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        {
2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            case    LVEQNB_DoublePrecision:
2422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                PK_C32_Coefs_t      Coefficients;
2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /*
2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 * Calculate the double precision coefficients
2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 */
2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVEQNB_DoublePrecCoefs((LVM_UINT16)pInstance->Params.SampleRate,
2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       &pInstance->pBandDefinitions[i],
2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       &Coefficients);
2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /*
2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 * Set the coefficients
2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 */
2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                PK_2I_D32F32CllGss_TRC_WRA_01_Init(&pInstance->pEQNB_FilterState[i],
2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                   &pInstance->pEQNB_Taps[i],
2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                   &Coefficients);
2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                break;
2592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            case    LVEQNB_SinglePrecision:
2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                PK_C16_Coefs_t      Coefficients;
2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /*
2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 * Calculate the single precision coefficients
2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 */
2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVEQNB_SinglePrecCoefs((LVM_UINT16)pInstance->Params.SampleRate,
2692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       &pInstance->pBandDefinitions[i],
2702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       &Coefficients);
2712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /*
2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 * Set the coefficients
2742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 */
2752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                PK_2I_D32F32CssGss_TRC_WRA_01_Init(&pInstance->pEQNB_FilterState[i],
2762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                   &pInstance->pEQNB_Taps[i],
2772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                   &Coefficients);
2782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                break;
2792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
2802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            default:
2812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                break;
2822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
2862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
2892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
2902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:            LVEQNB_ClearFilterHistory                                   */
2912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
2922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                     */
2932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Clears the filter data history                                                  */
2942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
2952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                      */
2962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInstance           Pointer to the instance                                     */
2972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                  */
2982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/
2992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid    LVEQNB_ClearFilterHistory(LVEQNB_Instance_t     *pInstance)
3012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
3022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16       *pTapAddress;
3032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16       NumTaps;
3042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pTapAddress = (LVM_INT16 *)pInstance->pEQNB_Taps;
3072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    NumTaps     = (LVM_INT16)((pInstance->Capabilities.MaxBands * sizeof(Biquad_2I_Order2_Taps_t))/sizeof(LVM_INT16));
3082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (NumTaps != 0)
3102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LoadConst_16(0,                                 /* Clear the history, value 0 */
3122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                     pTapAddress,                       /* Destination */
3132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                     NumTaps);                          /* Number of words */
3142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
3162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
3192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
3202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVEQNB_Control                                              */
3212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
3222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
3232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Sets or changes the LifeVibes module parameters.                                    */
3242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
3252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
3262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance               Instance handle                                             */
3272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pParams                 Pointer to a parameter structure                            */
3282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
3292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
3302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVEQNB_Success          Always succeeds                                             */
3312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVEQNB_NULLADDRESS      Instance or pParams  is NULL pointer                        */
3322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVEQNB_NULLADDRESS      NULL address for the equaliser filter definitions and the   */
3332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                          number of bands is non-zero                                 */
3342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
3352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
3362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function may be interrupted by the LVEQNB_Process function                 */
3372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
3382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
3392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3402c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVEQNB_ReturnStatus_en LVEQNB_Control(LVEQNB_Handle_t        hInstance,
3412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      LVEQNB_Params_t        *pParams)
3422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
3432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVEQNB_Instance_t    *pInstance = (LVEQNB_Instance_t  *)hInstance;
3452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16            bChange    = LVM_FALSE;
3462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16            i = 0;
3472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVEQNB_Mode_en       OperatingModeSave ;
3482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
3502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check for error conditions
3512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
3522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((hInstance == LVM_NULL) || (pParams == LVM_NULL))
3532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return LVEQNB_NULLADDRESS;
3552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((pParams->NBands !=0) && (pParams->pBandDefinition==LVM_NULL))
3582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return LVEQNB_NULLADDRESS;
3602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    OperatingModeSave = pInstance->Params.OperatingMode;
3632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Set the alpha factor of the mixer */
3652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pParams->SampleRate != pInstance->Params.SampleRate)
3662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMixer.MixerStream[0],LVEQNB_BYPASS_MIXER_TC,(LVM_Fs_en)pParams->SampleRate,2);
3682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMixer.MixerStream[1],LVEQNB_BYPASS_MIXER_TC,(LVM_Fs_en)pParams->SampleRate,2);
3692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if( (pInstance->Params.NBands            !=  pParams->NBands          ) ||
3732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.OperatingMode     !=  pParams->OperatingMode   ) ||
3742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.pBandDefinition   !=  pParams->pBandDefinition ) ||
3752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.SampleRate        !=  pParams->SampleRate      ) ||
3762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        (pInstance->Params.SourceFormat      !=  pParams->SourceFormat    ))
3772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        bChange = LVM_TRUE;
3802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
3822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        for(i = 0; i < pParams->NBands; i++)
3842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
3852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if((pInstance->pBandDefinitions[i].Frequency  != pParams->pBandDefinition[i].Frequency )||
3872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                (pInstance->pBandDefinitions[i].Gain       != pParams->pBandDefinition[i].Gain      )||
3882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                (pInstance->pBandDefinitions[i].QFactor    != pParams->pBandDefinition[i].QFactor   ))
3892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
3902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                bChange = LVM_TRUE;
3922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
3932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
3942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(bChange){
3982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
4002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * If the sample rate has changed clear the history
4012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
4022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (pInstance->Params.SampleRate != pParams->SampleRate)
4032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
4042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVEQNB_ClearFilterHistory(pInstance);           /* Clear the history */
4052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
4062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
4082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Update the instance parameters
4092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
4102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params = *pParams;
4112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
4142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Reset the filters except if the algo is switched off
4152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
4162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(pParams->OperatingMode != LVEQNB_BYPASS){
4172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
4182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Reset the filters as all parameters could have changed
4192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
4202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVEQNB_SetFilters(pInstance,                        /* Instance pointer */
4212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              pParams);                         /* New parameters */
4222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
4242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Update the filters
4252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
4262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVEQNB_SetCoefficients(pInstance);                  /* Instance pointer */
4272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
4282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(pParams->OperatingMode != OperatingModeSave)
4302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
4312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if(pParams->OperatingMode == LVEQNB_ON)
4322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
4332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[0],LVM_MAXINT_16);
4342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[1],0);
4352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pInstance->BypassMixer.MixerStream[0].CallbackSet        = 1;
4372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pInstance->BypassMixer.MixerStream[1].CallbackSet        = 1;
4382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
4392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            else
4402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
4412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /* Stay on the ON operating mode until the transition is done */
4422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pInstance->Params.OperatingMode = LVEQNB_ON;
4432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[0],0);
4452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[1],LVM_MAXINT_16);
4462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pInstance->BypassMixer.MixerStream[0].CallbackSet        = 1;
4472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pInstance->BypassMixer.MixerStream[1].CallbackSet        = 1;
4482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
4492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMixer.MixerStream[0],LVEQNB_BYPASS_MIXER_TC,(LVM_Fs_en)pParams->SampleRate,2);
4502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMixer.MixerStream[1],LVEQNB_BYPASS_MIXER_TC,(LVM_Fs_en)pParams->SampleRate,2);
4512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->bInOperatingModeTransition = LVM_TRUE;
4532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
4542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVEQNB_SUCCESS);
4572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
4582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
4612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVEQNB_BypassMixerCallBack                                  */
4632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
4652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  CallBack function of the mixer                                                      */
4662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  transition                                                                          */
4672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
4692c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_INT32 LVEQNB_BypassMixerCallBack (void* hInstance,
4702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      void *pGeneralPurpose,
4712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      LVM_INT16 CallbackParam)
4722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
4732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVEQNB_Instance_t      *pInstance =(LVEQNB_Instance_t  *)hInstance;
4742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Callback            CallBack  = pInstance->Capabilities.CallBack;
4752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    (void) pGeneralPurpose;
4772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     /*
4792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent      * Send an ALGOFF event if the ON->OFF switch transition is finished
4802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent      */
4812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if((LVC_Mixer_GetTarget(&pInstance->BypassMixer.MixerStream[0]) == 0x00000000) &&
4822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       (CallbackParam == 0)){
4832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params.OperatingMode = LVEQNB_BYPASS;
4842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (CallBack != LVM_NULL){
4852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            CallBack(pInstance->Capabilities.pBundleInstance, LVM_NULL, ALGORITHM_EQNB_ID|LVEQNB_EVENT_ALGOFF);
4862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
4872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
4902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     *  Exit transition state
4912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
4922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->bInOperatingModeTransition = LVM_FALSE;
4932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return 1;
4952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
4962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
502