• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   * Copyright (C) 2004-2010 NXP Software
3   * Copyright (C) 2010 The Android Open Source Project
4   *
5   * Licensed under the Apache License, Version 2.0 (the "License");
6   * you may not use this file except in compliance with the License.
7   * You may obtain a copy of the License at
8   *
9   *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  
18  #ifndef __LVREV_PRIVATE_H__
19  #define __LVREV_PRIVATE_H__
20  
21  #ifdef __cplusplus
22  extern "C" {
23  #endif
24  
25  
26  /****************************************************************************************/
27  /*                                                                                      */
28  /*  Includes                                                                            */
29  /*                                                                                      */
30  /****************************************************************************************/
31  #include "LVREV.h"
32  #include "LVREV_Tables.h"
33  #include "BIQUAD.h"
34  #include "Filter.h"
35  #include "VectorArithmetic.h"
36  #include "Mixer.h"
37  #include "LVM_Macros.h"
38  
39  
40  /****************************************************************************************/
41  /*                                                                                      */
42  /*  Defines                                                                             */
43  /*                                                                                      */
44  /****************************************************************************************/
45  /* General */
46  #define ONE_OVER_SQRT_TWO               23170           /* 1/sqrt(2) * 2^15 */
47  #define LVREV_B_8_on_1000            17179869           /* 0.8 * 2^31 */
48  #define LVREV_HEADROOM                   8192           /* -12dB * 2^15 */
49  #define LVREV_2_9_INQ29           1583769190L           /* 2.9 in Q29 format */
50  #define LVREV_MIN3DB                   0x5A82           /* -3dB in Q15 format */
51  
52  /* Intenal constants */
53  #define LVREV_LP_Poly_Order                 4
54  #define LVREV_LP_Poly_Shift                 5
55  #define LVREV_T_3_Power_0_on_4          32768
56  #define LVREV_T_3_Power_1_on_4          43125
57  #define LVREV_T_3_Power_2_on_4          56755
58  #define LVREV_T_3_Power_3_on_4          74694
59  #define LVREV_T60_SCALE                306774           /*(32767/7000)<<16 */
60  #define LVREV_T_3_Power_minus0_on_4     32767           /* 3^(-0/4) * 2^15 */
61  #define LVREV_T_3_Power_minus1_on_4     24898           /* 3^(-1/4) * 2^15 */
62  #define LVREV_T_3_Power_minus2_on_4     18919           /* 3^(-2/4) * 2^15 */
63  #define LVREV_T_3_Power_minus3_on_4     14375           /* 3^(-3/4) * 2^15 */
64  #define LVREV_MAX_T3_DELAY               2527           /* ((48000 * 120 * LVREV_T_3_Power_minus3_on_4) >> 15) / 1000 */
65  #define LVREV_MAX_T2_DELAY               3326           /* ((48000 * 120 * LVREV_T_3_Power_minus2_on_4) >> 15) / 1000 */
66  #define LVREV_MAX_T1_DELAY               4377           /* ((48000 * 120 * LVREV_T_3_Power_minus1_on_4) >> 15) / 1000 */
67  #define LVREV_MAX_T0_DELAY               5760           /* ((48000 * 120 * LVREV_T_3_Power_minus0_on_4) >> 15) / 1000 */
68  #define LVREV_MAX_AP3_DELAY              1685           /* ((48000 * 120 * LVREV_T_3_Power_minus3_on_4) >> 15) / 1500 */
69  #define LVREV_MAX_AP2_DELAY              2218           /* ((48000 * 120 * LVREV_T_3_Power_minus2_on_4) >> 15) / 1500 */
70  #define LVREV_MAX_AP1_DELAY              2918           /* ((48000 * 120 * LVREV_T_3_Power_minus1_on_4) >> 15) / 1500 */
71  #define LVREV_MAX_AP0_DELAY              3840           /* ((48000 * 120 * LVREV_T_3_Power_minus0_on_4) >> 15) / 1500 */
72  #define LVREV_BYPASSMIXER_TC             1000           /* Bypass mixer time constant*/
73  #define LVREV_ALLPASS_TC                 1000           /* All-pass filter time constant */
74  #define LVREV_ALLPASS_TAP_TC             10000           /* All-pass filter dely tap change */
75  #define LVREV_FEEDBACKMIXER_TC            100           /* Feedback mixer time constant*/
76  #define LVREV_OUTPUTGAIN_SHIFT              5           /* Bits shift for output gain correction */
77  
78  /* Parameter limits */
79  #define LVREV_NUM_FS                        9           /* Number of supported sample rates */
80  #define LVREV_MAXBLKSIZE_LIMIT             64           /* Maximum block size low limit */
81  #define LVREV_MAX_LEVEL                   100           /* Maximum level, 100% */
82  #define LVREV_MIN_LPF_CORNER               50           /* Low pass filter limits */
83  #define LVREV_MAX_LPF_CORNER            23999
84  #define LVREV_MIN_HPF_CORNER               20           /* High pass filrer limits */
85  #define LVREV_MAX_HPF_CORNER             1000
86  #define LVREV_MAX_T60                    7000           /* Maximum T60 time in ms */
87  #define LVREV_MAX_DENSITY                 100           /* Maximum density, 100% */
88  #define LVREV_MAX_DAMPING                 100           /* Maximum damping, 100% */
89  #define LVREV_MAX_ROOMSIZE                100           /* Maximum room size, 100% */
90  
91  
92  
93  /****************************************************************************************/
94  /*                                                                                      */
95  /*  Structures                                                                          */
96  /*                                                                                      */
97  /****************************************************************************************/
98  /* Fast data structure */
99  typedef struct
100  {
101  
102      Biquad_1I_Order1_Taps_t HPTaps;                     /* High pass filter taps */
103      Biquad_1I_Order1_Taps_t LPTaps;                     /* Low pass filter taps */
104      Biquad_1I_Order1_Taps_t RevLPTaps[4];               /* Reverb low pass filters taps */
105  
106  } LVREV_FastData_st;
107  
108  
109  /* Fast coefficient structure */
110  typedef struct
111  {
112  
113      Biquad_Instance_t       HPCoefs;                    /* High pass filter coefficients */
114      Biquad_Instance_t       LPCoefs;                    /* Low pass filter coefficients */
115      Biquad_Instance_t       RevLPCoefs[4];              /* Reverb low pass filters coefficients */
116  
117  } LVREV_FastCoef_st;
118  
119  
120  /* Instance parameter structure */
121  typedef struct
122  {
123      /* General */
124      LVREV_InstanceParams_st InstanceParams;             /* Initialisation time instance parameters */
125      LVREV_MemoryTable_st    MemoryTable;                /* Memory table */
126      LVREV_ControlParams_st  CurrentParams;              /* Parameters being used */
127      LVREV_ControlParams_st  NewParams;                  /* New parameters from the calling application */
128      LVM_CHAR                bControlPending;            /* Flag to indicate new parameters are available */
129      LVM_CHAR                bFirstControl;              /* Flag to indicate that the control function is called for the first time */
130      LVM_CHAR                bDisableReverb;             /* Flag to indicate that the mix level is 0% and the reverb can be disabled */
131      LVM_INT32               RoomSizeInms;               /* Room size in msec */
132      LVM_INT32               MaxBlkLen;                  /* Maximum block size for internal processing */
133  
134      /* Aligned memory pointers */
135      LVREV_FastData_st       *pFastData;                 /* Fast data memory base address */
136      LVREV_FastCoef_st       *pFastCoef;                 /* Fast coefficient memory base address */
137      LVM_INT32               *pScratchDelayLine[4];      /* Delay line scratch memory */
138      LVM_INT32               *pScratch;                  /* Multi ussge scratch */
139      LVM_INT32               *pInputSave;                /* Reverb block input save for dry/wet mixing*/
140  
141      /* Feedback matrix */
142      Mix_1St_Cll_t           FeedbackMixer[4];           /* Mixer for Pop and Click Supression caused by feedback Gain */
143  
144      /* All-Pass Filter */
145      LVM_INT32               T[4];                       /* Maximum delay size of buffer */
146      LVM_INT32               *pDelay_T[4];               /* Pointer to delay buffers */
147      LVM_INT32               Delay_AP[4];                /* Offset to AP delay buffer start */
148      LVM_INT16               AB_Selection;               /* Smooth from tap A to B when 1 otherwise B to A */
149      LVM_INT32               A_DelaySize[4];             /* A delay length in samples */
150      LVM_INT32               B_DelaySize[4];             /* B delay length in samples */
151      LVM_INT32               *pOffsetA[4];               /* Offset for the A delay tap */
152      LVM_INT32               *pOffsetB[4];               /* Offset for the B delay tap */
153      Mix_2St_Cll_t           Mixer_APTaps[4];            /* Smoothed AP delay mixer */
154      Mix_1St_Cll_t           Mixer_SGFeedback[4];        /* Smoothed SAfeedback gain */
155      Mix_1St_Cll_t           Mixer_SGFeedforward[4];     /* Smoothed AP feedforward gain */
156  
157      /* Output gain */
158      Mix_2St_Cll_t           BypassMixer;                /* Dry/wet mixer */
159      LVM_INT16               Gain;                       /* Gain applied to output to maintain average signal power */
160      Mix_1St_Cll_t           GainMixer;                  /* Gain smoothing */
161  
162  } LVREV_Instance_st;
163  
164  
165  /****************************************************************************************/
166  /*                                                                                      */
167  /*  Function prototypes                                                                 */
168  /*                                                                                      */
169  /****************************************************************************************/
170  
171  LVREV_ReturnStatus_en   LVREV_ApplyNewSettings(LVREV_Instance_st     *pPrivate);
172  
173  void                    ReverbBlock(LVM_INT32           *pInput,
174                                      LVM_INT32           *pOutput,
175                                      LVREV_Instance_st   *pPrivate,
176                                      LVM_UINT16          NumSamples);
177  
178  LVM_INT32               BypassMixer_Callback(void       *pCallbackData,
179                                               void       *pGeneralPurpose,
180                                               LVM_INT16  GeneralPurpose );
181  
182  
183  #ifdef __cplusplus
184  }
185  #endif
186  
187  #endif  /** __LVREV_PRIVATE_H__ **/
188  
189  /* End of file */
190