windows-nt/Source/XPSP1/NT/enduser/speech/tts/msttsdrv/engine/reverbfx.h
2020-09-26 16:20:57 +08:00

203 lines
6.7 KiB
C++

/******************************************************************************
* ReverbFX.h *
*-------------*
* This is the header file for the CReverbFX implementation.
*------------------------------------------------------------------------------
* Copyright (C) 1999 Microsoft Corporation Date: 03/01/99
* All Rights Reserved
*
*********************************************************************** MC ****/
#ifndef ReverbFX_H
#define ReverbFX_H
#ifndef __spttseng_h__
#include "spttseng.h"
#endif
//-------------------------------------------------------------
// Comment-out line below if you want
// integer math instead of floating point.
//
// NOTE:
// Bathtub preset probably won't work
// using integer math (overflow)
//-------------------------------------------------------------
#define FLOAT_REVERB 1
#ifdef FLOAT_REVERB
#define REVERBT float
#define REVERBL float
#else
#define REVERBT short
#define REVERBL long
#endif
#ifdef FLOAT_REVERB
static const float REVERB_VOL_OFF = 0.0;
static const float REVERB_VOL_UNITY = 1.0f;
static const float REVERB_MIN_MIX = 0.001f;
#else
static const long REVERB_VOL_SHIFT = (16);
static const long REVERB_VOL_LEVELS = 65536;
static const long REVERB_VOL_OFF = 0;
static const long REVERB_VOL_UNITY = REVERB_VOL_LEVELS;
#endif
static const float REVERB_MIN_DB = (-110.0);
static const long KMAXREVBMODS = 5;
static const long KWORKBUFLEN = 1024;
//-------------------------------------
// Reverb preset parametrs
//-------------------------------------
struct REVERBCONFIG
{
float wetGain_dB; // WET gain (db)
float dryGain_dB; // DRY gain (db)
short numOfReflect; // Number of modules
float *gain_ms_Array; // Array of delay values (ms)
float *gain_dB_Array; // Array of gain values (db)
float seqIndex; // "sequencer" fx
};
typedef struct REVERBCONFIG REVERBCONFIG, *LPREVERBCONFIG;
struct Reverb_Mod
{
REVERBL lGain; // Gain of the amplifiers.
long dwDelay; // Length of the delay line.
long dwDelayBufferSize; // Size of the delay buffer.
REVERBT *psDelayBuffer; // Circular delay buffer, length dwDelay.
REVERBT *psDelayIn; // Current input position in the delay.
REVERBT *psDelayOut; // Current output position in the delay.
REVERBT *psDelayEnd; // Location immediately following the buffer.
};
typedef struct Reverb_Mod Reverb_Mod, *LP_Reverb_Mod;
//----------------------------------
// Reverb error codes
//----------------------------------
static const long KREVERB_NOERROR = 0;
static const long KREVERB_MEMERROR = 1;
static const long KREVERB_OFF = 2;
//-----------------------------------------
// ReverbFX Class
//-----------------------------------------
class CReverbFX
{
public:
//----------------------------------
// Initialization functions
//----------------------------------
CReverbFX( void );
~CReverbFX( void );
short Reverb_Init
(
REVERBTYPE reverbPreset, // Configuration preset
long nSamplesPerSec, // SampleRate
long stereoOut // true = output is stero
);
private:
REVERBL DecibelToPercent( float flDecibel );
void ClearReverb( LP_Reverb_Mod mod );
short AllocReverbModule
(
LP_Reverb_Mod mod,
REVERBL lGain, // Gain of the amplifiers.
long dwDelay, // Length of the delay line.
long dwDelayBufferSize // Size of the delay buffer.
);
short CreateReverbModules
(
short wModules, // Number of modules to create.
LP_Reverb_Mod *mods,
float * pfltDelay, // Array of delay values for the modules.
float * pfltDB, // Array of gain values for the modules.
float fltSamplesPerMS // Number of samples per millisecond.
);
void DeleteReverbModules ();
LPREVERBCONFIG GetReverbConfig( REVERBTYPE dwReverbConfig );
//----------------------------------
// Run-time
//----------------------------------
void CopyWithGain
(
REVERBT *psDest,
REVERBT *psSource,
long dwSamples,
REVERBL gain
);
void MixWithGain_STEREO
(
REVERBT *pWet,
REVERBT *pDry,
short *pDest,
long dwSamples,
REVERBL gain
);
void MixWithGain_MONO
(
REVERBT *pWet,
REVERBT *pDry,
short *pDest,
long dwSamples,
REVERBL gain
);
void ProcessReverbModule
(
LP_Reverb_Mod mod,
long dwDestSamples, // Number of samples to process.
REVERBT *pSource, // Source sample buffer.
REVERBT *pDestination // Destination sample buffer.
);
void ProcessReverbBuffer
(
REVERBT *psSample, // Samples to process (in/out).
long wSamples, // Number of samples to process.
LP_Reverb_Mod *mods // Array of modules to apply.
);
public:
short Reverb_Process( float *sampleBuffer, long dwSamplesRemaining, float audioGain );
private:
//----------------------------------
// Member Variables
//----------------------------------
long m_StereoOut;
long m_dwWorkBufferSize;
REVERBT *m_pWorkBuf;
REVERBL m_wetVolGain;
REVERBL m_dryVolGain;
long m_numOfMods;
LP_Reverb_Mod m_Reverb_Mods[KMAXREVBMODS];
LPREVERBCONFIG m_pReverbConfig;
float m_Count;
float m_LenScale;
};
typedef CReverbFX *LP_CReverbFX;
#endif //--- This must be the last line in the file