• 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 /****************************************************************************************/
22 /*                                                                                      */
23 /*  Includes                                                                            */
24 /*                                                                                      */
25 /****************************************************************************************/
26 
27 #include <audio_utils/BiquadFilter.h>
28 #include "LVREV.h"
29 #include "LVREV_Tables.h"
30 #include "BIQUAD.h"
31 #include "Filter.h"
32 #include "VectorArithmetic.h"
33 #include "Mixer.h"
34 #include "LVM_Macros.h"
35 
36 /****************************************************************************************/
37 /*                                                                                      */
38 /*  Defines                                                                             */
39 /*                                                                                      */
40 /****************************************************************************************/
41 /* General */
42 #define ONE_OVER_SQRT_TWO 0.707107f /* 1/sqrt(2) * 2^15 */
43 #define LVREV_B_8_on_1000 0.008f    /* 0.8 * 2^31 */
44 #define LVREV_HEADROOM 0.25f        /* -12dB * 2^15 */
45 #define LVREV_2_9_INQ29 2.9f        /* 2.9 in Q29 format */
46 #define LVREV_MIN3DB 0.7079457f     /* -3dB in Q15 format */
47 
48 /* Intenal constants */
49 #define LVREV_LP_Poly_Order 4
50 #define LVREV_LP_Poly_Shift 5
51 
52 #define LVREV_T60_SCALE 0.000142f /*(1/7000) */
53 
54 #define LVREV_T_3_Power_0_on_4 1.0f
55 #define LVREV_T_3_Power_1_on_4 1.316074f
56 #define LVREV_T_3_Power_2_on_4 1.732051f
57 #define LVREV_T_3_Power_3_on_4 2.279507f
58 #define LVREV_T_3_Power_minus0_on_4 1.0f      /* 3^(-0/4) * 2^15 */
59 #define LVREV_T_3_Power_minus1_on_4 0.759836f /* 3^(-1/4) * 2^15 */
60 #define LVREV_T_3_Power_minus2_on_4 0.577350f /* 3^(-2/4) * 2^15 */
61 #define LVREV_T_3_Power_minus3_on_4 0.438691f /* 3^(-3/4) * 2^15 */
62 
63 /* ((192000 * 120 * LVREV_T_3_Power_minus3_on_4) >> 15) / 1000 */
64 #define LVREV_MAX_T3_DELAY 10108
65 /* ((192000 * 120 * LVREV_T_3_Power_minus2_on_4) >> 15) / 1000 */
66 #define LVREV_MAX_T2_DELAY 13304
67 /* ((192000 * 120 * LVREV_T_3_Power_minus1_on_4) >> 15) / 1000 */
68 #define LVREV_MAX_T1_DELAY 17508
69 /* ((192000 * 120 * LVREV_T_3_Power_minus0_on_4) >> 15) / 1000 */
70 #define LVREV_MAX_T0_DELAY 23040
71 /* ((192000 * 120 * LVREV_T_3_Power_minus3_on_4) >> 15) / 1500 */
72 #define LVREV_MAX_AP3_DELAY 6740
73 /* ((192000 * 120 * LVREV_T_3_Power_minus2_on_4) >> 15) / 1500 */
74 #define LVREV_MAX_AP2_DELAY 8872
75 /* ((192000 * 120 * LVREV_T_3_Power_minus1_on_4) >> 15) / 1500 */
76 #define LVREV_MAX_AP1_DELAY 11672
77 /* ((192000 * 120 * LVREV_T_3_Power_minus0_on_4) >> 15) / 1500 */
78 #define LVREV_MAX_AP0_DELAY 15360
79 
80 #define LVREV_BYPASSMIXER_TC 1000  /* Bypass mixer time constant*/
81 #define LVREV_ALLPASS_TC 1000      /* All-pass filter time constant */
82 #define LVREV_ALLPASS_TAP_TC 10000 /* All-pass filter dely tap change */
83 #define LVREV_FEEDBACKMIXER_TC 100 /* Feedback mixer time constant*/
84 #define LVREV_OUTPUTGAIN_SHIFT 5   /* Bits shift for output gain correction */
85 
86 /* Parameter limits */
87 #define LVREV_NUM_FS 13 /* Number of supported sample rates */
88 
89 #define LVREV_MAXBLKSIZE_LIMIT 64 /* Maximum block size low limit */
90 #define LVREV_MAX_LEVEL 100       /* Maximum level, 100% */
91 #define LVREV_MIN_LPF_CORNER 50   /* Low pass filter limits */
92 #define LVREV_MAX_LPF_CORNER 23999
93 #define LVREV_MIN_HPF_CORNER 20 /* High pass filrer limits */
94 #define LVREV_MAX_HPF_CORNER 1000
95 #define LVREV_MAX_T60 7000     /* Maximum T60 time in ms */
96 #define LVREV_MAX_DENSITY 100  /* Maximum density, 100% */
97 #define LVREV_MAX_DAMPING 100  /* Maximum damping, 100% */
98 #define LVREV_MAX_ROOMSIZE 100 /* Maximum room size, 100% */
99 
100 /****************************************************************************************/
101 /*                                                                                      */
102 /*  Structures                                                                          */
103 /*                                                                                      */
104 /****************************************************************************************/
105 
106 typedef struct {
107     /* General */
108     LVREV_InstanceParams_st InstanceParams; /* Initialisation time instance parameters */
109     LVREV_ControlParams_st CurrentParams;   /* Parameters being used */
110     LVREV_ControlParams_st NewParams;       /* New parameters from the \
111                                                calling application */
112     LVM_CHAR bControlPending;               /* Flag to indicate new parameters \
113                                                are available */
114     LVM_CHAR bFirstControl;                 /* Flag to indicate that the control \
115                                                function is called for the first time */
116     LVM_CHAR bDisableReverb;                /* Flag to indicate that the mix level is
117                                                0% and the reverb can be disabled */
118     LVM_INT32 RoomSizeInms;                 /* Room size in msec */
119     LVM_INT32 MaxBlkLen;                    /* Maximum block size for internal
120                                                processing */
121 
122     /* Aligned memory pointers */
123     std::unique_ptr<android::audio_utils::BiquadFilter<LVM_FLOAT>>
124             pRevHPFBiquad; /* Biquad filter instance for HPF */
125     std::unique_ptr<android::audio_utils::BiquadFilter<LVM_FLOAT>>
126             pRevLPFBiquad; /* Biquad filter instance for LPF */
127     std::array<std::unique_ptr<android::audio_utils::BiquadFilter<LVM_FLOAT>>, LVREV_DELAYLINES_4>
128             revLPFBiquad; /* Biquad filter instance for Reverb LPF */
129     LVM_FLOAT* pScratchDelayLine[LVREV_DELAYLINES_4]; /* Delay line scratch memory */
130     LVM_FLOAT* pScratch;             /* Multi ussge scratch */
131     LVM_FLOAT* pInputSave;           /* Reverb block input save for dry/wet
132                                         mixing*/
133 
134     /* Feedback matrix */
135     Mix_1St_Cll_FLOAT_t FeedbackMixer[LVREV_DELAYLINES_4]; /* Mixer for Pop and Click Suppression \
136                                              caused by feedback Gain */
137 
138     /* All-Pass Filter */
139     LVM_INT32 T[LVREV_DELAYLINES_4];                          /* Maximum delay size of buffer */
140     LVM_FLOAT* pDelay_T[LVREV_DELAYLINES_4];                  /* Pointer to delay buffers */
141     LVM_INT32 Delay_AP[LVREV_DELAYLINES_4];                   /* Offset to AP delay buffer start */
142     LVM_INT16 AB_Selection;                     /* Smooth from tap A to B when 1 \
143                                                    otherwise B to A */
144     LVM_INT32 A_DelaySize[LVREV_DELAYLINES_4];                /* A delay length in samples */
145     LVM_INT32 B_DelaySize[LVREV_DELAYLINES_4];                /* B delay length in samples */
146     LVM_FLOAT* pOffsetA[LVREV_DELAYLINES_4];                  /* Offset for the A delay tap */
147     LVM_FLOAT* pOffsetB[LVREV_DELAYLINES_4];                  /* Offset for the B delay tap */
148     Mix_2St_Cll_FLOAT_t Mixer_APTaps[LVREV_DELAYLINES_4];     /* Smoothed AP delay mixer */
149     Mix_1St_Cll_FLOAT_t Mixer_SGFeedback[LVREV_DELAYLINES_4]; /* Smoothed SAfeedback gain */
150     Mix_1St_Cll_FLOAT_t Mixer_SGFeedforward[LVREV_DELAYLINES_4]; /* Smoothed AP feedforward gain */
151 
152     /* Output gain */
153     Mix_2St_Cll_FLOAT_t BypassMixer; /* Dry/wet mixer */
154     LVM_FLOAT Gain;                  /* Gain applied to output to maintain
155                                         average signal power */
156     Mix_1St_Cll_FLOAT_t GainMixer;   /* Gain smoothing */
157 
158 } LVREV_Instance_st;
159 
160 /****************************************************************************************/
161 /*                                                                                      */
162 /*  Function prototypes                                                                 */
163 /*                                                                                      */
164 /****************************************************************************************/
165 
166 LVREV_ReturnStatus_en LVREV_ApplyNewSettings(LVREV_Instance_st* pPrivate);
167 void ReverbBlock(LVM_FLOAT* pInput, LVM_FLOAT* pOutput, LVREV_Instance_st* pPrivate,
168                  LVM_UINT16 NumSamples);
169 LVM_INT32 BypassMixer_Callback(void* pCallbackData, void* pGeneralPurpose,
170                                LVM_INT16 GeneralPurpose);
171 
172 #endif /** __LVREV_PRIVATE_H__ **/
173 
174 /* End of file */
175