1c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* 2c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Copyright (C) 2004-2010 NXP Software 3c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Copyright (C) 2010 The Android Open Source Project 4c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * 5c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 6c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * you may not use this file except in compliance with the License. 7c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * You may obtain a copy of the License at 8c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * 9c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * http://www.apache.org/licenses/LICENSE-2.0 10c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * 11c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Unless required by applicable law or agreed to in writing, software 12c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 13c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * See the License for the specific language governing permissions and 15c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * limitations under the License. 16c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 17c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 18c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/ 19c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 20c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* Includes */ 21c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 22c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/ 23c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include "LVREV_Private.h" 24c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include "Filter.h" 25c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 26c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/ 27c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 28c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* FUNCTION: LVREV_ApplyNewSettings */ 29c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 30c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* DESCRIPTION: */ 31c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* Applies the new control parameters */ 32c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 33c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* PARAMETERS: */ 34c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* pPrivate Pointer to the instance private parameters */ 35c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 36c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* RETURNS: */ 37c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* LVREV_Success Succeeded */ 38c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* LVREV_NULLADDRESS When pPrivate is NULL */ 39c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 40c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* NOTES: */ 41c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 42c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/ 43c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 44d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifndef BUILD_FLOAT 45c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric LaurentLVREV_ReturnStatus_en LVREV_ApplyNewSettings (LVREV_Instance_st *pPrivate) 46c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent{ 47c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 48c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_Mode_en OperatingMode; 49c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 NumberOfDelayLines; 50c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 51c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 52c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Check for NULL pointer */ 53c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate == LVM_NULL) 54c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 55c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent return LVREV_NULLADDRESS; 56c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 57c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 58c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent OperatingMode = pPrivate->NewParams.OperatingMode; 59c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 60c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->InstanceParams.NumDelays == LVREV_DELAYLINES_4) 61c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 62c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent NumberOfDelayLines = 4; 63c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 64c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else if(pPrivate->InstanceParams.NumDelays == LVREV_DELAYLINES_2) 65c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 66c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent NumberOfDelayLines = 2; 67c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 68c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 69c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 70c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent NumberOfDelayLines = 1; 71c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 72c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 73c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 74c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the high pass filter coefficients 75c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 76c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if((pPrivate->NewParams.HPF != pPrivate->CurrentParams.HPF) || 77c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 78c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->bFirstControl == LVM_TRUE)) 79c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 80c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Omega; 81c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent FO_C32_Coefs_t Coeffs; 82c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 83c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Omega = LVM_GetOmega(pPrivate->NewParams.HPF, pPrivate->NewParams.SampleRate); 84c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_FO_HPF(Omega, &Coeffs); 85c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent FO_1I_D32F32Cll_TRC_WRA_01_Init( &pPrivate->pFastCoef->HPCoefs, &pPrivate->pFastData->HPTaps, &Coeffs); 86c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LoadConst_32(0, 87c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (void *)&pPrivate->pFastData->HPTaps, /* Destination Cast to void: no dereferencing in function*/ 88c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent sizeof(Biquad_1I_Order1_Taps_t)/sizeof(LVM_INT32)); 89c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 90c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 91c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 92c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 93c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the low pass filter coefficients 94c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 95c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if((pPrivate->NewParams.LPF != pPrivate->CurrentParams.LPF) || 96c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 97c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->bFirstControl == LVM_TRUE)) 98c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 99c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Omega; 100c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent FO_C32_Coefs_t Coeffs; 101c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 102c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 103c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coeffs.A0 = 0x7FFFFFFF; 104c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coeffs.A1 = 0; 105c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coeffs.B1 = 0; 106c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->NewParams.LPF <= (LVM_FsTable[pPrivate->NewParams.SampleRate] >> 1)) 107c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 108c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Omega = LVM_GetOmega(pPrivate->NewParams.LPF, pPrivate->NewParams.SampleRate); 109c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 110c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 111c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Do not apply filter if w =2*pi*fc/fs >= 2.9 112c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 113c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(Omega<=LVREV_2_9_INQ29) 114c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 115c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_FO_LPF(Omega, &Coeffs); 116c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 117c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 118c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent FO_1I_D32F32Cll_TRC_WRA_01_Init( &pPrivate->pFastCoef->LPCoefs, &pPrivate->pFastData->LPTaps, &Coeffs); 119c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LoadConst_32(0, 120c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (void *)&pPrivate->pFastData->LPTaps, /* Destination Cast to void: no dereferencing in function*/ 121c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent sizeof(Biquad_1I_Order1_Taps_t)/sizeof(LVM_INT32)); 122c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 123c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 124c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 125c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 126c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Calculate the room size parameter 127c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 128c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if( pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) 129c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 130c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Room size range is 10ms to 200ms 131c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * 0% -- 10ms 132c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * 50% -- 65ms 133c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * 100% -- 120ms 134c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 135c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->RoomSizeInms = 10 + (((pPrivate->NewParams.RoomSize*11) + 5)/10); 136c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 137c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 138c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 139c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 140c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the T delay number of samples and the all pass delay number of samples 141c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 142c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if( (pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) || 143c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 144c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->bFirstControl == LVM_TRUE)) 145c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 146c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 147c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_UINT32 Temp; 148c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 APDelaySize; 149c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Fs = LVM_GetFsFromTable(pPrivate->NewParams.SampleRate); 150c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_UINT32 DelayLengthSamples = (LVM_UINT32)(Fs * pPrivate->RoomSizeInms); 151c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 i; 152c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 ScaleTable[] = {LVREV_T_3_Power_minus0_on_4, LVREV_T_3_Power_minus1_on_4, LVREV_T_3_Power_minus2_on_4, LVREV_T_3_Power_minus3_on_4}; 153c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 MaxT_Delay[] = {LVREV_MAX_T0_DELAY, LVREV_MAX_T1_DELAY, LVREV_MAX_T2_DELAY, LVREV_MAX_T3_DELAY}; 154c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 MaxAP_Delay[] = {LVREV_MAX_AP0_DELAY, LVREV_MAX_AP1_DELAY, LVREV_MAX_AP2_DELAY, LVREV_MAX_AP3_DELAY}; 155c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 156c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 157c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 158c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * For each delay line 159c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 160c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for (i=0; i<NumberOfDelayLines; i++) 161c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 162c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (i != 0) 163c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 164c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Temp1; /* to avoid QAC warning on type conversion */ 165c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Temp2; /* to avoid QAC warning on type conversion */ 166c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 167c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp2=(LVM_INT32)DelayLengthSamples; 168c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent MUL32x16INTO32(Temp2, ScaleTable[i], Temp1, 15) 169c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp=(LVM_UINT32)Temp1; 170c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 171c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 172c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 173c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp = DelayLengthSamples; 174c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 175c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent APDelaySize = Temp / 1500; 176c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 177c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 178c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 179c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Set the fixed delay 180c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 181c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp = (MaxT_Delay[i] - MaxAP_Delay[i]) * Fs / 48000; 182c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Delay_AP[i] = pPrivate->T[i] - Temp; 183c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 184c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 185c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 186c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Set the tap selection 187c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 188c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (pPrivate->AB_Selection) 189c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 190c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Smooth from tap A to tap B */ 191c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->pOffsetB[i] = &pPrivate->pDelay_T[i][pPrivate->T[i] - Temp - APDelaySize]; 192c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->B_DelaySize[i] = APDelaySize; 193c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_APTaps[i].Target1 = 0; 194c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_APTaps[i].Target2 = 0x7fffffff; 195c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 196c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 197c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 198c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Smooth from tap B to tap A */ 199c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->pOffsetA[i] = &pPrivate->pDelay_T[i][pPrivate->T[i] - Temp - APDelaySize]; 200c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->A_DelaySize[i] = APDelaySize; 201c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_APTaps[i].Target2 = 0; 202c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_APTaps[i].Target1 = 0x7fffffff; 203c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 204c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 205c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 206c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Set the maximum block size to the smallest delay size 207c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 208c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->MaxBlkLen = Temp; 209c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (pPrivate->MaxBlkLen > pPrivate->A_DelaySize[i]) 210c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 211c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->MaxBlkLen = pPrivate->A_DelaySize[i]; 212c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 213c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (pPrivate->MaxBlkLen > pPrivate->B_DelaySize[i]) 214c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 215c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->MaxBlkLen = pPrivate->B_DelaySize[i]; 216c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 217c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 218c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (pPrivate->AB_Selection) 219c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 220c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->AB_Selection = 0; 221c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 222c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 223c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 224c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->AB_Selection = 1; 225c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 226c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 227c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 228c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 229c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Limit the maximum block length 230c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 231c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->MaxBlkLen=pPrivate->MaxBlkLen-2; /* Just as a precausion, but no problem if we remove this line */ 232c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->MaxBlkLen > pPrivate->InstanceParams.MaxBlockSize) 233c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 234c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->MaxBlkLen = (LVM_INT32)pPrivate->InstanceParams.MaxBlockSize; 235c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 236c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 237c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 238c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 239c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 240c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the low pass filter coefficient 241c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 242c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if( (pPrivate->NewParams.Damping != pPrivate->CurrentParams.Damping) || 243c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 244c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->bFirstControl == LVM_TRUE)) 245c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 246c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 247c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Temp; 248c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Omega; 249c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent FO_C32_Coefs_t Coeffs; 250c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 i; 251c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 Damping = (LVM_INT16)((pPrivate->NewParams.Damping * 100) + 1000); 252c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 ScaleTable[] = {LVREV_T_3_Power_0_on_4, LVREV_T_3_Power_1_on_4, LVREV_T_3_Power_2_on_4, LVREV_T_3_Power_3_on_4}; 253c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 254c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 255c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 256c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * For each filter 257c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 258c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for (i=0; i<NumberOfDelayLines; i++) 259c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 260c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (i != 0) 261c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 262c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent MUL32x16INTO32(ScaleTable[i], Damping, Temp, 15) 263c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 264c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 265c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 266c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp = Damping; 267c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 268c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(Temp <= (LVM_FsTable[pPrivate->NewParams.SampleRate] >> 1)) 269c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 270c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Omega = LVM_GetOmega((LVM_UINT16)Temp, pPrivate->NewParams.SampleRate); 271c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_FO_LPF(Omega, &Coeffs); 272c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 273c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 274c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 275c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coeffs.A0 = 0x7FF00000; 276c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coeffs.A1 = 0; 277c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coeffs.B1 = 0; 278c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 279c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent FO_1I_D32F32Cll_TRC_WRA_01_Init(&pPrivate->pFastCoef->RevLPCoefs[i], &pPrivate->pFastData->RevLPTaps[i], &Coeffs); 280c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 281c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 282c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 283c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 284c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 285c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update All-pass filter mixer time constants 286c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 287c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if( (pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) || 288c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 289c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.Density != pPrivate->CurrentParams.Density)) 290c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 291c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 i; 292c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Alpha = (LVM_INT32)LVM_Mixer_TimeConstant(LVREV_ALLPASS_TC, LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), 1); 293c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 AlphaTap = (LVM_INT32)LVM_Mixer_TimeConstant(LVREV_ALLPASS_TAP_TC, LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), 1); 294c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 295c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for (i=0; i<4; i++) 296c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 297c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_APTaps[i].Alpha1 = AlphaTap; 298c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_APTaps[i].Alpha2 = AlphaTap; 299c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_SGFeedback[i].Alpha = Alpha; 300c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_SGFeedforward[i].Alpha = Alpha; 301c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 302c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 303c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 304c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 305c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 306c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the feed back gain 307c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 308c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if( (pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) || 309c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 310c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.T60 != pPrivate->CurrentParams.T60) || 311c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->bFirstControl == LVM_TRUE)) 312c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 313c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 314c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 G[4]; /* Feedback gain (Q7.24) */ 315c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 316c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->NewParams.T60 == 0) 317c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 318c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent G[3] = 0; 319c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent G[2] = 0; 320c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent G[1] = 0; 321c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent G[0] = 0; 322c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 323c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 324c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 325c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Temp1; 326c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Temp2; 327c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 i; 328c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 ScaleTable[] = {LVREV_T_3_Power_minus0_on_4, LVREV_T_3_Power_minus1_on_4, LVREV_T_3_Power_minus2_on_4, LVREV_T_3_Power_minus3_on_4}; 329c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 330c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 331c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 332c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * For each delay line 333c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 334c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for (i=0; i<NumberOfDelayLines; i++) 335c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 336c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp1 = (3 * pPrivate->RoomSizeInms * ScaleTable[i]) / pPrivate->NewParams.T60; 337c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(Temp1 >= (4 << 15)) 338c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 339c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent G[i] = 0; 340c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 341c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else if((Temp1 >= (2 << 15))) 342c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 343c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp2 = LVM_Power10(-(Temp1 << 14)); 344c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp1 = LVM_Power10(-(Temp1 << 14)); 345c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent MUL32x32INTO32(Temp1,Temp2,Temp1,24) 346c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 347c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 348c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 349c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp1 = LVM_Power10(-(Temp1 << 15)); 350c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 351c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (NumberOfDelayLines == 1) 352c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 353c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent G[i] = Temp1; 354c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 355c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 356c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 357c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 TempG; 358c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent MUL32x16INTO32(Temp1,ONE_OVER_SQRT_TWO,TempG,15) 359c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent G[i]=TempG; 360c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 361c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 362c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 363c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 364c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Set up the feedback mixers for four delay lines */ 365c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[0].Target=G[0]<<7; 366c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[1].Target=G[1]<<7; 367c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[2].Target=G[2]<<7; 368c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[3].Target=G[3]<<7; 369c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 370c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 371c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 372c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 373c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Calculate the gain correction 374c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 375c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if((pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) || 376c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.Level != pPrivate->CurrentParams.Level) || 377c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.T60 != pPrivate->CurrentParams.T60) ) 378c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 379c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Index=0; 380c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 i=0; 381c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Gain=0; 382c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 RoomSize=0; 383c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 T60; 384c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Coefs[5]; 385c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 386c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->NewParams.RoomSize==0) 387c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 388c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent RoomSize=1; 389c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 390c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 391c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 392c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent RoomSize=(LVM_INT32)pPrivate->NewParams.RoomSize; 393c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 394c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 395c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->NewParams.T60<100) 396c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 397c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent T60 = 100 * LVREV_T60_SCALE; 398c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 399c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 400c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 401c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent T60 = pPrivate->NewParams.T60 * LVREV_T60_SCALE; 402c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 403c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 404c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Find the nearest room size in table */ 405c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for(i=0;i<24;i++) 406c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 407c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(RoomSize<= LVREV_GainPolyTable[i][0]) 408c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 409c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Index=i; 410c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent break; 411c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 412c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 413c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 414c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 415c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(RoomSize==LVREV_GainPolyTable[Index][0]) 416c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 417c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Take table values if the room size is in table */ 418c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for(i=1;i<5;i++) 419c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 420c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coefs[i-1]=LVREV_GainPolyTable[Index][i]; 421c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 422c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coefs[4]=0; 423c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Gain=LVM_Polynomial(3,Coefs,T60); /* Q.24 result */ 424c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 425c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 426c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 427c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Interpolate the gain between nearest room sizes */ 428c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 429c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Gain1,Gain2; 430c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Tot_Dist,Dist; 431c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 432c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Tot_Dist=LVREV_GainPolyTable[Index][0]-LVREV_GainPolyTable[Index-1][0]; 433c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Dist=RoomSize-LVREV_GainPolyTable[Index-1][0]; 434c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 435c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 436c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Get gain for first */ 437c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for(i=1;i<5;i++) 438c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 439c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coefs[i-1]=LVREV_GainPolyTable[Index-1][i]; 440c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 441c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coefs[4]=0; 442c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 443c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Gain1=LVM_Polynomial(3,Coefs,T60); /* Q.24 result */ 444c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 445c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Get gain for second */ 446c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for(i=1;i<5;i++) 447c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 448c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coefs[i-1]=LVREV_GainPolyTable[Index][i]; 449c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 450c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coefs[4]=0; 451c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 452c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Gain2=LVM_Polynomial(3,Coefs,T60); /* Q.24 result */ 453c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 454c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Linear Interpolate the gain */ 455c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Gain = Gain1+ (((Gain2-Gain1)*Dist)/(Tot_Dist)); 456c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 457c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 458c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 459c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 460c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Get the inverse of gain: Q.15 461c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Gain is mostly above one except few cases, take only gains above 1 462c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 463c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(Gain < 16777216L) 464c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 465c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Gain= 32767; 466c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 467c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 468c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 469c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Gain=(LVM_INT16)(LVM_MAXINT_32/(Gain>>8)); 470c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 471c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 472c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 473c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Index=((32767*100)/(100+pPrivate->NewParams.Level)); 474c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Gain=(LVM_INT16)((pPrivate->Gain*Index)>>15); 475c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->GainMixer.Target = pPrivate->Gain*Index; 476c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 477c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 478c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 479c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 480c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the all pass comb filter coefficient 481c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 482c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if( (pPrivate->NewParams.Density != pPrivate->CurrentParams.Density) || 483c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->bFirstControl == LVM_TRUE)) 484c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 485c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 i; 486c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 b = pPrivate->NewParams.Density * LVREV_B_8_on_1000; 487c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 488c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for (i=0;i<4; i++) 489c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 490c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_SGFeedback[i].Target = b; 491c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_SGFeedforward[i].Target = b; 492c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 493c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 494c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 495c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 496c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 497c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the bypass mixer time constant 498c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 499c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if((pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 500c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->bFirstControl == LVM_TRUE)) 501c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 502c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_UINT16 NumChannels = 1; /* Assume MONO format */ 503c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Alpha; 504c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 505c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Alpha = (LVM_INT32)LVM_Mixer_TimeConstant(LVREV_FEEDBACKMIXER_TC, LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), NumChannels); 506c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[0].Alpha=Alpha; 507c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[1].Alpha=Alpha; 508c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[2].Alpha=Alpha; 509c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[3].Alpha=Alpha; 510c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 5115185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent NumChannels = 2; /* Always stereo output */ 512c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Alpha1 = (LVM_INT32)LVM_Mixer_TimeConstant(LVREV_BYPASSMIXER_TC, LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), NumChannels); 513c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Alpha2 = pPrivate->BypassMixer.Alpha1; 514c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->GainMixer.Alpha = pPrivate->BypassMixer.Alpha1; 515c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 516c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 517c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 518c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 519c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the bypass mixer targets 520c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 521c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if( (pPrivate->NewParams.Level != pPrivate->CurrentParams.Level) && 522c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.OperatingMode == LVM_MODE_ON)) 523c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 524c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Target2 = ((LVM_INT32)(pPrivate->NewParams.Level * 32767)/100)<<16; 5252d3bf535004f7310fe04a4b5f46b6747cdb3c93fEric Laurent pPrivate->BypassMixer.Target1 = 0x00000000; 526c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if ((pPrivate->NewParams.Level == 0) && (pPrivate->bFirstControl == LVM_FALSE)) 527c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 528c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.CallbackSet2 = LVM_TRUE; 529c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 530c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (pPrivate->NewParams.Level != 0) 531c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 532c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->bDisableReverb = LVM_FALSE; 533c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 534c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 535c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 536c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->NewParams.OperatingMode != pPrivate->CurrentParams.OperatingMode) 537c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 538c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->NewParams.OperatingMode == LVM_MODE_ON) 539c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 540c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Target2 = ((LVM_INT32)(pPrivate->NewParams.Level * 32767)/100)<<16; 5412d3bf535004f7310fe04a4b5f46b6747cdb3c93fEric Laurent pPrivate->BypassMixer.Target1 = 0x00000000; 542c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 543c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.CallbackSet2 = LVM_FALSE; 544c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent OperatingMode = LVM_MODE_ON; 545c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (pPrivate->NewParams.Level == 0) 546c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 547c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->bDisableReverb = LVM_TRUE; 548c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 549c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 550c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 551c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->bDisableReverb = LVM_FALSE; 552c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 553c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 554c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else if (pPrivate->bFirstControl == LVM_FALSE) 555c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 556c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Target2 = 0x00000000; 5572d3bf535004f7310fe04a4b5f46b6747cdb3c93fEric Laurent pPrivate->BypassMixer.Target1 = 0x00000000; 558c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.CallbackSet2 = LVM_TRUE; 559c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->GainMixer.Target = 0x03FFFFFF; 560c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent OperatingMode = LVM_MODE_ON; 561c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 562c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 563c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 564c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent OperatingMode = LVM_MODE_OFF; 565c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 566c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 567c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 568c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 569c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 570c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * If it is the first call to ApplyNew settings force the current to the target to begin immediate playback of the effect 571c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 572c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->bFirstControl == LVM_TRUE) 573c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 574c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Current1 = pPrivate->BypassMixer.Target1; 575c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Current2 = pPrivate->BypassMixer.Target2; 576c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 577c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 578c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 579c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 580c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Copy the new parameters 581c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 582c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->CurrentParams = pPrivate->NewParams; 583c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->CurrentParams.OperatingMode = OperatingMode; 584c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 585c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 586c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 587c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update flag 588c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 589c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->bFirstControl == LVM_TRUE) 590c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 591c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->bFirstControl = LVM_FALSE; 592c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 593c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 594c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 595c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent return LVREV_SUCCESS; 596c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent} 597d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else /* BUILD_FLOAT*/ 598d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh KaturiLVREV_ReturnStatus_en LVREV_ApplyNewSettings (LVREV_Instance_st *pPrivate) 599d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri{ 600d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 601d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_Mode_en OperatingMode; 602d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT32 NumberOfDelayLines; 603d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 604d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 605d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* Check for NULL pointer */ 606d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(pPrivate == LVM_NULL) 607d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 608d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri return LVREV_NULLADDRESS; 609d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 610d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 611d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri OperatingMode = pPrivate->NewParams.OperatingMode; 612d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 613d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(pPrivate->InstanceParams.NumDelays == LVREV_DELAYLINES_4) 614d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 615d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri NumberOfDelayLines = 4; 616d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 617d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else if(pPrivate->InstanceParams.NumDelays == LVREV_DELAYLINES_2) 618d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 619d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri NumberOfDelayLines = 2; 620d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 621d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 622d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 623d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri NumberOfDelayLines = 1; 624d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 625d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 626d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 627d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Update the high pass filter coefficients 628d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 629d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if((pPrivate->NewParams.HPF != pPrivate->CurrentParams.HPF) || 630d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 631d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->bFirstControl == LVM_TRUE)) 632d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 633d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Omega; 634d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri FO_FLOAT_Coefs_t Coeffs; 635d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 636d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Omega = LVM_GetOmega(pPrivate->NewParams.HPF, pPrivate->NewParams.SampleRate); 637d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FO_HPF(Omega, &Coeffs); 638d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri FO_1I_D32F32Cll_TRC_WRA_01_Init( &pPrivate->pFastCoef->HPCoefs, 639d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri &pPrivate->pFastData->HPTaps, &Coeffs); 640d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LoadConst_Float(0, 641d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (void *)&pPrivate->pFastData->HPTaps, /* Destination Cast to void: \ 642d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri no dereferencing in function*/ 643d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri sizeof(Biquad_1I_Order1_FLOAT_Taps_t) / sizeof(LVM_FLOAT)); 644d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 645d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 646d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 647d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 648d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Update the low pass filter coefficients 649d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 650d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if((pPrivate->NewParams.LPF != pPrivate->CurrentParams.LPF) || 651d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 652d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->bFirstControl == LVM_TRUE)) 653d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 654d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Omega; 655d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri FO_FLOAT_Coefs_t Coeffs; 656d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 657d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Coeffs.A0 = 1; 658d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Coeffs.A1 = 0; 659d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Coeffs.B1 = 0; 660d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(pPrivate->NewParams.LPF <= (LVM_FsTable[pPrivate->NewParams.SampleRate] >> 1)) 661d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 662d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Omega = LVM_GetOmega(pPrivate->NewParams.LPF, pPrivate->NewParams.SampleRate); 663d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 664d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 665d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Do not apply filter if w =2*pi*fc/fs >= 2.9 666d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 667d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(Omega <= (LVM_FLOAT)LVREV_2_9_INQ29) 668d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 669d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FO_LPF(Omega, &Coeffs); 670d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 671d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 672d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri FO_1I_D32F32Cll_TRC_WRA_01_Init( &pPrivate->pFastCoef->LPCoefs, 673d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri &pPrivate->pFastData->LPTaps, &Coeffs); 674d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LoadConst_Float(0, 675d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (void *)&pPrivate->pFastData->LPTaps, /* Destination Cast to void: \ 676d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri no dereferencing in function*/ 677d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri sizeof(Biquad_1I_Order1_FLOAT_Taps_t) / sizeof(LVM_FLOAT)); 678d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 679d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 680d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 681d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 682d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Calculate the room size parameter 683d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 684d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if( pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) 685d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 686d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* Room size range is 10ms to 200ms 687d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * 0% -- 10ms 688d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * 50% -- 65ms 689d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * 100% -- 120ms 690d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 691d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->RoomSizeInms = 10 + (((pPrivate->NewParams.RoomSize*11) + 5) / 10); 692d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 693d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 694d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 695d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 696d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Update the T delay number of samples and the all pass delay number of samples 697d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 698d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if( (pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) || 699d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 700d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->bFirstControl == LVM_TRUE)) 701d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 702d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 703d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_UINT32 Temp; 704d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT32 APDelaySize; 705d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT32 Fs = LVM_GetFsFromTable(pPrivate->NewParams.SampleRate); 706d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_UINT32 DelayLengthSamples = (LVM_UINT32)(Fs * pPrivate->RoomSizeInms); 707d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT16 i; 708d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT ScaleTable[] = {LVREV_T_3_Power_minus0_on_4, LVREV_T_3_Power_minus1_on_4, \ 709d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVREV_T_3_Power_minus2_on_4, LVREV_T_3_Power_minus3_on_4}; 710d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT16 MaxT_Delay[] = {LVREV_MAX_T0_DELAY, LVREV_MAX_T1_DELAY, \ 711d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVREV_MAX_T2_DELAY, LVREV_MAX_T3_DELAY}; 712d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT16 MaxAP_Delay[] = {LVREV_MAX_AP0_DELAY, LVREV_MAX_AP1_DELAY, \ 713d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVREV_MAX_AP2_DELAY, LVREV_MAX_AP3_DELAY}; 714d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 715d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 716d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 717d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * For each delay line 718d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 719d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri for (i = 0; i < NumberOfDelayLines; i++) 720d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 721d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (i != 0) 722d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 723d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Temp1; /* to avoid QAC warning on type conversion */ 724d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 725d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp1=(LVM_FLOAT)DelayLengthSamples; 726d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp = (LVM_UINT32)(Temp1 * ScaleTable[i]); 727d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 728d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 729d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 730d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp = DelayLengthSamples; 731d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 732d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri APDelaySize = Temp / 1500; 733d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 734d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 735d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 736d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Set the fixed delay 737d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 738d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 739d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifdef HIGHER_FS 740d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp = (MaxT_Delay[i] - MaxAP_Delay[i]) * Fs / 192000; 741d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else 742d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp = (MaxT_Delay[i] - MaxAP_Delay[i]) * Fs / 48000; 743d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif 744d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->Delay_AP[i] = pPrivate->T[i] - Temp; 745d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 746d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 747d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 748d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Set the tap selection 749d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 750d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (pPrivate->AB_Selection) 751d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 752d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* Smooth from tap A to tap B */ 753d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->pOffsetB[i] = &pPrivate->pDelay_T[i][pPrivate->T[i] - \ 754d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp - APDelaySize]; 755d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->B_DelaySize[i] = APDelaySize; 756d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->Mixer_APTaps[i].Target1 = 0; 757d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->Mixer_APTaps[i].Target2 = 1.0f; 758d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 759d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 760d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 761d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* Smooth from tap B to tap A */ 762d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->pOffsetA[i] = &pPrivate->pDelay_T[i][pPrivate->T[i] - \ 763d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp - APDelaySize]; 764d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->A_DelaySize[i] = APDelaySize; 765d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->Mixer_APTaps[i].Target2 = 0; 766d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->Mixer_APTaps[i].Target1 = 1.0f; 767d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 768d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 769d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 770d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Set the maximum block size to the smallest delay size 771d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 772d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->MaxBlkLen = Temp; 773d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (pPrivate->MaxBlkLen > pPrivate->A_DelaySize[i]) 774d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 775d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->MaxBlkLen = pPrivate->A_DelaySize[i]; 776d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 777d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (pPrivate->MaxBlkLen > pPrivate->B_DelaySize[i]) 778d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 779d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->MaxBlkLen = pPrivate->B_DelaySize[i]; 780d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 781d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 782d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (pPrivate->AB_Selection) 783d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 784d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->AB_Selection = 0; 785d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 786d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 787d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 788d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->AB_Selection = 1; 789d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 790d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 791d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 792d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 793d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Limit the maximum block length 794d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 795d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* Just as a precausion, but no problem if we remove this line */ 796d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->MaxBlkLen = pPrivate->MaxBlkLen - 2; 797d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(pPrivate->MaxBlkLen > pPrivate->InstanceParams.MaxBlockSize) 798d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 799d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->MaxBlkLen = (LVM_INT32)pPrivate->InstanceParams.MaxBlockSize; 800d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 801d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 802d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 803d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 804d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 805d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 806d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Update the low pass filter coefficient 807d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 808d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if( (pPrivate->NewParams.Damping != pPrivate->CurrentParams.Damping) || 809d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 810d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->bFirstControl == LVM_TRUE)) 811d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 812d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 813d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT32 Temp; 814d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Omega; 815d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri FO_FLOAT_Coefs_t Coeffs; 816d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT16 i; 817d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT16 Damping = (LVM_INT16)((pPrivate->NewParams.Damping * 100) + 1000); 818d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT ScaleTable[] = {LVREV_T_3_Power_0_on_4, LVREV_T_3_Power_1_on_4, 819d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVREV_T_3_Power_2_on_4, LVREV_T_3_Power_3_on_4}; 820d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 821d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 822d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 823d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * For each filter 824d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 825d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri for (i = 0; i < NumberOfDelayLines; i++) 826d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 827d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (i != 0) 828d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 829d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp = (LVM_INT32)(ScaleTable[i] * Damping); 830d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 831d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 832d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 833d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp = Damping; 834d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 835d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(Temp <= (LVM_INT32)(LVM_FsTable[pPrivate->NewParams.SampleRate] >> 1)) 836d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 837d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Omega = LVM_GetOmega(Temp, pPrivate->NewParams.SampleRate); 838d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FO_LPF(Omega, &Coeffs); 839d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 840d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 841d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 842d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Coeffs.A0 = 1; 843d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Coeffs.A1 = 0; 844d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Coeffs.B1 = 0; 845d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 846d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri FO_1I_D32F32Cll_TRC_WRA_01_Init(&pPrivate->pFastCoef->RevLPCoefs[i], 847d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri &pPrivate->pFastData->RevLPTaps[i], &Coeffs); 848d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 849d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 850d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 851d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 852d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 853d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Update All-pass filter mixer time constants 854d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 855d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if( (pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) || 856d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 857d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->NewParams.Density != pPrivate->CurrentParams.Density)) 858d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 859d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT16 i; 860d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Alpha; 861d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT AlphaTap; 862d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 863d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Alpha = LVM_Mixer_TimeConstant(LVREV_ALLPASS_TC, 864d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), 865d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1); 866c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 867d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri AlphaTap = LVM_Mixer_TimeConstant(LVREV_ALLPASS_TAP_TC, 868d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), 869d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1); 870c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 871d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri for (i = 0; i < 4; i++) 872d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 873d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->Mixer_APTaps[i].Alpha1 = AlphaTap; 874d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->Mixer_APTaps[i].Alpha2 = AlphaTap; 875d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->Mixer_SGFeedback[i].Alpha = Alpha; 876d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->Mixer_SGFeedforward[i].Alpha = Alpha; 877d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 878d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 879d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 880d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 881d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 882d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Update the feed back gain 883d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 884d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if( (pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) || 885d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 886d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->NewParams.T60 != pPrivate->CurrentParams.T60) || 887d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->bFirstControl == LVM_TRUE)) 888d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 889d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 890d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT G[4]; /* Feedback gain (Q7.24) */ 891d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 892d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(pPrivate->NewParams.T60 == 0) 893d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 894d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri G[3] = 0; 895d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri G[2] = 0; 896d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri G[1] = 0; 897d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri G[0] = 0; 898d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 899d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 900d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 901d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Temp1; 902d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Temp2; 903d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT16 i; 904d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT ScaleTable[] = {LVREV_T_3_Power_minus0_on_4, LVREV_T_3_Power_minus1_on_4, 905d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVREV_T_3_Power_minus2_on_4, LVREV_T_3_Power_minus3_on_4}; 906d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 907d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 908d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 909d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * For each delay line 910d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 911d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri for (i = 0; i < NumberOfDelayLines; i++) 912d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 913d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp1 = (3 * pPrivate->RoomSizeInms * ScaleTable[i]) / pPrivate->NewParams.T60; 914d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(Temp1 >= (4)) 915d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 916d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri G[i] = 0; 917d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 918d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else if((Temp1 >= (2))) 919d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 920d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp2 = LVM_Power10(-(Temp1 / 2.0f)); 921d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp1 = LVM_Power10(-(Temp1 / 2.0f)); 922d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp1 = Temp1 * Temp2; 923d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 924d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 925d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 926d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Temp1 = LVM_Power10(-(Temp1)); 927d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 928d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (NumberOfDelayLines == 1) 929d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 930d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri G[i] = Temp1; 931d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 932d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 933d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 934d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT TempG; 935d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri TempG = Temp1 * ONE_OVER_SQRT_TWO; 936d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri G[i]=TempG; 937d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 938d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 939d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 940d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 941d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* Set up the feedback mixers for four delay lines */ 942d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->FeedbackMixer[0].Target=G[0]; 943d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->FeedbackMixer[1].Target=G[1]; 944d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->FeedbackMixer[2].Target=G[2]; 945d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->FeedbackMixer[3].Target=G[3]; 946d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 947d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 948d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 949d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 950d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Calculate the gain correction 951d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 952d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if((pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) || 953d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->NewParams.Level != pPrivate->CurrentParams.Level) || 954d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->NewParams.T60 != pPrivate->CurrentParams.T60) ) 955d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 956d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT32 Index=0; 957d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Index_FLOAT; 958d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT32 i=0; 959d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Gain=0; 960d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT32 RoomSize=0; 961d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT T60; 962d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Coefs[5]; 963d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 964d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 965d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(pPrivate->NewParams.RoomSize == 0) 966d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 967d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri RoomSize = 1; 968d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 969d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 970d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 971d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri RoomSize = (LVM_INT32)pPrivate->NewParams.RoomSize; 972d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 973d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 974d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 975d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(pPrivate->NewParams.T60 < 100) 976d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 977d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri T60 = 100 * LVREV_T60_SCALE; 978d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 979d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 980d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 981d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri T60 = pPrivate->NewParams.T60 * LVREV_T60_SCALE; 982d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 983d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 984d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* Find the nearest room size in table */ 985d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri for(i = 0; i < 24; i++) 986d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 987d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(RoomSize <= LVREV_GainPolyTable[i][0]) 988d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 989d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Index = i; 990d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri break; 991d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 992d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 993d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 994d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 995d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(RoomSize == LVREV_GainPolyTable[Index][0]) 996d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 997d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* Take table values if the room size is in table */ 998d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri for(i = 1; i < 5; i++) 999d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1000d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Coefs[i-1] = LVREV_GainPolyTable[Index][i]; 1001d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1002d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Coefs[4] = 0; 1003d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Gain = LVM_Polynomial(3, Coefs, T60); /* Q.24 result */ 1004d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1005d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 1006d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1007d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* Interpolate the gain between nearest room sizes */ 1008d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1009d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Gain1,Gain2; 1010d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT32 Tot_Dist,Dist; 1011d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1012d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Tot_Dist = (LVM_UINT32)LVREV_GainPolyTable[Index][0] - \ 1013d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (LVM_UINT32)LVREV_GainPolyTable[Index-1][0]; 1014d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Dist = RoomSize - (LVM_UINT32)LVREV_GainPolyTable[Index - 1][0]; 1015d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1016d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1017d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* Get gain for first */ 1018d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri for(i = 1; i < 5; i++) 1019d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1020d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Coefs[i-1] = LVREV_GainPolyTable[Index-1][i]; 1021d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1022d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Coefs[4] = 0; 1023d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1024d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Gain1 = LVM_Polynomial(3, Coefs, T60); /* Q.24 result */ 1025d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1026d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* Get gain for second */ 1027d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri for(i = 1; i < 5; i++) 1028d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1029d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Coefs[i-1] = LVREV_GainPolyTable[Index][i]; 1030d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1031d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Coefs[4] = 0; 1032d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1033d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Gain2 = LVM_Polynomial(3, Coefs, T60); /* Q.24 result */ 1034d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1035d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* Linear Interpolate the gain */ 1036d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Gain = Gain1 + (((Gain2 - Gain1) * Dist) / (Tot_Dist)); 1037d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1038d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1039d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1040d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 1041d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Get the inverse of gain: Q.15 1042d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Gain is mostly above one except few cases, take only gains above 1 1043d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 1044d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(Gain < 1) 1045d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1046d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->Gain = 1; 1047d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1048d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 1049d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1050d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->Gain = 1 / Gain; 1051d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1052d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1053d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Index_FLOAT = 100.0f / (LVM_FLOAT)(100 + pPrivate->NewParams.Level); 1054d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->Gain = pPrivate->Gain * Index_FLOAT; 1055d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->GainMixer.Target = (pPrivate->Gain*Index_FLOAT) / 2; 1056d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1057d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1058d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1059d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 1060d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Update the all pass comb filter coefficient 1061d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 1062d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if( (pPrivate->NewParams.Density != pPrivate->CurrentParams.Density) || 1063d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->bFirstControl == LVM_TRUE)) 1064d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1065d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT16 i; 1066d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT b = (LVM_FLOAT)pPrivate->NewParams.Density * LVREV_B_8_on_1000; 1067d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1068d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri for (i = 0; i < 4; i++) 1069d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1070d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->Mixer_SGFeedback[i].Target = b; 1071d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->Mixer_SGFeedforward[i].Target = b; 1072d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1073d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1074d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1075d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1076d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 1077d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Update the bypass mixer time constant 1078d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 1079d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if((pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 1080d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->bFirstControl == LVM_TRUE)) 1081d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1082d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_UINT16 NumChannels = 1; /* Assume MONO format */ 1083d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT Alpha; 1084d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1085d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri Alpha = LVM_Mixer_TimeConstant(LVREV_FEEDBACKMIXER_TC, 1086d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), 1087d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri NumChannels); 1088d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->FeedbackMixer[0].Alpha = Alpha; 1089d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->FeedbackMixer[1].Alpha = Alpha; 1090d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->FeedbackMixer[2].Alpha = Alpha; 1091d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->FeedbackMixer[3].Alpha = Alpha; 1092d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1093d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri NumChannels = 2; /* Always stereo output */ 1094d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->BypassMixer.Alpha1 = LVM_Mixer_TimeConstant(LVREV_BYPASSMIXER_TC, 1095d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), NumChannels); 1096d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->BypassMixer.Alpha2 = pPrivate->BypassMixer.Alpha1; 1097d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->GainMixer.Alpha = pPrivate->BypassMixer.Alpha1; 1098d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1099d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1100d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1101d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 1102d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Update the bypass mixer targets 1103d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 1104d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if( (pPrivate->NewParams.Level != pPrivate->CurrentParams.Level) && 1105d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri (pPrivate->NewParams.OperatingMode == LVM_MODE_ON)) 1106d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1107d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->BypassMixer.Target2 = (LVM_FLOAT)(pPrivate->NewParams.Level ) / 100.0f; 1108d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->BypassMixer.Target1 = 0x00000000; 1109d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if ((pPrivate->NewParams.Level == 0) && (pPrivate->bFirstControl == LVM_FALSE)) 1110d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1111d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->BypassMixer.CallbackSet2 = LVM_TRUE; 1112d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1113d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (pPrivate->NewParams.Level != 0) 1114d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1115d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->bDisableReverb = LVM_FALSE; 1116d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1117d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1118d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1119d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(pPrivate->NewParams.OperatingMode != pPrivate->CurrentParams.OperatingMode) 1120d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1121d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(pPrivate->NewParams.OperatingMode == LVM_MODE_ON) 1122d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1123d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->BypassMixer.Target2 = (LVM_FLOAT)(pPrivate->NewParams.Level ) / 100.0f; 1124d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->BypassMixer.Target1 = 0x00000000; 1125d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1126d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->BypassMixer.CallbackSet2 = LVM_FALSE; 1127d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri OperatingMode = LVM_MODE_ON; 1128d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if (pPrivate->NewParams.Level == 0) 1129d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1130d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->bDisableReverb = LVM_TRUE; 1131d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1132d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 1133d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1134d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->bDisableReverb = LVM_FALSE; 1135d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1136d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1137d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else if (pPrivate->bFirstControl == LVM_FALSE) 1138d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1139d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->BypassMixer.Target2 = 0x00000000; 1140d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->BypassMixer.Target1 = 0x00000000; 1141d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->BypassMixer.CallbackSet2 = LVM_TRUE; 1142d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->GainMixer.Target = 0.03125f; 1143d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri OperatingMode = LVM_MODE_ON; 1144d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1145d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri else 1146d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1147d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri OperatingMode = LVM_MODE_OFF; 1148d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1149d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1150d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1151d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1152d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* If it is the first call to ApplyNew settings force the current to the target \ 1153d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri to begin immediate playback of the effect */ 1154d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(pPrivate->bFirstControl == LVM_TRUE) 1155d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1156d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->BypassMixer.Current1 = pPrivate->BypassMixer.Target1; 1157d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->BypassMixer.Current2 = pPrivate->BypassMixer.Target2; 1158d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1159d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1160d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1161d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 1162d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Copy the new parameters 1163d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 1164d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->CurrentParams = pPrivate->NewParams; 1165d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->CurrentParams.OperatingMode = OperatingMode; 1166d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1167d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1168d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri /* 1169d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri * Update flag 1170d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri */ 1171d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri if(pPrivate->bFirstControl == LVM_TRUE) 1172d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri { 1173d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pPrivate->bFirstControl = LVM_FALSE; 1174d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri } 1175d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1176d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 1177d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri return LVREV_SUCCESS; 1178d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri} 1179d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif /*BUILD_FLOAT*/ 1180c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/ 1181c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 1182c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* FUNCTION: BypassMixer_Callback */ 1183c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 1184c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* DESCRIPTION: */ 1185c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* Controls the On to Off operating mode transition */ 1186c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 1187c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* PARAMETERS: */ 1188c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* pPrivate Pointer to the instance private parameters */ 1189c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 1190c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* RETURNS: */ 1191c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* LVREV_Success Succeeded */ 1192c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* LVREV_NULLADDRESS When pPrivate is NULL */ 1193c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 1194c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* NOTES: */ 1195c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 1196c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/ 1197c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric LaurentLVM_INT32 BypassMixer_Callback (void *pCallbackData, 1198c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent void *pGeneralPurpose, 1199c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 GeneralPurpose ) 1200c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent{ 1201c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 1202c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVREV_Instance_st *pLVREV_Private = (LVREV_Instance_st *)pCallbackData; 1203c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 1204c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 1205c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 1206c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Avoid build warnings 1207c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 1208c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (void)pGeneralPurpose; 1209c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (void)GeneralPurpose; 1210c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 1211c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 1212c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 1213c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Turn off 1214c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 1215c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pLVREV_Private->CurrentParams.OperatingMode = LVM_MODE_OFF; 1216c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pLVREV_Private->bDisableReverb = LVM_TRUE; 1217c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVREV_ClearAudioBuffers((LVREV_Handle_t)pCallbackData); 1218c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 1219c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 1220c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent return 0; 1221c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent} 1222c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 1223c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* End of file */ 1224c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 1225