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{ 1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent extern const LVM_UINT16 LVEQNB_SampleRateTab[]; /* Sample rate table */ 1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 i; /* Filter band index */ 1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT32 fs = (LVM_UINT32)LVEQNB_SampleRateTab[(LVM_UINT16)pParams->SampleRate]; /* Sample rate */ 1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT32 fc; /* Filter centre frequency */ 1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 QFactor; /* Filter Q factor */ 1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->NBands = pParams->NBands; 1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for (i=0; i<pParams->NBands; i++) 1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Get the filter settings 1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent fc = (LVM_UINT32)pParams->pBandDefinition[i].Frequency; /* Get the band centre frequency */ 1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent QFactor = (LVM_INT16)pParams->pBandDefinition[i].QFactor; /* Get the band Q factor */ 1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * For each filter set the type of biquad required 1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pBiquadType[i] = LVEQNB_SinglePrecision; /* Default to single precision */ 1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((fc << 15) <= (LOW_FREQ * fs)) 1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * fc <= fs/110 1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pBiquadType[i] = LVEQNB_DoublePrecision; 1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else if (((fc << 15) <= (HIGH_FREQ * fs)) && (QFactor > 300)) 1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * (fs/110 < fc < fs/85) & (Q>3) 1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pBiquadType[i] = LVEQNB_DoublePrecision; 1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Check for out of range frequencies 1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (fc > (fs >> 1)) 1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pBiquadType[i] = LVEQNB_OutOfRange; 1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copy the filter definition to persistant memory 1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pBandDefinitions[i] = pParams->pBandDefinition[i]; 1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVEQNB_SetCoefficients */ 2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Sets the filter coefficients. This uses the type to select single or double */ 2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* precision coefficients. */ 2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pInstance Pointer to the instance */ 2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pParams Initialisation parameters */ 2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVEQNB_SetCoefficients(LVEQNB_Instance_t *pInstance) 2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 i; /* Filter band index */ 2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVEQNB_BiquadType_en BiquadType; /* Filter biquad type */ 2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the coefficients for each band by the init function 2232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for (i=0; i<pInstance->Params.NBands; i++) 2252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Check band type for correct initialisation method and recalculate the coefficients 2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent BiquadType = pInstance->pBiquadType[i]; 2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent switch (BiquadType) 2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent case LVEQNB_DoublePrecision: 2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent PK_C32_Coefs_t Coefficients; 2362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Calculate the double precision coefficients 2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVEQNB_DoublePrecCoefs((LVM_UINT16)pInstance->Params.SampleRate, 2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &pInstance->pBandDefinitions[i], 2422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &Coefficients); 2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the coefficients 2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent PK_2I_D32F32CllGss_TRC_WRA_01_Init(&pInstance->pEQNB_FilterState[i], 2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &pInstance->pEQNB_Taps[i], 2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &Coefficients); 2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent break; 2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent case LVEQNB_SinglePrecision: 2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent PK_C16_Coefs_t Coefficients; 2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Calculate the single precision coefficients 2592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVEQNB_SinglePrecCoefs((LVM_UINT16)pInstance->Params.SampleRate, 2612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &pInstance->pBandDefinitions[i], 2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &Coefficients); 2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the coefficients 2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent PK_2I_D32F32CssGss_TRC_WRA_01_Init(&pInstance->pEQNB_FilterState[i], 2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &pInstance->pEQNB_Taps[i], 2692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &Coefficients); 2702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent break; 2712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent default: 2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent break; 2742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 2782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 2812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVEQNB_ClearFilterHistory */ 2832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 2852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Clears the filter data history */ 2862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 2882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pInstance Pointer to the instance */ 2892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 2912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVEQNB_ClearFilterHistory(LVEQNB_Instance_t *pInstance) 2932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 2942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *pTapAddress; 2952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 NumTaps; 2962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pTapAddress = (LVM_INT16 *)pInstance->pEQNB_Taps; 2992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent NumTaps = (LVM_INT16)((pInstance->Capabilities.MaxBands * sizeof(Biquad_2I_Order2_Taps_t))/sizeof(LVM_INT16)); 3002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (NumTaps != 0) 3022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LoadConst_16(0, /* Clear the history, value 0 */ 3042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pTapAddress, /* Destination */ 3052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent NumTaps); /* Number of words */ 3062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 3082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 3112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 3122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVEQNB_Control */ 3132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 3142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 3152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Sets or changes the LifeVibes module parameters. */ 3162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 3172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 3182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance Instance handle */ 3192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pParams Pointer to a parameter structure */ 3202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 3212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 3222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVEQNB_Success Always succeeds */ 3232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVEQNB_NULLADDRESS Instance or pParams is NULL pointer */ 3242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVEQNB_NULLADDRESS NULL address for the equaliser filter definitions and the */ 3252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* number of bands is non-zero */ 3262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 3272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 3282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 1. This function may be interrupted by the LVEQNB_Process function */ 3292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 3302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 3312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3322c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVEQNB_ReturnStatus_en LVEQNB_Control(LVEQNB_Handle_t hInstance, 3332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVEQNB_Params_t *pParams) 3342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 3352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVEQNB_Instance_t *pInstance = (LVEQNB_Instance_t *)hInstance; 3372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 bChange = LVM_FALSE; 3382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 i = 0; 3392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVEQNB_Mode_en OperatingModeSave ; 3402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 3422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Check for error conditions 3432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 3442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((hInstance == LVM_NULL) || (pParams == LVM_NULL)) 3452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return LVEQNB_NULLADDRESS; 3472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((pParams->NBands !=0) && (pParams->pBandDefinition==LVM_NULL)) 3502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return LVEQNB_NULLADDRESS; 3522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent OperatingModeSave = pInstance->Params.OperatingMode; 3552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Set the alpha factor of the mixer */ 3572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pParams->SampleRate != pInstance->Params.SampleRate) 3582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMixer.MixerStream[0],LVEQNB_BYPASS_MIXER_TC,(LVM_Fs_en)pParams->SampleRate,2); 3602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMixer.MixerStream[1],LVEQNB_BYPASS_MIXER_TC,(LVM_Fs_en)pParams->SampleRate,2); 3612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if( (pInstance->Params.NBands != pParams->NBands ) || 3652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Params.OperatingMode != pParams->OperatingMode ) || 3662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Params.pBandDefinition != pParams->pBandDefinition ) || 3672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Params.SampleRate != pParams->SampleRate ) || 3682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Params.SourceFormat != pParams->SourceFormat )) 3692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent bChange = LVM_TRUE; 3722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 3742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for(i = 0; i < pParams->NBands; i++) 3762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((pInstance->pBandDefinitions[i].Frequency != pParams->pBandDefinition[i].Frequency )|| 3792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->pBandDefinitions[i].Gain != pParams->pBandDefinition[i].Gain )|| 3802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->pBandDefinitions[i].QFactor != pParams->pBandDefinition[i].QFactor )) 3812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent bChange = LVM_TRUE; 3842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(bChange){ 3902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 3922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * If the sample rate has changed clear the history 3932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 3942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pInstance->Params.SampleRate != pParams->SampleRate) 3952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVEQNB_ClearFilterHistory(pInstance); /* Clear the history */ 3972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 4002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Update the instance parameters 4012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 4022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Params = *pParams; 4032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 4062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Reset the filters except if the algo is switched off 4072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 4082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pParams->OperatingMode != LVEQNB_BYPASS){ 4092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 4102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Reset the filters as all parameters could have changed 4112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 4122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVEQNB_SetFilters(pInstance, /* Instance pointer */ 4132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pParams); /* New parameters */ 4142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 4162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Update the filters 4172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 4182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVEQNB_SetCoefficients(pInstance); /* Instance pointer */ 4192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pParams->OperatingMode != OperatingModeSave) 4222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 4232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pParams->OperatingMode == LVEQNB_ON) 4242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 4252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[0],LVM_MAXINT_16); 4262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[1],0); 4272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->BypassMixer.MixerStream[0].CallbackSet = 1; 4292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->BypassMixer.MixerStream[1].CallbackSet = 1; 4302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 4322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 4332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Stay on the ON operating mode until the transition is done */ 4342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Params.OperatingMode = LVEQNB_ON; 4352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[0],0); 4372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pInstance->BypassMixer.MixerStream[1],LVM_MAXINT_16); 4382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->BypassMixer.MixerStream[0].CallbackSet = 1; 4392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->BypassMixer.MixerStream[1].CallbackSet = 1; 4402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMixer.MixerStream[0],LVEQNB_BYPASS_MIXER_TC,(LVM_Fs_en)pParams->SampleRate,2); 4422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->BypassMixer.MixerStream[1],LVEQNB_BYPASS_MIXER_TC,(LVM_Fs_en)pParams->SampleRate,2); 4432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->bInOperatingModeTransition = LVM_TRUE; 4452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVEQNB_SUCCESS); 4492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 4502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 4532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 4542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVEQNB_BypassMixerCallBack */ 4552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 4562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 4572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* CallBack function of the mixer */ 4582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* transition */ 4592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 4602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 4612c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_INT32 LVEQNB_BypassMixerCallBack (void* hInstance, 4622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent void *pGeneralPurpose, 4632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 CallbackParam) 4642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 4652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVEQNB_Instance_t *pInstance =(LVEQNB_Instance_t *)hInstance; 4662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_Callback CallBack = pInstance->Capabilities.CallBack; 4672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (void) pGeneralPurpose; 4692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 4712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Send an ALGOFF event if the ON->OFF switch transition is finished 4722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 4732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((LVC_Mixer_GetTarget(&pInstance->BypassMixer.MixerStream[0]) == 0x00000000) && 4742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (CallbackParam == 0)){ 4752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Params.OperatingMode = LVEQNB_BYPASS; 4762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (CallBack != LVM_NULL){ 4772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CallBack(pInstance->Capabilities.pBundleInstance, LVM_NULL, ALGORITHM_EQNB_ID|LVEQNB_EVENT_ALGOFF); 4782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 4822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Exit transition state 4832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 4842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->bInOperatingModeTransition = LVM_FALSE; 4852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return 1; 4872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 4882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 494