203 lines
6.7 KiB
C++
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
|
|
|
|
|
|
|
|
|