xref: /aosp_15_r20/external/sonivox/arm-wt-22k/lib_src/eas_reverb.c (revision f81fb7c475c4b71ff83bdcc517de2a8c174e4e5c)
1*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2*f81fb7c4SAndroid Build Coastguard Worker  *
3*f81fb7c4SAndroid Build Coastguard Worker  * File:
4*f81fb7c4SAndroid Build Coastguard Worker  * eas_reverb.c
5*f81fb7c4SAndroid Build Coastguard Worker  *
6*f81fb7c4SAndroid Build Coastguard Worker  * Contents and purpose:
7*f81fb7c4SAndroid Build Coastguard Worker  * Contains the implementation of the Reverb effect.
8*f81fb7c4SAndroid Build Coastguard Worker  *
9*f81fb7c4SAndroid Build Coastguard Worker  *
10*f81fb7c4SAndroid Build Coastguard Worker  * Copyright Sonic Network Inc. 2006
11*f81fb7c4SAndroid Build Coastguard Worker 
12*f81fb7c4SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
13*f81fb7c4SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
14*f81fb7c4SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
15*f81fb7c4SAndroid Build Coastguard Worker  *
16*f81fb7c4SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
17*f81fb7c4SAndroid Build Coastguard Worker  *
18*f81fb7c4SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
19*f81fb7c4SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
20*f81fb7c4SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21*f81fb7c4SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
22*f81fb7c4SAndroid Build Coastguard Worker  * limitations under the License.
23*f81fb7c4SAndroid Build Coastguard Worker  *
24*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
25*f81fb7c4SAndroid Build Coastguard Worker  * Revision Control:
26*f81fb7c4SAndroid Build Coastguard Worker  *   $Revision: 510 $
27*f81fb7c4SAndroid Build Coastguard Worker  *   $Date: 2006-12-19 01:47:33 -0800 (Tue, 19 Dec 2006) $
28*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
29*f81fb7c4SAndroid Build Coastguard Worker */
30*f81fb7c4SAndroid Build Coastguard Worker 
31*f81fb7c4SAndroid Build Coastguard Worker /*------------------------------------
32*f81fb7c4SAndroid Build Coastguard Worker  * includes
33*f81fb7c4SAndroid Build Coastguard Worker  *------------------------------------
34*f81fb7c4SAndroid Build Coastguard Worker */
35*f81fb7c4SAndroid Build Coastguard Worker 
36*f81fb7c4SAndroid Build Coastguard Worker #include "eas_data.h"
37*f81fb7c4SAndroid Build Coastguard Worker #include "eas_effects.h"
38*f81fb7c4SAndroid Build Coastguard Worker #include "eas_math.h"
39*f81fb7c4SAndroid Build Coastguard Worker #include "eas_reverbdata.h"
40*f81fb7c4SAndroid Build Coastguard Worker #include "eas_reverb.h"
41*f81fb7c4SAndroid Build Coastguard Worker #include "eas_config.h"
42*f81fb7c4SAndroid Build Coastguard Worker #include "eas_host.h"
43*f81fb7c4SAndroid Build Coastguard Worker #include "eas_report.h"
44*f81fb7c4SAndroid Build Coastguard Worker 
45*f81fb7c4SAndroid Build Coastguard Worker /* prototypes for effects interface */
46*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbInit (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR *pInstData);
47*f81fb7c4SAndroid Build Coastguard Worker static void ReverbProcess (EAS_VOID_PTR pInstData, EAS_PCM *pSrc, EAS_PCM *pDst, EAS_I32 numSamples);
48*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbShutdown (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR pInstData);
49*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbGetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue);
50*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbSetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value);
51*f81fb7c4SAndroid Build Coastguard Worker 
52*f81fb7c4SAndroid Build Coastguard Worker /* common effects interface for configuration module */
53*f81fb7c4SAndroid Build Coastguard Worker const S_EFFECTS_INTERFACE EAS_Reverb =
54*f81fb7c4SAndroid Build Coastguard Worker {
55*f81fb7c4SAndroid Build Coastguard Worker     ReverbInit,
56*f81fb7c4SAndroid Build Coastguard Worker     ReverbProcess,
57*f81fb7c4SAndroid Build Coastguard Worker     ReverbShutdown,
58*f81fb7c4SAndroid Build Coastguard Worker     ReverbGetParam,
59*f81fb7c4SAndroid Build Coastguard Worker     ReverbSetParam
60*f81fb7c4SAndroid Build Coastguard Worker };
61*f81fb7c4SAndroid Build Coastguard Worker 
62*f81fb7c4SAndroid Build Coastguard Worker 
63*f81fb7c4SAndroid Build Coastguard Worker 
64*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
65*f81fb7c4SAndroid Build Coastguard Worker  * InitializeReverb()
66*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
67*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
68*f81fb7c4SAndroid Build Coastguard Worker  *
69*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
70*f81fb7c4SAndroid Build Coastguard Worker  *
71*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
72*f81fb7c4SAndroid Build Coastguard Worker  *
73*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
74*f81fb7c4SAndroid Build Coastguard Worker */
ReverbInit(EAS_DATA_HANDLE pEASData,EAS_VOID_PTR * pInstData)75*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbInit(EAS_DATA_HANDLE pEASData, EAS_VOID_PTR *pInstData)
76*f81fb7c4SAndroid Build Coastguard Worker {
77*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 i;
78*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16 nOffset;
79*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT temp;
80*f81fb7c4SAndroid Build Coastguard Worker 
81*f81fb7c4SAndroid Build Coastguard Worker     S_REVERB_OBJECT *pReverbData;
82*f81fb7c4SAndroid Build Coastguard Worker     S_REVERB_PRESET *pPreset;
83*f81fb7c4SAndroid Build Coastguard Worker 
84*f81fb7c4SAndroid Build Coastguard Worker     /* check Configuration Module for data allocation */
85*f81fb7c4SAndroid Build Coastguard Worker     if (pEASData->staticMemoryModel)
86*f81fb7c4SAndroid Build Coastguard Worker         pReverbData = EAS_CMEnumFXData(EAS_MODULE_REVERB);
87*f81fb7c4SAndroid Build Coastguard Worker 
88*f81fb7c4SAndroid Build Coastguard Worker     /* allocate dynamic memory */
89*f81fb7c4SAndroid Build Coastguard Worker     else
90*f81fb7c4SAndroid Build Coastguard Worker         pReverbData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_REVERB_OBJECT));
91*f81fb7c4SAndroid Build Coastguard Worker 
92*f81fb7c4SAndroid Build Coastguard Worker     if (pReverbData == NULL)
93*f81fb7c4SAndroid Build Coastguard Worker     {
94*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Failed to allocate Reverb memory\n"); */ }
95*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_MALLOC_FAILED;
96*f81fb7c4SAndroid Build Coastguard Worker     }
97*f81fb7c4SAndroid Build Coastguard Worker 
98*f81fb7c4SAndroid Build Coastguard Worker     /* clear the structure */
99*f81fb7c4SAndroid Build Coastguard Worker     EAS_HWMemSet(pReverbData, 0, sizeof(S_REVERB_OBJECT));
100*f81fb7c4SAndroid Build Coastguard Worker 
101*f81fb7c4SAndroid Build Coastguard Worker     ReverbReadInPresets(pReverbData);
102*f81fb7c4SAndroid Build Coastguard Worker 
103*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nMinSamplesToAdd = REVERB_UPDATE_PERIOD_IN_SAMPLES;
104*f81fb7c4SAndroid Build Coastguard Worker 
105*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nRevOutFbkR = 0;
106*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nRevOutFbkL = 0;
107*f81fb7c4SAndroid Build Coastguard Worker 
108*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sAp0.m_zApIn  = AP0_IN;
109*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sAp0.m_zApOut = AP0_IN + DEFAULT_AP0_LENGTH;
110*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sAp0.m_nApGain = DEFAULT_AP0_GAIN;
111*f81fb7c4SAndroid Build Coastguard Worker 
112*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_zD0In = DELAY0_IN;
113*f81fb7c4SAndroid Build Coastguard Worker 
114*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sAp1.m_zApIn  = AP1_IN;
115*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sAp1.m_zApOut = AP1_IN + DEFAULT_AP1_LENGTH;
116*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sAp1.m_nApGain = DEFAULT_AP1_GAIN;
117*f81fb7c4SAndroid Build Coastguard Worker 
118*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_zD1In = DELAY1_IN;
119*f81fb7c4SAndroid Build Coastguard Worker 
120*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_zLpf0    = 0;
121*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_zLpf1    = 0;
122*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nLpfFwd  = 8837;
123*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nLpfFbk  = 6494;
124*f81fb7c4SAndroid Build Coastguard Worker 
125*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nSin     = 0;
126*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nCos     = 0;
127*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nSinIncrement    = 0;
128*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nCosIncrement    = 0;
129*f81fb7c4SAndroid Build Coastguard Worker 
130*f81fb7c4SAndroid Build Coastguard Worker     // set xfade parameters
131*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nXfadeInterval = (EAS_U16)REVERB_XFADE_PERIOD_IN_SAMPLES;
132*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nXfadeCounter = pReverbData->m_nXfadeInterval + 1;   // force update on first iteration
133*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nPhase = -32768;
134*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nPhaseIncrement = REVERB_XFADE_PHASE_INCREMENT;
135*f81fb7c4SAndroid Build Coastguard Worker 
136*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nNoise = (EAS_I16)0xABCD;
137*f81fb7c4SAndroid Build Coastguard Worker 
138*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nMaxExcursion = 0x007F;
139*f81fb7c4SAndroid Build Coastguard Worker 
140*f81fb7c4SAndroid Build Coastguard Worker     // set delay tap lengths
141*f81fb7c4SAndroid Build Coastguard Worker     nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion,
142*f81fb7c4SAndroid Build Coastguard Worker                                     &pReverbData->m_nNoise );
143*f81fb7c4SAndroid Build Coastguard Worker 
144*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_zD1Cross =
145*f81fb7c4SAndroid Build Coastguard Worker         DELAY1_OUT - pReverbData->m_nMaxExcursion + nOffset;
146*f81fb7c4SAndroid Build Coastguard Worker 
147*f81fb7c4SAndroid Build Coastguard Worker     nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion,
148*f81fb7c4SAndroid Build Coastguard Worker                                     &pReverbData->m_nNoise );
149*f81fb7c4SAndroid Build Coastguard Worker 
150*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_zD0Cross =
151*f81fb7c4SAndroid Build Coastguard Worker         DELAY1_OUT - pReverbData->m_nMaxExcursion - nOffset;
152*f81fb7c4SAndroid Build Coastguard Worker 
153*f81fb7c4SAndroid Build Coastguard Worker     nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion,
154*f81fb7c4SAndroid Build Coastguard Worker                                     &pReverbData->m_nNoise );
155*f81fb7c4SAndroid Build Coastguard Worker 
156*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_zD0Self  =
157*f81fb7c4SAndroid Build Coastguard Worker         DELAY0_OUT - pReverbData->m_nMaxExcursion - nOffset;
158*f81fb7c4SAndroid Build Coastguard Worker 
159*f81fb7c4SAndroid Build Coastguard Worker     nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion,
160*f81fb7c4SAndroid Build Coastguard Worker                                     &pReverbData->m_nNoise );
161*f81fb7c4SAndroid Build Coastguard Worker 
162*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_zD1Self  =
163*f81fb7c4SAndroid Build Coastguard Worker         DELAY1_OUT - pReverbData->m_nMaxExcursion + nOffset;
164*f81fb7c4SAndroid Build Coastguard Worker 
165*f81fb7c4SAndroid Build Coastguard Worker     // for debugging purposes, allow noise generator
166*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_bUseNoise = EAS_FALSE;
167*f81fb7c4SAndroid Build Coastguard Worker 
168*f81fb7c4SAndroid Build Coastguard Worker     // for debugging purposes, allow bypass
169*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_bBypass = EAS_TRUE;  //EAS_FALSE;
170*f81fb7c4SAndroid Build Coastguard Worker 
171*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nNextRoom = 1;
172*f81fb7c4SAndroid Build Coastguard Worker 
173*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nCurrentRoom = pReverbData->m_nNextRoom + 1; // force update on first iteration
174*f81fb7c4SAndroid Build Coastguard Worker 
175*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nWet = REVERB_DEFAULT_WET;
176*f81fb7c4SAndroid Build Coastguard Worker 
177*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nDry = REVERB_DEFAULT_DRY;
178*f81fb7c4SAndroid Build Coastguard Worker 
179*f81fb7c4SAndroid Build Coastguard Worker     // set base index into circular buffer
180*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nBaseIndex = 0;
181*f81fb7c4SAndroid Build Coastguard Worker 
182*f81fb7c4SAndroid Build Coastguard Worker     // set the early reflections, L
183*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sEarlyL.m_nLpfFbk = 4915;
184*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sEarlyL.m_nLpfFwd = 27852;
185*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sEarlyL.m_zLpf = 0;
186*f81fb7c4SAndroid Build Coastguard Worker 
187*f81fb7c4SAndroid Build Coastguard Worker     for (i=0; i < REVERB_MAX_NUM_REFLECTIONS; i++)
188*f81fb7c4SAndroid Build Coastguard Worker     {
189*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_sEarlyL.m_nGain[i] = 0;
190*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_sEarlyL.m_zDelay[i] = 0;
191*f81fb7c4SAndroid Build Coastguard Worker     }
192*f81fb7c4SAndroid Build Coastguard Worker 
193*f81fb7c4SAndroid Build Coastguard Worker     // set the early reflections, R
194*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sEarlyR.m_nLpfFbk = 4915;
195*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sEarlyR.m_nLpfFwd = 27852;
196*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sEarlyR.m_zLpf = 0;
197*f81fb7c4SAndroid Build Coastguard Worker 
198*f81fb7c4SAndroid Build Coastguard Worker     for (i=0; i < REVERB_MAX_NUM_REFLECTIONS; i++)
199*f81fb7c4SAndroid Build Coastguard Worker     {
200*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_sEarlyR.m_nGain[i] = 0;
201*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_sEarlyR.m_zDelay[i] = 0;
202*f81fb7c4SAndroid Build Coastguard Worker     }
203*f81fb7c4SAndroid Build Coastguard Worker 
204*f81fb7c4SAndroid Build Coastguard Worker     // clear the reverb delay line
205*f81fb7c4SAndroid Build Coastguard Worker     for (i=0; i < REVERB_BUFFER_SIZE_IN_SAMPLES; i++)
206*f81fb7c4SAndroid Build Coastguard Worker     {
207*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_nDelayLine[i] = 0;
208*f81fb7c4SAndroid Build Coastguard Worker     }
209*f81fb7c4SAndroid Build Coastguard Worker 
210*f81fb7c4SAndroid Build Coastguard Worker     ////////////////////////////////
211*f81fb7c4SAndroid Build Coastguard Worker     ///code from the EAS DEMO Reverb
212*f81fb7c4SAndroid Build Coastguard Worker     //now copy from the new preset into the reverb
213*f81fb7c4SAndroid Build Coastguard Worker     pPreset = &pReverbData->m_sPreset.m_sPreset[pReverbData->m_nNextRoom];
214*f81fb7c4SAndroid Build Coastguard Worker 
215*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nLpfFbk = pPreset->m_nLpfFbk;
216*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nLpfFwd = pPreset->m_nLpfFwd;
217*f81fb7c4SAndroid Build Coastguard Worker 
218*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nEarly = pPreset->m_nEarly;
219*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nWet = pPreset->m_nWet;
220*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nDry = pPreset->m_nDry;
221*f81fb7c4SAndroid Build Coastguard Worker 
222*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nMaxExcursion = pPreset->m_nMaxExcursion;
223*f81fb7c4SAndroid Build Coastguard Worker     //stored as time based, convert to sample based
224*f81fb7c4SAndroid Build Coastguard Worker     temp = pPreset->m_nXfadeInterval;
225*f81fb7c4SAndroid Build Coastguard Worker     /*lint -e{702} shift for performance */
226*f81fb7c4SAndroid Build Coastguard Worker     temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
227*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nXfadeInterval = (EAS_U16) temp;
228*f81fb7c4SAndroid Build Coastguard Worker     //gsReverbObject.m_nXfadeInterval = pPreset->m_nXfadeInterval;
229*f81fb7c4SAndroid Build Coastguard Worker 
230*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sAp0.m_nApGain = pPreset->m_nAp0_ApGain;
231*f81fb7c4SAndroid Build Coastguard Worker     //stored as time based, convert to absolute sample value
232*f81fb7c4SAndroid Build Coastguard Worker     temp = pPreset->m_nAp0_ApOut;
233*f81fb7c4SAndroid Build Coastguard Worker     /*lint -e{702} shift for performance */
234*f81fb7c4SAndroid Build Coastguard Worker     temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
235*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sAp0.m_zApOut = (EAS_U16) (pReverbData->m_sAp0.m_zApIn + temp);
236*f81fb7c4SAndroid Build Coastguard Worker     //gsReverbObject.m_sAp0.m_zApOut = pPreset->m_nAp0_ApOut;
237*f81fb7c4SAndroid Build Coastguard Worker 
238*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sAp1.m_nApGain = pPreset->m_nAp1_ApGain;
239*f81fb7c4SAndroid Build Coastguard Worker     //stored as time based, convert to absolute sample value
240*f81fb7c4SAndroid Build Coastguard Worker     temp = pPreset->m_nAp1_ApOut;
241*f81fb7c4SAndroid Build Coastguard Worker     /*lint -e{702} shift for performance */
242*f81fb7c4SAndroid Build Coastguard Worker     temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
243*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sAp1.m_zApOut = (EAS_U16) (pReverbData->m_sAp1.m_zApIn + temp);
244*f81fb7c4SAndroid Build Coastguard Worker     //gsReverbObject.m_sAp1.m_zApOut = pPreset->m_nAp1_ApOut;
245*f81fb7c4SAndroid Build Coastguard Worker     ///code from the EAS DEMO Reverb
246*f81fb7c4SAndroid Build Coastguard Worker     ////////////////////////////////
247*f81fb7c4SAndroid Build Coastguard Worker 
248*f81fb7c4SAndroid Build Coastguard Worker     *pInstData = pReverbData;
249*f81fb7c4SAndroid Build Coastguard Worker 
250*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
251*f81fb7c4SAndroid Build Coastguard Worker 
252*f81fb7c4SAndroid Build Coastguard Worker }   /* end InitializeReverb */
253*f81fb7c4SAndroid Build Coastguard Worker 
254*f81fb7c4SAndroid Build Coastguard Worker 
255*f81fb7c4SAndroid Build Coastguard Worker 
256*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
257*f81fb7c4SAndroid Build Coastguard Worker  * ReverbProcess()
258*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
259*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
260*f81fb7c4SAndroid Build Coastguard Worker  * Reverberate the requested number of samples (block based processing)
261*f81fb7c4SAndroid Build Coastguard Worker  *
262*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
263*f81fb7c4SAndroid Build Coastguard Worker  * pInputBuffer - src buffer
264*f81fb7c4SAndroid Build Coastguard Worker  * pOutputBuffer - dst buffer
265*f81fb7c4SAndroid Build Coastguard Worker  * nNumSamplesToAdd - number of samples to write to buffer
266*f81fb7c4SAndroid Build Coastguard Worker  *
267*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
268*f81fb7c4SAndroid Build Coastguard Worker  * number of samples actually written to buffer
269*f81fb7c4SAndroid Build Coastguard Worker  *
270*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
271*f81fb7c4SAndroid Build Coastguard Worker  * - samples are added to the presently free buffer
272*f81fb7c4SAndroid Build Coastguard Worker  *
273*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
274*f81fb7c4SAndroid Build Coastguard Worker */
ReverbProcess(EAS_VOID_PTR pInstData,EAS_PCM * pSrc,EAS_PCM * pDst,EAS_I32 numSamples)275*f81fb7c4SAndroid Build Coastguard Worker static void ReverbProcess(EAS_VOID_PTR pInstData, EAS_PCM *pSrc, EAS_PCM *pDst, EAS_I32 numSamples)
276*f81fb7c4SAndroid Build Coastguard Worker {
277*f81fb7c4SAndroid Build Coastguard Worker     S_REVERB_OBJECT *pReverbData;
278*f81fb7c4SAndroid Build Coastguard Worker 
279*f81fb7c4SAndroid Build Coastguard Worker     pReverbData = (S_REVERB_OBJECT*) pInstData;
280*f81fb7c4SAndroid Build Coastguard Worker 
281*f81fb7c4SAndroid Build Coastguard Worker     //if bypassed or the preset forces the signal to be completely dry
282*f81fb7c4SAndroid Build Coastguard Worker     if (pReverbData->m_bBypass ||
283*f81fb7c4SAndroid Build Coastguard Worker         (pReverbData->m_nWet == 0 && pReverbData->m_nDry == 32767))
284*f81fb7c4SAndroid Build Coastguard Worker     {
285*f81fb7c4SAndroid Build Coastguard Worker         if (pSrc != pDst)
286*f81fb7c4SAndroid Build Coastguard Worker             EAS_HWMemCpy(pSrc, pDst, numSamples * NUM_OUTPUT_CHANNELS * (EAS_I32) sizeof(EAS_PCM));
287*f81fb7c4SAndroid Build Coastguard Worker         return;
288*f81fb7c4SAndroid Build Coastguard Worker     }
289*f81fb7c4SAndroid Build Coastguard Worker 
290*f81fb7c4SAndroid Build Coastguard Worker     if (pReverbData->m_nNextRoom != pReverbData->m_nCurrentRoom)
291*f81fb7c4SAndroid Build Coastguard Worker     {
292*f81fb7c4SAndroid Build Coastguard Worker         ReverbUpdateRoom(pReverbData);
293*f81fb7c4SAndroid Build Coastguard Worker     }
294*f81fb7c4SAndroid Build Coastguard Worker 
295*f81fb7c4SAndroid Build Coastguard Worker     ReverbUpdateXfade(pReverbData, numSamples);
296*f81fb7c4SAndroid Build Coastguard Worker 
297*f81fb7c4SAndroid Build Coastguard Worker     Reverb(pReverbData, numSamples, pDst, pSrc);
298*f81fb7c4SAndroid Build Coastguard Worker 
299*f81fb7c4SAndroid Build Coastguard Worker     /* check if update counter needs to be reset */
300*f81fb7c4SAndroid Build Coastguard Worker     if (pReverbData->m_nUpdateCounter >= REVERB_MODULO_UPDATE_PERIOD_IN_SAMPLES)
301*f81fb7c4SAndroid Build Coastguard Worker     {
302*f81fb7c4SAndroid Build Coastguard Worker         /* update interval has elapsed, so reset counter */
303*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_nUpdateCounter = 0;
304*f81fb7c4SAndroid Build Coastguard Worker     }   /* end if m_nUpdateCounter >= update interval */
305*f81fb7c4SAndroid Build Coastguard Worker 
306*f81fb7c4SAndroid Build Coastguard Worker     /* increment update counter */
307*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nUpdateCounter += (EAS_I16)numSamples;
308*f81fb7c4SAndroid Build Coastguard Worker 
309*f81fb7c4SAndroid Build Coastguard Worker }   /* end ComputeReverb */
310*f81fb7c4SAndroid Build Coastguard Worker 
311*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
312*f81fb7c4SAndroid Build Coastguard Worker  * ReverbUpdateXfade
313*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
314*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
315*f81fb7c4SAndroid Build Coastguard Worker  * Update the xfade parameters as required
316*f81fb7c4SAndroid Build Coastguard Worker  *
317*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
318*f81fb7c4SAndroid Build Coastguard Worker  * nNumSamplesToAdd - number of samples to write to buffer
319*f81fb7c4SAndroid Build Coastguard Worker  *
320*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
321*f81fb7c4SAndroid Build Coastguard Worker  *
322*f81fb7c4SAndroid Build Coastguard Worker  *
323*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
324*f81fb7c4SAndroid Build Coastguard Worker  * - xfade parameters will be changed
325*f81fb7c4SAndroid Build Coastguard Worker  *
326*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
327*f81fb7c4SAndroid Build Coastguard Worker */
ReverbUpdateXfade(S_REVERB_OBJECT * pReverbData,EAS_INT nNumSamplesToAdd)328*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbUpdateXfade(S_REVERB_OBJECT *pReverbData, EAS_INT nNumSamplesToAdd)
329*f81fb7c4SAndroid Build Coastguard Worker {
330*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16 nOffset;
331*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16 tempCos;
332*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16 tempSin;
333*f81fb7c4SAndroid Build Coastguard Worker 
334*f81fb7c4SAndroid Build Coastguard Worker     if (pReverbData->m_nXfadeCounter >= pReverbData->m_nXfadeInterval)
335*f81fb7c4SAndroid Build Coastguard Worker     {
336*f81fb7c4SAndroid Build Coastguard Worker         /* update interval has elapsed, so reset counter */
337*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_nXfadeCounter = 0;
338*f81fb7c4SAndroid Build Coastguard Worker 
339*f81fb7c4SAndroid Build Coastguard Worker         // Pin the sin,cos values to min / max values to ensure that the
340*f81fb7c4SAndroid Build Coastguard Worker         // modulated taps' coefs are zero (thus no clicks)
341*f81fb7c4SAndroid Build Coastguard Worker         if (pReverbData->m_nPhaseIncrement > 0)
342*f81fb7c4SAndroid Build Coastguard Worker         {
343*f81fb7c4SAndroid Build Coastguard Worker             // if phase increment > 0, then sin -> 1, cos -> 0
344*f81fb7c4SAndroid Build Coastguard Worker             pReverbData->m_nSin = 32767;
345*f81fb7c4SAndroid Build Coastguard Worker             pReverbData->m_nCos = 0;
346*f81fb7c4SAndroid Build Coastguard Worker 
347*f81fb7c4SAndroid Build Coastguard Worker             // reset the phase to match the sin, cos values
348*f81fb7c4SAndroid Build Coastguard Worker             pReverbData->m_nPhase = 32767;
349*f81fb7c4SAndroid Build Coastguard Worker 
350*f81fb7c4SAndroid Build Coastguard Worker             // modulate the cross taps because their tap coefs are zero
351*f81fb7c4SAndroid Build Coastguard Worker             nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion, &pReverbData->m_nNoise );
352*f81fb7c4SAndroid Build Coastguard Worker 
353*f81fb7c4SAndroid Build Coastguard Worker             pReverbData->m_zD1Cross =
354*f81fb7c4SAndroid Build Coastguard Worker                 DELAY1_OUT - pReverbData->m_nMaxExcursion + nOffset;
355*f81fb7c4SAndroid Build Coastguard Worker 
356*f81fb7c4SAndroid Build Coastguard Worker             nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion, &pReverbData->m_nNoise );
357*f81fb7c4SAndroid Build Coastguard Worker 
358*f81fb7c4SAndroid Build Coastguard Worker             pReverbData->m_zD0Cross =
359*f81fb7c4SAndroid Build Coastguard Worker                 DELAY0_OUT - pReverbData->m_nMaxExcursion - nOffset;
360*f81fb7c4SAndroid Build Coastguard Worker         }
361*f81fb7c4SAndroid Build Coastguard Worker         else
362*f81fb7c4SAndroid Build Coastguard Worker         {
363*f81fb7c4SAndroid Build Coastguard Worker             // if phase increment < 0, then sin -> 0, cos -> 1
364*f81fb7c4SAndroid Build Coastguard Worker             pReverbData->m_nSin = 0;
365*f81fb7c4SAndroid Build Coastguard Worker             pReverbData->m_nCos = 32767;
366*f81fb7c4SAndroid Build Coastguard Worker 
367*f81fb7c4SAndroid Build Coastguard Worker             // reset the phase to match the sin, cos values
368*f81fb7c4SAndroid Build Coastguard Worker             pReverbData->m_nPhase = -32768;
369*f81fb7c4SAndroid Build Coastguard Worker 
370*f81fb7c4SAndroid Build Coastguard Worker             // modulate the self taps because their tap coefs are zero
371*f81fb7c4SAndroid Build Coastguard Worker             nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion, &pReverbData->m_nNoise );
372*f81fb7c4SAndroid Build Coastguard Worker 
373*f81fb7c4SAndroid Build Coastguard Worker             pReverbData->m_zD0Self  =
374*f81fb7c4SAndroid Build Coastguard Worker                 DELAY0_OUT - pReverbData->m_nMaxExcursion - nOffset;
375*f81fb7c4SAndroid Build Coastguard Worker 
376*f81fb7c4SAndroid Build Coastguard Worker             nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion, &pReverbData->m_nNoise );
377*f81fb7c4SAndroid Build Coastguard Worker 
378*f81fb7c4SAndroid Build Coastguard Worker             pReverbData->m_zD1Self  =
379*f81fb7c4SAndroid Build Coastguard Worker                 DELAY1_OUT - pReverbData->m_nMaxExcursion + nOffset;
380*f81fb7c4SAndroid Build Coastguard Worker 
381*f81fb7c4SAndroid Build Coastguard Worker         }   // end if-else (pReverbData->m_nPhaseIncrement > 0)
382*f81fb7c4SAndroid Build Coastguard Worker 
383*f81fb7c4SAndroid Build Coastguard Worker         // Reverse the direction of the sin,cos so that the
384*f81fb7c4SAndroid Build Coastguard Worker         // tap whose coef was previously increasing now decreases
385*f81fb7c4SAndroid Build Coastguard Worker         // and vice versa
386*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_nPhaseIncrement = -pReverbData->m_nPhaseIncrement;
387*f81fb7c4SAndroid Build Coastguard Worker 
388*f81fb7c4SAndroid Build Coastguard Worker     }   // end if counter >= update interval
389*f81fb7c4SAndroid Build Coastguard Worker 
390*f81fb7c4SAndroid Build Coastguard Worker     //compute what phase will be next time
391*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nPhase += pReverbData->m_nPhaseIncrement;
392*f81fb7c4SAndroid Build Coastguard Worker 
393*f81fb7c4SAndroid Build Coastguard Worker     //calculate what the new sin and cos need to reach by the next update
394*f81fb7c4SAndroid Build Coastguard Worker     ReverbCalculateSinCos(pReverbData->m_nPhase, &tempSin, &tempCos);
395*f81fb7c4SAndroid Build Coastguard Worker 
396*f81fb7c4SAndroid Build Coastguard Worker     //calculate the per-sample increment required to get there by the next update
397*f81fb7c4SAndroid Build Coastguard Worker     /*lint -e{702} shift for performance */
398*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nSinIncrement =
399*f81fb7c4SAndroid Build Coastguard Worker             (tempSin - pReverbData->m_nSin) >> REVERB_UPDATE_PERIOD_IN_BITS;
400*f81fb7c4SAndroid Build Coastguard Worker 
401*f81fb7c4SAndroid Build Coastguard Worker     /*lint -e{702} shift for performance */
402*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nCosIncrement =
403*f81fb7c4SAndroid Build Coastguard Worker             (tempCos - pReverbData->m_nCos) >> REVERB_UPDATE_PERIOD_IN_BITS;
404*f81fb7c4SAndroid Build Coastguard Worker 
405*f81fb7c4SAndroid Build Coastguard Worker 
406*f81fb7c4SAndroid Build Coastguard Worker     /* increment update counter */
407*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nXfadeCounter += (EAS_U16) nNumSamplesToAdd;
408*f81fb7c4SAndroid Build Coastguard Worker 
409*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
410*f81fb7c4SAndroid Build Coastguard Worker 
411*f81fb7c4SAndroid Build Coastguard Worker }   /* end ReverbUpdateXfade */
412*f81fb7c4SAndroid Build Coastguard Worker 
413*f81fb7c4SAndroid Build Coastguard Worker 
414*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
415*f81fb7c4SAndroid Build Coastguard Worker  * ReverbCalculateNoise
416*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
417*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
418*f81fb7c4SAndroid Build Coastguard Worker  * Calculate a noise sample and limit its value
419*f81fb7c4SAndroid Build Coastguard Worker  *
420*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
421*f81fb7c4SAndroid Build Coastguard Worker  * nMaxExcursion - noise value is limited to this value
422*f81fb7c4SAndroid Build Coastguard Worker  * pnNoise - return new noise sample in this (not limited)
423*f81fb7c4SAndroid Build Coastguard Worker  *
424*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
425*f81fb7c4SAndroid Build Coastguard Worker  * new limited noise value
426*f81fb7c4SAndroid Build Coastguard Worker  *
427*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
428*f81fb7c4SAndroid Build Coastguard Worker  * - *pnNoise noise value is updated
429*f81fb7c4SAndroid Build Coastguard Worker  *
430*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
431*f81fb7c4SAndroid Build Coastguard Worker */
ReverbCalculateNoise(EAS_U16 nMaxExcursion,EAS_I16 * pnNoise)432*f81fb7c4SAndroid Build Coastguard Worker static EAS_U16 ReverbCalculateNoise(EAS_U16 nMaxExcursion, EAS_I16 *pnNoise)
433*f81fb7c4SAndroid Build Coastguard Worker {
434*f81fb7c4SAndroid Build Coastguard Worker     // calculate new noise value
435*f81fb7c4SAndroid Build Coastguard Worker     *pnNoise = (EAS_I16) (*pnNoise * 5 + 1);
436*f81fb7c4SAndroid Build Coastguard Worker 
437*f81fb7c4SAndroid Build Coastguard Worker #if 0   // 1xxx, test
438*f81fb7c4SAndroid Build Coastguard Worker     *pnNoise = 0;
439*f81fb7c4SAndroid Build Coastguard Worker #endif  // 1xxx, test
440*f81fb7c4SAndroid Build Coastguard Worker 
441*f81fb7c4SAndroid Build Coastguard Worker     // return the limited noise value
442*f81fb7c4SAndroid Build Coastguard Worker     return (nMaxExcursion & (*pnNoise));
443*f81fb7c4SAndroid Build Coastguard Worker 
444*f81fb7c4SAndroid Build Coastguard Worker }   /* end ReverbCalculateNoise */
445*f81fb7c4SAndroid Build Coastguard Worker 
446*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
447*f81fb7c4SAndroid Build Coastguard Worker  * ReverbCalculateSinCos
448*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
449*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
450*f81fb7c4SAndroid Build Coastguard Worker  * Calculate a new sin and cosine value based on the given phase
451*f81fb7c4SAndroid Build Coastguard Worker  *
452*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
453*f81fb7c4SAndroid Build Coastguard Worker  * nPhase   - phase angle
454*f81fb7c4SAndroid Build Coastguard Worker  * pnSin    - input old value, output new value
455*f81fb7c4SAndroid Build Coastguard Worker  * pnCos    - input old value, output new value
456*f81fb7c4SAndroid Build Coastguard Worker  *
457*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
458*f81fb7c4SAndroid Build Coastguard Worker  *
459*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
460*f81fb7c4SAndroid Build Coastguard Worker  * - *pnSin, *pnCos are updated
461*f81fb7c4SAndroid Build Coastguard Worker  *
462*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
463*f81fb7c4SAndroid Build Coastguard Worker */
ReverbCalculateSinCos(EAS_I16 nPhase,EAS_I16 * pnSin,EAS_I16 * pnCos)464*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbCalculateSinCos(EAS_I16 nPhase, EAS_I16 *pnSin, EAS_I16 *pnCos)
465*f81fb7c4SAndroid Build Coastguard Worker {
466*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 nTemp;
467*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 nNetAngle;
468*f81fb7c4SAndroid Build Coastguard Worker 
469*f81fb7c4SAndroid Build Coastguard Worker     //  -1 <=  nPhase  < 1
470*f81fb7c4SAndroid Build Coastguard Worker     // However, for the calculation, we need a value
471*f81fb7c4SAndroid Build Coastguard Worker     // that ranges from -1/2 to +1/2, so divide the phase by 2
472*f81fb7c4SAndroid Build Coastguard Worker     /*lint -e{702} shift for performance */
473*f81fb7c4SAndroid Build Coastguard Worker     nNetAngle = nPhase >> 1;
474*f81fb7c4SAndroid Build Coastguard Worker 
475*f81fb7c4SAndroid Build Coastguard Worker     /*
476*f81fb7c4SAndroid Build Coastguard Worker     Implement the following
477*f81fb7c4SAndroid Build Coastguard Worker     sin(x) = (2-4*c)*x^2 + c + x
478*f81fb7c4SAndroid Build Coastguard Worker     cos(x) = (2-4*c)*x^2 + c - x
479*f81fb7c4SAndroid Build Coastguard Worker 
480*f81fb7c4SAndroid Build Coastguard Worker       where  c = 1/sqrt(2)
481*f81fb7c4SAndroid Build Coastguard Worker     using the a0 + x*(a1 + x*a2) approach
482*f81fb7c4SAndroid Build Coastguard Worker     */
483*f81fb7c4SAndroid Build Coastguard Worker 
484*f81fb7c4SAndroid Build Coastguard Worker     /* limit the input "angle" to be between -0.5 and +0.5 */
485*f81fb7c4SAndroid Build Coastguard Worker     if (nNetAngle > EG1_HALF)
486*f81fb7c4SAndroid Build Coastguard Worker     {
487*f81fb7c4SAndroid Build Coastguard Worker         nNetAngle = EG1_HALF;
488*f81fb7c4SAndroid Build Coastguard Worker     }
489*f81fb7c4SAndroid Build Coastguard Worker     else if (nNetAngle < EG1_MINUS_HALF)
490*f81fb7c4SAndroid Build Coastguard Worker     {
491*f81fb7c4SAndroid Build Coastguard Worker         nNetAngle = EG1_MINUS_HALF;
492*f81fb7c4SAndroid Build Coastguard Worker     }
493*f81fb7c4SAndroid Build Coastguard Worker 
494*f81fb7c4SAndroid Build Coastguard Worker     /* calculate sin */
495*f81fb7c4SAndroid Build Coastguard Worker     nTemp = EG1_ONE + MULT_EG1_EG1(REVERB_PAN_G2, nNetAngle);
496*f81fb7c4SAndroid Build Coastguard Worker     nTemp = REVERB_PAN_G0 + MULT_EG1_EG1(nTemp, nNetAngle);
497*f81fb7c4SAndroid Build Coastguard Worker     *pnSin = (EAS_I16) SATURATE_EG1(nTemp);
498*f81fb7c4SAndroid Build Coastguard Worker 
499*f81fb7c4SAndroid Build Coastguard Worker     /* calculate cos */
500*f81fb7c4SAndroid Build Coastguard Worker     nTemp = -EG1_ONE + MULT_EG1_EG1(REVERB_PAN_G2, nNetAngle);
501*f81fb7c4SAndroid Build Coastguard Worker     nTemp = REVERB_PAN_G0 + MULT_EG1_EG1(nTemp, nNetAngle);
502*f81fb7c4SAndroid Build Coastguard Worker     *pnCos = (EAS_I16) SATURATE_EG1(nTemp);
503*f81fb7c4SAndroid Build Coastguard Worker 
504*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
505*f81fb7c4SAndroid Build Coastguard Worker }   /* end ReverbCalculateSinCos */
506*f81fb7c4SAndroid Build Coastguard Worker 
507*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
508*f81fb7c4SAndroid Build Coastguard Worker  * Reverb
509*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
510*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
511*f81fb7c4SAndroid Build Coastguard Worker  * apply reverb to the given signal
512*f81fb7c4SAndroid Build Coastguard Worker  *
513*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
514*f81fb7c4SAndroid Build Coastguard Worker  * nNu
515*f81fb7c4SAndroid Build Coastguard Worker  * pnSin    - input old value, output new value
516*f81fb7c4SAndroid Build Coastguard Worker  * pnCos    - input old value, output new value
517*f81fb7c4SAndroid Build Coastguard Worker  *
518*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
519*f81fb7c4SAndroid Build Coastguard Worker  * number of samples actually reverberated
520*f81fb7c4SAndroid Build Coastguard Worker  *
521*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
522*f81fb7c4SAndroid Build Coastguard Worker  *
523*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
524*f81fb7c4SAndroid Build Coastguard Worker */
Reverb(S_REVERB_OBJECT * pReverbData,EAS_INT nNumSamplesToAdd,EAS_PCM * pOutputBuffer,EAS_PCM * pInputBuffer)525*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Reverb(S_REVERB_OBJECT *pReverbData, EAS_INT nNumSamplesToAdd, EAS_PCM *pOutputBuffer, EAS_PCM *pInputBuffer)
526*f81fb7c4SAndroid Build Coastguard Worker {
527*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 i;
528*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 nDelayOut;
529*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16 nBase;
530*f81fb7c4SAndroid Build Coastguard Worker 
531*f81fb7c4SAndroid Build Coastguard Worker     EAS_U32 nAddr;
532*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 nTemp1;
533*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 nTemp2;
534*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 nApIn;
535*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 nApOut;
536*f81fb7c4SAndroid Build Coastguard Worker 
537*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 j;
538*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 nEarlyOut;
539*f81fb7c4SAndroid Build Coastguard Worker 
540*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 tempValue;
541*f81fb7c4SAndroid Build Coastguard Worker 
542*f81fb7c4SAndroid Build Coastguard Worker 
543*f81fb7c4SAndroid Build Coastguard Worker     // get the base address
544*f81fb7c4SAndroid Build Coastguard Worker     nBase = pReverbData->m_nBaseIndex;
545*f81fb7c4SAndroid Build Coastguard Worker 
546*f81fb7c4SAndroid Build Coastguard Worker     for (i=0; i < nNumSamplesToAdd; i++)
547*f81fb7c4SAndroid Build Coastguard Worker     {
548*f81fb7c4SAndroid Build Coastguard Worker         // ********** Left Allpass - start
549*f81fb7c4SAndroid Build Coastguard Worker         // left input = (left dry/4) + right feedback from previous period
550*f81fb7c4SAndroid Build Coastguard Worker         /*lint -e{702} use shift for performance */
551*f81fb7c4SAndroid Build Coastguard Worker         nApIn = ((*pInputBuffer++)>>2) + pReverbData->m_nRevOutFbkR;
552*f81fb7c4SAndroid Build Coastguard Worker //      nApIn = *pInputBuffer++;    // 1xxx test and debug ap
553*f81fb7c4SAndroid Build Coastguard Worker 
554*f81fb7c4SAndroid Build Coastguard Worker         // fetch allpass delay line out
555*f81fb7c4SAndroid Build Coastguard Worker         //nAddr = CIRCULAR(nBase, psAp0->m_zApOut, REVERB_BUFFER_MASK);
556*f81fb7c4SAndroid Build Coastguard Worker         nAddr = CIRCULAR(nBase, pReverbData->m_sAp0.m_zApOut, REVERB_BUFFER_MASK);
557*f81fb7c4SAndroid Build Coastguard Worker         nDelayOut = pReverbData->m_nDelayLine[nAddr];
558*f81fb7c4SAndroid Build Coastguard Worker 
559*f81fb7c4SAndroid Build Coastguard Worker         // calculate allpass feedforward; subtract the feedforward result
560*f81fb7c4SAndroid Build Coastguard Worker         nTemp1 = MULT_EG1_EG1(nApIn, pReverbData->m_sAp0.m_nApGain);
561*f81fb7c4SAndroid Build Coastguard Worker         nApOut = SATURATE(nDelayOut - nTemp1);          // allpass output
562*f81fb7c4SAndroid Build Coastguard Worker 
563*f81fb7c4SAndroid Build Coastguard Worker         // calculate allpass feedback; add the feedback result
564*f81fb7c4SAndroid Build Coastguard Worker         nTemp1 = MULT_EG1_EG1(nApOut, pReverbData->m_sAp0.m_nApGain);
565*f81fb7c4SAndroid Build Coastguard Worker         nTemp1 = SATURATE(nApIn + nTemp1);
566*f81fb7c4SAndroid Build Coastguard Worker 
567*f81fb7c4SAndroid Build Coastguard Worker         // inject into allpass delay
568*f81fb7c4SAndroid Build Coastguard Worker         nAddr = CIRCULAR(nBase, pReverbData->m_sAp0.m_zApIn, REVERB_BUFFER_MASK);
569*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_nDelayLine[nAddr] = (EAS_PCM) nTemp1;
570*f81fb7c4SAndroid Build Coastguard Worker 
571*f81fb7c4SAndroid Build Coastguard Worker         // inject allpass output into delay line
572*f81fb7c4SAndroid Build Coastguard Worker         nAddr = CIRCULAR(nBase, pReverbData->m_zD0In, REVERB_BUFFER_MASK);
573*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_nDelayLine[nAddr] = (EAS_PCM) nApOut;
574*f81fb7c4SAndroid Build Coastguard Worker 
575*f81fb7c4SAndroid Build Coastguard Worker         // ********** Left Allpass - end
576*f81fb7c4SAndroid Build Coastguard Worker 
577*f81fb7c4SAndroid Build Coastguard Worker         // ********** Right Allpass - start
578*f81fb7c4SAndroid Build Coastguard Worker         // right input = (right dry/4) + left feedback from previous period
579*f81fb7c4SAndroid Build Coastguard Worker         /*lint -e{702} use shift for performance */
580*f81fb7c4SAndroid Build Coastguard Worker         nApIn = ((*pInputBuffer++)>>2) + pReverbData->m_nRevOutFbkL;
581*f81fb7c4SAndroid Build Coastguard Worker //      nApIn = *pInputBuffer++;    // 1xxx test and debug ap
582*f81fb7c4SAndroid Build Coastguard Worker 
583*f81fb7c4SAndroid Build Coastguard Worker         // fetch allpass delay line out
584*f81fb7c4SAndroid Build Coastguard Worker         nAddr = CIRCULAR(nBase, pReverbData->m_sAp1.m_zApOut, REVERB_BUFFER_MASK);
585*f81fb7c4SAndroid Build Coastguard Worker         nDelayOut = pReverbData->m_nDelayLine[nAddr];
586*f81fb7c4SAndroid Build Coastguard Worker 
587*f81fb7c4SAndroid Build Coastguard Worker         // calculate allpass feedforward; subtract the feedforward result
588*f81fb7c4SAndroid Build Coastguard Worker         nTemp1 = MULT_EG1_EG1(nApIn, pReverbData->m_sAp1.m_nApGain);
589*f81fb7c4SAndroid Build Coastguard Worker         nApOut = SATURATE(nDelayOut - nTemp1);          // allpass output
590*f81fb7c4SAndroid Build Coastguard Worker 
591*f81fb7c4SAndroid Build Coastguard Worker         // calculate allpass feedback; add the feedback result
592*f81fb7c4SAndroid Build Coastguard Worker         nTemp1 = MULT_EG1_EG1(nApOut, pReverbData->m_sAp1.m_nApGain);
593*f81fb7c4SAndroid Build Coastguard Worker         nTemp1 = SATURATE(nApIn + nTemp1);
594*f81fb7c4SAndroid Build Coastguard Worker 
595*f81fb7c4SAndroid Build Coastguard Worker         // inject into allpass delay
596*f81fb7c4SAndroid Build Coastguard Worker         nAddr = CIRCULAR(nBase, pReverbData->m_sAp1.m_zApIn, REVERB_BUFFER_MASK);
597*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_nDelayLine[nAddr] = (EAS_PCM) nTemp1;
598*f81fb7c4SAndroid Build Coastguard Worker 
599*f81fb7c4SAndroid Build Coastguard Worker         // inject allpass output into delay line
600*f81fb7c4SAndroid Build Coastguard Worker         nAddr = CIRCULAR(nBase, pReverbData->m_zD1In, REVERB_BUFFER_MASK);
601*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_nDelayLine[nAddr] = (EAS_PCM) nApOut;
602*f81fb7c4SAndroid Build Coastguard Worker 
603*f81fb7c4SAndroid Build Coastguard Worker         // ********** Right Allpass - end
604*f81fb7c4SAndroid Build Coastguard Worker 
605*f81fb7c4SAndroid Build Coastguard Worker         // ********** D0 output - start
606*f81fb7c4SAndroid Build Coastguard Worker         // fetch delay line self out
607*f81fb7c4SAndroid Build Coastguard Worker         nAddr = CIRCULAR(nBase, pReverbData->m_zD0Self, REVERB_BUFFER_MASK);
608*f81fb7c4SAndroid Build Coastguard Worker         nDelayOut = pReverbData->m_nDelayLine[nAddr];
609*f81fb7c4SAndroid Build Coastguard Worker 
610*f81fb7c4SAndroid Build Coastguard Worker         // calculate delay line self out
611*f81fb7c4SAndroid Build Coastguard Worker         nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nSin);
612*f81fb7c4SAndroid Build Coastguard Worker 
613*f81fb7c4SAndroid Build Coastguard Worker         // fetch delay line cross out
614*f81fb7c4SAndroid Build Coastguard Worker         nAddr = CIRCULAR(nBase, pReverbData->m_zD1Cross, REVERB_BUFFER_MASK);
615*f81fb7c4SAndroid Build Coastguard Worker         nDelayOut = pReverbData->m_nDelayLine[nAddr];
616*f81fb7c4SAndroid Build Coastguard Worker 
617*f81fb7c4SAndroid Build Coastguard Worker         // calculate delay line self out
618*f81fb7c4SAndroid Build Coastguard Worker         nTemp2 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nCos);
619*f81fb7c4SAndroid Build Coastguard Worker 
620*f81fb7c4SAndroid Build Coastguard Worker         // calculate unfiltered delay out
621*f81fb7c4SAndroid Build Coastguard Worker         nDelayOut = SATURATE(nTemp1 + nTemp2);
622*f81fb7c4SAndroid Build Coastguard Worker 
623*f81fb7c4SAndroid Build Coastguard Worker         // calculate lowpass filter (mixer scale factor included in LPF feedforward)
624*f81fb7c4SAndroid Build Coastguard Worker         nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nLpfFwd);
625*f81fb7c4SAndroid Build Coastguard Worker 
626*f81fb7c4SAndroid Build Coastguard Worker         nTemp2 = MULT_EG1_EG1(pReverbData->m_zLpf0, pReverbData->m_nLpfFbk);
627*f81fb7c4SAndroid Build Coastguard Worker 
628*f81fb7c4SAndroid Build Coastguard Worker         // calculate filtered delay out and simultaneously update LPF state variable
629*f81fb7c4SAndroid Build Coastguard Worker         // filtered delay output is stored in m_zLpf0
630*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_zLpf0 = (EAS_PCM) SATURATE(nTemp1 + nTemp2);
631*f81fb7c4SAndroid Build Coastguard Worker 
632*f81fb7c4SAndroid Build Coastguard Worker         // ********** D0 output - end
633*f81fb7c4SAndroid Build Coastguard Worker 
634*f81fb7c4SAndroid Build Coastguard Worker         // ********** D1 output - start
635*f81fb7c4SAndroid Build Coastguard Worker         // fetch delay line self out
636*f81fb7c4SAndroid Build Coastguard Worker         nAddr = CIRCULAR(nBase, pReverbData->m_zD1Self, REVERB_BUFFER_MASK);
637*f81fb7c4SAndroid Build Coastguard Worker         nDelayOut = pReverbData->m_nDelayLine[nAddr];
638*f81fb7c4SAndroid Build Coastguard Worker 
639*f81fb7c4SAndroid Build Coastguard Worker         // calculate delay line self out
640*f81fb7c4SAndroid Build Coastguard Worker         nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nSin);
641*f81fb7c4SAndroid Build Coastguard Worker 
642*f81fb7c4SAndroid Build Coastguard Worker         // fetch delay line cross out
643*f81fb7c4SAndroid Build Coastguard Worker         nAddr = CIRCULAR(nBase, pReverbData->m_zD0Cross, REVERB_BUFFER_MASK);
644*f81fb7c4SAndroid Build Coastguard Worker         nDelayOut = pReverbData->m_nDelayLine[nAddr];
645*f81fb7c4SAndroid Build Coastguard Worker 
646*f81fb7c4SAndroid Build Coastguard Worker         // calculate delay line self out
647*f81fb7c4SAndroid Build Coastguard Worker         nTemp2 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nCos);
648*f81fb7c4SAndroid Build Coastguard Worker 
649*f81fb7c4SAndroid Build Coastguard Worker         // calculate unfiltered delay out
650*f81fb7c4SAndroid Build Coastguard Worker         nDelayOut = SATURATE(nTemp1 + nTemp2);
651*f81fb7c4SAndroid Build Coastguard Worker 
652*f81fb7c4SAndroid Build Coastguard Worker         // calculate lowpass filter (mixer scale factor included in LPF feedforward)
653*f81fb7c4SAndroid Build Coastguard Worker         nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nLpfFwd);
654*f81fb7c4SAndroid Build Coastguard Worker 
655*f81fb7c4SAndroid Build Coastguard Worker         nTemp2 = MULT_EG1_EG1(pReverbData->m_zLpf1, pReverbData->m_nLpfFbk);
656*f81fb7c4SAndroid Build Coastguard Worker 
657*f81fb7c4SAndroid Build Coastguard Worker         // calculate filtered delay out and simultaneously update LPF state variable
658*f81fb7c4SAndroid Build Coastguard Worker         // filtered delay output is stored in m_zLpf1
659*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_zLpf1 = (EAS_PCM)SATURATE(nTemp1 + nTemp2);
660*f81fb7c4SAndroid Build Coastguard Worker 
661*f81fb7c4SAndroid Build Coastguard Worker         // ********** D1 output - end
662*f81fb7c4SAndroid Build Coastguard Worker 
663*f81fb7c4SAndroid Build Coastguard Worker         // ********** mixer and feedback - start
664*f81fb7c4SAndroid Build Coastguard Worker         // sum is fedback to right input (R + L)
665*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_nRevOutFbkL =
666*f81fb7c4SAndroid Build Coastguard Worker             (EAS_PCM)SATURATE((EAS_I32)pReverbData->m_zLpf1 + (EAS_I32)pReverbData->m_zLpf0);
667*f81fb7c4SAndroid Build Coastguard Worker 
668*f81fb7c4SAndroid Build Coastguard Worker         // difference is feedback to left input (R - L)
669*f81fb7c4SAndroid Build Coastguard Worker         /*lint -e{685} lint complains that it can't saturate negative */
670*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_nRevOutFbkR =
671*f81fb7c4SAndroid Build Coastguard Worker             (EAS_PCM)SATURATE((EAS_I32)pReverbData->m_zLpf1 - (EAS_I32)pReverbData->m_zLpf0);
672*f81fb7c4SAndroid Build Coastguard Worker 
673*f81fb7c4SAndroid Build Coastguard Worker         // ********** mixer and feedback - end
674*f81fb7c4SAndroid Build Coastguard Worker 
675*f81fb7c4SAndroid Build Coastguard Worker         // ********** start early reflection generator, left
676*f81fb7c4SAndroid Build Coastguard Worker         //psEarly = &(pReverbData->m_sEarlyL);
677*f81fb7c4SAndroid Build Coastguard Worker 
678*f81fb7c4SAndroid Build Coastguard Worker         nEarlyOut = 0;
679*f81fb7c4SAndroid Build Coastguard Worker 
680*f81fb7c4SAndroid Build Coastguard Worker         for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++)
681*f81fb7c4SAndroid Build Coastguard Worker         {
682*f81fb7c4SAndroid Build Coastguard Worker             // fetch delay line out
683*f81fb7c4SAndroid Build Coastguard Worker             //nAddr = CIRCULAR(nBase, psEarly->m_zDelay[j], REVERB_BUFFER_MASK);
684*f81fb7c4SAndroid Build Coastguard Worker             nAddr = CIRCULAR(nBase, pReverbData->m_sEarlyL.m_zDelay[j], REVERB_BUFFER_MASK);
685*f81fb7c4SAndroid Build Coastguard Worker 
686*f81fb7c4SAndroid Build Coastguard Worker             nDelayOut = pReverbData->m_nDelayLine[nAddr];
687*f81fb7c4SAndroid Build Coastguard Worker 
688*f81fb7c4SAndroid Build Coastguard Worker             // calculate reflection
689*f81fb7c4SAndroid Build Coastguard Worker             //nTemp1 = MULT_EG1_EG1(nDelayOut, psEarly->m_nGain[j]);
690*f81fb7c4SAndroid Build Coastguard Worker             nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_sEarlyL.m_nGain[j]);
691*f81fb7c4SAndroid Build Coastguard Worker 
692*f81fb7c4SAndroid Build Coastguard Worker             nEarlyOut = SATURATE(nEarlyOut + nTemp1);
693*f81fb7c4SAndroid Build Coastguard Worker 
694*f81fb7c4SAndroid Build Coastguard Worker         }   // end for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++)
695*f81fb7c4SAndroid Build Coastguard Worker 
696*f81fb7c4SAndroid Build Coastguard Worker         // apply lowpass to early reflections
697*f81fb7c4SAndroid Build Coastguard Worker         //nTemp1 = MULT_EG1_EG1(nEarlyOut, psEarly->m_nLpfFwd);
698*f81fb7c4SAndroid Build Coastguard Worker         nTemp1 = MULT_EG1_EG1(nEarlyOut, pReverbData->m_sEarlyL.m_nLpfFwd);
699*f81fb7c4SAndroid Build Coastguard Worker 
700*f81fb7c4SAndroid Build Coastguard Worker         //nTemp2 = MULT_EG1_EG1(psEarly->m_zLpf, psEarly->m_nLpfFbk);
701*f81fb7c4SAndroid Build Coastguard Worker         nTemp2 = MULT_EG1_EG1(pReverbData->m_sEarlyL.m_zLpf, pReverbData->m_sEarlyL.m_nLpfFbk);
702*f81fb7c4SAndroid Build Coastguard Worker 
703*f81fb7c4SAndroid Build Coastguard Worker 
704*f81fb7c4SAndroid Build Coastguard Worker         // calculate filtered out and simultaneously update LPF state variable
705*f81fb7c4SAndroid Build Coastguard Worker         // filtered output is stored in m_zLpf1
706*f81fb7c4SAndroid Build Coastguard Worker         //psEarly->m_zLpf = SATURATE(nTemp1 + nTemp2);
707*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_sEarlyL.m_zLpf = (EAS_PCM) SATURATE(nTemp1 + nTemp2);
708*f81fb7c4SAndroid Build Coastguard Worker 
709*f81fb7c4SAndroid Build Coastguard Worker         // combine filtered early and late reflections for output
710*f81fb7c4SAndroid Build Coastguard Worker         //*pOutputBuffer++ = inL;
711*f81fb7c4SAndroid Build Coastguard Worker         //tempValue = SATURATE(psEarly->m_zLpf + pReverbData->m_nRevOutFbkL);
712*f81fb7c4SAndroid Build Coastguard Worker         tempValue = SATURATE((EAS_I32)pReverbData->m_sEarlyL.m_zLpf + (EAS_I32)pReverbData->m_nRevOutFbkL);
713*f81fb7c4SAndroid Build Coastguard Worker         //scale reverb output by wet level
714*f81fb7c4SAndroid Build Coastguard Worker         /*lint -e{701} use shift for performance */
715*f81fb7c4SAndroid Build Coastguard Worker         tempValue = MULT_EG1_EG1(tempValue, (pReverbData->m_nWet<<1));
716*f81fb7c4SAndroid Build Coastguard Worker         //sum with output buffer
717*f81fb7c4SAndroid Build Coastguard Worker         tempValue += *pOutputBuffer;
718*f81fb7c4SAndroid Build Coastguard Worker         *pOutputBuffer++ = (EAS_PCM)SATURATE(tempValue);
719*f81fb7c4SAndroid Build Coastguard Worker 
720*f81fb7c4SAndroid Build Coastguard Worker         // ********** end early reflection generator, left
721*f81fb7c4SAndroid Build Coastguard Worker 
722*f81fb7c4SAndroid Build Coastguard Worker         // ********** start early reflection generator, right
723*f81fb7c4SAndroid Build Coastguard Worker         //psEarly = &(pReverbData->m_sEarlyR);
724*f81fb7c4SAndroid Build Coastguard Worker 
725*f81fb7c4SAndroid Build Coastguard Worker         nEarlyOut = 0;
726*f81fb7c4SAndroid Build Coastguard Worker 
727*f81fb7c4SAndroid Build Coastguard Worker         for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++)
728*f81fb7c4SAndroid Build Coastguard Worker         {
729*f81fb7c4SAndroid Build Coastguard Worker             // fetch delay line out
730*f81fb7c4SAndroid Build Coastguard Worker             nAddr = CIRCULAR(nBase, pReverbData->m_sEarlyR.m_zDelay[j], REVERB_BUFFER_MASK);
731*f81fb7c4SAndroid Build Coastguard Worker             nDelayOut = pReverbData->m_nDelayLine[nAddr];
732*f81fb7c4SAndroid Build Coastguard Worker 
733*f81fb7c4SAndroid Build Coastguard Worker             // calculate reflection
734*f81fb7c4SAndroid Build Coastguard Worker             nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_sEarlyR.m_nGain[j]);
735*f81fb7c4SAndroid Build Coastguard Worker 
736*f81fb7c4SAndroid Build Coastguard Worker             nEarlyOut = SATURATE(nEarlyOut + nTemp1);
737*f81fb7c4SAndroid Build Coastguard Worker 
738*f81fb7c4SAndroid Build Coastguard Worker         }   // end for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++)
739*f81fb7c4SAndroid Build Coastguard Worker 
740*f81fb7c4SAndroid Build Coastguard Worker         // apply lowpass to early reflections
741*f81fb7c4SAndroid Build Coastguard Worker         nTemp1 = MULT_EG1_EG1(nEarlyOut, pReverbData->m_sEarlyR.m_nLpfFwd);
742*f81fb7c4SAndroid Build Coastguard Worker 
743*f81fb7c4SAndroid Build Coastguard Worker         nTemp2 = MULT_EG1_EG1(pReverbData->m_sEarlyR.m_zLpf, pReverbData->m_sEarlyR.m_nLpfFbk);
744*f81fb7c4SAndroid Build Coastguard Worker 
745*f81fb7c4SAndroid Build Coastguard Worker         // calculate filtered out and simultaneously update LPF state variable
746*f81fb7c4SAndroid Build Coastguard Worker         // filtered output is stored in m_zLpf1
747*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_sEarlyR.m_zLpf = (EAS_PCM)SATURATE(nTemp1 + nTemp2);
748*f81fb7c4SAndroid Build Coastguard Worker 
749*f81fb7c4SAndroid Build Coastguard Worker         // combine filtered early and late reflections for output
750*f81fb7c4SAndroid Build Coastguard Worker         //*pOutputBuffer++ = inR;
751*f81fb7c4SAndroid Build Coastguard Worker         tempValue = SATURATE((EAS_I32)pReverbData->m_sEarlyR.m_zLpf + (EAS_I32)pReverbData->m_nRevOutFbkR);
752*f81fb7c4SAndroid Build Coastguard Worker         //scale reverb output by wet level
753*f81fb7c4SAndroid Build Coastguard Worker         /*lint -e{701} use shift for performance */
754*f81fb7c4SAndroid Build Coastguard Worker         tempValue = MULT_EG1_EG1(tempValue, (pReverbData->m_nWet << 1));
755*f81fb7c4SAndroid Build Coastguard Worker         //sum with output buffer
756*f81fb7c4SAndroid Build Coastguard Worker         tempValue = tempValue + *pOutputBuffer;
757*f81fb7c4SAndroid Build Coastguard Worker         *pOutputBuffer++ = (EAS_PCM)SATURATE(tempValue);
758*f81fb7c4SAndroid Build Coastguard Worker 
759*f81fb7c4SAndroid Build Coastguard Worker         // ********** end early reflection generator, right
760*f81fb7c4SAndroid Build Coastguard Worker 
761*f81fb7c4SAndroid Build Coastguard Worker         // decrement base addr for next sample period
762*f81fb7c4SAndroid Build Coastguard Worker         nBase--;
763*f81fb7c4SAndroid Build Coastguard Worker 
764*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_nSin += pReverbData->m_nSinIncrement;
765*f81fb7c4SAndroid Build Coastguard Worker         pReverbData->m_nCos += pReverbData->m_nCosIncrement;
766*f81fb7c4SAndroid Build Coastguard Worker 
767*f81fb7c4SAndroid Build Coastguard Worker     }   // end for (i=0; i < nNumSamplesToAdd; i++)
768*f81fb7c4SAndroid Build Coastguard Worker 
769*f81fb7c4SAndroid Build Coastguard Worker     // store the most up to date version
770*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nBaseIndex = nBase;
771*f81fb7c4SAndroid Build Coastguard Worker 
772*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
773*f81fb7c4SAndroid Build Coastguard Worker }   /* end Reverb */
774*f81fb7c4SAndroid Build Coastguard Worker 
775*f81fb7c4SAndroid Build Coastguard Worker 
776*f81fb7c4SAndroid Build Coastguard Worker 
777*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
778*f81fb7c4SAndroid Build Coastguard Worker  * ReverbShutdown()
779*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
780*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
781*f81fb7c4SAndroid Build Coastguard Worker  * Initializes the Reverb effect.
782*f81fb7c4SAndroid Build Coastguard Worker  *
783*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
784*f81fb7c4SAndroid Build Coastguard Worker  * pInstData        - handle to instance data
785*f81fb7c4SAndroid Build Coastguard Worker  *
786*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
787*f81fb7c4SAndroid Build Coastguard Worker  *
788*f81fb7c4SAndroid Build Coastguard Worker  *
789*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
790*f81fb7c4SAndroid Build Coastguard Worker  *
791*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
792*f81fb7c4SAndroid Build Coastguard Worker */
ReverbShutdown(EAS_DATA_HANDLE pEASData,EAS_VOID_PTR pInstData)793*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbShutdown (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR pInstData)
794*f81fb7c4SAndroid Build Coastguard Worker {
795*f81fb7c4SAndroid Build Coastguard Worker     /* check Configuration Module for static memory allocation */
796*f81fb7c4SAndroid Build Coastguard Worker     if (!pEASData->staticMemoryModel)
797*f81fb7c4SAndroid Build Coastguard Worker         EAS_HWFree(pEASData->hwInstData, pInstData);
798*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
799*f81fb7c4SAndroid Build Coastguard Worker } /* end ReverbShutdown */
800*f81fb7c4SAndroid Build Coastguard Worker 
801*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
802*f81fb7c4SAndroid Build Coastguard Worker  * ReverbGetParam()
803*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
804*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
805*f81fb7c4SAndroid Build Coastguard Worker  * Get a Reverb parameter
806*f81fb7c4SAndroid Build Coastguard Worker  *
807*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
808*f81fb7c4SAndroid Build Coastguard Worker  * pInstData        - handle to instance data
809*f81fb7c4SAndroid Build Coastguard Worker  * param            - parameter index
810*f81fb7c4SAndroid Build Coastguard Worker  * *pValue          - pointer to variable to hold retrieved value
811*f81fb7c4SAndroid Build Coastguard Worker  *
812*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
813*f81fb7c4SAndroid Build Coastguard Worker  *
814*f81fb7c4SAndroid Build Coastguard Worker  *
815*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
816*f81fb7c4SAndroid Build Coastguard Worker  *
817*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
818*f81fb7c4SAndroid Build Coastguard Worker */
ReverbGetParam(EAS_VOID_PTR pInstData,EAS_I32 param,EAS_I32 * pValue)819*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbGetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue)
820*f81fb7c4SAndroid Build Coastguard Worker {
821*f81fb7c4SAndroid Build Coastguard Worker     S_REVERB_OBJECT *p;
822*f81fb7c4SAndroid Build Coastguard Worker 
823*f81fb7c4SAndroid Build Coastguard Worker     p = (S_REVERB_OBJECT*) pInstData;
824*f81fb7c4SAndroid Build Coastguard Worker 
825*f81fb7c4SAndroid Build Coastguard Worker     switch (param)
826*f81fb7c4SAndroid Build Coastguard Worker     {
827*f81fb7c4SAndroid Build Coastguard Worker         case EAS_PARAM_REVERB_BYPASS:
828*f81fb7c4SAndroid Build Coastguard Worker             *pValue = (EAS_I32) p->m_bBypass;
829*f81fb7c4SAndroid Build Coastguard Worker             break;
830*f81fb7c4SAndroid Build Coastguard Worker         case EAS_PARAM_REVERB_PRESET:
831*f81fb7c4SAndroid Build Coastguard Worker             *pValue = (EAS_I8) p->m_nCurrentRoom;
832*f81fb7c4SAndroid Build Coastguard Worker             break;
833*f81fb7c4SAndroid Build Coastguard Worker         case EAS_PARAM_REVERB_WET:
834*f81fb7c4SAndroid Build Coastguard Worker             *pValue = p->m_nWet;
835*f81fb7c4SAndroid Build Coastguard Worker             break;
836*f81fb7c4SAndroid Build Coastguard Worker         case EAS_PARAM_REVERB_DRY:
837*f81fb7c4SAndroid Build Coastguard Worker             *pValue = p->m_nDry;
838*f81fb7c4SAndroid Build Coastguard Worker             break;
839*f81fb7c4SAndroid Build Coastguard Worker         default:
840*f81fb7c4SAndroid Build Coastguard Worker             return EAS_ERROR_INVALID_PARAMETER;
841*f81fb7c4SAndroid Build Coastguard Worker     }
842*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
843*f81fb7c4SAndroid Build Coastguard Worker } /* end ReverbGetParam */
844*f81fb7c4SAndroid Build Coastguard Worker 
845*f81fb7c4SAndroid Build Coastguard Worker 
846*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
847*f81fb7c4SAndroid Build Coastguard Worker  * ReverbSetParam()
848*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
849*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
850*f81fb7c4SAndroid Build Coastguard Worker  * Set a Reverb parameter
851*f81fb7c4SAndroid Build Coastguard Worker  *
852*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
853*f81fb7c4SAndroid Build Coastguard Worker  * pInstData        - handle to instance data
854*f81fb7c4SAndroid Build Coastguard Worker  * param            - parameter index
855*f81fb7c4SAndroid Build Coastguard Worker  * *pValue          - new paramter value
856*f81fb7c4SAndroid Build Coastguard Worker  *
857*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
858*f81fb7c4SAndroid Build Coastguard Worker  *
859*f81fb7c4SAndroid Build Coastguard Worker  *
860*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
861*f81fb7c4SAndroid Build Coastguard Worker  *
862*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
863*f81fb7c4SAndroid Build Coastguard Worker */
ReverbSetParam(EAS_VOID_PTR pInstData,EAS_I32 param,EAS_I32 value)864*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbSetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value)
865*f81fb7c4SAndroid Build Coastguard Worker {
866*f81fb7c4SAndroid Build Coastguard Worker     S_REVERB_OBJECT *p;
867*f81fb7c4SAndroid Build Coastguard Worker 
868*f81fb7c4SAndroid Build Coastguard Worker     p = (S_REVERB_OBJECT*) pInstData;
869*f81fb7c4SAndroid Build Coastguard Worker 
870*f81fb7c4SAndroid Build Coastguard Worker     switch (param)
871*f81fb7c4SAndroid Build Coastguard Worker     {
872*f81fb7c4SAndroid Build Coastguard Worker         case EAS_PARAM_REVERB_BYPASS:
873*f81fb7c4SAndroid Build Coastguard Worker             p->m_bBypass = (EAS_BOOL) value;
874*f81fb7c4SAndroid Build Coastguard Worker             break;
875*f81fb7c4SAndroid Build Coastguard Worker         case EAS_PARAM_REVERB_PRESET:
876*f81fb7c4SAndroid Build Coastguard Worker             if(value!=EAS_PARAM_REVERB_LARGE_HALL && value!=EAS_PARAM_REVERB_HALL &&
877*f81fb7c4SAndroid Build Coastguard Worker                 value!=EAS_PARAM_REVERB_CHAMBER && value!=EAS_PARAM_REVERB_ROOM)
878*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_ERROR_INVALID_PARAMETER;
879*f81fb7c4SAndroid Build Coastguard Worker             p->m_nNextRoom = (EAS_I16)value;
880*f81fb7c4SAndroid Build Coastguard Worker             break;
881*f81fb7c4SAndroid Build Coastguard Worker         case EAS_PARAM_REVERB_WET:
882*f81fb7c4SAndroid Build Coastguard Worker             if(value>EAS_REVERB_WET_MAX || value<EAS_REVERB_WET_MIN)
883*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_ERROR_INVALID_PARAMETER;
884*f81fb7c4SAndroid Build Coastguard Worker             p->m_nWet = (EAS_I16)value;
885*f81fb7c4SAndroid Build Coastguard Worker             break;
886*f81fb7c4SAndroid Build Coastguard Worker         case EAS_PARAM_REVERB_DRY:
887*f81fb7c4SAndroid Build Coastguard Worker             if(value>EAS_REVERB_DRY_MAX || value<EAS_REVERB_DRY_MIN)
888*f81fb7c4SAndroid Build Coastguard Worker                 return EAS_ERROR_INVALID_PARAMETER;
889*f81fb7c4SAndroid Build Coastguard Worker             p->m_nDry = (EAS_I16)value;
890*f81fb7c4SAndroid Build Coastguard Worker             break;
891*f81fb7c4SAndroid Build Coastguard Worker         default:
892*f81fb7c4SAndroid Build Coastguard Worker             return EAS_ERROR_INVALID_PARAMETER;
893*f81fb7c4SAndroid Build Coastguard Worker     }
894*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
895*f81fb7c4SAndroid Build Coastguard Worker } /* end ReverbSetParam */
896*f81fb7c4SAndroid Build Coastguard Worker 
897*f81fb7c4SAndroid Build Coastguard Worker 
898*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
899*f81fb7c4SAndroid Build Coastguard Worker  * ReverbUpdateRoom
900*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
901*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
902*f81fb7c4SAndroid Build Coastguard Worker  * Update the room's preset parameters as required
903*f81fb7c4SAndroid Build Coastguard Worker  *
904*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
905*f81fb7c4SAndroid Build Coastguard Worker  *
906*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
907*f81fb7c4SAndroid Build Coastguard Worker  *
908*f81fb7c4SAndroid Build Coastguard Worker  *
909*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
910*f81fb7c4SAndroid Build Coastguard Worker  * - reverb paramters (fbk, fwd, etc) will be changed
911*f81fb7c4SAndroid Build Coastguard Worker  * - m_nCurrentRoom := m_nNextRoom
912*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
913*f81fb7c4SAndroid Build Coastguard Worker */
ReverbUpdateRoom(S_REVERB_OBJECT * pReverbData)914*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbUpdateRoom(S_REVERB_OBJECT *pReverbData)
915*f81fb7c4SAndroid Build Coastguard Worker {
916*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT temp;
917*f81fb7c4SAndroid Build Coastguard Worker 
918*f81fb7c4SAndroid Build Coastguard Worker     S_REVERB_PRESET *pPreset = &pReverbData->m_sPreset.m_sPreset[pReverbData->m_nNextRoom];
919*f81fb7c4SAndroid Build Coastguard Worker 
920*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nLpfFwd = pPreset->m_nLpfFwd;
921*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nLpfFbk = pPreset->m_nLpfFbk;
922*f81fb7c4SAndroid Build Coastguard Worker 
923*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nEarly = pPreset->m_nEarly;
924*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nWet = pPreset->m_nWet;
925*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nDry = pPreset->m_nDry;
926*f81fb7c4SAndroid Build Coastguard Worker 
927*f81fb7c4SAndroid Build Coastguard Worker 
928*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nMaxExcursion = pPreset->m_nMaxExcursion;
929*f81fb7c4SAndroid Build Coastguard Worker     //stored as time based, convert to sample based
930*f81fb7c4SAndroid Build Coastguard Worker     temp = pPreset->m_nXfadeInterval;
931*f81fb7c4SAndroid Build Coastguard Worker     /*lint -e{702} shift for performance */
932*f81fb7c4SAndroid Build Coastguard Worker     temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
933*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nXfadeInterval = (EAS_U16) temp;
934*f81fb7c4SAndroid Build Coastguard Worker     //gpsReverbObject->m_nXfadeInterval = pPreset->m_nXfadeInterval;
935*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sAp0.m_nApGain = pPreset->m_nAp0_ApGain;
936*f81fb7c4SAndroid Build Coastguard Worker     //stored as time based, convert to absolute sample value
937*f81fb7c4SAndroid Build Coastguard Worker     temp = pPreset->m_nAp0_ApOut;
938*f81fb7c4SAndroid Build Coastguard Worker     /*lint -e{702} shift for performance */
939*f81fb7c4SAndroid Build Coastguard Worker     temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
940*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sAp0.m_zApOut = (EAS_U16) (pReverbData->m_sAp0.m_zApIn + temp);
941*f81fb7c4SAndroid Build Coastguard Worker     //gpsReverbObject->m_sAp0.m_zApOut = pPreset->m_nAp0_ApOut;
942*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sAp1.m_nApGain = pPreset->m_nAp1_ApGain;
943*f81fb7c4SAndroid Build Coastguard Worker     //stored as time based, convert to absolute sample value
944*f81fb7c4SAndroid Build Coastguard Worker     temp = pPreset->m_nAp1_ApOut;
945*f81fb7c4SAndroid Build Coastguard Worker     /*lint -e{702} shift for performance */
946*f81fb7c4SAndroid Build Coastguard Worker     temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
947*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_sAp1.m_zApOut = (EAS_U16) (pReverbData->m_sAp1.m_zApIn + temp);
948*f81fb7c4SAndroid Build Coastguard Worker     //gpsReverbObject->m_sAp1.m_zApOut = pPreset->m_nAp1_ApOut;
949*f81fb7c4SAndroid Build Coastguard Worker 
950*f81fb7c4SAndroid Build Coastguard Worker     pReverbData->m_nCurrentRoom = pReverbData->m_nNextRoom;
951*f81fb7c4SAndroid Build Coastguard Worker 
952*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
953*f81fb7c4SAndroid Build Coastguard Worker 
954*f81fb7c4SAndroid Build Coastguard Worker }   /* end ReverbUpdateRoom */
955*f81fb7c4SAndroid Build Coastguard Worker 
956*f81fb7c4SAndroid Build Coastguard Worker 
957*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
958*f81fb7c4SAndroid Build Coastguard Worker  * ReverbReadInPresets()
959*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
960*f81fb7c4SAndroid Build Coastguard Worker  * Purpose: sets global reverb preset bank to defaults
961*f81fb7c4SAndroid Build Coastguard Worker  *
962*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
963*f81fb7c4SAndroid Build Coastguard Worker  *
964*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
965*f81fb7c4SAndroid Build Coastguard Worker  *
966*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
967*f81fb7c4SAndroid Build Coastguard Worker */
ReverbReadInPresets(S_REVERB_OBJECT * pReverbData)968*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbReadInPresets(S_REVERB_OBJECT *pReverbData)
969*f81fb7c4SAndroid Build Coastguard Worker {
970*f81fb7c4SAndroid Build Coastguard Worker 
971*f81fb7c4SAndroid Build Coastguard Worker     int preset = 0;
972*f81fb7c4SAndroid Build Coastguard Worker     int defaultPreset = 0;
973*f81fb7c4SAndroid Build Coastguard Worker 
974*f81fb7c4SAndroid Build Coastguard Worker     //now init any remaining presets to defaults
975*f81fb7c4SAndroid Build Coastguard Worker     for (defaultPreset = preset; defaultPreset < REVERB_MAX_ROOM_TYPE; defaultPreset++)
976*f81fb7c4SAndroid Build Coastguard Worker     {
977*f81fb7c4SAndroid Build Coastguard Worker         S_REVERB_PRESET *pPreset = &pReverbData->m_sPreset.m_sPreset[defaultPreset];
978*f81fb7c4SAndroid Build Coastguard Worker         if (defaultPreset == 0 || defaultPreset > REVERB_MAX_ROOM_TYPE-1)
979*f81fb7c4SAndroid Build Coastguard Worker         {
980*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nLpfFbk = 8307;
981*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nLpfFwd = 14768;
982*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarly = 0;
983*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nWet = 27690;
984*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nDry = 32767;
985*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_LpfFbk = 3692;
986*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_LpfFwd = 29075;
987*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay0 = 922;
988*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain0 = 22152;
989*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay1 = 1462;
990*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain1 = 17537;
991*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay2 = 0;
992*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain2 = 14768;
993*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay3 = 1221;
994*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain3 = 14307;
995*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay4 = 0;
996*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain4 = 13384;
997*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay0 = 502;
998*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain0 = 20306;
999*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay1 = 1762;
1000*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain1 = 17537;
1001*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay2 = 0;
1002*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain2 = 14768;
1003*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay3 = 0;
1004*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain3 = 16153;
1005*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay4 = 0;
1006*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain4 = 13384;
1007*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nMaxExcursion = 127;
1008*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nXfadeInterval = 6388;
1009*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp0_ApGain = 15691;
1010*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp0_ApOut = 711;
1011*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp1_ApGain = 17999;
1012*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp1_ApOut = 1113;
1013*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu4 = 0;
1014*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu5 = 0;
1015*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu6 = 0;
1016*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu7 = 0;
1017*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu8 = 0;
1018*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu9 = 0;
1019*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu10 = 0;
1020*f81fb7c4SAndroid Build Coastguard Worker         }
1021*f81fb7c4SAndroid Build Coastguard Worker         else if (defaultPreset == 1)
1022*f81fb7c4SAndroid Build Coastguard Worker         {
1023*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nLpfFbk = 6461;
1024*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nLpfFwd = 14307;
1025*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarly = 0;
1026*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nWet = 27690;
1027*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nDry = 32767;
1028*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_LpfFbk = 3692;
1029*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_LpfFwd = 29075;
1030*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay0 = 922;
1031*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain0 = 22152;
1032*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay1 = 1462;
1033*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain1 = 17537;
1034*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay2 = 0;
1035*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain2 = 14768;
1036*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay3 = 1221;
1037*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain3 = 14307;
1038*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay4 = 0;
1039*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain4 = 13384;
1040*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay0 = 502;
1041*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain0 = 20306;
1042*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay1 = 1762;
1043*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain1 = 17537;
1044*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay2 = 0;
1045*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain2 = 14768;
1046*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay3 = 0;
1047*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain3 = 16153;
1048*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay4 = 0;
1049*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain4 = 13384;
1050*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nMaxExcursion = 127;
1051*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nXfadeInterval = 6391;
1052*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp0_ApGain = 15230;
1053*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp0_ApOut = 708;
1054*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp1_ApGain = 9692;
1055*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp1_ApOut = 1113;
1056*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu4 = 0;
1057*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu5 = 0;
1058*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu6 = 0;
1059*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu7 = 0;
1060*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu8 = 0;
1061*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu9 = 0;
1062*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu10 = 0;
1063*f81fb7c4SAndroid Build Coastguard Worker         }
1064*f81fb7c4SAndroid Build Coastguard Worker         else if (defaultPreset == 2)
1065*f81fb7c4SAndroid Build Coastguard Worker         {
1066*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nLpfFbk = 5077;
1067*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nLpfFwd = 12922;
1068*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarly = 0;
1069*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nWet = 24460;
1070*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nDry = 32767;
1071*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_LpfFbk = 3692;
1072*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_LpfFwd = 29075;
1073*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay0 = 922;
1074*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain0 = 22152;
1075*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay1 = 1462;
1076*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain1 = 17537;
1077*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay2 = 0;
1078*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain2 = 14768;
1079*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay3 = 1221;
1080*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain3 = 14307;
1081*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay4 = 0;
1082*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain4 = 13384;
1083*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay0 = 502;
1084*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain0 = 20306;
1085*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay1 = 1762;
1086*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain1 = 17537;
1087*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay2 = 0;
1088*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain2 = 14768;
1089*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay3 = 0;
1090*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain3 = 16153;
1091*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay4 = 0;
1092*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain4 = 13384;
1093*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nMaxExcursion = 127;
1094*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nXfadeInterval = 6449;
1095*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp0_ApGain = 15691;
1096*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp0_ApOut = 774;
1097*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp1_ApGain = 15691;
1098*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp1_ApOut = 1113;
1099*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu4 = 0;
1100*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu5 = 0;
1101*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu6 = 0;
1102*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu7 = 0;
1103*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu8 = 0;
1104*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu9 = 0;
1105*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu10 = 0;
1106*f81fb7c4SAndroid Build Coastguard Worker         }
1107*f81fb7c4SAndroid Build Coastguard Worker         else if (defaultPreset == 3)
1108*f81fb7c4SAndroid Build Coastguard Worker         {
1109*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nLpfFbk = 5077;
1110*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nLpfFwd = 11076;
1111*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarly = 0;
1112*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nWet = 23075;
1113*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nDry = 32767;
1114*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_LpfFbk = 3692;
1115*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_LpfFwd = 29075;
1116*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay0 = 922;
1117*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain0 = 22152;
1118*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay1 = 1462;
1119*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain1 = 17537;
1120*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay2 = 0;
1121*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain2 = 14768;
1122*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay3 = 1221;
1123*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain3 = 14307;
1124*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Delay4 = 0;
1125*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyL_Gain4 = 13384;
1126*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay0 = 502;
1127*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain0 = 20306;
1128*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay1 = 1762;
1129*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain1 = 17537;
1130*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay2 = 0;
1131*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain2 = 14768;
1132*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay3 = 0;
1133*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain3 = 16153;
1134*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Delay4 = 0;
1135*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nEarlyR_Gain4 = 13384;
1136*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nMaxExcursion = 127;
1137*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nXfadeInterval = 6470;   //6483;
1138*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp0_ApGain = 14768;
1139*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp0_ApOut = 792;
1140*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp1_ApGain = 15783;
1141*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_nAp1_ApOut = 1113;
1142*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu4 = 0;
1143*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu5 = 0;
1144*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu6 = 0;
1145*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu7 = 0;
1146*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu8 = 0;
1147*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu9 = 0;
1148*f81fb7c4SAndroid Build Coastguard Worker             pPreset->m_rfu10 = 0;
1149*f81fb7c4SAndroid Build Coastguard Worker 
1150*f81fb7c4SAndroid Build Coastguard Worker         }
1151*f81fb7c4SAndroid Build Coastguard Worker     }
1152*f81fb7c4SAndroid Build Coastguard Worker 
1153*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
1154*f81fb7c4SAndroid Build Coastguard Worker }
1155