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