/****************************************************************************** * 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