xref: /aosp_15_r20/frameworks/av/media/libeffects/testlibs/EffectReverb.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2008 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_EFFECTREVERB_H_
18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_EFFECTREVERB_H_
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <audio_effects/effect_environmentalreverb.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <audio_effects/effect_presetreverb.h>
22*ec779b8eSAndroid Build Coastguard Worker 
23*ec779b8eSAndroid Build Coastguard Worker 
24*ec779b8eSAndroid Build Coastguard Worker /*------------------------------------
25*ec779b8eSAndroid Build Coastguard Worker  * defines
26*ec779b8eSAndroid Build Coastguard Worker  *------------------------------------
27*ec779b8eSAndroid Build Coastguard Worker */
28*ec779b8eSAndroid Build Coastguard Worker 
29*ec779b8eSAndroid Build Coastguard Worker /*
30*ec779b8eSAndroid Build Coastguard Worker CIRCULAR() calculates the array index using modulo arithmetic.
31*ec779b8eSAndroid Build Coastguard Worker The "trick" is that modulo arithmetic is simplified by masking
32*ec779b8eSAndroid Build Coastguard Worker the effective address where the mask is (2^n)-1. This only works
33*ec779b8eSAndroid Build Coastguard Worker if the buffer size is a power of two.
34*ec779b8eSAndroid Build Coastguard Worker */
35*ec779b8eSAndroid Build Coastguard Worker #define CIRCULAR(base,offset,size) (uint32_t)(               \
36*ec779b8eSAndroid Build Coastguard Worker             (                                               \
37*ec779b8eSAndroid Build Coastguard Worker                 ((int32_t)(base)) + ((int32_t)(offset))     \
38*ec779b8eSAndroid Build Coastguard Worker             )                                               \
39*ec779b8eSAndroid Build Coastguard Worker             & size                                          \
40*ec779b8eSAndroid Build Coastguard Worker                                             )
41*ec779b8eSAndroid Build Coastguard Worker 
42*ec779b8eSAndroid Build Coastguard Worker #define NUM_OUTPUT_CHANNELS 2
43*ec779b8eSAndroid Build Coastguard Worker #define OUTPUT_CHANNELS AUDIO_CHANNEL_OUT_STEREO
44*ec779b8eSAndroid Build Coastguard Worker 
45*ec779b8eSAndroid Build Coastguard Worker #define REVERB_BUFFER_SIZE_IN_SAMPLES_MAX   16384
46*ec779b8eSAndroid Build Coastguard Worker 
47*ec779b8eSAndroid Build Coastguard Worker #define REVERB_NUM_PRESETS  REVERB_PRESET_PLATE   // REVERB_PRESET_NONE is not included
48*ec779b8eSAndroid Build Coastguard Worker #define REVERB_MAX_NUM_REFLECTIONS      5   // max num reflections per channel
49*ec779b8eSAndroid Build Coastguard Worker 
50*ec779b8eSAndroid Build Coastguard Worker 
51*ec779b8eSAndroid Build Coastguard Worker // xfade parameters
52*ec779b8eSAndroid Build Coastguard Worker #define REVERB_XFADE_PERIOD_IN_SECONDS      (double) (100.0 / 1000.0)        // xfade once every this many seconds
53*ec779b8eSAndroid Build Coastguard Worker 
54*ec779b8eSAndroid Build Coastguard Worker 
55*ec779b8eSAndroid Build Coastguard Worker /**********/
56*ec779b8eSAndroid Build Coastguard Worker /* the entire synth uses various flags in a bit field */
57*ec779b8eSAndroid Build Coastguard Worker 
58*ec779b8eSAndroid Build Coastguard Worker /* if flag is set, synth reset has been requested */
59*ec779b8eSAndroid Build Coastguard Worker #define REVERB_FLAG_RESET_IS_REQUESTED          0x01    /* bit 0 */
60*ec779b8eSAndroid Build Coastguard Worker #define MASK_REVERB_RESET_IS_REQUESTED          0x01
61*ec779b8eSAndroid Build Coastguard Worker #define MASK_REVERB_RESET_IS_NOT_REQUESTED      (uint32_t)(~MASK_REVERB_RESET_IS_REQUESTED)
62*ec779b8eSAndroid Build Coastguard Worker 
63*ec779b8eSAndroid Build Coastguard Worker /*
64*ec779b8eSAndroid Build Coastguard Worker by default, we always want to update ALL channel parameters
65*ec779b8eSAndroid Build Coastguard Worker when we reset the synth (e.g., during GM ON)
66*ec779b8eSAndroid Build Coastguard Worker */
67*ec779b8eSAndroid Build Coastguard Worker #define DEFAULT_REVERB_FLAGS                    0x0
68*ec779b8eSAndroid Build Coastguard Worker 
69*ec779b8eSAndroid Build Coastguard Worker /* coefficients for generating sin, cos */
70*ec779b8eSAndroid Build Coastguard Worker #define REVERB_PAN_G2   4294940151          /* -0.82842712474619 = 2 - 4/sqrt(2) */
71*ec779b8eSAndroid Build Coastguard Worker /*
72*ec779b8eSAndroid Build Coastguard Worker int32_t nPanG1 = +1.0 for sin
73*ec779b8eSAndroid Build Coastguard Worker int32_t nPanG1 = -1.0 for cos
74*ec779b8eSAndroid Build Coastguard Worker */
75*ec779b8eSAndroid Build Coastguard Worker #define REVERB_PAN_G0   23170               /* 0.707106781186547 = 1/sqrt(2) */
76*ec779b8eSAndroid Build Coastguard Worker 
77*ec779b8eSAndroid Build Coastguard Worker /*************************************************************/
78*ec779b8eSAndroid Build Coastguard Worker // define the input injection points
79*ec779b8eSAndroid Build Coastguard Worker #define GUARD               5                       // safety guard of this many samples
80*ec779b8eSAndroid Build Coastguard Worker 
81*ec779b8eSAndroid Build Coastguard Worker #define MAX_AP_TIME         (int) ((20*65536)/1000)  // delay time in time units (65536th of sec)
82*ec779b8eSAndroid Build Coastguard Worker #define MAX_DELAY_TIME      (int) ((65*65536)/1000)  // delay time in time units
83*ec779b8eSAndroid Build Coastguard Worker #define MAX_EARLY_TIME      (int) ((65*65536)/1000)  // delay time in time units
84*ec779b8eSAndroid Build Coastguard Worker 
85*ec779b8eSAndroid Build Coastguard Worker #define AP0_IN              0
86*ec779b8eSAndroid Build Coastguard Worker 
87*ec779b8eSAndroid Build Coastguard Worker 
88*ec779b8eSAndroid Build Coastguard Worker #define REVERB_DEFAULT_ROOM_NUMBER      1       // default preset number
89*ec779b8eSAndroid Build Coastguard Worker #define DEFAULT_AP0_GAIN                19400
90*ec779b8eSAndroid Build Coastguard Worker #define DEFAULT_AP1_GAIN                -19400
91*ec779b8eSAndroid Build Coastguard Worker 
92*ec779b8eSAndroid Build Coastguard Worker #define REVERB_DEFAULT_WET              32767
93*ec779b8eSAndroid Build Coastguard Worker #define REVERB_DEFAULT_DRY              0
94*ec779b8eSAndroid Build Coastguard Worker 
95*ec779b8eSAndroid Build Coastguard Worker #define REVERB_WET_MAX              32767
96*ec779b8eSAndroid Build Coastguard Worker #define REVERB_WET_MIN              0
97*ec779b8eSAndroid Build Coastguard Worker #define REVERB_DRY_MAX              32767
98*ec779b8eSAndroid Build Coastguard Worker #define REVERB_DRY_MIN              0
99*ec779b8eSAndroid Build Coastguard Worker 
100*ec779b8eSAndroid Build Coastguard Worker // constants for reverb density
101*ec779b8eSAndroid Build Coastguard Worker // The density expressed in permilles changes the Allpass delay in a linear manner in the range defined by
102*ec779b8eSAndroid Build Coastguard Worker // AP0_TIME_BASE to AP0_TIME_BASE + AP0_TIME_RANGE
103*ec779b8eSAndroid Build Coastguard Worker #define AP0_TIME_BASE (int)((9*65536)/1000)
104*ec779b8eSAndroid Build Coastguard Worker #define AP0_TIME_RANGE (int)((4*65536)/1000)
105*ec779b8eSAndroid Build Coastguard Worker #define AP1_TIME_BASE (int)((12*65536)/1000)
106*ec779b8eSAndroid Build Coastguard Worker #define AP1_TIME_RANGE (int)((8*65536)/1000)
107*ec779b8eSAndroid Build Coastguard Worker 
108*ec779b8eSAndroid Build Coastguard Worker // constants for reverb diffusion
109*ec779b8eSAndroid Build Coastguard Worker // The diffusion expressed in permilles changes the Allpass gain in a linear manner in the range defined by
110*ec779b8eSAndroid Build Coastguard Worker // AP0_GAIN_BASE to AP0_GAIN_BASE + AP0_GAIN_RANGE
111*ec779b8eSAndroid Build Coastguard Worker #define AP0_GAIN_BASE (int)(9830)
112*ec779b8eSAndroid Build Coastguard Worker #define AP0_GAIN_RANGE (int)(19660-9830)
113*ec779b8eSAndroid Build Coastguard Worker #define AP1_GAIN_BASE (int)(6553)
114*ec779b8eSAndroid Build Coastguard Worker #define AP1_GAIN_RANGE (int)(22936-6553)
115*ec779b8eSAndroid Build Coastguard Worker 
116*ec779b8eSAndroid Build Coastguard Worker 
117*ec779b8eSAndroid Build Coastguard Worker enum reverb_state_e {
118*ec779b8eSAndroid Build Coastguard Worker     REVERB_STATE_UNINITIALIZED,
119*ec779b8eSAndroid Build Coastguard Worker     REVERB_STATE_INITIALIZED,
120*ec779b8eSAndroid Build Coastguard Worker     REVERB_STATE_ACTIVE,
121*ec779b8eSAndroid Build Coastguard Worker };
122*ec779b8eSAndroid Build Coastguard Worker 
123*ec779b8eSAndroid Build Coastguard Worker /* parameters for each allpass */
124*ec779b8eSAndroid Build Coastguard Worker typedef struct
125*ec779b8eSAndroid Build Coastguard Worker {
126*ec779b8eSAndroid Build Coastguard Worker     uint16_t             m_zApOut;       // delay offset for ap out
127*ec779b8eSAndroid Build Coastguard Worker 
128*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nApGain;      // gain for ap
129*ec779b8eSAndroid Build Coastguard Worker 
130*ec779b8eSAndroid Build Coastguard Worker     uint16_t             m_zApIn;        // delay offset for ap in
131*ec779b8eSAndroid Build Coastguard Worker 
132*ec779b8eSAndroid Build Coastguard Worker } allpass_object_t;
133*ec779b8eSAndroid Build Coastguard Worker 
134*ec779b8eSAndroid Build Coastguard Worker 
135*ec779b8eSAndroid Build Coastguard Worker /* parameters for early reflections */
136*ec779b8eSAndroid Build Coastguard Worker typedef struct
137*ec779b8eSAndroid Build Coastguard Worker {
138*ec779b8eSAndroid Build Coastguard Worker     uint16_t            m_zDelay[REVERB_MAX_NUM_REFLECTIONS];   // delay offset for ap out
139*ec779b8eSAndroid Build Coastguard Worker 
140*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nGain[REVERB_MAX_NUM_REFLECTIONS];    // gain for ap
141*ec779b8eSAndroid Build Coastguard Worker 
142*ec779b8eSAndroid Build Coastguard Worker } early_reflection_object_t;
143*ec779b8eSAndroid Build Coastguard Worker 
144*ec779b8eSAndroid Build Coastguard Worker //demo
145*ec779b8eSAndroid Build Coastguard Worker typedef struct
146*ec779b8eSAndroid Build Coastguard Worker {
147*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nRvbLpfFbk;
148*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nRvbLpfFwd;
149*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nRoomLpfFbk;
150*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nRoomLpfFwd;
151*ec779b8eSAndroid Build Coastguard Worker 
152*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nEarlyGain;
153*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nEarlyDelay;
154*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nLateGain;
155*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nLateDelay;
156*ec779b8eSAndroid Build Coastguard Worker 
157*ec779b8eSAndroid Build Coastguard Worker     early_reflection_object_t m_sEarlyL;
158*ec779b8eSAndroid Build Coastguard Worker     early_reflection_object_t m_sEarlyR;
159*ec779b8eSAndroid Build Coastguard Worker 
160*ec779b8eSAndroid Build Coastguard Worker     uint16_t            m_nMaxExcursion; //28
161*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nXfadeInterval;
162*ec779b8eSAndroid Build Coastguard Worker 
163*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nAp0_ApGain; //30
164*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nAp0_ApOut;
165*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nAp1_ApGain;
166*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nAp1_ApOut;
167*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nDiffusion;
168*ec779b8eSAndroid Build Coastguard Worker 
169*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_rfu4;
170*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_rfu5;
171*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_rfu6;
172*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_rfu7;
173*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_rfu8;
174*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_rfu9;
175*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_rfu10; //43
176*ec779b8eSAndroid Build Coastguard Worker 
177*ec779b8eSAndroid Build Coastguard Worker } reverb_preset_t;
178*ec779b8eSAndroid Build Coastguard Worker 
179*ec779b8eSAndroid Build Coastguard Worker typedef struct
180*ec779b8eSAndroid Build Coastguard Worker {
181*ec779b8eSAndroid Build Coastguard Worker     reverb_preset_t     m_sPreset[REVERB_NUM_PRESETS]; // array of presets(does not include REVERB_PRESET_NONE)
182*ec779b8eSAndroid Build Coastguard Worker 
183*ec779b8eSAndroid Build Coastguard Worker } reverb_preset_bank_t;
184*ec779b8eSAndroid Build Coastguard Worker 
185*ec779b8eSAndroid Build Coastguard Worker 
186*ec779b8eSAndroid Build Coastguard Worker /* parameters for each reverb */
187*ec779b8eSAndroid Build Coastguard Worker typedef struct
188*ec779b8eSAndroid Build Coastguard Worker {
189*ec779b8eSAndroid Build Coastguard Worker     /* update counter keeps track of when synth params need updating */
190*ec779b8eSAndroid Build Coastguard Worker     /* only needs to be as large as REVERB_UPDATE_PERIOD_IN_SAMPLES */
191*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nUpdateCounter;
192*ec779b8eSAndroid Build Coastguard Worker 
193*ec779b8eSAndroid Build Coastguard Worker     uint16_t             m_nBaseIndex;                                   // base index for circular buffer
194*ec779b8eSAndroid Build Coastguard Worker 
195*ec779b8eSAndroid Build Coastguard Worker     // reverb delay line offsets, allpass parameters, etc:
196*ec779b8eSAndroid Build Coastguard Worker 
197*ec779b8eSAndroid Build Coastguard Worker     short             m_nRevFbkR;              // combine feedback reverb right out with dry left in
198*ec779b8eSAndroid Build Coastguard Worker     short             m_zOutLpfL;              // left reverb output
199*ec779b8eSAndroid Build Coastguard Worker 
200*ec779b8eSAndroid Build Coastguard Worker     allpass_object_t    m_sAp0;                     // allpass 0 (left channel)
201*ec779b8eSAndroid Build Coastguard Worker 
202*ec779b8eSAndroid Build Coastguard Worker     uint16_t             m_zD0In;                    // delay offset for delay line D0 in
203*ec779b8eSAndroid Build Coastguard Worker 
204*ec779b8eSAndroid Build Coastguard Worker     short             m_nRevFbkL;              // combine feedback reverb left out with dry right in
205*ec779b8eSAndroid Build Coastguard Worker     short             m_zOutLpfR;              // right reverb output
206*ec779b8eSAndroid Build Coastguard Worker 
207*ec779b8eSAndroid Build Coastguard Worker     allpass_object_t    m_sAp1;                     // allpass 1 (right channel)
208*ec779b8eSAndroid Build Coastguard Worker 
209*ec779b8eSAndroid Build Coastguard Worker     uint16_t             m_zD1In;                    // delay offset for delay line D1 in
210*ec779b8eSAndroid Build Coastguard Worker 
211*ec779b8eSAndroid Build Coastguard Worker     // delay output taps, notice criss cross order
212*ec779b8eSAndroid Build Coastguard Worker     uint16_t             m_zD0Self;                  // self feeds forward d0 --> d0
213*ec779b8eSAndroid Build Coastguard Worker 
214*ec779b8eSAndroid Build Coastguard Worker     uint16_t             m_zD1Cross;                 // cross feeds across d1 --> d0
215*ec779b8eSAndroid Build Coastguard Worker 
216*ec779b8eSAndroid Build Coastguard Worker     uint16_t             m_zD1Self;                  // self feeds forward d1 --> d1
217*ec779b8eSAndroid Build Coastguard Worker 
218*ec779b8eSAndroid Build Coastguard Worker     uint16_t             m_zD0Cross;                 // cross feeds across d0 --> d1
219*ec779b8eSAndroid Build Coastguard Worker 
220*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nSin;                     // gain for self taps
221*ec779b8eSAndroid Build Coastguard Worker 
222*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nCos;                     // gain for cross taps
223*ec779b8eSAndroid Build Coastguard Worker 
224*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nSinIncrement;            // increment for gain
225*ec779b8eSAndroid Build Coastguard Worker 
226*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nCosIncrement;            // increment for gain
227*ec779b8eSAndroid Build Coastguard Worker 
228*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nRvbLpfFwd;                  // reverb feedback lpf forward gain (includes scaling for mixer)
229*ec779b8eSAndroid Build Coastguard Worker 
230*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nRvbLpfFbk;                  // reverb feedback lpf feedback gain
231*ec779b8eSAndroid Build Coastguard Worker 
232*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nRoomLpfFwd;                  // room lpf forward gain (includes scaling for mixer)
233*ec779b8eSAndroid Build Coastguard Worker 
234*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nRoomLpfFbk;                  // room lpf feedback gain
235*ec779b8eSAndroid Build Coastguard Worker 
236*ec779b8eSAndroid Build Coastguard Worker     uint16_t            m_nXfadeInterval;           // update/xfade after this many samples
237*ec779b8eSAndroid Build Coastguard Worker 
238*ec779b8eSAndroid Build Coastguard Worker     uint16_t            m_nXfadeCounter;            // keep track of when to xfade
239*ec779b8eSAndroid Build Coastguard Worker 
240*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nPhase;                   // -1 <= m_nPhase < 1
241*ec779b8eSAndroid Build Coastguard Worker                                                     // but during sin,cos calculations
242*ec779b8eSAndroid Build Coastguard Worker                                                     // use m_nPhase/2
243*ec779b8eSAndroid Build Coastguard Worker 
244*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nPhaseIncrement;          // add this to m_nPhase each frame
245*ec779b8eSAndroid Build Coastguard Worker 
246*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nNoise;                   // random noise sample
247*ec779b8eSAndroid Build Coastguard Worker 
248*ec779b8eSAndroid Build Coastguard Worker     uint16_t            m_nMaxExcursion;            // the taps can excurse +/- this amount
249*ec779b8eSAndroid Build Coastguard Worker 
250*ec779b8eSAndroid Build Coastguard Worker     uint16_t            m_bUseNoise;                // if TRUE, use noise as input signal
251*ec779b8eSAndroid Build Coastguard Worker 
252*ec779b8eSAndroid Build Coastguard Worker     uint16_t            m_bBypass;                  // if TRUE, then bypass reverb and copy input to output
253*ec779b8eSAndroid Build Coastguard Worker 
254*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nCurrentRoom;             // preset number for current room
255*ec779b8eSAndroid Build Coastguard Worker 
256*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nNextRoom;                // preset number for next room
257*ec779b8eSAndroid Build Coastguard Worker 
258*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nEarlyGain;               // gain for early (widen) signal
259*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nEarlyDelay;              // initial dealy for early (widen) signal
260*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nEarly0in;
261*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nEarly1in;
262*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nLateGain;               // gain for late reverb
263*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nLateDelay;
264*ec779b8eSAndroid Build Coastguard Worker 
265*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nDiffusion;
266*ec779b8eSAndroid Build Coastguard Worker 
267*ec779b8eSAndroid Build Coastguard Worker     early_reflection_object_t   m_sEarlyL;          // left channel early reflections
268*ec779b8eSAndroid Build Coastguard Worker     early_reflection_object_t   m_sEarlyR;          // right channel early reflections
269*ec779b8eSAndroid Build Coastguard Worker 
270*ec779b8eSAndroid Build Coastguard Worker     short             m_nDelayLine[REVERB_BUFFER_SIZE_IN_SAMPLES_MAX];    // one large delay line for all reverb elements
271*ec779b8eSAndroid Build Coastguard Worker 
272*ec779b8eSAndroid Build Coastguard Worker     reverb_preset_t     pPreset;
273*ec779b8eSAndroid Build Coastguard Worker 
274*ec779b8eSAndroid Build Coastguard Worker     reverb_preset_bank_t  m_sPreset;
275*ec779b8eSAndroid Build Coastguard Worker 
276*ec779b8eSAndroid Build Coastguard Worker     //int8_t            preset;
277*ec779b8eSAndroid Build Coastguard Worker     uint32_t            m_nSamplingRate;
278*ec779b8eSAndroid Build Coastguard Worker     int32_t             m_nUpdatePeriodInBits;
279*ec779b8eSAndroid Build Coastguard Worker     int32_t             m_nBufferMask;
280*ec779b8eSAndroid Build Coastguard Worker     int32_t             m_nUpdatePeriodInSamples;
281*ec779b8eSAndroid Build Coastguard Worker     int32_t             m_nDelay0Out;
282*ec779b8eSAndroid Build Coastguard Worker     int32_t             m_nDelay1Out;
283*ec779b8eSAndroid Build Coastguard Worker     int16_t             m_nCosWT_5KHz;
284*ec779b8eSAndroid Build Coastguard Worker 
285*ec779b8eSAndroid Build Coastguard Worker     uint16_t            m_Aux;                // if TRUE, is connected as auxiliary effect
286*ec779b8eSAndroid Build Coastguard Worker     uint16_t            m_Preset;             // if TRUE, expose preset revert interface
287*ec779b8eSAndroid Build Coastguard Worker 
288*ec779b8eSAndroid Build Coastguard Worker     uint32_t            mState;
289*ec779b8eSAndroid Build Coastguard Worker } reverb_object_t;
290*ec779b8eSAndroid Build Coastguard Worker 
291*ec779b8eSAndroid Build Coastguard Worker 
292*ec779b8eSAndroid Build Coastguard Worker 
293*ec779b8eSAndroid Build Coastguard Worker typedef struct reverb_module_s {
294*ec779b8eSAndroid Build Coastguard Worker     const struct effect_interface_s *itfe;
295*ec779b8eSAndroid Build Coastguard Worker     effect_config_t config;
296*ec779b8eSAndroid Build Coastguard Worker     reverb_object_t context;
297*ec779b8eSAndroid Build Coastguard Worker } reverb_module_t;
298*ec779b8eSAndroid Build Coastguard Worker 
299*ec779b8eSAndroid Build Coastguard Worker /*------------------------------------
300*ec779b8eSAndroid Build Coastguard Worker  * Effect API
301*ec779b8eSAndroid Build Coastguard Worker  *------------------------------------
302*ec779b8eSAndroid Build Coastguard Worker */
303*ec779b8eSAndroid Build Coastguard Worker int EffectCreate(const effect_uuid_t *effectUID,
304*ec779b8eSAndroid Build Coastguard Worker                  int32_t sessionId,
305*ec779b8eSAndroid Build Coastguard Worker                  int32_t ioId,
306*ec779b8eSAndroid Build Coastguard Worker                  effect_handle_t *pHandle);
307*ec779b8eSAndroid Build Coastguard Worker int EffectRelease(effect_handle_t handle);
308*ec779b8eSAndroid Build Coastguard Worker int EffectGetDescriptor(const effect_uuid_t *uuid,
309*ec779b8eSAndroid Build Coastguard Worker                         effect_descriptor_t *pDescriptor);
310*ec779b8eSAndroid Build Coastguard Worker 
311*ec779b8eSAndroid Build Coastguard Worker static int Reverb_Process(effect_handle_t self,
312*ec779b8eSAndroid Build Coastguard Worker                           audio_buffer_t *inBuffer,
313*ec779b8eSAndroid Build Coastguard Worker                           audio_buffer_t *outBuffer);
314*ec779b8eSAndroid Build Coastguard Worker static int Reverb_Command(effect_handle_t self,
315*ec779b8eSAndroid Build Coastguard Worker                           uint32_t cmdCode,
316*ec779b8eSAndroid Build Coastguard Worker                           uint32_t cmdSize,
317*ec779b8eSAndroid Build Coastguard Worker                           void *pCmdData,
318*ec779b8eSAndroid Build Coastguard Worker                           uint32_t *replySize,
319*ec779b8eSAndroid Build Coastguard Worker                           void *pReplyData);
320*ec779b8eSAndroid Build Coastguard Worker static int Reverb_GetDescriptor(effect_handle_t   self,
321*ec779b8eSAndroid Build Coastguard Worker                                 effect_descriptor_t *pDescriptor);
322*ec779b8eSAndroid Build Coastguard Worker 
323*ec779b8eSAndroid Build Coastguard Worker /*------------------------------------
324*ec779b8eSAndroid Build Coastguard Worker  * internal functions
325*ec779b8eSAndroid Build Coastguard Worker  *------------------------------------
326*ec779b8eSAndroid Build Coastguard Worker */
327*ec779b8eSAndroid Build Coastguard Worker 
328*ec779b8eSAndroid Build Coastguard Worker int Reverb_Init(reverb_module_t *pRvbModule, int aux, int preset);
329*ec779b8eSAndroid Build Coastguard Worker int Reverb_setConfig(reverb_module_t *pRvbModule, effect_config_t *pConfig, bool init);
330*ec779b8eSAndroid Build Coastguard Worker void Reverb_getConfig(reverb_module_t *pRvbModule, effect_config_t *pConfig);
331*ec779b8eSAndroid Build Coastguard Worker void Reverb_Reset(reverb_object_t *pReverb, bool init);
332*ec779b8eSAndroid Build Coastguard Worker 
333*ec779b8eSAndroid Build Coastguard Worker int Reverb_setParameter (reverb_object_t *pReverb, int32_t param, uint32_t size, void *pValue);
334*ec779b8eSAndroid Build Coastguard Worker int Reverb_getParameter(reverb_object_t *pReverb, int32_t param, uint32_t *pSize, void *pValue);
335*ec779b8eSAndroid Build Coastguard Worker 
336*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
337*ec779b8eSAndroid Build Coastguard Worker  * ReverbUpdateXfade
338*ec779b8eSAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
339*ec779b8eSAndroid Build Coastguard Worker  * Purpose:
340*ec779b8eSAndroid Build Coastguard Worker  * Update the xfade parameters as required
341*ec779b8eSAndroid Build Coastguard Worker  *
342*ec779b8eSAndroid Build Coastguard Worker  * Inputs:
343*ec779b8eSAndroid Build Coastguard Worker  * nNumSamplesToAdd - number of samples to write to buffer
344*ec779b8eSAndroid Build Coastguard Worker  *
345*ec779b8eSAndroid Build Coastguard Worker  * Outputs:
346*ec779b8eSAndroid Build Coastguard Worker  *
347*ec779b8eSAndroid Build Coastguard Worker  *
348*ec779b8eSAndroid Build Coastguard Worker  * Side Effects:
349*ec779b8eSAndroid Build Coastguard Worker  * - xfade parameters will be changed
350*ec779b8eSAndroid Build Coastguard Worker  *
351*ec779b8eSAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
352*ec779b8eSAndroid Build Coastguard Worker */
353*ec779b8eSAndroid Build Coastguard Worker static int ReverbUpdateXfade(reverb_object_t* pReverbData, int nNumSamplesToAdd);
354*ec779b8eSAndroid Build Coastguard Worker 
355*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
356*ec779b8eSAndroid Build Coastguard Worker  * ReverbCalculateNoise
357*ec779b8eSAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
358*ec779b8eSAndroid Build Coastguard Worker  * Purpose:
359*ec779b8eSAndroid Build Coastguard Worker  * Calculate a noise sample and limit its value
360*ec779b8eSAndroid Build Coastguard Worker  *
361*ec779b8eSAndroid Build Coastguard Worker  * Inputs:
362*ec779b8eSAndroid Build Coastguard Worker  * Pointer to reverb context
363*ec779b8eSAndroid Build Coastguard Worker  *
364*ec779b8eSAndroid Build Coastguard Worker  * Outputs:
365*ec779b8eSAndroid Build Coastguard Worker  * new limited noise value
366*ec779b8eSAndroid Build Coastguard Worker  *
367*ec779b8eSAndroid Build Coastguard Worker  * Side Effects:
368*ec779b8eSAndroid Build Coastguard Worker  * - pReverbData->m_nNoise value is updated
369*ec779b8eSAndroid Build Coastguard Worker  *
370*ec779b8eSAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
371*ec779b8eSAndroid Build Coastguard Worker */
372*ec779b8eSAndroid Build Coastguard Worker static uint16_t ReverbCalculateNoise(reverb_object_t *pReverbData);
373*ec779b8eSAndroid Build Coastguard Worker 
374*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
375*ec779b8eSAndroid Build Coastguard Worker  * ReverbCalculateSinCos
376*ec779b8eSAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
377*ec779b8eSAndroid Build Coastguard Worker  * Purpose:
378*ec779b8eSAndroid Build Coastguard Worker  * Calculate a new sin and cosine value based on the given phase
379*ec779b8eSAndroid Build Coastguard Worker  *
380*ec779b8eSAndroid Build Coastguard Worker  * Inputs:
381*ec779b8eSAndroid Build Coastguard Worker  * nPhase   - phase angle
382*ec779b8eSAndroid Build Coastguard Worker  * pnSin    - input old value, output new value
383*ec779b8eSAndroid Build Coastguard Worker  * pnCos    - input old value, output new value
384*ec779b8eSAndroid Build Coastguard Worker  *
385*ec779b8eSAndroid Build Coastguard Worker  * Outputs:
386*ec779b8eSAndroid Build Coastguard Worker  *
387*ec779b8eSAndroid Build Coastguard Worker  * Side Effects:
388*ec779b8eSAndroid Build Coastguard Worker  * - *pnSin, *pnCos are updated
389*ec779b8eSAndroid Build Coastguard Worker  *
390*ec779b8eSAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
391*ec779b8eSAndroid Build Coastguard Worker */
392*ec779b8eSAndroid Build Coastguard Worker static int ReverbCalculateSinCos(int16_t nPhase, int16_t *pnSin, int16_t *pnCos);
393*ec779b8eSAndroid Build Coastguard Worker 
394*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
395*ec779b8eSAndroid Build Coastguard Worker  * Reverb
396*ec779b8eSAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
397*ec779b8eSAndroid Build Coastguard Worker  * Purpose:
398*ec779b8eSAndroid Build Coastguard Worker  * apply reverb to the given signal
399*ec779b8eSAndroid Build Coastguard Worker  *
400*ec779b8eSAndroid Build Coastguard Worker  * Inputs:
401*ec779b8eSAndroid Build Coastguard Worker  * nNu
402*ec779b8eSAndroid Build Coastguard Worker  * pnSin    - input old value, output new value
403*ec779b8eSAndroid Build Coastguard Worker  * pnCos    - input old value, output new value
404*ec779b8eSAndroid Build Coastguard Worker  *
405*ec779b8eSAndroid Build Coastguard Worker  * Outputs:
406*ec779b8eSAndroid Build Coastguard Worker  * number of samples actually reverberated
407*ec779b8eSAndroid Build Coastguard Worker  *
408*ec779b8eSAndroid Build Coastguard Worker  * Side Effects:
409*ec779b8eSAndroid Build Coastguard Worker  *
410*ec779b8eSAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
411*ec779b8eSAndroid Build Coastguard Worker */
412*ec779b8eSAndroid Build Coastguard Worker static int Reverb(reverb_object_t* pReverbData, int nNumSamplesToAdd, short *pOutputBuffer, short *pInputBuffer);
413*ec779b8eSAndroid Build Coastguard Worker 
414*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
415*ec779b8eSAndroid Build Coastguard Worker  * ReverbReadInPresets()
416*ec779b8eSAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
417*ec779b8eSAndroid Build Coastguard Worker  * Purpose: sets global reverb preset bank to defaults
418*ec779b8eSAndroid Build Coastguard Worker  *
419*ec779b8eSAndroid Build Coastguard Worker  * Inputs:
420*ec779b8eSAndroid Build Coastguard Worker  *
421*ec779b8eSAndroid Build Coastguard Worker  * Outputs:
422*ec779b8eSAndroid Build Coastguard Worker  *
423*ec779b8eSAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
424*ec779b8eSAndroid Build Coastguard Worker */
425*ec779b8eSAndroid Build Coastguard Worker static int ReverbReadInPresets(reverb_object_t* pReverbData);
426*ec779b8eSAndroid Build Coastguard Worker 
427*ec779b8eSAndroid Build Coastguard Worker 
428*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
429*ec779b8eSAndroid Build Coastguard Worker  * ReverbUpdateRoom
430*ec779b8eSAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
431*ec779b8eSAndroid Build Coastguard Worker  * Purpose:
432*ec779b8eSAndroid Build Coastguard Worker  * Update the room's preset parameters as required
433*ec779b8eSAndroid Build Coastguard Worker  *
434*ec779b8eSAndroid Build Coastguard Worker  * Inputs:
435*ec779b8eSAndroid Build Coastguard Worker  *
436*ec779b8eSAndroid Build Coastguard Worker  * Outputs:
437*ec779b8eSAndroid Build Coastguard Worker  *
438*ec779b8eSAndroid Build Coastguard Worker  *
439*ec779b8eSAndroid Build Coastguard Worker  * Side Effects:
440*ec779b8eSAndroid Build Coastguard Worker  * - reverb paramters (fbk, fwd, etc) will be changed
441*ec779b8eSAndroid Build Coastguard Worker  * - m_nCurrentRoom := m_nNextRoom
442*ec779b8eSAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
443*ec779b8eSAndroid Build Coastguard Worker */
444*ec779b8eSAndroid Build Coastguard Worker static int ReverbUpdateRoom(reverb_object_t* pReverbData, bool fullUpdate);
445*ec779b8eSAndroid Build Coastguard Worker 
446*ec779b8eSAndroid Build Coastguard Worker #endif /*ANDROID_EFFECTREVERB_H_*/
447