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