Home | History | Annotate | Download | only in testlibs
      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