xref: /aosp_15_r20/external/sonivox/arm-wt-22k/lib_src/eas_reverbdata.h (revision f81fb7c475c4b71ff83bdcc517de2a8c174e4e5c)
1*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2*f81fb7c4SAndroid Build Coastguard Worker  *
3*f81fb7c4SAndroid Build Coastguard Worker  * File:
4*f81fb7c4SAndroid Build Coastguard Worker  * eas_reverbdata.h
5*f81fb7c4SAndroid Build Coastguard Worker  *
6*f81fb7c4SAndroid Build Coastguard Worker  * Contents and purpose:
7*f81fb7c4SAndroid Build Coastguard Worker  * Contains the prototypes for 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: 499 $
27*f81fb7c4SAndroid Build Coastguard Worker  *   $Date: 2006-12-11 16:07:20 -0800 (Mon, 11 Dec 2006) $
28*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
29*f81fb7c4SAndroid Build Coastguard Worker */
30*f81fb7c4SAndroid Build Coastguard Worker 
31*f81fb7c4SAndroid Build Coastguard Worker #ifndef _EAS_REVERBDATA_H
32*f81fb7c4SAndroid Build Coastguard Worker #define _EAS_REVERBDATA_H
33*f81fb7c4SAndroid Build Coastguard Worker 
34*f81fb7c4SAndroid Build Coastguard Worker #include "eas_types.h"
35*f81fb7c4SAndroid Build Coastguard Worker #include "eas_audioconst.h"
36*f81fb7c4SAndroid Build Coastguard Worker 
37*f81fb7c4SAndroid Build Coastguard Worker /*------------------------------------
38*f81fb7c4SAndroid Build Coastguard Worker  * defines
39*f81fb7c4SAndroid Build Coastguard Worker  *------------------------------------
40*f81fb7c4SAndroid Build Coastguard Worker */
41*f81fb7c4SAndroid Build Coastguard Worker 
42*f81fb7c4SAndroid Build Coastguard Worker /*
43*f81fb7c4SAndroid Build Coastguard Worker CIRCULAR() calculates the array index using modulo arithmetic.
44*f81fb7c4SAndroid Build Coastguard Worker The "trick" is that modulo arithmetic is simplified by masking
45*f81fb7c4SAndroid Build Coastguard Worker the effective address where the mask is (2^n)-1. This only works
46*f81fb7c4SAndroid Build Coastguard Worker if the buffer size is a power of two.
47*f81fb7c4SAndroid Build Coastguard Worker */
48*f81fb7c4SAndroid Build Coastguard Worker #define CIRCULAR(base,offset,size) (EAS_U32)(               \
49*f81fb7c4SAndroid Build Coastguard Worker             (                                               \
50*f81fb7c4SAndroid Build Coastguard Worker                 ((EAS_I32)(base)) + ((EAS_I32)(offset))     \
51*f81fb7c4SAndroid Build Coastguard Worker             )                                               \
52*f81fb7c4SAndroid Build Coastguard Worker             & size                                          \
53*f81fb7c4SAndroid Build Coastguard Worker                                             )
54*f81fb7c4SAndroid Build Coastguard Worker 
55*f81fb7c4SAndroid Build Coastguard Worker /* reverb parameters are updated every 2^(REVERB_UPDATE_PERIOD_IN_BITS) samples */
56*f81fb7c4SAndroid Build Coastguard Worker #if defined (_SAMPLE_RATE_8000)
57*f81fb7c4SAndroid Build Coastguard Worker 
58*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_UPDATE_PERIOD_IN_BITS        5
59*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_BUFFER_SIZE_IN_SAMPLES       2048
60*f81fb7c4SAndroid Build Coastguard Worker 
61*f81fb7c4SAndroid Build Coastguard Worker #elif defined (_SAMPLE_RATE_16000)
62*f81fb7c4SAndroid Build Coastguard Worker 
63*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_UPDATE_PERIOD_IN_BITS        6
64*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_BUFFER_SIZE_IN_SAMPLES       4096
65*f81fb7c4SAndroid Build Coastguard Worker 
66*f81fb7c4SAndroid Build Coastguard Worker #elif defined (_SAMPLE_RATE_22050)
67*f81fb7c4SAndroid Build Coastguard Worker 
68*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_UPDATE_PERIOD_IN_BITS        7
69*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_BUFFER_SIZE_IN_SAMPLES       4096
70*f81fb7c4SAndroid Build Coastguard Worker 
71*f81fb7c4SAndroid Build Coastguard Worker #elif defined (_SAMPLE_RATE_32000)
72*f81fb7c4SAndroid Build Coastguard Worker 
73*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_UPDATE_PERIOD_IN_BITS        7
74*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_BUFFER_SIZE_IN_SAMPLES       8192
75*f81fb7c4SAndroid Build Coastguard Worker 
76*f81fb7c4SAndroid Build Coastguard Worker #elif defined (_SAMPLE_RATE_44100)
77*f81fb7c4SAndroid Build Coastguard Worker 
78*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_UPDATE_PERIOD_IN_BITS        8
79*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_BUFFER_SIZE_IN_SAMPLES       8192
80*f81fb7c4SAndroid Build Coastguard Worker 
81*f81fb7c4SAndroid Build Coastguard Worker #elif defined (_SAMPLE_RATE_48000)
82*f81fb7c4SAndroid Build Coastguard Worker 
83*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_UPDATE_PERIOD_IN_BITS        8
84*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_BUFFER_SIZE_IN_SAMPLES       8192
85*f81fb7c4SAndroid Build Coastguard Worker 
86*f81fb7c4SAndroid Build Coastguard Worker #endif
87*f81fb7c4SAndroid Build Coastguard Worker 
88*f81fb7c4SAndroid Build Coastguard Worker // Define a mask for circular addressing, so that array index
89*f81fb7c4SAndroid Build Coastguard Worker // can wraparound and stay in array boundary of 0, 1, ..., (buffer size -1)
90*f81fb7c4SAndroid Build Coastguard Worker // The buffer size MUST be a power of two
91*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_BUFFER_MASK                  (REVERB_BUFFER_SIZE_IN_SAMPLES -1)
92*f81fb7c4SAndroid Build Coastguard Worker 
93*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_MAX_ROOM_TYPE            4   // any room numbers larger than this are invalid
94*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_MAX_NUM_REFLECTIONS      5   // max num reflections per channel
95*f81fb7c4SAndroid Build Coastguard Worker 
96*f81fb7c4SAndroid Build Coastguard Worker /* synth parameters are updated every SYNTH_UPDATE_PERIOD_IN_SAMPLES */
97*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_UPDATE_PERIOD_IN_SAMPLES (EAS_I32)(0x1L << REVERB_UPDATE_PERIOD_IN_BITS)
98*f81fb7c4SAndroid Build Coastguard Worker 
99*f81fb7c4SAndroid Build Coastguard Worker /*
100*f81fb7c4SAndroid Build Coastguard Worker calculate the update counter by bitwise ANDING with this value to
101*f81fb7c4SAndroid Build Coastguard Worker generate a 2^n modulo value
102*f81fb7c4SAndroid Build Coastguard Worker */
103*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_MODULO_UPDATE_PERIOD_IN_SAMPLES  (EAS_I32)(REVERB_UPDATE_PERIOD_IN_SAMPLES -1)
104*f81fb7c4SAndroid Build Coastguard Worker 
105*f81fb7c4SAndroid Build Coastguard Worker /* synth parameters are updated every SYNTH_UPDATE_PERIOD_IN_SECONDS seconds */
106*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_UPDATE_PERIOD_IN_SECONDS     (REVERB_UPDATE_PERIOD_IN_SAMPLES / _OUTPUT_SAMPLE_RATE)
107*f81fb7c4SAndroid Build Coastguard Worker 
108*f81fb7c4SAndroid Build Coastguard Worker // xfade parameters
109*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_XFADE_PERIOD_IN_SECONDS      (100.0 / 1000.0)        // xfade once every this many seconds
110*f81fb7c4SAndroid Build Coastguard Worker 
111*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_XFADE_PERIOD_IN_SAMPLES      (REVERB_XFADE_PERIOD_IN_SECONDS * _OUTPUT_SAMPLE_RATE)
112*f81fb7c4SAndroid Build Coastguard Worker 
113*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_XFADE_PHASE_INCREMENT    (EAS_I16)(65536 / ((EAS_I16)REVERB_XFADE_PERIOD_IN_SAMPLES/(EAS_I16)REVERB_UPDATE_PERIOD_IN_SAMPLES))
114*f81fb7c4SAndroid Build Coastguard Worker 
115*f81fb7c4SAndroid Build Coastguard Worker /**********/
116*f81fb7c4SAndroid Build Coastguard Worker /* the entire synth uses various flags in a bit field */
117*f81fb7c4SAndroid Build Coastguard Worker 
118*f81fb7c4SAndroid Build Coastguard Worker /* if flag is set, synth reset has been requested */
119*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_FLAG_RESET_IS_REQUESTED          0x01    /* bit 0 */
120*f81fb7c4SAndroid Build Coastguard Worker #define MASK_REVERB_RESET_IS_REQUESTED          0x01
121*f81fb7c4SAndroid Build Coastguard Worker #define MASK_REVERB_RESET_IS_NOT_REQUESTED      (EAS_U32)(~MASK_REVERB_RESET_IS_REQUESTED)
122*f81fb7c4SAndroid Build Coastguard Worker 
123*f81fb7c4SAndroid Build Coastguard Worker /*
124*f81fb7c4SAndroid Build Coastguard Worker by default, we always want to update ALL channel parameters
125*f81fb7c4SAndroid Build Coastguard Worker when we reset the synth (e.g., during GM ON)
126*f81fb7c4SAndroid Build Coastguard Worker */
127*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_REVERB_FLAGS                    0x0
128*f81fb7c4SAndroid Build Coastguard Worker 
129*f81fb7c4SAndroid Build Coastguard Worker /* coefficients for generating sin, cos */
130*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_PAN_G2   4294940151          /* -0.82842712474619 = 2 - 4/sqrt(2) */
131*f81fb7c4SAndroid Build Coastguard Worker /*
132*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 nPanG1 = +1.0 for sin
133*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 nPanG1 = -1.0 for cos
134*f81fb7c4SAndroid Build Coastguard Worker */
135*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_PAN_G0   23170               /* 0.707106781186547 = 1/sqrt(2) */
136*f81fb7c4SAndroid Build Coastguard Worker 
137*f81fb7c4SAndroid Build Coastguard Worker /*************************************************************/
138*f81fb7c4SAndroid Build Coastguard Worker // define the input injection points
139*f81fb7c4SAndroid Build Coastguard Worker #define GUARD               5                       // safety guard of this many samples
140*f81fb7c4SAndroid Build Coastguard Worker 
141*f81fb7c4SAndroid Build Coastguard Worker #define MAX_AP_TIME         (double) (20.0/1000.0)  // delay time in milliseconds
142*f81fb7c4SAndroid Build Coastguard Worker #define MAX_DELAY_TIME      (double) (65.0/1000.0)  // delay time in milliseconds
143*f81fb7c4SAndroid Build Coastguard Worker 
144*f81fb7c4SAndroid Build Coastguard Worker #define MAX_AP_SAMPLES      (int)(((double) MAX_AP_TIME)    * ((double) _OUTPUT_SAMPLE_RATE))
145*f81fb7c4SAndroid Build Coastguard Worker #define MAX_DELAY_SAMPLES   (int)(((double) MAX_DELAY_TIME) * ((double) _OUTPUT_SAMPLE_RATE))
146*f81fb7c4SAndroid Build Coastguard Worker 
147*f81fb7c4SAndroid Build Coastguard Worker #define AP0_IN              0
148*f81fb7c4SAndroid Build Coastguard Worker #define AP1_IN              (AP0_IN     + MAX_AP_SAMPLES    + GUARD)
149*f81fb7c4SAndroid Build Coastguard Worker #define DELAY0_IN           (AP1_IN     + MAX_AP_SAMPLES    + GUARD)
150*f81fb7c4SAndroid Build Coastguard Worker #define DELAY1_IN           (DELAY0_IN  + MAX_DELAY_SAMPLES + GUARD)
151*f81fb7c4SAndroid Build Coastguard Worker 
152*f81fb7c4SAndroid Build Coastguard Worker // Define the max offsets for the end points of each section
153*f81fb7c4SAndroid Build Coastguard Worker // i.e., we don't expect a given section's taps to go beyond
154*f81fb7c4SAndroid Build Coastguard Worker // the following limits
155*f81fb7c4SAndroid Build Coastguard Worker #define AP0_OUT             (AP0_IN     + MAX_AP_SAMPLES    -1)
156*f81fb7c4SAndroid Build Coastguard Worker #define AP1_OUT             (AP1_IN     + MAX_AP_SAMPLES    -1)
157*f81fb7c4SAndroid Build Coastguard Worker #define DELAY0_OUT          (DELAY0_IN  + MAX_DELAY_SAMPLES -1)
158*f81fb7c4SAndroid Build Coastguard Worker #define DELAY1_OUT          (DELAY1_IN  + MAX_DELAY_SAMPLES -1)
159*f81fb7c4SAndroid Build Coastguard Worker 
160*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_DEFAULT_ROOM_NUMBER      1       // default preset number
161*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_AP0_LENGTH              (int)(((double) (17.0/1000.0))  * ((double) _OUTPUT_SAMPLE_RATE))
162*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_AP0_GAIN                19400
163*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_AP1_LENGTH              (int)(((double) (16.5/1000.0))  * ((double) _OUTPUT_SAMPLE_RATE))
164*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_AP1_GAIN                -19400
165*f81fb7c4SAndroid Build Coastguard Worker 
166*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_DEFAULT_WET              32767
167*f81fb7c4SAndroid Build Coastguard Worker #define REVERB_DEFAULT_DRY              0
168*f81fb7c4SAndroid Build Coastguard Worker 
169*f81fb7c4SAndroid Build Coastguard Worker #define EAS_REVERB_WET_MAX              32767
170*f81fb7c4SAndroid Build Coastguard Worker #define EAS_REVERB_WET_MIN              0
171*f81fb7c4SAndroid Build Coastguard Worker #define EAS_REVERB_DRY_MAX              32767
172*f81fb7c4SAndroid Build Coastguard Worker #define EAS_REVERB_DRY_MIN              0
173*f81fb7c4SAndroid Build Coastguard Worker 
174*f81fb7c4SAndroid Build Coastguard Worker /* parameters for each allpass */
175*f81fb7c4SAndroid Build Coastguard Worker typedef struct
176*f81fb7c4SAndroid Build Coastguard Worker {
177*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_zApOut;       // delay offset for ap out
178*f81fb7c4SAndroid Build Coastguard Worker 
179*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nApGain;      // gain for ap
180*f81fb7c4SAndroid Build Coastguard Worker 
181*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_zApIn;        // delay offset for ap in
182*f81fb7c4SAndroid Build Coastguard Worker 
183*f81fb7c4SAndroid Build Coastguard Worker } S_ALLPASS_OBJECT;
184*f81fb7c4SAndroid Build Coastguard Worker 
185*f81fb7c4SAndroid Build Coastguard Worker 
186*f81fb7c4SAndroid Build Coastguard Worker /* parameters for each allpass */
187*f81fb7c4SAndroid Build Coastguard Worker typedef struct
188*f81fb7c4SAndroid Build Coastguard Worker {
189*f81fb7c4SAndroid Build Coastguard Worker     EAS_PCM             m_zLpf;                     // actual state variable, not a length
190*f81fb7c4SAndroid Build Coastguard Worker 
191*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nLpfFwd;                  // lpf forward gain
192*f81fb7c4SAndroid Build Coastguard Worker 
193*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nLpfFbk;                  // lpf feedback gain
194*f81fb7c4SAndroid Build Coastguard Worker 
195*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_zDelay[REVERB_MAX_NUM_REFLECTIONS];   // delay offset for ap out
196*f81fb7c4SAndroid Build Coastguard Worker 
197*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nGain[REVERB_MAX_NUM_REFLECTIONS];    // gain for ap
198*f81fb7c4SAndroid Build Coastguard Worker 
199*f81fb7c4SAndroid Build Coastguard Worker } S_EARLY_REFLECTION_OBJECT;
200*f81fb7c4SAndroid Build Coastguard Worker 
201*f81fb7c4SAndroid Build Coastguard Worker //demo
202*f81fb7c4SAndroid Build Coastguard Worker typedef struct
203*f81fb7c4SAndroid Build Coastguard Worker {
204*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nLpfFbk;
205*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nLpfFwd;
206*f81fb7c4SAndroid Build Coastguard Worker 
207*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarly;
208*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nWet;
209*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nDry;
210*f81fb7c4SAndroid Build Coastguard Worker 
211*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyL_LpfFbk;
212*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyL_LpfFwd;
213*f81fb7c4SAndroid Build Coastguard Worker 
214*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyL_Delay0; //8
215*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyL_Gain0;
216*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyL_Delay1;
217*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyL_Gain1;
218*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyL_Delay2;
219*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyL_Gain2;
220*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyL_Delay3;
221*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyL_Gain3;
222*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyL_Delay4;
223*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyL_Gain4;
224*f81fb7c4SAndroid Build Coastguard Worker 
225*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyR_Delay0; //18
226*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyR_Gain0;
227*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyR_Delay1;
228*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyR_Gain1;
229*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyR_Delay2;
230*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyR_Gain2;
231*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyR_Delay3;
232*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyR_Gain3;
233*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyR_Delay4;
234*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarlyR_Gain4;
235*f81fb7c4SAndroid Build Coastguard Worker 
236*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_nMaxExcursion; //28
237*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nXfadeInterval;
238*f81fb7c4SAndroid Build Coastguard Worker 
239*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nAp0_ApGain; //30
240*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nAp0_ApOut;
241*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nAp1_ApGain;
242*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nAp1_ApOut;
243*f81fb7c4SAndroid Build Coastguard Worker 
244*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_rfu4;
245*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_rfu5;
246*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_rfu6;
247*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_rfu7;
248*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_rfu8;
249*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_rfu9;
250*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_rfu10; //43
251*f81fb7c4SAndroid Build Coastguard Worker 
252*f81fb7c4SAndroid Build Coastguard Worker } S_REVERB_PRESET;
253*f81fb7c4SAndroid Build Coastguard Worker 
254*f81fb7c4SAndroid Build Coastguard Worker typedef struct
255*f81fb7c4SAndroid Build Coastguard Worker {
256*f81fb7c4SAndroid Build Coastguard Worker     S_REVERB_PRESET     m_sPreset[REVERB_MAX_ROOM_TYPE];    //array of presets
257*f81fb7c4SAndroid Build Coastguard Worker 
258*f81fb7c4SAndroid Build Coastguard Worker } S_REVERB_PRESET_BANK;
259*f81fb7c4SAndroid Build Coastguard Worker 
260*f81fb7c4SAndroid Build Coastguard Worker /* parameters for each reverb */
261*f81fb7c4SAndroid Build Coastguard Worker typedef struct
262*f81fb7c4SAndroid Build Coastguard Worker {
263*f81fb7c4SAndroid Build Coastguard Worker     /* controls entire reverb playback volume */
264*f81fb7c4SAndroid Build Coastguard Worker     /* to conserve memory, use the MSB and ignore the LSB */
265*f81fb7c4SAndroid Build Coastguard Worker     EAS_U8              m_nMasterVolume;
266*f81fb7c4SAndroid Build Coastguard Worker 
267*f81fb7c4SAndroid Build Coastguard Worker     /* update counter keeps track of when synth params need updating */
268*f81fb7c4SAndroid Build Coastguard Worker     /* only needs to be as large as REVERB_UPDATE_PERIOD_IN_SAMPLES */
269*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nUpdateCounter;
270*f81fb7c4SAndroid Build Coastguard Worker 
271*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_nMinSamplesToAdd;         /* ComputeReverb() generates this many samples */
272*f81fb7c4SAndroid Build Coastguard Worker 
273*f81fb7c4SAndroid Build Coastguard Worker     EAS_U8              m_nFlags;                   /* misc flags/bit fields */
274*f81fb7c4SAndroid Build Coastguard Worker 
275*f81fb7c4SAndroid Build Coastguard Worker     EAS_PCM             *m_pOutputBuffer;
276*f81fb7c4SAndroid Build Coastguard Worker     EAS_PCM             *m_pInputBuffer;
277*f81fb7c4SAndroid Build Coastguard Worker 
278*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_nNumSamplesInOutputBuffer;
279*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_nNumSamplesInInputBuffer;
280*f81fb7c4SAndroid Build Coastguard Worker 
281*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_nNumInputSamplesRead;     // if m_nNumInputSamplesRead >= NumSamplesInInputBuffer
282*f81fb7c4SAndroid Build Coastguard Worker                                                     // then get a new input buffer
283*f81fb7c4SAndroid Build Coastguard Worker     EAS_PCM             *m_pNextInputSample;
284*f81fb7c4SAndroid Build Coastguard Worker 
285*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_nBaseIndex;                                   // base index for circular buffer
286*f81fb7c4SAndroid Build Coastguard Worker 
287*f81fb7c4SAndroid Build Coastguard Worker     // reverb delay line offsets, allpass parameters, etc:
288*f81fb7c4SAndroid Build Coastguard Worker 
289*f81fb7c4SAndroid Build Coastguard Worker     EAS_PCM             m_nRevOutFbkR;              // combine feedback reverb right out with dry left in
290*f81fb7c4SAndroid Build Coastguard Worker 
291*f81fb7c4SAndroid Build Coastguard Worker     S_ALLPASS_OBJECT    m_sAp0;                     // allpass 0 (left channel)
292*f81fb7c4SAndroid Build Coastguard Worker 
293*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_zD0In;                    // delay offset for delay line D0 in
294*f81fb7c4SAndroid Build Coastguard Worker 
295*f81fb7c4SAndroid Build Coastguard Worker     EAS_PCM             m_nRevOutFbkL;              // combine feedback reverb left out with dry right in
296*f81fb7c4SAndroid Build Coastguard Worker 
297*f81fb7c4SAndroid Build Coastguard Worker     S_ALLPASS_OBJECT    m_sAp1;                     // allpass 1 (right channel)
298*f81fb7c4SAndroid Build Coastguard Worker 
299*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_zD1In;                    // delay offset for delay line D1 in
300*f81fb7c4SAndroid Build Coastguard Worker 
301*f81fb7c4SAndroid Build Coastguard Worker     // delay output taps, notice criss cross order
302*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_zD0Self;                  // self feeds forward d0 --> d0
303*f81fb7c4SAndroid Build Coastguard Worker 
304*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_zD1Cross;                 // cross feeds across d1 --> d0
305*f81fb7c4SAndroid Build Coastguard Worker 
306*f81fb7c4SAndroid Build Coastguard Worker     EAS_PCM             m_zLpf0;                    // actual state variable, not a length
307*f81fb7c4SAndroid Build Coastguard Worker 
308*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_zD1Self;                  // self feeds forward d1 --> d1
309*f81fb7c4SAndroid Build Coastguard Worker 
310*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_zD0Cross;                 // cross feeds across d0 --> d1
311*f81fb7c4SAndroid Build Coastguard Worker 
312*f81fb7c4SAndroid Build Coastguard Worker     EAS_PCM             m_zLpf1;                    // actual state variable, not a length
313*f81fb7c4SAndroid Build Coastguard Worker 
314*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nSin;                     // gain for self taps
315*f81fb7c4SAndroid Build Coastguard Worker 
316*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nCos;                     // gain for cross taps
317*f81fb7c4SAndroid Build Coastguard Worker 
318*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nSinIncrement;            // increment for gain
319*f81fb7c4SAndroid Build Coastguard Worker 
320*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nCosIncrement;            // increment for gain
321*f81fb7c4SAndroid Build Coastguard Worker 
322*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nLpfFwd;                  // lpf forward gain (includes scaling for mixer)
323*f81fb7c4SAndroid Build Coastguard Worker 
324*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nLpfFbk;                  // lpf feedback gain
325*f81fb7c4SAndroid Build Coastguard Worker 
326*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_nXfadeInterval;           // update/xfade after this many samples
327*f81fb7c4SAndroid Build Coastguard Worker 
328*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_nXfadeCounter;            // keep track of when to xfade
329*f81fb7c4SAndroid Build Coastguard Worker 
330*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nPhase;                   // -1 <= m_nPhase < 1
331*f81fb7c4SAndroid Build Coastguard Worker                                                     // but during sin,cos calculations
332*f81fb7c4SAndroid Build Coastguard Worker                                                     // use m_nPhase/2
333*f81fb7c4SAndroid Build Coastguard Worker 
334*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nPhaseIncrement;          // add this to m_nPhase each frame
335*f81fb7c4SAndroid Build Coastguard Worker 
336*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nNoise;                   // random noise sample
337*f81fb7c4SAndroid Build Coastguard Worker 
338*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             m_nMaxExcursion;            // the taps can excurse +/- this amount
339*f81fb7c4SAndroid Build Coastguard Worker 
340*f81fb7c4SAndroid Build Coastguard Worker     EAS_BOOL            m_bUseNoise;                // if EAS_TRUE, use noise as input signal
341*f81fb7c4SAndroid Build Coastguard Worker 
342*f81fb7c4SAndroid Build Coastguard Worker     EAS_BOOL            m_bBypass;                  // if EAS_TRUE, then bypass reverb and copy input to output
343*f81fb7c4SAndroid Build Coastguard Worker 
344*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nCurrentRoom;             // preset number for current room
345*f81fb7c4SAndroid Build Coastguard Worker 
346*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nNextRoom;                // preset number for next room
347*f81fb7c4SAndroid Build Coastguard Worker 
348*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nWet;                     // gain for wet (processed) signal
349*f81fb7c4SAndroid Build Coastguard Worker 
350*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nDry;                     // gain for dry (unprocessed) signal
351*f81fb7c4SAndroid Build Coastguard Worker 
352*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             m_nEarly;                   // gain for early (widen) signal
353*f81fb7c4SAndroid Build Coastguard Worker 
354*f81fb7c4SAndroid Build Coastguard Worker     S_EARLY_REFLECTION_OBJECT   m_sEarlyL;          // left channel early reflections
355*f81fb7c4SAndroid Build Coastguard Worker     S_EARLY_REFLECTION_OBJECT   m_sEarlyR;          // right channel early reflections
356*f81fb7c4SAndroid Build Coastguard Worker 
357*f81fb7c4SAndroid Build Coastguard Worker     EAS_PCM             m_nDelayLine[REVERB_BUFFER_SIZE_IN_SAMPLES];    // one large delay line for all reverb elements
358*f81fb7c4SAndroid Build Coastguard Worker 
359*f81fb7c4SAndroid Build Coastguard Worker     S_REVERB_PRESET     pPreset;
360*f81fb7c4SAndroid Build Coastguard Worker 
361*f81fb7c4SAndroid Build Coastguard Worker     S_REVERB_PRESET_BANK    m_sPreset;
362*f81fb7c4SAndroid Build Coastguard Worker 
363*f81fb7c4SAndroid Build Coastguard Worker     //EAS_I8            preset;
364*f81fb7c4SAndroid Build Coastguard Worker 
365*f81fb7c4SAndroid Build Coastguard Worker } S_REVERB_OBJECT;
366*f81fb7c4SAndroid Build Coastguard Worker 
367*f81fb7c4SAndroid Build Coastguard Worker 
368*f81fb7c4SAndroid Build Coastguard Worker /*------------------------------------
369*f81fb7c4SAndroid Build Coastguard Worker  * prototypes
370*f81fb7c4SAndroid Build Coastguard Worker  *------------------------------------
371*f81fb7c4SAndroid Build Coastguard Worker */
372*f81fb7c4SAndroid Build Coastguard Worker 
373*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
374*f81fb7c4SAndroid Build Coastguard Worker  * ReverbUpdateXfade
375*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
376*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
377*f81fb7c4SAndroid Build Coastguard Worker  * Update the xfade parameters as required
378*f81fb7c4SAndroid Build Coastguard Worker  *
379*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
380*f81fb7c4SAndroid Build Coastguard Worker  * nNumSamplesToAdd - number of samples to write to buffer
381*f81fb7c4SAndroid Build Coastguard Worker  *
382*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
383*f81fb7c4SAndroid Build Coastguard Worker  *
384*f81fb7c4SAndroid Build Coastguard Worker  *
385*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
386*f81fb7c4SAndroid Build Coastguard Worker  * - xfade parameters will be changed
387*f81fb7c4SAndroid Build Coastguard Worker  *
388*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
389*f81fb7c4SAndroid Build Coastguard Worker */
390*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbUpdateXfade(S_REVERB_OBJECT* pReverbData, EAS_INT nNumSamplesToAdd);
391*f81fb7c4SAndroid Build Coastguard Worker 
392*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
393*f81fb7c4SAndroid Build Coastguard Worker  * ReverbCalculateNoise
394*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
395*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
396*f81fb7c4SAndroid Build Coastguard Worker  * Calculate a noise sample and limit its value
397*f81fb7c4SAndroid Build Coastguard Worker  *
398*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
399*f81fb7c4SAndroid Build Coastguard Worker  * nMaxExcursion - noise value is limited to this value
400*f81fb7c4SAndroid Build Coastguard Worker  * pnNoise - return new noise sample in this (not limited)
401*f81fb7c4SAndroid Build Coastguard Worker  *
402*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
403*f81fb7c4SAndroid Build Coastguard Worker  * new limited noise value
404*f81fb7c4SAndroid Build Coastguard Worker  *
405*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
406*f81fb7c4SAndroid Build Coastguard Worker  * - *pnNoise noise value is updated
407*f81fb7c4SAndroid Build Coastguard Worker  *
408*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
409*f81fb7c4SAndroid Build Coastguard Worker */
410*f81fb7c4SAndroid Build Coastguard Worker static EAS_U16 ReverbCalculateNoise(EAS_U16 nMaxExcursion, EAS_I16 *pnNoise);
411*f81fb7c4SAndroid Build Coastguard Worker 
412*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
413*f81fb7c4SAndroid Build Coastguard Worker  * ReverbCalculateSinCos
414*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
415*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
416*f81fb7c4SAndroid Build Coastguard Worker  * Calculate a new sin and cosine value based on the given phase
417*f81fb7c4SAndroid Build Coastguard Worker  *
418*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
419*f81fb7c4SAndroid Build Coastguard Worker  * nPhase   - phase angle
420*f81fb7c4SAndroid Build Coastguard Worker  * pnSin    - input old value, output new value
421*f81fb7c4SAndroid Build Coastguard Worker  * pnCos    - input old value, output new value
422*f81fb7c4SAndroid Build Coastguard Worker  *
423*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
424*f81fb7c4SAndroid Build Coastguard Worker  *
425*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
426*f81fb7c4SAndroid Build Coastguard Worker  * - *pnSin, *pnCos are updated
427*f81fb7c4SAndroid Build Coastguard Worker  *
428*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
429*f81fb7c4SAndroid Build Coastguard Worker */
430*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbCalculateSinCos(EAS_I16 nPhase, EAS_I16 *pnSin, EAS_I16 *pnCos);
431*f81fb7c4SAndroid Build Coastguard Worker 
432*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
433*f81fb7c4SAndroid Build Coastguard Worker  * Reverb
434*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
435*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
436*f81fb7c4SAndroid Build Coastguard Worker  * apply reverb to the given signal
437*f81fb7c4SAndroid Build Coastguard Worker  *
438*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
439*f81fb7c4SAndroid Build Coastguard Worker  * nNu
440*f81fb7c4SAndroid Build Coastguard Worker  * pnSin    - input old value, output new value
441*f81fb7c4SAndroid Build Coastguard Worker  * pnCos    - input old value, output new value
442*f81fb7c4SAndroid Build Coastguard Worker  *
443*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
444*f81fb7c4SAndroid Build Coastguard Worker  * number of samples actually reverberated
445*f81fb7c4SAndroid Build Coastguard Worker  *
446*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
447*f81fb7c4SAndroid Build Coastguard Worker  *
448*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
449*f81fb7c4SAndroid Build Coastguard Worker */
450*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT Reverb(S_REVERB_OBJECT* pReverbData, EAS_INT nNumSamplesToAdd, EAS_PCM *pOutputBuffer, EAS_PCM *pInputBuffer);
451*f81fb7c4SAndroid Build Coastguard Worker 
452*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
453*f81fb7c4SAndroid Build Coastguard Worker  * ReverbReadInPresets()
454*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
455*f81fb7c4SAndroid Build Coastguard Worker  * Purpose: sets global reverb preset bank to defaults
456*f81fb7c4SAndroid Build Coastguard Worker  *
457*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
458*f81fb7c4SAndroid Build Coastguard Worker  *
459*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
460*f81fb7c4SAndroid Build Coastguard Worker  *
461*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
462*f81fb7c4SAndroid Build Coastguard Worker */
463*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbReadInPresets(S_REVERB_OBJECT* pReverbData);
464*f81fb7c4SAndroid Build Coastguard Worker 
465*f81fb7c4SAndroid Build Coastguard Worker 
466*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
467*f81fb7c4SAndroid Build Coastguard Worker  * ReverbUpdateRoom
468*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
469*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
470*f81fb7c4SAndroid Build Coastguard Worker  * Update the room's preset parameters as required
471*f81fb7c4SAndroid Build Coastguard Worker  *
472*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
473*f81fb7c4SAndroid Build Coastguard Worker  *
474*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
475*f81fb7c4SAndroid Build Coastguard Worker  *
476*f81fb7c4SAndroid Build Coastguard Worker  *
477*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
478*f81fb7c4SAndroid Build Coastguard Worker  * - reverb paramters (fbk, fwd, etc) will be changed
479*f81fb7c4SAndroid Build Coastguard Worker  * - m_nCurrentRoom := m_nNextRoom
480*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
481*f81fb7c4SAndroid Build Coastguard Worker */
482*f81fb7c4SAndroid Build Coastguard Worker static EAS_RESULT ReverbUpdateRoom(S_REVERB_OBJECT* pReverbData);
483*f81fb7c4SAndroid Build Coastguard Worker 
484*f81fb7c4SAndroid Build Coastguard Worker #endif /* #ifndef _EAS_REVERBDATA_H */
485*f81fb7c4SAndroid Build Coastguard Worker 
486*f81fb7c4SAndroid Build Coastguard Worker 
487