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 22extern "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 */ 99typedef 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 */ 110typedef 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 */ 121typedef 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 171LVREV_ReturnStatus_en LVREV_ApplyNewSettings(LVREV_Instance_st *pPrivate); 172 173void ReverbBlock(LVM_INT32 *pInput, 174 LVM_INT32 *pOutput, 175 LVREV_Instance_st *pPrivate, 176 LVM_UINT16 NumSamples); 177 178LVM_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