LVREV_ApplyNewSettings.c revision c59c6fd7f859b4010d788db89b8d4d76bbb70e57
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/* Project:: */ 21c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* $Author: nxp007753 $ */ 22c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* $Revision: 1316 $ */ 23c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* $Date: 2010-07-23 11:53:24 +0200 (Fri, 23 Jul 2010) $ */ 24c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 25c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/ 26c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 27c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/ 28c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 29c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* Includes */ 30c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 31c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/ 32c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include "LVREV_Private.h" 33c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include "Filter.h" 34c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 35c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/ 36c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 37c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* FUNCTION: LVREV_ApplyNewSettings */ 38c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 39c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* DESCRIPTION: */ 40c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* Applies the new control parameters */ 41c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 42c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* PARAMETERS: */ 43c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* pPrivate Pointer to the instance private parameters */ 44c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 45c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* RETURNS: */ 46c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* LVREV_Success Succeeded */ 47c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* LVREV_NULLADDRESS When pPrivate is NULL */ 48c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 49c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* NOTES: */ 50c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 51c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/ 52c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 53c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric LaurentLVREV_ReturnStatus_en LVREV_ApplyNewSettings (LVREV_Instance_st *pPrivate) 54c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent{ 55c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 56c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_Mode_en OperatingMode; 57c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 NumberOfDelayLines; 58c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 59c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 60c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Check for NULL pointer */ 61c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate == LVM_NULL) 62c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 63c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent return LVREV_NULLADDRESS; 64c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 65c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 66c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent OperatingMode = pPrivate->NewParams.OperatingMode; 67c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 68c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->InstanceParams.NumDelays == LVREV_DELAYLINES_4) 69c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 70c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent NumberOfDelayLines = 4; 71c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 72c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else if(pPrivate->InstanceParams.NumDelays == LVREV_DELAYLINES_2) 73c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 74c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent NumberOfDelayLines = 2; 75c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 76c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 77c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 78c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent NumberOfDelayLines = 1; 79c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 80c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 81c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 82c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the high pass filter coefficients 83c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 84c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if((pPrivate->NewParams.HPF != pPrivate->CurrentParams.HPF) || 85c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 86c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->bFirstControl == LVM_TRUE)) 87c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 88c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Omega; 89c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent FO_C32_Coefs_t Coeffs; 90c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 91c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Omega = LVM_GetOmega(pPrivate->NewParams.HPF, pPrivate->NewParams.SampleRate); 92c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_FO_HPF(Omega, &Coeffs); 93c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent FO_1I_D32F32Cll_TRC_WRA_01_Init( &pPrivate->pFastCoef->HPCoefs, &pPrivate->pFastData->HPTaps, &Coeffs); 94c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LoadConst_32(0, 95c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (void *)&pPrivate->pFastData->HPTaps, /* Destination Cast to void: no dereferencing in function*/ 96c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent sizeof(Biquad_1I_Order1_Taps_t)/sizeof(LVM_INT32)); 97c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 98c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 99c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 100c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 101c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the low pass filter coefficients 102c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 103c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if((pPrivate->NewParams.LPF != pPrivate->CurrentParams.LPF) || 104c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 105c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->bFirstControl == LVM_TRUE)) 106c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 107c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Omega; 108c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent FO_C32_Coefs_t Coeffs; 109c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 110c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 111c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coeffs.A0 = 0x7FFFFFFF; 112c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coeffs.A1 = 0; 113c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coeffs.B1 = 0; 114c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->NewParams.LPF <= (LVM_FsTable[pPrivate->NewParams.SampleRate] >> 1)) 115c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 116c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Omega = LVM_GetOmega(pPrivate->NewParams.LPF, pPrivate->NewParams.SampleRate); 117c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 118c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 119c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Do not apply filter if w =2*pi*fc/fs >= 2.9 120c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 121c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(Omega<=LVREV_2_9_INQ29) 122c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 123c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_FO_LPF(Omega, &Coeffs); 124c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 125c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 126c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent FO_1I_D32F32Cll_TRC_WRA_01_Init( &pPrivate->pFastCoef->LPCoefs, &pPrivate->pFastData->LPTaps, &Coeffs); 127c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LoadConst_32(0, 128c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (void *)&pPrivate->pFastData->LPTaps, /* Destination Cast to void: no dereferencing in function*/ 129c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent sizeof(Biquad_1I_Order1_Taps_t)/sizeof(LVM_INT32)); 130c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 131c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 132c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 133c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 134c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Calculate the room size parameter 135c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 136c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if( pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) 137c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 138c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Room size range is 10ms to 200ms 139c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * 0% -- 10ms 140c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * 50% -- 65ms 141c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * 100% -- 120ms 142c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 143c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->RoomSizeInms = 10 + (((pPrivate->NewParams.RoomSize*11) + 5)/10); 144c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 145c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 146c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 147c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 148c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the T delay number of samples and the all pass delay number of samples 149c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 150c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if( (pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) || 151c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 152c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->bFirstControl == LVM_TRUE)) 153c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 154c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 155c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_UINT32 Temp; 156c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 APDelaySize; 157c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Fs = LVM_GetFsFromTable(pPrivate->NewParams.SampleRate); 158c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_UINT32 DelayLengthSamples = (LVM_UINT32)(Fs * pPrivate->RoomSizeInms); 159c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 i; 160c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric 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}; 161c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 MaxT_Delay[] = {LVREV_MAX_T0_DELAY, LVREV_MAX_T1_DELAY, LVREV_MAX_T2_DELAY, LVREV_MAX_T3_DELAY}; 162c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 MaxAP_Delay[] = {LVREV_MAX_AP0_DELAY, LVREV_MAX_AP1_DELAY, LVREV_MAX_AP2_DELAY, LVREV_MAX_AP3_DELAY}; 163c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 164c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 165c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 166c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * For each delay line 167c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 168c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for (i=0; i<NumberOfDelayLines; i++) 169c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 170c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (i != 0) 171c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 172c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Temp1; /* to avoid QAC warning on type conversion */ 173c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Temp2; /* to avoid QAC warning on type conversion */ 174c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 175c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp2=(LVM_INT32)DelayLengthSamples; 176c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent MUL32x16INTO32(Temp2, ScaleTable[i], Temp1, 15) 177c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp=(LVM_UINT32)Temp1; 178c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 179c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 180c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 181c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp = DelayLengthSamples; 182c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 183c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent APDelaySize = Temp / 1500; 184c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 185c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 186c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 187c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Set the fixed delay 188c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 189c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp = (MaxT_Delay[i] - MaxAP_Delay[i]) * Fs / 48000; 190c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Delay_AP[i] = pPrivate->T[i] - Temp; 191c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 192c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 193c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 194c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Set the tap selection 195c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 196c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (pPrivate->AB_Selection) 197c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 198c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Smooth from tap A to tap B */ 199c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->pOffsetB[i] = &pPrivate->pDelay_T[i][pPrivate->T[i] - Temp - APDelaySize]; 200c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->B_DelaySize[i] = APDelaySize; 201c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_APTaps[i].Target1 = 0; 202c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_APTaps[i].Target2 = 0x7fffffff; 203c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 204c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 205c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 206c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Smooth from tap B to tap A */ 207c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->pOffsetA[i] = &pPrivate->pDelay_T[i][pPrivate->T[i] - Temp - APDelaySize]; 208c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->A_DelaySize[i] = APDelaySize; 209c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_APTaps[i].Target2 = 0; 210c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_APTaps[i].Target1 = 0x7fffffff; 211c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 212c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 213c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 214c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Set the maximum block size to the smallest delay size 215c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 216c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->MaxBlkLen = Temp; 217c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (pPrivate->MaxBlkLen > pPrivate->A_DelaySize[i]) 218c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 219c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->MaxBlkLen = pPrivate->A_DelaySize[i]; 220c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 221c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (pPrivate->MaxBlkLen > pPrivate->B_DelaySize[i]) 222c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 223c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->MaxBlkLen = pPrivate->B_DelaySize[i]; 224c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 225c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 226c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (pPrivate->AB_Selection) 227c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 228c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->AB_Selection = 0; 229c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 230c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 231c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 232c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->AB_Selection = 1; 233c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 234c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 235c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 236c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 237c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Limit the maximum block length 238c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 239c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->MaxBlkLen=pPrivate->MaxBlkLen-2; /* Just as a precausion, but no problem if we remove this line */ 240c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->MaxBlkLen > pPrivate->InstanceParams.MaxBlockSize) 241c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 242c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->MaxBlkLen = (LVM_INT32)pPrivate->InstanceParams.MaxBlockSize; 243c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 244c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 245c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 246c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 247c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 248c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the low pass filter coefficient 249c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 250c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if( (pPrivate->NewParams.Damping != pPrivate->CurrentParams.Damping) || 251c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 252c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->bFirstControl == LVM_TRUE)) 253c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 254c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 255c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Temp; 256c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Omega; 257c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent FO_C32_Coefs_t Coeffs; 258c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 i; 259c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 Damping = (LVM_INT16)((pPrivate->NewParams.Damping * 100) + 1000); 260c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric 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}; 261c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 262c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 263c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 264c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * For each filter 265c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 266c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for (i=0; i<NumberOfDelayLines; i++) 267c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 268c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (i != 0) 269c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 270c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent MUL32x16INTO32(ScaleTable[i], Damping, Temp, 15) 271c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 272c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 273c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 274c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp = Damping; 275c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 276c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(Temp <= (LVM_FsTable[pPrivate->NewParams.SampleRate] >> 1)) 277c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 278c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Omega = LVM_GetOmega((LVM_UINT16)Temp, pPrivate->NewParams.SampleRate); 279c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_FO_LPF(Omega, &Coeffs); 280c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 281c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 282c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 283c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coeffs.A0 = 0x7FF00000; 284c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coeffs.A1 = 0; 285c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coeffs.B1 = 0; 286c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 287c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent FO_1I_D32F32Cll_TRC_WRA_01_Init(&pPrivate->pFastCoef->RevLPCoefs[i], &pPrivate->pFastData->RevLPTaps[i], &Coeffs); 288c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 289c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 290c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 291c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 292c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 293c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update All-pass filter mixer time constants 294c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 295c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if( (pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) || 296c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 297c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.Density != pPrivate->CurrentParams.Density)) 298c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 299c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 i; 300c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Alpha = (LVM_INT32)LVM_Mixer_TimeConstant(LVREV_ALLPASS_TC, LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), 1); 301c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 AlphaTap = (LVM_INT32)LVM_Mixer_TimeConstant(LVREV_ALLPASS_TAP_TC, LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), 1); 302c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 303c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for (i=0; i<4; i++) 304c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 305c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_APTaps[i].Alpha1 = AlphaTap; 306c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_APTaps[i].Alpha2 = AlphaTap; 307c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_SGFeedback[i].Alpha = Alpha; 308c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_SGFeedforward[i].Alpha = Alpha; 309c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 310c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 311c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 312c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 313c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 314c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the feed back gain 315c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 316c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if( (pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) || 317c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 318c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.T60 != pPrivate->CurrentParams.T60) || 319c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->bFirstControl == LVM_TRUE)) 320c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 321c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 322c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 G[4]; /* Feedback gain (Q7.24) */ 323c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 324c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->NewParams.T60 == 0) 325c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 326c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent G[3] = 0; 327c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent G[2] = 0; 328c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent G[1] = 0; 329c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent G[0] = 0; 330c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 331c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 332c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 333c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Temp1; 334c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Temp2; 335c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 i; 336c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric 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}; 337c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 338c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 339c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 340c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * For each delay line 341c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 342c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for (i=0; i<NumberOfDelayLines; i++) 343c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 344c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp1 = (3 * pPrivate->RoomSizeInms * ScaleTable[i]) / pPrivate->NewParams.T60; 345c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(Temp1 >= (4 << 15)) 346c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 347c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent G[i] = 0; 348c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 349c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else if((Temp1 >= (2 << 15))) 350c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 351c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp2 = LVM_Power10(-(Temp1 << 14)); 352c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp1 = LVM_Power10(-(Temp1 << 14)); 353c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent MUL32x32INTO32(Temp1,Temp2,Temp1,24) 354c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 355c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 356c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 357c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Temp1 = LVM_Power10(-(Temp1 << 15)); 358c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 359c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (NumberOfDelayLines == 1) 360c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 361c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent G[i] = Temp1; 362c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 363c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 364c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 365c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 TempG; 366c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent MUL32x16INTO32(Temp1,ONE_OVER_SQRT_TWO,TempG,15) 367c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent G[i]=TempG; 368c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 369c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 370c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 371c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 372c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Set up the feedback mixers for four delay lines */ 373c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[0].Target=G[0]<<7; 374c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[1].Target=G[1]<<7; 375c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[2].Target=G[2]<<7; 376c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[3].Target=G[3]<<7; 377c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 378c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 379c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 380c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 381c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Calculate the gain correction 382c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 383c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if((pPrivate->NewParams.RoomSize != pPrivate->CurrentParams.RoomSize) || 384c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.Level != pPrivate->CurrentParams.Level) || 385c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.T60 != pPrivate->CurrentParams.T60) ) 386c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 387c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Index=0; 388c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 i=0; 389c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Gain=0; 390c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 RoomSize=0; 391c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 T60; 392c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Coefs[5]; 393c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 394c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->NewParams.RoomSize==0) 395c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 396c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent RoomSize=1; 397c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 398c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 399c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 400c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent RoomSize=(LVM_INT32)pPrivate->NewParams.RoomSize; 401c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 402c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 403c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->NewParams.T60<100) 404c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 405c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent T60 = 100 * LVREV_T60_SCALE; 406c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 407c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 408c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 409c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent T60 = pPrivate->NewParams.T60 * LVREV_T60_SCALE; 410c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 411c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 412c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Find the nearest room size in table */ 413c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for(i=0;i<24;i++) 414c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 415c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(RoomSize<= LVREV_GainPolyTable[i][0]) 416c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 417c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Index=i; 418c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent break; 419c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 420c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 421c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 422c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 423c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(RoomSize==LVREV_GainPolyTable[Index][0]) 424c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 425c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Take table values if the room size is in table */ 426c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for(i=1;i<5;i++) 427c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 428c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coefs[i-1]=LVREV_GainPolyTable[Index][i]; 429c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 430c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coefs[4]=0; 431c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Gain=LVM_Polynomial(3,Coefs,T60); /* Q.24 result */ 432c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 433c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 434c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 435c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Interpolate the gain between nearest room sizes */ 436c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 437c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Gain1,Gain2; 438c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Tot_Dist,Dist; 439c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 440c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Tot_Dist=LVREV_GainPolyTable[Index][0]-LVREV_GainPolyTable[Index-1][0]; 441c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Dist=RoomSize-LVREV_GainPolyTable[Index-1][0]; 442c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 443c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 444c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Get gain for first */ 445c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for(i=1;i<5;i++) 446c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 447c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coefs[i-1]=LVREV_GainPolyTable[Index-1][i]; 448c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 449c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coefs[4]=0; 450c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 451c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Gain1=LVM_Polynomial(3,Coefs,T60); /* Q.24 result */ 452c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 453c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Get gain for second */ 454c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for(i=1;i<5;i++) 455c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 456c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coefs[i-1]=LVREV_GainPolyTable[Index][i]; 457c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 458c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Coefs[4]=0; 459c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 460c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Gain2=LVM_Polynomial(3,Coefs,T60); /* Q.24 result */ 461c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 462c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Linear Interpolate the gain */ 463c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Gain = Gain1+ (((Gain2-Gain1)*Dist)/(Tot_Dist)); 464c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 465c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 466c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 467c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 468c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Get the inverse of gain: Q.15 469c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Gain is mostly above one except few cases, take only gains above 1 470c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 471c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(Gain < 16777216L) 472c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 473c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Gain= 32767; 474c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 475c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 476c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 477c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Gain=(LVM_INT16)(LVM_MAXINT_32/(Gain>>8)); 478c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 479c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 480c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 481c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Index=((32767*100)/(100+pPrivate->NewParams.Level)); 482c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Gain=(LVM_INT16)((pPrivate->Gain*Index)>>15); 483c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->GainMixer.Target = pPrivate->Gain*Index; 484c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 485c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 486c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 487c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 488c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the all pass comb filter coefficient 489c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 490c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if( (pPrivate->NewParams.Density != pPrivate->CurrentParams.Density) || 491c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->bFirstControl == LVM_TRUE)) 492c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 493c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 i; 494c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 b = pPrivate->NewParams.Density * LVREV_B_8_on_1000; 495c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 496c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent for (i=0;i<4; i++) 497c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 498c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_SGFeedback[i].Target = b; 499c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->Mixer_SGFeedforward[i].Target = b; 500c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 501c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 502c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 503c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 504c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 505c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the bypass mixer time constant 506c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 507c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if((pPrivate->NewParams.SampleRate != pPrivate->CurrentParams.SampleRate) || 508c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.SourceFormat != pPrivate->CurrentParams.SourceFormat) || 509c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->bFirstControl == LVM_TRUE)) 510c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 511c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_UINT16 NumChannels = 1; /* Assume MONO format */ 512c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 Alpha; 513c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 514c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Alpha = (LVM_INT32)LVM_Mixer_TimeConstant(LVREV_FEEDBACKMIXER_TC, LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), NumChannels); 515c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[0].Alpha=Alpha; 516c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[1].Alpha=Alpha; 517c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[2].Alpha=Alpha; 518c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->FeedbackMixer[3].Alpha=Alpha; 519c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 520c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (pPrivate->NewParams.SourceFormat != LVM_MONO) 521c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 522c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Stereo or Mono-in-Stereo format data */ 523c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent NumChannels = 2; 524c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 525c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Alpha1 = (LVM_INT32)LVM_Mixer_TimeConstant(LVREV_BYPASSMIXER_TC, LVM_GetFsFromTable(pPrivate->NewParams.SampleRate), NumChannels); 526c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Alpha2 = pPrivate->BypassMixer.Alpha1; 527c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->GainMixer.Alpha = pPrivate->BypassMixer.Alpha1; 528c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 529c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 530c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 531c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 532c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update the bypass mixer targets 533c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 534c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if( (pPrivate->NewParams.Level != pPrivate->CurrentParams.Level) && 535c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (pPrivate->NewParams.OperatingMode == LVM_MODE_ON)) 536c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 537c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Target2 = ((LVM_INT32)(pPrivate->NewParams.Level * 32767)/100)<<16; 538c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Target1 = LVREV_HEADROOM << 16; 539c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if ((pPrivate->NewParams.Level == 0) && (pPrivate->bFirstControl == LVM_FALSE)) 540c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 541c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.CallbackSet2 = LVM_TRUE; 542c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 543c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (pPrivate->NewParams.Level != 0) 544c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 545c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->bDisableReverb = LVM_FALSE; 546c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 547c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 548c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 549c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->NewParams.OperatingMode != pPrivate->CurrentParams.OperatingMode) 550c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 551c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->NewParams.OperatingMode == LVM_MODE_ON) 552c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 553c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Target2 = ((LVM_INT32)(pPrivate->NewParams.Level * 32767)/100)<<16; 554c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Target1 = LVREV_HEADROOM << 16; 555c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 556c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.CallbackSet2 = LVM_FALSE; 557c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent OperatingMode = LVM_MODE_ON; 558c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if (pPrivate->NewParams.Level == 0) 559c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 560c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->bDisableReverb = LVM_TRUE; 561c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 562c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 563c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 564c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->bDisableReverb = LVM_FALSE; 565c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 566c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 567c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else if (pPrivate->bFirstControl == LVM_FALSE) 568c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 569c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Target2 = 0x00000000; 570c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Target1 = 0x7FFFFFFF; 571c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.CallbackSet2 = LVM_TRUE; 572c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->GainMixer.Target = 0x03FFFFFF; 573c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent OperatingMode = LVM_MODE_ON; 574c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 575c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent else 576c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 577c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent OperatingMode = LVM_MODE_OFF; 578c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 579c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 580c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 581c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 582c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 583c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * If it is the first call to ApplyNew settings force the current to the target to begin immediate playback of the effect 584c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 585c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->bFirstControl == LVM_TRUE) 586c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 587c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Current1 = pPrivate->BypassMixer.Target1; 588c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->BypassMixer.Current2 = pPrivate->BypassMixer.Target2; 589c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 590c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 591c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 592c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 593c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Copy the new parameters 594c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 595c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->CurrentParams = pPrivate->NewParams; 596c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->CurrentParams.OperatingMode = OperatingMode; 597c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 598c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 599c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 600c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Update flag 601c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 602c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if(pPrivate->bFirstControl == LVM_TRUE) 603c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent { 604c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pPrivate->bFirstControl = LVM_FALSE; 605c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent } 606c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 607c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 608c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent return LVREV_SUCCESS; 609c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent} 610c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 611c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 612c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/ 613c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 614c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* FUNCTION: BypassMixer_Callback */ 615c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 616c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* DESCRIPTION: */ 617c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* Controls the On to Off operating mode transition */ 618c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 619c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* PARAMETERS: */ 620c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* pPrivate Pointer to the instance private parameters */ 621c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 622c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* RETURNS: */ 623c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* LVREV_Success Succeeded */ 624c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* LVREV_NULLADDRESS When pPrivate is NULL */ 625c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 626c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* NOTES: */ 627c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* */ 628c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/ 629c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric LaurentLVM_INT32 BypassMixer_Callback (void *pCallbackData, 630c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent void *pGeneralPurpose, 631c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 GeneralPurpose ) 632c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent{ 633c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 634c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVREV_Instance_st *pLVREV_Private = (LVREV_Instance_st *)pCallbackData; 635c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 636c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 637c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 638c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Avoid build warnings 639c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 640c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (void)pGeneralPurpose; 641c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (void)GeneralPurpose; 642c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 643c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 644c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 645c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Turn off 646c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 647c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pLVREV_Private->CurrentParams.OperatingMode = LVM_MODE_OFF; 648c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pLVREV_Private->bDisableReverb = LVM_TRUE; 649c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVREV_ClearAudioBuffers((LVREV_Handle_t)pCallbackData); 650c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 651c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 652c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent return 0; 653c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent} 654c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 655c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* End of file */ 656c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 657