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