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