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