diff --git a/reaction/code/client/qal.c b/reaction/code/client/qal.c index 5ddd67f2..d52020bb 100644 --- a/reaction/code/client/qal.c +++ b/reaction/code/client/qal.c @@ -62,6 +62,7 @@ LPALSOURCEF qalSourcef; LPALSOURCE3F qalSource3f; LPALSOURCEFV qalSourcefv; LPALSOURCEI qalSourcei; +LPALSOURCE3I qalSource3i; LPALGETSOURCEF qalGetSourcef; LPALGETSOURCE3F qalGetSource3f; LPALGETSOURCEFV qalGetSourcefv; @@ -107,6 +108,46 @@ LPALCCAPTURESTART qalcCaptureStart; LPALCCAPTURESTOP qalcCaptureStop; LPALCCAPTURESAMPLES qalcCaptureSamples; +// Effect objects +LPALGENEFFECTS qalGenEffects = NULL; +LPALDELETEEFFECTS qalDeleteEffects = NULL; +LPALISEFFECT qalIsEffect = NULL; +LPALEFFECTI qalEffecti = NULL; +LPALEFFECTIV qalEffectiv = NULL; +LPALEFFECTF qalEffectf = NULL; +LPALEFFECTFV qalEffectfv = NULL; +LPALGETEFFECTI qalGetEffecti = NULL; +LPALGETEFFECTIV qalGetEffectiv = NULL; +LPALGETEFFECTF qalGetEffectf = NULL; +LPALGETEFFECTFV qalGetEffectfv = NULL; + +//Filter objects +LPALGENFILTERS qalGenFilters = NULL; +LPALDELETEFILTERS qalDeleteFilters = NULL; +LPALISFILTER qalIsFilter = NULL; +LPALFILTERI qalFilteri = NULL; +LPALFILTERIV qalFilteriv = NULL; +LPALFILTERF qalFilterf = NULL; +LPALFILTERFV qalFilterfv = NULL; +LPALGETFILTERI qalGetFilteri = NULL; +LPALGETFILTERIV qalGetFilteriv = NULL; +LPALGETFILTERF qalGetFilterf = NULL; +LPALGETFILTERFV qalGetFilterfv = NULL; + +// Auxiliary slot object +LPALGENAUXILIARYEFFECTSLOTS qalGenAuxiliaryEffectSlots = NULL; +LPALDELETEAUXILIARYEFFECTSLOTS qalDeleteAuxiliaryEffectSlots = NULL; +LPALISAUXILIARYEFFECTSLOT qalIsAuxiliaryEffectSlot = NULL; +LPALAUXILIARYEFFECTSLOTI qalAuxiliaryEffectSloti = NULL; +LPALAUXILIARYEFFECTSLOTIV qalAuxiliaryEffectSlotiv = NULL; +LPALAUXILIARYEFFECTSLOTF qalAuxiliaryEffectSlotf = NULL; +LPALAUXILIARYEFFECTSLOTFV qalAuxiliaryEffectSlotfv = NULL; +LPALGETAUXILIARYEFFECTSLOTI qalGetAuxiliaryEffectSloti = NULL; +LPALGETAUXILIARYEFFECTSLOTIV qalGetAuxiliaryEffectSlotiv = NULL; +LPALGETAUXILIARYEFFECTSLOTF qalGetAuxiliaryEffectSlotf = NULL; +LPALGETAUXILIARYEFFECTSLOTFV qalGetAuxiliaryEffectSlotfv = NULL; + + static void *OpenALLib = NULL; static qboolean alinit_fail = qfalse; @@ -195,6 +236,7 @@ qboolean QAL_Init(const char *libname) qalSource3f = GPA("alSource3f"); qalSourcefv = GPA("alSourcefv"); qalSourcei = GPA("alSourcei"); + qalSource3i = GPA("alSource3i"); qalGetSourcef = GPA("alGetSourcef"); qalGetSource3f = GPA("alGetSource3f"); qalGetSourcefv = GPA("alGetSourcefv"); diff --git a/reaction/code/client/qal.h b/reaction/code/client/qal.h index 1a2284a2..9abdfc3f 100644 --- a/reaction/code/client/qal.h +++ b/reaction/code/client/qal.h @@ -47,6 +47,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #endif #endif +#include "qal_efx.h" + + #ifdef USE_OPENAL_DLOPEN extern LPALENABLE qalEnable; extern LPALDISABLE qalDisable; @@ -142,6 +145,46 @@ extern LPALCCAPTURECLOSEDEVICE qalcCaptureCloseDevice; extern LPALCCAPTURESTART qalcCaptureStart; extern LPALCCAPTURESTOP qalcCaptureStop; extern LPALCCAPTURESAMPLES qalcCaptureSamples; + +// Effect objects +extern LPALGENEFFECTS qalGenEffects; +extern LPALDELETEEFFECTS qalDeleteEffects; +extern LPALISEFFECT qalIsEffect; +extern LPALEFFECTI qalEffecti; +extern LPALEFFECTIV qalEffectiv; +extern LPALEFFECTF qalEffectf; +extern LPALEFFECTFV qalEffectfv; +extern LPALGETEFFECTI qalGetEffecti; +extern LPALGETEFFECTIV qalGetEffectiv; +extern LPALGETEFFECTF qalGetEffectf; +extern LPALGETEFFECTFV qalGetEffectfv; + +//Filter objects +extern LPALGENFILTERS qalGenFilters; +extern LPALDELETEFILTERS qalDeleteFilters; +extern LPALISFILTER qalIsFilter; +extern LPALFILTERI qalFilteri; +extern LPALFILTERIV qalFilteriv; +extern LPALFILTERF qalFilterf; +extern LPALFILTERFV qalFilterfv; +extern LPALGETFILTERI qalGetFilteri; +extern LPALGETFILTERIV qalGetFilteriv; +extern LPALGETFILTERF qalGetFilterf; +extern LPALGETFILTERFV qalGetFilterfv; + +// Auxiliary slot object +extern LPALGENAUXILIARYEFFECTSLOTS qalGenAuxiliaryEffectSlots; +extern LPALDELETEAUXILIARYEFFECTSLOTS qalDeleteAuxiliaryEffectSlots; +extern LPALISAUXILIARYEFFECTSLOT qalIsAuxiliaryEffectSlot; +extern LPALAUXILIARYEFFECTSLOTI qalAuxiliaryEffectSloti; +extern LPALAUXILIARYEFFECTSLOTIV qalAuxiliaryEffectSlotiv; +extern LPALAUXILIARYEFFECTSLOTF qalAuxiliaryEffectSlotf; +extern LPALAUXILIARYEFFECTSLOTFV qalAuxiliaryEffectSlotfv; +extern LPALGETAUXILIARYEFFECTSLOTI qalGetAuxiliaryEffectSloti; +extern LPALGETAUXILIARYEFFECTSLOTIV qalGetAuxiliaryEffectSlotiv; +extern LPALGETAUXILIARYEFFECTSLOTF qalGetAuxiliaryEffectSlotf; +extern LPALGETAUXILIARYEFFECTSLOTFV qalGetAuxiliaryEffectSlotfv; + #else #define qalEnable alEnable #define qalDisable alDisable diff --git a/reaction/code/client/qal_efx.h b/reaction/code/client/qal_efx.h new file mode 100644 index 00000000..916172a1 --- /dev/null +++ b/reaction/code/client/qal_efx.h @@ -0,0 +1,737 @@ +#ifndef __qefx_h_ +#define __qefx_h_ + + +#ifdef __cplusplus +extern "C" { +#endif + +#define ALC_EXT_EFX_NAME "ALC_EXT_EFX" + +/** + * Context definitions to be used with alcCreateContext. + * These values must be unique and not conflict with other + * al context values. + */ +#define ALC_EFX_MAJOR_VERSION 0x20001 +#define ALC_EFX_MINOR_VERSION 0x20002 +#define ALC_MAX_AUXILIARY_SENDS 0x20003 + + + + +/** + * Listener definitions to be used with alListener functions. + * These values must be unique and not conflict with other + * al listener values. + */ +#define AL_METERS_PER_UNIT 0x20004 + + + + +/** + * Source definitions to be used with alSource functions. + * These values must be unique and not conflict with other + * al source values. + */ +#define AL_DIRECT_FILTER 0x20005 +#define AL_AUXILIARY_SEND_FILTER 0x20006 +#define AL_AIR_ABSORPTION_FACTOR 0x20007 +#define AL_ROOM_ROLLOFF_FACTOR 0x20008 +#define AL_CONE_OUTER_GAINHF 0x20009 +#define AL_DIRECT_FILTER_GAINHF_AUTO 0x2000A +#define AL_AUXILIARY_SEND_FILTER_GAIN_AUTO 0x2000B +#define AL_AUXILIARY_SEND_FILTER_GAINHF_AUTO 0x2000C + + + + +/** + * Effect object definitions to be used with alEffect functions. + * + * Effect parameter value definitions, ranges, and defaults + * appear farther down in this file. + */ + +/* Reverb Parameters */ +#define AL_REVERB_DENSITY 0x0001 +#define AL_REVERB_DIFFUSION 0x0002 +#define AL_REVERB_GAIN 0x0003 +#define AL_REVERB_GAINHF 0x0004 +#define AL_REVERB_DECAY_TIME 0x0005 +#define AL_REVERB_DECAY_HFRATIO 0x0006 +#define AL_REVERB_REFLECTIONS_GAIN 0x0007 +#define AL_REVERB_REFLECTIONS_DELAY 0x0008 +#define AL_REVERB_LATE_REVERB_GAIN 0x0009 +#define AL_REVERB_LATE_REVERB_DELAY 0x000A +#define AL_REVERB_AIR_ABSORPTION_GAINHF 0x000B +#define AL_REVERB_ROOM_ROLLOFF_FACTOR 0x000C +#define AL_REVERB_DECAY_HFLIMIT 0x000D + +/* Chorus Parameters */ +#define AL_CHORUS_WAVEFORM 0x0001 +#define AL_CHORUS_PHASE 0x0002 +#define AL_CHORUS_RATE 0x0003 +#define AL_CHORUS_DEPTH 0x0004 +#define AL_CHORUS_FEEDBACK 0x0005 +#define AL_CHORUS_DELAY 0x0006 + +/* Distortion Parameters */ +#define AL_DISTORTION_EDGE 0x0001 +#define AL_DISTORTION_GAIN 0x0002 +#define AL_DISTORTION_LOWPASS_CUTOFF 0x0003 +#define AL_DISTORTION_EQCENTER 0x0004 +#define AL_DISTORTION_EQBANDWIDTH 0x0005 + +/* Echo Parameters */ +#define AL_ECHO_DELAY 0x0001 +#define AL_ECHO_LRDELAY 0x0002 +#define AL_ECHO_DAMPING 0x0003 +#define AL_ECHO_FEEDBACK 0x0004 +#define AL_ECHO_SPREAD 0x0005 + +/* Flanger Parameters */ +#define AL_FLANGER_WAVEFORM 0x0001 +#define AL_FLANGER_PHASE 0x0002 +#define AL_FLANGER_RATE 0x0003 +#define AL_FLANGER_DEPTH 0x0004 +#define AL_FLANGER_FEEDBACK 0x0005 +#define AL_FLANGER_DELAY 0x0006 + +/* Frequencyshifter Parameters */ +#define AL_FREQUENCY_SHIFTER_FREQUENCY 0x0001 +#define AL_FREQUENCY_SHIFTER_LEFT_DIRECTION 0x0002 +#define AL_FREQUENCY_SHIFTER_RIGHT_DIRECTION 0x0003 + +/* Vocalmorpher Parameters */ +#define AL_VOCAL_MORPHER_PHONEMEA 0x0001 +#define AL_VOCAL_MORPHER_PHONEMEA_COARSE_TUNING 0x0002 +#define AL_VOCAL_MORPHER_PHONEMEB 0x0003 +#define AL_VOCAL_MORPHER_PHONEMEB_COARSE_TUNING 0x0004 +#define AL_VOCAL_MORPHER_WAVEFORM 0x0005 +#define AL_VOCAL_MORPHER_RATE 0x0006 + +/* Pitchshifter Parameters */ +#define AL_PITCH_SHIFTER_COARSE_TUNE 0x0001 +#define AL_PITCH_SHIFTER_FINE_TUNE 0x0002 + +/* Ringmodulator Parameters */ +#define AL_RING_MODULATOR_FREQUENCY 0x0001 +#define AL_RING_MODULATOR_HIGHPASS_CUTOFF 0x0002 +#define AL_RING_MODULATOR_WAVEFORM 0x0003 + +/* Autowah Parameters */ +#define AL_AUTOWAH_ATTACK_TIME 0x0001 +#define AL_AUTOWAH_RELEASE_TIME 0x0002 +#define AL_AUTOWAH_RESONANCE 0x0003 +#define AL_AUTOWAH_PEAK_GAIN 0x0004 + +/* Compressor Parameters */ +#define AL_COMPRESSOR_ONOFF 0x0001 + +/* Equalizer Parameters */ +#define AL_EQUALIZER_LOW_GAIN 0x0001 +#define AL_EQUALIZER_LOW_CUTOFF 0x0002 +#define AL_EQUALIZER_MID1_GAIN 0x0003 +#define AL_EQUALIZER_MID1_CENTER 0x0004 +#define AL_EQUALIZER_MID1_WIDTH 0x0005 +#define AL_EQUALIZER_MID2_GAIN 0x0006 +#define AL_EQUALIZER_MID2_CENTER 0x0007 +#define AL_EQUALIZER_MID2_WIDTH 0x0008 +#define AL_EQUALIZER_HIGH_GAIN 0x0009 +#define AL_EQUALIZER_HIGH_CUTOFF 0x000A + +/* Effect type */ +#define AL_EFFECT_FIRST_PARAMETER 0x0000 +#define AL_EFFECT_LAST_PARAMETER 0x8000 +#define AL_EFFECT_TYPE 0x8001 + +/* Effect type definitions to be used with AL_EFFECT_TYPE. */ +#define AL_EFFECT_NULL 0x0000 /* Can also be used as an Effect Object ID */ +#define AL_EFFECT_REVERB 0x0001 +#define AL_EFFECT_CHORUS 0x0002 +#define AL_EFFECT_DISTORTION 0x0003 +#define AL_EFFECT_ECHO 0x0004 +#define AL_EFFECT_FLANGER 0x0005 +#define AL_EFFECT_FREQUENCY_SHIFTER 0x0006 +#define AL_EFFECT_VOCAL_MORPHER 0x0007 +#define AL_EFFECT_PITCH_SHIFTER 0x0008 +#define AL_EFFECT_RING_MODULATOR 0x0009 +#define AL_EFFECT_AUTOWAH 0x000A +#define AL_EFFECT_COMPRESSOR 0x000B +#define AL_EFFECT_EQUALIZER 0x000C + +/** + * Auxiliary Slot object definitions to be used with alAuxiliaryEffectSlot functions. + */ +#define AL_EFFECTSLOT_EFFECT 0x0001 +#define AL_EFFECTSLOT_GAIN 0x0002 +#define AL_EFFECTSLOT_AUXILIARY_SEND_AUTO 0x0003 + +/** + * Value to be used as an Auxiliary Slot ID to disable a source send.. + */ +#define AL_EFFECTSLOT_NULL 0x0000 + + + +/** + * Filter object definitions to be used with alFilter functions. + */ + +/* Lowpass parameters. */ +#define AL_LOWPASS_GAIN 0x0001 +#define AL_LOWPASS_GAINHF 0x0002 + +/* Highpass Parameters */ +#define AL_HIGHPASS_GAIN 0x0001 +#define AL_HIGHPASS_GAINLF 0x0002 + +/* Bandpass Parameters */ +#define AL_BANDPASS_GAIN 0x0001 +#define AL_BANDPASS_GAINLF 0x0002 +#define AL_BANDPASS_GAINHF 0x0003 + +/* Filter type */ +#define AL_FILTER_FIRST_PARAMETER 0x0000 +#define AL_FILTER_LAST_PARAMETER 0x8000 +#define AL_FILTER_TYPE 0x8001 + +/* Filter type definitions to be used with AL_FILTER_TYPE. */ +#define AL_FILTER_NULL 0x0000 /* Can also be used as a Filter Object ID */ +#define AL_FILTER_LOWPASS 0x0001 +#define AL_FILTER_HIGHPASS 0x0002 +#define AL_FILTER_BANDPASS 0x0003 + + +/** + * Effect object functions. + */ + +/* Create Effect objects. */ +typedef void (__cdecl *LPALGENEFFECTS)( ALsizei n, ALuint* effects ); + +/* Delete Effect objects. */ +typedef void (__cdecl *LPALDELETEEFFECTS)( ALsizei n, ALuint* effects ); + +/* Verify a handle is a valid Effect. */ +typedef ALboolean (__cdecl *LPALISEFFECT)( ALuint eid ); + +/* Set an integer parameter for an Effect object. */ +typedef void (__cdecl *LPALEFFECTI)( ALuint eid, ALenum param, ALint value); +typedef void (__cdecl *LPALEFFECTIV)( ALuint eid, ALenum param, ALint* values ); + +/* Set a floating point parameter for an Effect object. */ +typedef void (__cdecl *LPALEFFECTF)( ALuint eid, ALenum param, ALfloat value); +typedef void (__cdecl *LPALEFFECTFV)( ALuint eid, ALenum param, ALfloat* values ); + +/* Get an integer parameter for an Effect object. */ +typedef void (__cdecl *LPALGETEFFECTI)( ALuint eid, ALenum pname, ALint* value ); +typedef void (__cdecl *LPALGETEFFECTIV)( ALuint eid, ALenum pname, ALint* values ); + +/* Get a floating point parameter for an Effect object. */ +typedef void (__cdecl *LPALGETEFFECTF)( ALuint eid, ALenum pname, ALfloat* value ); +typedef void (__cdecl *LPALGETEFFECTFV)( ALuint eid, ALenum pname, ALfloat* values ); + + +/** + * Filter object functions + */ + +/* Create Filter objects. */ +typedef void (__cdecl *LPALGENFILTERS)( ALsizei n, ALuint* filters ); + +/* Delete Filter objects. */ +typedef void (__cdecl *LPALDELETEFILTERS)( ALsizei n, ALuint* filters ); + +/* Verify a handle is a valid Filter. */ +typedef ALboolean (__cdecl *LPALISFILTER)( ALuint fid ); + +/* Set an integer parameter for a Filter object. */ +typedef void (__cdecl *LPALFILTERI)( ALuint fid, ALenum param, ALint value ); +typedef void (__cdecl *LPALFILTERIV)( ALuint fid, ALenum param, ALint* values ); + +/* Set a floating point parameter for an Filter object. */ +typedef void (__cdecl *LPALFILTERF)( ALuint fid, ALenum param, ALfloat value); +typedef void (__cdecl *LPALFILTERFV)( ALuint fid, ALenum param, ALfloat* values ); + +/* Get an integer parameter for a Filter object. */ +typedef void (__cdecl *LPALGETFILTERI)( ALuint fid, ALenum pname, ALint* value ); +typedef void (__cdecl *LPALGETFILTERIV)( ALuint fid, ALenum pname, ALint* values ); + +/* Get a floating point parameter for a Filter object. */ +typedef void (__cdecl *LPALGETFILTERF)( ALuint fid, ALenum pname, ALfloat* value ); +typedef void (__cdecl *LPALGETFILTERFV)( ALuint fid, ALenum pname, ALfloat* values ); + + +/** + * Auxiliary Slot object functions + */ + +/* Create Auxiliary Slot objects. */ +typedef void (__cdecl *LPALGENAUXILIARYEFFECTSLOTS)( ALsizei n, ALuint* slots ); + +/* Delete Auxiliary Slot objects. */ +typedef void (__cdecl *LPALDELETEAUXILIARYEFFECTSLOTS)( ALsizei n, ALuint* slots ); + +/* Verify a handle is a valid Auxiliary Slot. */ +typedef ALboolean (__cdecl *LPALISAUXILIARYEFFECTSLOT)( ALuint slot ); + +/* Set an integer parameter for a Auxiliary Slot object. */ +typedef void (__cdecl *LPALAUXILIARYEFFECTSLOTI)( ALuint asid, ALenum param, ALint value ); +typedef void (__cdecl *LPALAUXILIARYEFFECTSLOTIV)( ALuint asid, ALenum param, ALint* values ); + +/* Set a floating point parameter for an Auxiliary Slot object. */ +typedef void (__cdecl *LPALAUXILIARYEFFECTSLOTF)( ALuint asid, ALenum param, ALfloat value ); +typedef void (__cdecl *LPALAUXILIARYEFFECTSLOTFV)( ALuint asid, ALenum param, ALfloat* values ); + +/* Get an integer parameter for a Auxiliary Slot object. */ +typedef void (__cdecl *LPALGETAUXILIARYEFFECTSLOTI)( ALuint asid, ALenum pname, ALint* value ); +typedef void (__cdecl *LPALGETAUXILIARYEFFECTSLOTIV)( ALuint asid, ALenum pname, ALint* values ); + +/* Get a floating point parameter for a Auxiliary Slot object. */ +typedef void (__cdecl *LPALGETAUXILIARYEFFECTSLOTF)( ALuint asid, ALenum pname, ALfloat* value ); +typedef void (__cdecl *LPALGETAUXILIARYEFFECTSLOTFV)( ALuint asid, ALenum pname, ALfloat* values ); + + + + +/********************************************************** + * Filter ranges and defaults. + */ + +/** + * Lowpass filter + */ + +#define LOWPASS_MIN_GAIN 0.0f +#define LOWPASS_MAX_GAIN 1.0f +#define LOWPASS_DEFAULT_GAIN 1.0f + +#define LOWPASS_MIN_GAINHF 0.0f +#define LOWPASS_MAX_GAINHF 1.0f +#define LOWPASS_DEFAULT_GAINHF 1.0f + +/** + * Highpass filter + */ + +#define HIGHPASS_MIN_GAIN 0.0f +#define HIGHPASS_MAX_GAIN 1.0f +#define HIGHPASS_DEFAULT_GAIN 1.0f + +#define HIGHPASS_MIN_GAINLF 0.0f +#define HIGHPASS_MAX_GAINLF 1.0f +#define HIGHPASS_DEFAULT_GAINLF 1.0f + +/** + * Bandpass filter + */ + +#define BANDPASS_MIN_GAIN 0.0f +#define BANDPASS_MAX_GAIN 1.0f +#define BANDPASS_DEFAULT_GAIN 1.0f + +#define BANDPASS_MIN_GAINHF 0.0f +#define BANDPASS_MAX_GAINHF 1.0f +#define BANDPASS_DEFAULT_GAINHF 1.0f + +#define BANDPASS_MIN_GAINLF 0.0f +#define BANDPASS_MAX_GAINLF 1.0f +#define BANDPASS_DEFAULT_GAINLF 1.0f + + + + + /********************************************************** + * Effect parameter structures, value definitions, ranges and defaults. + */ + +/** + * AL reverb effect parameter ranges and defaults + */ +#define AL_REVERB_MIN_DENSITY 0.0f +#define AL_REVERB_MAX_DENSITY 1.0f +#define AL_REVERB_DEFAULT_DENSITY 1.0f + +#define AL_REVERB_MIN_DIFFUSION 0.0f +#define AL_REVERB_MAX_DIFFUSION 1.0f +#define AL_REVERB_DEFAULT_DIFFUSION 1.0f + +#define AL_REVERB_MIN_GAIN 0.0f +#define AL_REVERB_MAX_GAIN 1.0f +#define AL_REVERB_DEFAULT_GAIN 0.32f + +#define AL_REVERB_MIN_GAINHF 0.0f +#define AL_REVERB_MAX_GAINHF 1.0f +#define AL_REVERB_DEFAULT_GAINHF 0.89f + +#define AL_REVERB_MIN_DECAY_TIME 0.1f +#define AL_REVERB_MAX_DECAY_TIME 20.0f +#define AL_REVERB_DEFAULT_DECAY_TIME 1.49f + +#define AL_REVERB_MIN_DECAY_HFRATIO 0.1f +#define AL_REVERB_MAX_DECAY_HFRATIO 2.0f +#define AL_REVERB_DEFAULT_DECAY_HFRATIO 0.83f + +#define AL_REVERB_MIN_REFLECTIONS_GAIN 0.0f +#define AL_REVERB_MAX_REFLECTIONS_GAIN 3.16f +#define AL_REVERB_DEFAULT_REFLECTIONS_GAIN 0.05f + +#define AL_REVERB_MIN_REFLECTIONS_DELAY 0.0f +#define AL_REVERB_MAX_REFLECTIONS_DELAY 0.3f +#define AL_REVERB_DEFAULT_REFLECTIONS_DELAY 0.007f + +#define AL_REVERB_MIN_LATE_REVERB_GAIN 0.0f +#define AL_REVERB_MAX_LATE_REVERB_GAIN 10.0f +#define AL_REVERB_DEFAULT_LATE_REVERB_GAIN 1.26f + +#define AL_REVERB_MIN_LATE_REVERB_DELAY 0.0f +#define AL_REVERB_MAX_LATE_REVERB_DELAY 0.1f +#define AL_REVERB_DEFAULT_LATE_REVERB_DELAY 0.011f + +#define AL_REVERB_MIN_AIR_ABSORPTION_GAINHF 0.892f +#define AL_REVERB_MAX_AIR_ABSORPTION_GAINHF 1.0f +#define AL_REVERB_DEFAULT_AIR_ABSORPTION_GAINHF 0.994f + +#define AL_REVERB_MIN_ROOM_ROLLOFF_FACTOR 0.0f +#define AL_REVERB_MAX_ROOM_ROLLOFF_FACTOR 10.0f +#define AL_REVERB_DEFAULT_ROOM_ROLLOFF_FACTOR 0.0f + +#define AL_REVERB_MIN_DECAY_HFLIMIT AL_FALSE +#define AL_REVERB_MAX_DECAY_HFLIMIT AL_TRUE +#define AL_REVERB_DEFAULT_DECAY_HFLIMIT AL_TRUE + +/** + * AL chorus effect parameter ranges and defaults + */ +#define AL_CHORUS_MIN_WAVEFORM 0 +#define AL_CHORUS_MAX_WAVEFORM 1 +#define AL_CHORUS_DEFAULT_WAVEFORM 1 + +#define AL_CHORUS_WAVEFORM_SINUSOID 0 +#define AL_CHORUS_WAVEFORM_TRIANGLE 1 + +#define AL_CHORUS_MIN_PHASE (-180) +#define AL_CHORUS_MAX_PHASE 180 +#define AL_CHORUS_DEFAULT_PHASE 90 + +#define AL_CHORUS_MIN_RATE 0.0f +#define AL_CHORUS_MAX_RATE 10.0f +#define AL_CHORUS_DEFAULT_RATE 1.1f + +#define AL_CHORUS_MIN_DEPTH 0.0f +#define AL_CHORUS_MAX_DEPTH 1.0f +#define AL_CHORUS_DEFAULT_DEPTH 0.1f + +#define AL_CHORUS_MIN_FEEDBACK (-1.0f) +#define AL_CHORUS_MAX_FEEDBACK 1.0f +#define AL_CHORUS_DEFAULT_FEEDBACK 0.25f + +#define AL_CHORUS_MIN_DELAY 0.0f +#define AL_CHORUS_MAX_DELAY 0.016f +#define AL_CHORUS_DEFAULT_DELAY 0.016f + +/** + * AL distortion effect parameter ranges and defaults + */ +#define AL_DISTORTION_MIN_EDGE 0.0f +#define AL_DISTORTION_MAX_EDGE 1.0f +#define AL_DISTORTION_DEFAULT_EDGE 0.2f + +#define AL_DISTORTION_MIN_GAIN 0.01f +#define AL_DISTORTION_MAX_GAIN 1.0f +#define AL_DISTORTION_DEFAULT_GAIN 0.05f + +#define AL_DISTORTION_MIN_LOWPASS_CUTOFF 80.0f +#define AL_DISTORTION_MAX_LOWPASS_CUTOFF 24000.0f +#define AL_DISTORTION_DEFAULT_LOWPASS_CUTOFF 8000.0f + +#define AL_DISTORTION_MIN_EQCENTER 80.0f +#define AL_DISTORTION_MAX_EQCENTER 24000.0f +#define AL_DISTORTION_DEFAULT_EQCENTER 3600.0f + +#define AL_DISTORTION_MIN_EQBANDWIDTH 80.0f +#define AL_DISTORTION_MAX_EQBANDWIDTH 24000.0f +#define AL_DISTORTION_DEFAULT_EQBANDWIDTH 3600.0f + +/** + * AL echo effect parameter ranges and defaults + */ +#define AL_ECHO_MIN_DELAY 0.0f +#define AL_ECHO_MAX_DELAY 0.207f +#define AL_ECHO_DEFAULT_DELAY 0.1f + +#define AL_ECHO_MIN_LRDELAY 0.0f +#define AL_ECHO_MAX_LRDELAY 0.404f +#define AL_ECHO_DEFAULT_LRDELAY 0.1f + +#define AL_ECHO_MIN_DAMPING 0.0f +#define AL_ECHO_MAX_DAMPING 0.99f +#define AL_ECHO_DEFAULT_DAMPING 0.5f + +#define AL_ECHO_MIN_FEEDBACK 0.0f +#define AL_ECHO_MAX_FEEDBACK 1.0f +#define AL_ECHO_DEFAULT_FEEDBACK 0.5f + +#define AL_ECHO_MIN_SPREAD (-1.0f) +#define AL_ECHO_MAX_SPREAD 1.0f +#define AL_ECHO_DEFAULT_SPREAD (-1.0f) + +/** + * AL flanger effect parameter ranges and defaults + */ +#define AL_FLANGER_MIN_WAVEFORM 0 +#define AL_FLANGER_MAX_WAVEFORM 1 +#define AL_FLANGER_DEFAULT_WAVEFORM 1 + +#define AL_FLANGER_WAVEFORM_SINUSOID 0 +#define AL_FLANGER_WAVEFORM_TRIANGLE 1 + +#define AL_FLANGER_MIN_PHASE (-180) +#define AL_FLANGER_MAX_PHASE 180 +#define AL_FLANGER_DEFAULT_PHASE 0 + +#define AL_FLANGER_MIN_RATE 0.0f +#define AL_FLANGER_MAX_RATE 10.0f +#define AL_FLANGER_DEFAULT_RATE 0.27f + +#define AL_FLANGER_MIN_DEPTH 0.0f +#define AL_FLANGER_MAX_DEPTH 1.0f +#define AL_FLANGER_DEFAULT_DEPTH 1.0f + +#define AL_FLANGER_MIN_FEEDBACK (-1.0f) +#define AL_FLANGER_MAX_FEEDBACK 1.0f +#define AL_FLANGER_DEFAULT_FEEDBACK (-0.5f) + +#define AL_FLANGER_MIN_DELAY 0.0f +#define AL_FLANGER_MAX_DELAY 0.004f +#define AL_FLANGER_DEFAULT_DELAY 0.002f + +/** + * AL frequency shifter effect parameter ranges and defaults + */ +#define AL_FREQUENCY_SHIFTER_MIN_FREQUENCY 0.0f +#define AL_FREQUENCY_SHIFTER_MAX_FREQUENCY 24000.0f +#define AL_FREQUENCY_SHIFTER_DEFAULT_FREQUENCY 0.0f + +#define AL_FREQUENCY_SHIFTER_MIN_LEFT_DIRECTION 0 +#define AL_FREQUENCY_SHIFTER_MAX_LEFT_DIRECTION 2 +#define AL_FREQUENCY_SHIFTER_DEFAULT_LEFT_DIRECTION 0 + +#define AL_FREQUENCY_SHIFTER_MIN_RIGHT_DIRECTION 0 +#define AL_FREQUENCY_SHIFTER_MAX_RIGHT_DIRECTION 2 +#define AL_FREQUENCY_SHIFTER_DEFAULT_RIGHT_DIRECTION 0 + +#define AL_FREQUENCY_SHIFTER_DIRECTION_DOWN 0 +#define AL_FREQUENCY_SHIFTER_DIRECTION_UP 1 +#define AL_FREQUENCY_SHIFTER_DIRECTION_OFF 2 + +/** + * AL vocal morpher effect parameter ranges and defaults + */ +#define AL_VOCAL_MORPHER_MIN_PHONEMEA 0 +#define AL_VOCAL_MORPHER_MAX_PHONEMEA 29 +#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEA 0 + +#define AL_VOCAL_MORPHER_MIN_PHONEMEA_COARSE_TUNING (-24) +#define AL_VOCAL_MORPHER_MAX_PHONEMEA_COARSE_TUNING 24 +#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEA_COARSE_TUNING 0 + +#define AL_VOCAL_MORPHER_MIN_PHONEMEB 0 +#define AL_VOCAL_MORPHER_MAX_PHONEMEB 29 +#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEB 10 + +#define AL_VOCAL_MORPHER_PHONEME_A 0 +#define AL_VOCAL_MORPHER_PHONEME_E 1 +#define AL_VOCAL_MORPHER_PHONEME_I 2 +#define AL_VOCAL_MORPHER_PHONEME_O 3 +#define AL_VOCAL_MORPHER_PHONEME_U 4 +#define AL_VOCAL_MORPHER_PHONEME_AA 5 +#define AL_VOCAL_MORPHER_PHONEME_AE 6 +#define AL_VOCAL_MORPHER_PHONEME_AH 7 +#define AL_VOCAL_MORPHER_PHONEME_AO 8 +#define AL_VOCAL_MORPHER_PHONEME_EH 9 +#define AL_VOCAL_MORPHER_PHONEME_ER 10 +#define AL_VOCAL_MORPHER_PHONEME_IH 11 +#define AL_VOCAL_MORPHER_PHONEME_IY 12 +#define AL_VOCAL_MORPHER_PHONEME_UH 13 +#define AL_VOCAL_MORPHER_PHONEME_UW 14 +#define AL_VOCAL_MORPHER_PHONEME_B 15 +#define AL_VOCAL_MORPHER_PHONEME_D 16 +#define AL_VOCAL_MORPHER_PHONEME_F 17 +#define AL_VOCAL_MORPHER_PHONEME_G 18 +#define AL_VOCAL_MORPHER_PHONEME_J 19 +#define AL_VOCAL_MORPHER_PHONEME_K 20 +#define AL_VOCAL_MORPHER_PHONEME_L 21 +#define AL_VOCAL_MORPHER_PHONEME_M 22 +#define AL_VOCAL_MORPHER_PHONEME_N 23 +#define AL_VOCAL_MORPHER_PHONEME_P 24 +#define AL_VOCAL_MORPHER_PHONEME_R 25 +#define AL_VOCAL_MORPHER_PHONEME_S 26 +#define AL_VOCAL_MORPHER_PHONEME_T 27 +#define AL_VOCAL_MORPHER_PHONEME_V 28 +#define AL_VOCAL_MORPHER_PHONEME_Z 29 + +#define AL_VOCAL_MORPHER_MIN_PHONEMEB_COARSE_TUNING (-24) +#define AL_VOCAL_MORPHER_MAX_PHONEMEB_COARSE_TUNING 24 +#define AL_VOCAL_MORPHER_DEFAULT_PHONEMEB_COARSE_TUNING 0 + +#define AL_VOCAL_MORPHER_MIN_WAVEFORM 0 +#define AL_VOCAL_MORPHER_MAX_WAVEFORM 2 +#define AL_VOCAL_MORPHER_DEFAULT_WAVEFORM 0 + +#define AL_VOCAL_MORPHER_WAVEFORM_SINUSOID 0 +#define AL_VOCAL_MORPHER_WAVEFORM_TRIANGLE 1 +#define AL_VOCAL_MORPHER_WAVEFORM_SAWTOOTH 2 + +#define AL_VOCAL_MORPHER_MIN_RATE 0.0f +#define AL_VOCAL_MORPHER_MAX_RATE 10.0f +#define AL_VOCAL_MORPHER_DEFAULT_RATE 1.41f + +/** + * AL pitch shifter effect parameter ranges and defaults + */ +#define AL_PITCH_SHIFTER_MIN_COARSE_TUNE (-12) +#define AL_PITCH_SHIFTER_MAX_COARSE_TUNE 12 +#define AL_PITCH_SHIFTER_DEFAULT_COARSE_TUNE 12 + +#define AL_PITCH_SHIFTER_MIN_FINE_TUNE (-50) +#define AL_PITCH_SHIFTER_MAX_FINE_TUNE 50 +#define AL_PITCH_SHIFTER_DEFAULT_FINE_TUNE 0 + +/** + * AL ring modulator effect parameter ranges and defaults + */ +#define AL_RING_MODULATOR_MIN_FREQUENCY 0.0f +#define AL_RING_MODULATOR_MAX_FREQUENCY 8000.0f +#define AL_RING_MODULATOR_DEFAULT_FREQUENCY 440.0f + +#define AL_RING_MODULATOR_MIN_HIGHPASS_CUTOFF 0.0f +#define AL_RING_MODULATOR_MAX_HIGHPASS_CUTOFF 24000.0f +#define AL_RING_MODULATOR_DEFAULT_HIGHPASS_CUTOFF 800.0f + +#define AL_RING_MODULATOR_MIN_WAVEFORM 0 +#define AL_RING_MODULATOR_MAX_WAVEFORM 2 +#define AL_RING_MODULATOR_DEFAULT_WAVEFORM 0 + +#define AL_RING_MODULATOR_SINUSOID 0 +#define AL_RING_MODULATOR_SAWTOOTH 1 +#define AL_RING_MODULATOR_SQUARE 2 + +/** + * AL autowah effect parameter ranges and defaults + */ +#define AL_AUTOWAH_MIN_ATTACK_TIME 0.0001f +#define AL_AUTOWAH_MAX_ATTACK_TIME 1.0f +#define AL_AUTOWAH_DEFAULT_ATTACK_TIME 0.06f + +#define AL_AUTOWAH_MIN_RELEASE_TIME 0.0001f +#define AL_AUTOWAH_MAX_RELEASE_TIME 1.0f +#define AL_AUTOWAH_DEFAULT_RELEASE_TIME 0.06f + +#define AL_AUTOWAH_MIN_RESONANCE 2.0f +#define AL_AUTOWAH_MAX_RESONANCE 1000.0f +#define AL_AUTOWAH_DEFAULT_RESONANCE 1000.0f + +#define AL_AUTOWAH_MIN_PEAK_GAIN 0.00003f +#define AL_AUTOWAH_MAX_PEAK_GAIN 31621.0f +#define AL_AUTOWAH_DEFAULT_PEAK_GAIN 11.22f + +/** + * AL compressor effect parameter ranges and defaults + */ +#define AL_COMPRESSOR_MIN_ONOFF 0 +#define AL_COMPRESSOR_MAX_ONOFF 1 +#define AL_COMPRESSOR_DEFAULT_ONOFF 1 + +/** + * AL equalizer effect parameter ranges and defaults + */ +#define AL_EQUALIZER_MIN_LOW_GAIN 0.126f +#define AL_EQUALIZER_MAX_LOW_GAIN 7.943f +#define AL_EQUALIZER_DEFAULT_LOW_GAIN 1.0f + +#define AL_EQUALIZER_MIN_LOW_CUTOFF 50.0f +#define AL_EQUALIZER_MAX_LOW_CUTOFF 800.0f +#define AL_EQUALIZER_DEFAULT_LOW_CUTOFF 200.0f + +#define AL_EQUALIZER_MIN_MID1_GAIN 0.126f +#define AL_EQUALIZER_MAX_MID1_GAIN 7.943f +#define AL_EQUALIZER_DEFAULT_MID1_GAIN 1.0f + +#define AL_EQUALIZER_MIN_MID1_CENTER 200.0f +#define AL_EQUALIZER_MAX_MID1_CENTER 3000.0f +#define AL_EQUALIZER_DEFAULT_MID1_CENTER 500.0f + +#define AL_EQUALIZER_MIN_MID1_WIDTH 0.01f +#define AL_EQUALIZER_MAX_MID1_WIDTH 1.0f +#define AL_EQUALIZER_DEFAULT_MID1_WIDTH 1.0f + +#define AL_EQUALIZER_MIN_MID2_GAIN 0.126f +#define AL_EQUALIZER_MAX_MID2_GAIN 7.943f +#define AL_EQUALIZER_DEFAULT_MID2_GAIN 1.0f + +#define AL_EQUALIZER_MIN_MID2_CENTER 1000.0f +#define AL_EQUALIZER_MAX_MID2_CENTER 8000.0f +#define AL_EQUALIZER_DEFAULT_MID2_CENTER 3000.0f + +#define AL_EQUALIZER_MIN_MID2_WIDTH 0.01f +#define AL_EQUALIZER_MAX_MID2_WIDTH 1.0f +#define AL_EQUALIZER_DEFAULT_MID2_WIDTH 1.0f + +#define AL_EQUALIZER_MIN_HIGH_GAIN 0.126f +#define AL_EQUALIZER_MAX_HIGH_GAIN 7.943f +#define AL_EQUALIZER_DEFAULT_HIGH_GAIN 1.0f + +#define AL_EQUALIZER_MIN_HIGH_CUTOFF 4000.0f +#define AL_EQUALIZER_MAX_HIGH_CUTOFF 16000.0f +#define AL_EQUALIZER_DEFAULT_HIGH_CUTOFF 6000.0f + + + + +/********************************************************** + * Source parameter value definitions, ranges and defaults. + */ +#define AL_MIN_AIR_ABSORPTION_FACTOR 0.0f +#define AL_MAX_AIR_ABSORPTION_FACTOR 10.0f +#define AL_DEFAULT_AIR_ABSORPTION_FACTOR 0.0f + +#define AL_MIN_ROOM_ROLLOFF_FACTOR 0.0f +#define AL_MAX_ROOM_ROLLOFF_FACTOR 10.0f +#define AL_DEFAULT_ROOM_ROLLOFF_FACTOR 0.0f + +#define AL_MIN_CONE_OUTER_GAINHF 0.0f +#define AL_MAX_CONE_OUTER_GAINHF 1.0f +#define AL_DEFAULT_CONE_OUTER_GAINHF 1.0f + +#define AL_MIN_DIRECT_FILTER_GAINHF_AUTO AL_FALSE +#define AL_MAX_DIRECT_FILTER_GAINHF_AUTO AL_TRUE +#define AL_DEFAULT_DIRECT_FILTER_GAINHF_AUTO AL_TRUE + +#define AL_MIN_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_FALSE +#define AL_MAX_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_TRUE +#define AL_DEFAULT_AUXILIARY_SEND_FILTER_GAIN_AUTO AL_TRUE + +#define AL_MIN_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_FALSE +#define AL_MAX_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_TRUE +#define AL_DEFAULT_AUXILIARY_SEND_FILTER_GAINHF_AUTO AL_TRUE + + + + +/********************************************************** + * Listener parameter value definitions, ranges and defaults. + */ +#define AL_MIN_METERS_PER_UNIT FLT_MIN +#define AL_MAX_METERS_PER_UNIT FLT_MAX +#define AL_DEFAULT_METERS_PER_UNIT 1.0f + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* __qefx_h_ */ diff --git a/reaction/code/client/snd_alreverbs.h b/reaction/code/client/snd_alreverbs.h new file mode 100644 index 00000000..a1212abd --- /dev/null +++ b/reaction/code/client/snd_alreverbs.h @@ -0,0 +1,774 @@ +#define REVERB_PRESET_CITY \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 0.5f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.398107f, \ + /*flGainLF*/ 1.f, \ + /*flDecayTime*/ 1.49f, \ + /*flDecayHFRatio*/ 0.67f, \ + /*flDecayLFRatio*/ 1.f, \ + /*flReflectionsGain*/ 0.0730298f, \ + /*flReflectionsDelay*/ 0.007f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 0.142725f, \ + /*flLateReverbDelay*/ 0.011f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_CITY_SUBWAY \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 0.74f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.707946f, \ + /*flGainLF*/ 0.891251f, \ + /*flDecayTime*/ 3.01f, \ + /*flDecayHFRatio*/ 1.23f, \ + /*flDecayLFRatio*/ 0.91f, \ + /*flReflectionsGain*/ 0.707946f, \ + /*flReflectionsDelay*/ 0.046f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 1.25893f, \ + /*flLateReverbDelay*/ 0.028f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.125f, \ + /*flEchoDepth*/ 0.21f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_CITY_UNDERPASS \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 0.82f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.446684f, \ + /*flGainLF*/ 0.891251f, \ + /*flDecayTime*/ 3.57f, \ + /*flDecayHFRatio*/ 1.12f, \ + /*flDecayLFRatio*/ 0.91f, \ + /*flReflectionsGain*/ 0.398107f, \ + /*flReflectionsDelay*/ 0.059f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 0.891251f, \ + /*flLateReverbDelay*/ 0.037f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.14f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.991973f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_CITY_ABANDONED \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 0.69f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.794328f, \ + /*flGainLF*/ 0.891251f, \ + /*flDecayTime*/ 3.28f, \ + /*flDecayHFRatio*/ 1.17f, \ + /*flDecayLFRatio*/ 0.91f, \ + /*flReflectionsGain*/ 0.446684f, \ + /*flReflectionsDelay*/ 0.044f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 0.281838f, \ + /*flLateReverbDelay*/ 0.024f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.2f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.996552f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_ALLEY \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 0.3f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.732825f, \ + /*flGainLF*/ 1.f, \ + /*flDecayTime*/ 1.49f, \ + /*flDecayHFRatio*/ 0.86f, \ + /*flDecayLFRatio*/ 1.f, \ + /*flReflectionsGain*/ 0.250035f, \ + /*flReflectionsDelay*/ 0.007f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 0.995405f, \ + /*flLateReverbDelay*/ 0.011f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.125f, \ + /*flEchoDepth*/ 0.95f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_PARKINGLOT \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 1.f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 1.f, \ + /*flGainLF*/ 1.f, \ + /*flDecayTime*/ 1.65f, \ + /*flDecayHFRatio*/ 1.5f, \ + /*flDecayLFRatio*/ 1.f, \ + /*flReflectionsGain*/ 0.208209f, \ + /*flReflectionsDelay*/ 0.008f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 0.265155f, \ + /*flLateReverbDelay*/ 0.012f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_SEWERPIPE \ + { \ + /*flDensity*/ 0.307063f, \ + /*flDiffusion*/ 0.8f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.316228f, \ + /*flGainLF*/ 1.f, \ + /*flDecayTime*/ 2.81f, \ + /*flDecayHFRatio*/ 0.14f, \ + /*flDecayLFRatio*/ 1.f, \ + /*flReflectionsGain*/ 1.6387f, \ + /*flReflectionsDelay*/ 0.014f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 3.24713f, \ + /*flLateReverbDelay*/ 0.021f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_BATHROOM \ + { \ + /*flDensity*/ 0.1715f, \ + /*flDiffusion*/ 1.f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.251189f, \ + /*flGainLF*/ 1.f, \ + /*flDecayTime*/ 1.49f, \ + /*flDecayHFRatio*/ 0.54f, \ + /*flDecayLFRatio*/ 1.f, \ + /*flReflectionsGain*/ 0.653131f, \ + /*flReflectionsDelay*/ 0.007f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 3.27341f, \ + /*flLateReverbDelay*/ 0.011f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_STONEROOM \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 1.f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.707946f, \ + /*flGainLF*/ 1.f, \ + /*flDecayTime*/ 2.31f, \ + /*flDecayHFRatio*/ 0.64f, \ + /*flDecayLFRatio*/ 1.f, \ + /*flReflectionsGain*/ 0.441062f, \ + /*flReflectionsDelay*/ 0.012f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 1.10027f, \ + /*flLateReverbDelay*/ 0.017f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_DUSTYROOM \ + { \ + /*flDensity*/ 0.3645f, \ + /*flDiffusion*/ 0.56f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.794328f, \ + /*flGainLF*/ 0.707946f, \ + /*flDecayTime*/ 1.79f, \ + /*flDecayHFRatio*/ 0.38f, \ + /*flDecayLFRatio*/ 0.21f, \ + /*flReflectionsGain*/ 0.501187f, \ + /*flReflectionsDelay*/ 0.002f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 1.25893f, \ + /*flLateReverbDelay*/ 0.006f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.202f, \ + /*flEchoDepth*/ 0.05f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.988553f, \ + /*flHFReference*/ 13046.f, \ + /*flLFReference*/ 163.3f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_HALLWAY \ + { \ + /*flDensity*/ 0.3645f, \ + /*flDiffusion*/ 1.f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.707946f, \ + /*flGainLF*/ 1.f, \ + /*flDecayTime*/ 1.49f, \ + /*flDecayHFRatio*/ 0.59f, \ + /*flDecayLFRatio*/ 1.f, \ + /*flReflectionsGain*/ 0.245754f, \ + /*flReflectionsDelay*/ 0.007f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 1.6615f, \ + /*flLateReverbDelay*/ 0.011f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_CHAPEL \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 0.84f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.562341f, \ + /*flGainLF*/ 1.f, \ + /*flDecayTime*/ 4.62f, \ + /*flDecayHFRatio*/ 0.64f, \ + /*flDecayLFRatio*/ 1.23f, \ + /*flReflectionsGain*/ 0.446684f, \ + /*flReflectionsDelay*/ 0.032f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 0.794328f, \ + /*flLateReverbDelay*/ 0.049f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.11f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_AUDITORIUM \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 1.f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.578096f, \ + /*flGainLF*/ 1.f, \ + /*flDecayTime*/ 4.32f, \ + /*flDecayHFRatio*/ 0.59f, \ + /*flDecayLFRatio*/ 1.f, \ + /*flReflectionsGain*/ 0.403181f, \ + /*flReflectionsDelay*/ 0.02f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 0.716968f, \ + /*flLateReverbDelay*/ 0.03f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_SPORT_GYMNASIUM \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 0.81f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.446684f, \ + /*flGainLF*/ 0.891251f, \ + /*flDecayTime*/ 3.14f, \ + /*flDecayHFRatio*/ 1.06f, \ + /*flDecayLFRatio*/ 1.35f, \ + /*flReflectionsGain*/ 0.398107f, \ + /*flReflectionsDelay*/ 0.029f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 0.562341f, \ + /*flLateReverbDelay*/ 0.045f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.146f, \ + /*flEchoDepth*/ 0.14f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 7176.9f, \ + /*flLFReference*/ 211.2f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_SPORT_EMPTYSTADIUM \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 1.f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.446684f, \ + /*flGainLF*/ 0.794328f, \ + /*flDecayTime*/ 6.26f, \ + /*flDecayHFRatio*/ 0.51f, \ + /*flDecayLFRatio*/ 1.1f, \ + /*flReflectionsGain*/ 0.0630957f, \ + /*flReflectionsDelay*/ 0.183f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 0.398107f, \ + /*flLateReverbDelay*/ 0.038f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_ARENA \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 1.f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.447713f, \ + /*flGainLF*/ 1.f, \ + /*flDecayTime*/ 7.24f, \ + /*flDecayHFRatio*/ 0.33f, \ + /*flDecayLFRatio*/ 1.f, \ + /*flReflectionsGain*/ 0.261216f, \ + /*flReflectionsDelay*/ 0.02f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 1.01859f, \ + /*flLateReverbDelay*/ 0.03f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_HANGAR \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 1.f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.316228f, \ + /*flGainLF*/ 1.f, \ + /*flDecayTime*/ 10.05f, \ + /*flDecayHFRatio*/ 0.23f, \ + /*flDecayLFRatio*/ 1.f, \ + /*flReflectionsGain*/ 0.500035f, \ + /*flReflectionsDelay*/ 0.02f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 1.25603f, \ + /*flLateReverbDelay*/ 0.03f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_DRIVING_TUNNEL \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 0.81f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.398107f, \ + /*flGainLF*/ 0.891251f, \ + /*flDecayTime*/ 3.42f, \ + /*flDecayHFRatio*/ 0.94f, \ + /*flDecayLFRatio*/ 1.31f, \ + /*flReflectionsGain*/ 0.707946f, \ + /*flReflectionsDelay*/ 0.051f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 0.707946f, \ + /*flLateReverbDelay*/ 0.047f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.214f, \ + /*flEchoDepth*/ 0.05f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 155.3f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_MOUNTAINS \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 0.27f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.0562341f, \ + /*flGainLF*/ 1.f, \ + /*flDecayTime*/ 1.49f, \ + /*flDecayHFRatio*/ 0.21f, \ + /*flDecayLFRatio*/ 1.f, \ + /*flReflectionsGain*/ 0.040738f, \ + /*flReflectionsDelay*/ 0.3f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 0.191867f, \ + /*flLateReverbDelay*/ 0.1f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 1.f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_FOREST \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 0.3f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.0223872f, \ + /*flGainLF*/ 1.f, \ + /*flDecayTime*/ 1.49f, \ + /*flDecayHFRatio*/ 0.54f, \ + /*flDecayLFRatio*/ 1.f, \ + /*flReflectionsGain*/ 0.0524807f, \ + /*flReflectionsDelay*/ 0.162f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 0.768245f, \ + /*flLateReverbDelay*/ 0.088f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.125f, \ + /*flEchoDepth*/ 1.f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_UNDERWATER \ + { \ + /*flDensity*/ 0.3645f, \ + /*flDiffusion*/ 1.f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.01f, \ + /*flGainLF*/ 1.f, \ + /*flDecayTime*/ 1.49f, \ + /*flDecayHFRatio*/ 0.1f, \ + /*flDecayLFRatio*/ 1.f, \ + /*flReflectionsGain*/ 0.596348f, \ + /*flReflectionsDelay*/ 0.007f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 7.07946f, \ + /*flLateReverbDelay*/ 0.011f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.f, \ + /*flModulationTime*/ 1.18f, \ + /*flModulationDepth*/ 0.348f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_MOOD_HEAVEN \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 0.94f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.794328f, \ + /*flGainLF*/ 0.446684f, \ + /*flDecayTime*/ 5.04f, \ + /*flDecayHFRatio*/ 1.12f, \ + /*flDecayLFRatio*/ 0.56f, \ + /*flReflectionsGain*/ 0.242661f, \ + /*flReflectionsDelay*/ 0.02f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 1.25893f, \ + /*flLateReverbDelay*/ 0.029f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.08f, \ + /*flModulationTime*/ 2.742f, \ + /*flModulationDepth*/ 0.05f, \ + /*flAirAbsorptionGainHF*/ 0.9977f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_MOOD_HELL \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 0.57f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.354813f, \ + /*flGainLF*/ 0.446684f, \ + /*flDecayTime*/ 3.57f, \ + /*flDecayHFRatio*/ 0.49f, \ + /*flDecayLFRatio*/ 2.f, \ + /*flReflectionsGain*/ 0.f, \ + /*flReflectionsDelay*/ 0.02f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 1.41254f, \ + /*flLateReverbDelay*/ 0.03f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.11f, \ + /*flEchoDepth*/ 0.04f, \ + /*flModulationTime*/ 2.109f, \ + /*flModulationDepth*/ 0.52f, \ + /*flAirAbsorptionGainHF*/ 0.99426f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 139.5f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_MOOD_MEMORY \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 0.85f, \ + /*flGain*/ 0.316228f, \ + /*flGainHF*/ 0.630957f, \ + /*flGainLF*/ 0.354813f, \ + /*flDecayTime*/ 4.06f, \ + /*flDecayHFRatio*/ 0.82f, \ + /*flDecayLFRatio*/ 0.56f, \ + /*flReflectionsGain*/ 0.0398107f, \ + /*flReflectionsDelay*/ 0.f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 1.12202f, \ + /*flLateReverbDelay*/ 0.f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.f, \ + /*flModulationTime*/ 0.474f, \ + /*flModulationDepth*/ 0.45f, \ + /*flAirAbsorptionGainHF*/ 0.988553f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 0 \ + } + +#define REVERB_PRESET_MIN \ + { \ + /*flDensity*/ 1.f, \ + /*flDiffusion*/ 1.f, \ + /*flGain*/ 0.32f, \ + /*flGainHF*/ 0.89f, \ + /*flGainLF*/ 0.f, \ + /*flDecayTime*/ 0.1f, \ + /*flDecayHFRatio*/ 0.83f, \ + /*flDecayLFRatio*/ 1.f, \ + /*flReflectionsGain*/ 0.05f, \ + /*flReflectionsDelay*/ 0.007f, \ + /*flReflectionsPan[0]*/ 0.f, \ + /*flReflectionsPan[1]*/ 0.f, \ + /*flReflectionsPan[2]*/ 0.f, \ + /*flLateReverbGain*/ 1.26f, \ + /*flLateReverbDelay*/ 0.011f, \ + /*flLateReverbPan[0]*/ 0.f, \ + /*flLateReverbPan[1]*/ 0.f, \ + /*flLateReverbPan[2]*/ 0.f, \ + /*flEchoTime*/ 0.25f, \ + /*flEchoDepth*/ 0.f, \ + /*flModulationTime*/ 0.25f, \ + /*flModulationDepth*/ 0.f, \ + /*flAirAbsorptionGainHF*/ 0.994f, \ + /*flHFReference*/ 5000.f, \ + /*flLFReference*/ 250.f, \ + /*flRoomRolloffFactor*/ 0.f, \ + /*iDecayHFLimit*/ 1, \ + } diff --git a/reaction/code/client/snd_openal.c b/reaction/code/client/snd_openal.c index 74d18d8c..e0ce1cfd 100644 --- a/reaction/code/client/snd_openal.c +++ b/reaction/code/client/snd_openal.c @@ -24,6 +24,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "snd_local.h" #include "snd_codec.h" #include "client.h" +#include "../qcommon/qcommon.h" + +extern int Sys_MilliSeconds(void); #ifdef USE_OPENAL @@ -42,6 +45,8 @@ cvar_t *s_alGraceDistance; cvar_t *s_alDriver; cvar_t *s_alDevice; cvar_t *s_alAvailableDevices; +cvar_t *s_alEffectsLevel; + /* ================= @@ -119,6 +124,111 @@ static void S_AL_ClearError( qboolean quiet ) //=========================================================================== +typedef struct +{ + float flDensity; + float flDiffusion; + float flGain; + float flGainHF; + float flGainLF; + float flDecayTime; + float flDecayHFRatio; + float flDecayLFRatio; + float flReflectionsGain; + float flReflectionsDelay; + float flReflectionsPan[3]; + float flLateReverbGain; + float flLateReverbDelay; + float flLateReverbPan[3]; + float flEchoTime; + float flEchoDepth; + float flModulationTime; + float flModulationDepth; + float flAirAbsorptionGainHF; + float flHFReference; + float flLFReference; + float flRoomRolloffFactor; + int iDecayHFLimit; +} reverb_t; + +typedef struct +{ + float gain; + float gainHF; +} lowPass_t; + +typedef struct +{ + reverb_t current; + reverb_t from; + reverb_t to; + int changeTime; + + ALuint alEffect; + ALuint alEffectSlot; +} env_t; + +typedef struct +{ + lowPass_t current; + lowPass_t from; + lowPass_t to; + int changeTime; + ALuint alFilter; +} water_t; + +typedef struct +{ + qboolean initialized; + + env_t env; + water_t water; + + int lastContents; +} effects_t; + +static effects_t s_alEffects; + +#include "snd_alreverbs.h" + +typedef struct +{ + const char* name; + reverb_t data; +} namedReverb_t; + +static const reverb_t s_alReverbUnderwater = REVERB_PRESET_UNDERWATER; +static const namedReverb_t s_alReverbPresets[] = +{ + { "default", REVERB_PRESET_MIN, }, + { "city", REVERB_PRESET_CITY, }, + { "subway", REVERB_PRESET_CITY_SUBWAY, }, + { "underpass", REVERB_PRESET_CITY_UNDERPASS, }, + { "abandoned", REVERB_PRESET_CITY_ABANDONED, }, + { "alley", REVERB_PRESET_ALLEY, }, + { "parkinglot", REVERB_PRESET_PARKINGLOT, }, + { "sewerpipe", REVERB_PRESET_SEWERPIPE, }, + { "bathroom", REVERB_PRESET_BATHROOM, }, + { "stoneroom", REVERB_PRESET_STONEROOM, }, + { "dustyroom", REVERB_PRESET_DUSTYROOM, }, + { "hallway", REVERB_PRESET_HALLWAY, }, + { "chapel", REVERB_PRESET_CHAPEL, }, + { "auditorium", REVERB_PRESET_AUDITORIUM, }, + { "gymnasium", REVERB_PRESET_SPORT_GYMNASIUM, }, + { "stadium", REVERB_PRESET_SPORT_EMPTYSTADIUM, }, + { "arena", REVERB_PRESET_ARENA, }, + { "hangar", REVERB_PRESET_HANGAR, }, + { "tunnel", REVERB_PRESET_DRIVING_TUNNEL, }, + { "mountains", REVERB_PRESET_MOUNTAINS, }, + { "forest", REVERB_PRESET_FOREST, }, + { "underwater", REVERB_PRESET_UNDERWATER, }, + { "mood_heaven", REVERB_PRESET_MOOD_HEAVEN, }, + { "mood_hell", REVERB_PRESET_MOOD_HELL, }, + { "mood_memory", REVERB_PRESET_MOOD_MEMORY, }, +}; + + +//=========================================================================== typedef struct alSfx_s { @@ -597,6 +707,8 @@ static void S_AL_ScaleGain(src_t *chksrc, vec3_t origin) if(!chksrc->local) distance = Distance(origin, lastListenerOrigin); + else + distance = 0.f; // If we exceed a certain distance, scale the gain linearly until the sound // vanishes into nothingness. @@ -778,6 +890,22 @@ static void S_AL_SrcSetup(srcHandle_t src, sfxHandle_t sfx, alSrcPriority_t prio qalSourcei(curSource->alSource, AL_SOURCE_RELATIVE, AL_FALSE); qalSourcef(curSource->alSource, AL_ROLLOFF_FACTOR, s_alRolloff->value); } + + if (s_alEffects.initialized) + { + if (entity == -1) + { + qalSourcei(curSource->alSource, AL_DIRECT_FILTER, AL_FILTER_NULL); + qalSource3i(curSource->alSource, AL_AUXILIARY_SEND_FILTER, AL_EFFECTSLOT_NULL, 0, AL_FILTER_NULL); + //Com_Printf("%s: no effect (%d)\n", knownSfx[sfx].filename, entity); + } + else + { + qalSource3i(curSource->alSource, AL_AUXILIARY_SEND_FILTER, s_alEffects.env.alEffectSlot, 0, AL_FILTER_NULL); + qalSourcei(curSource->alSource, AL_DIRECT_FILTER, s_alEffects.water.alFilter); + //Com_Printf("%s: with effect (%d)\n", knownSfx[sfx].filename, entity); + } + } } /* @@ -1139,6 +1267,35 @@ static qboolean S_AL_CheckInput(int entityNum, sfxHandle_t sfx) return qfalse; } +/* +================= +S_AL_StartLocalSoundEx + +Play a local sound effect +================= +*/ +static +void S_AL_StartLocalSoundEx(sfxHandle_t sfx, int channel, int entity) +{ + srcHandle_t src; + + if(S_AL_CheckInput(0, sfx)) + return; + + // Try to grab a source + src = S_AL_SrcAlloc(SRCPRI_LOCAL, entity, channel); + + if(src == -1) + return; + + // Set up the effect + S_AL_SrcSetup(src, sfx, SRCPRI_LOCAL, entity, channel, qtrue); + + // Start it playing + srcList[src].isPlaying = qtrue; + qalSourcePlay(srcList[src].alSource); +} + /* ================= S_AL_StartLocalSound @@ -1149,23 +1306,7 @@ Play a local (non-spatialized) sound effect static void S_AL_StartLocalSound(sfxHandle_t sfx, int channel) { - srcHandle_t src; - - if(S_AL_CheckInput(0, sfx)) - return; - - // Try to grab a source - src = S_AL_SrcAlloc(SRCPRI_LOCAL, -1, channel); - - if(src == -1) - return; - - // Set up the effect - S_AL_SrcSetup(src, sfx, SRCPRI_LOCAL, -1, channel, qtrue); - - // Start it playing - srcList[src].isPlaying = qtrue; - qalSourcePlay(srcList[src].alSource); + S_AL_StartLocalSoundEx(sfx, channel, -1); } /* @@ -1195,7 +1336,7 @@ static void S_AL_StartSound( vec3_t origin, int entnum, int entchannel, sfxHandl if(S_AL_HearingThroughEntity(entnum)) { - S_AL_StartLocalSound(sfx, entchannel); + S_AL_StartLocalSoundEx(sfx, entchannel, entnum); return; } @@ -2090,6 +2231,59 @@ void S_AL_StopAllSounds( void ) S_AL_StreamDie(i); } +static void S_AL_ChangeUnderWater(void) +{ + s_alEffects.water.from = s_alEffects.water.current; + if (s_alEffects.lastContents & CONTENTS_LIQUID_MASK) + { + s_alEffects.water.to.gain = 0.25f; + s_alEffects.water.to.gainHF = 0.0625f; + } + else + { + s_alEffects.water.to.gain = 1.f; + s_alEffects.water.to.gainHF = 1.f; + } + + s_alEffects.water.changeTime = Sys_MilliSeconds(); +} + +static void S_AL_ChangeEnvironment(const reverb_t* env) +{ + s_alEffects.env.from = s_alEffects.env.current; + s_alEffects.env.to = *env; + s_alEffects.env.changeTime = Sys_MilliSeconds(); +} + +static const reverb_t* S_AL_GetReverbForContents(int contents) +{ + if (contents & CONTENTS_LIQUID_MASK) + { + return &s_alReverbUnderwater; + } + else + { + int index = 0; + +# define CHECK_BIT(bit) index |= (0 != (contents & CONTENTS_ENVBIT_##bit)) << bit + + CHECK_BIT(0); + CHECK_BIT(1); + CHECK_BIT(2); + CHECK_BIT(3); + CHECK_BIT(4); + CHECK_BIT(5); + CHECK_BIT(6); + +# undef CHECK_BIT + + if (index >= ARRAY_LEN(s_alReverbPresets)) + index = 0; + + return &s_alReverbPresets[index].data; + } +} + /* ================= S_AL_Respatialize @@ -2101,6 +2295,8 @@ void S_AL_Respatialize( int entityNum, const vec3_t origin, vec3_t axis[3], int float velocity[3] = {0.0f, 0.0f, 0.0f}; float orientation[6]; vec3_t sorigin; + int contents; + int changedContents; VectorCopy( origin, sorigin ); S_AL_SanitiseVector( sorigin ); @@ -2114,12 +2310,176 @@ void S_AL_Respatialize( int entityNum, const vec3_t origin, vec3_t axis[3], int VectorCopy( sorigin, lastListenerOrigin ); + contents = CM_PointContents(sorigin, 0); + changedContents = contents ^ s_alEffects.lastContents; + s_alEffects.lastContents = contents; + + if (changedContents & CONTENTS_LIQUID_MASK) + { + S_AL_ChangeUnderWater(); + } + + if (changedContents & (CONTENTS_LIQUID_MASK | CONTENTS_ENVIRONMENT_MASK)) + { + S_AL_ChangeEnvironment(S_AL_GetReverbForContents(contents)); + } + // Set OpenAL listener paramaters qalListenerfv(AL_POSITION, (ALfloat *)sorigin); qalListenerfv(AL_VELOCITY, velocity); qalListenerfv(AL_ORIENTATION, orientation); } +static void S_AL_LerpReverb(const reverb_t* from, const reverb_t* to, float fraction, reverb_t* out) +{ +# define LERP_FIELD(field) out->field = from->field + (to->field - from->field) * fraction +# define LOG_LERP_FIELD(field) out->field = from->field * powf(to->field / from->field, fraction) + + *out = *to; + + LERP_FIELD (flDensity); + LERP_FIELD (flDiffusion); + LOG_LERP_FIELD (flGain); + LOG_LERP_FIELD (flGainHF); + LOG_LERP_FIELD (flGainLF); + LERP_FIELD (flDecayTime); + LERP_FIELD (flDecayHFRatio); + LERP_FIELD (flDecayLFRatio); + LOG_LERP_FIELD (flReflectionsGain); + LERP_FIELD (flReflectionsDelay); + LERP_FIELD (flReflectionsPan[0]); + LERP_FIELD (flReflectionsPan[1]); + LERP_FIELD (flReflectionsPan[2]); + LOG_LERP_FIELD (flLateReverbGain); + LERP_FIELD (flLateReverbDelay); + LERP_FIELD (flLateReverbPan[0]); + LERP_FIELD (flLateReverbPan[1]); + LERP_FIELD (flLateReverbPan[2]); + LERP_FIELD (flEchoTime); + LERP_FIELD (flEchoDepth); + LERP_FIELD (flModulationTime); + LERP_FIELD (flModulationDepth); + LOG_LERP_FIELD (flAirAbsorptionGainHF); + LERP_FIELD (flHFReference); + LERP_FIELD (flLFReference); + LERP_FIELD (flRoomRolloffFactor); + + out->iDecayHFLimit = fraction < 0.5f ? from->iDecayHFLimit : to->iDecayHFLimit; + +# undef LERP_FIELD +} + +//#define CHECK_ERROR() if (qalGetError() != AL_NO_ERROR) Com_Printf(S_COLOR_YELLOW "Error on line %d\n", __LINE__) + +static qboolean S_AL_SetReverbParameters(const reverb_t *pEFXEAXReverb, ALuint uiEffect) +{ + qboolean bReturn = qfalse; + + if (pEFXEAXReverb) + { + // Clear AL Error code + qalGetError(); + +# define SET_FLOAT_PARM(parm, field) \ + qalEffectf(uiEffect, parm, field); if (qalGetError() != AL_NO_ERROR) Com_Printf(S_COLOR_YELLOW "Error setting " #parm " to %g \n", field) + + SET_FLOAT_PARM(AL_REVERB_DENSITY, pEFXEAXReverb->flDensity); + SET_FLOAT_PARM(AL_REVERB_DIFFUSION, pEFXEAXReverb->flDiffusion); + SET_FLOAT_PARM(AL_REVERB_GAIN, pEFXEAXReverb->flGain); + SET_FLOAT_PARM(AL_REVERB_GAINHF, pEFXEAXReverb->flGainHF); + ////SET_FLOAT_PARM(AL_REVERB_GAINLF, pEFXEAXReverb->flGainLF); + SET_FLOAT_PARM(AL_REVERB_DECAY_TIME, pEFXEAXReverb->flDecayTime); + SET_FLOAT_PARM(AL_REVERB_DECAY_HFRATIO, pEFXEAXReverb->flDecayHFRatio); + ////SET_FLOAT_PARM(AL_REVERB_DECAY_LFRATIO, pEFXEAXReverb->flDecayLFRatio); + SET_FLOAT_PARM(AL_REVERB_REFLECTIONS_GAIN, pEFXEAXReverb->flReflectionsGain); + SET_FLOAT_PARM(AL_REVERB_REFLECTIONS_DELAY, pEFXEAXReverb->flReflectionsDelay); + ////qalEffectfv(uiEffect, AL_REVERB_REFLECTIONS_PAN, pEFXEAXReverb->flReflectionsPan); + SET_FLOAT_PARM(AL_REVERB_LATE_REVERB_GAIN, pEFXEAXReverb->flLateReverbGain); + SET_FLOAT_PARM(AL_REVERB_LATE_REVERB_DELAY, pEFXEAXReverb->flLateReverbDelay); + ////qalEffectfv(uiEffect, AL_REVERB_LATE_REVERB_PAN, pEFXEAXReverb->flLateReverbPan); + ////SET_FLOAT_PARM(AL_REVERB_ECHO_TIME, pEFXEAXReverb->flEchoTime); + ////SET_FLOAT_PARM(AL_REVERB_ECHO_DEPTH, pEFXEAXReverb->flEchoDepth); + ////SET_FLOAT_PARM(AL_REVERB_MODULATION_TIME, pEFXEAXReverb->flModulationTime); + ////SET_FLOAT_PARM(AL_REVERB_MODULATION_DEPTH, pEFXEAXReverb->flModulationDepth); + SET_FLOAT_PARM(AL_REVERB_AIR_ABSORPTION_GAINHF, pEFXEAXReverb->flAirAbsorptionGainHF); + ////SET_FLOAT_PARM(AL_REVERB_HFREFERENCE, pEFXEAXReverb->flHFReference); + ////SET_FLOAT_PARM(AL_REVERB_LFREFERENCE, pEFXEAXReverb->flLFReference); + SET_FLOAT_PARM(AL_REVERB_ROOM_ROLLOFF_FACTOR, pEFXEAXReverb->flRoomRolloffFactor); + qalEffecti(uiEffect, AL_REVERB_DECAY_HFLIMIT, pEFXEAXReverb->iDecayHFLimit); + + if (qalGetError() == AL_NO_ERROR) + bReturn = qtrue; + } + + return bReturn; +} + + +static void S_AL_UpdateEnvironment(void) +{ + if (!s_alEffects.initialized) + return; + + if (s_alEffects.env.changeTime >= 0) + { + qboolean interpolate = qtrue; + const int ENV_CHANGE_TIME = 1000; // ms + int now = Sys_MilliSeconds(); + if (!interpolate || now > s_alEffects.env.changeTime + ENV_CHANGE_TIME) + { + s_alEffects.env.current = s_alEffects.env.to; + s_alEffects.env.changeTime = -1; + } + else + { + float frac = Com_Clamp(0.f, 1.f, (now - s_alEffects.env.changeTime) / ((float) ENV_CHANGE_TIME)); + S_AL_LerpReverb(&s_alEffects.env.from, &s_alEffects.env.to, frac, &s_alEffects.env.current); + } + + S_AL_SetReverbParameters(&s_alEffects.env.current, s_alEffects.env.alEffect); + qalAuxiliaryEffectSloti(s_alEffects.env.alEffectSlot, AL_EFFECTSLOT_EFFECT, s_alEffects.env.alEffect); + } +} + +static void S_AL_UpdateUnderwater(void) +{ + if (!s_alEffects.initialized) + return; + + if (s_alEffects.water.changeTime >= 0) + { + int i; + qboolean interpolate = qtrue; + + const int WATER_CHANGE_TIME = 500; // ms + int now = Sys_MilliSeconds(); + const lowPass_t *from = &s_alEffects.water.from; + const lowPass_t *to = &s_alEffects.water.to; + + if (!interpolate || now > s_alEffects.water.changeTime + WATER_CHANGE_TIME) + { + s_alEffects.water.changeTime = -1; + s_alEffects.water.current = *to; + } + else + { + float frac = Com_Clamp(0.f, 1.f, (now - s_alEffects.water.changeTime) / ((float) WATER_CHANGE_TIME)); + s_alEffects.water.current.gain = from->gain + (to->gain - from->gain) * frac; + s_alEffects.water.current.gainHF = from->gainHF + (to->gainHF - from->gainHF) * frac; + } + + qalFilterf(s_alEffects.water.alFilter, AL_LOWPASS_GAIN, s_alEffects.water.current.gain); + qalFilterf(s_alEffects.water.alFilter, AL_LOWPASS_GAINHF, s_alEffects.water.current.gainHF); + + for (i=0; iisActive && !src->local) + qalSourcei(src->alSource, AL_DIRECT_FILTER, s_alEffects.water.alFilter); + } + } +} + /* ================= S_AL_Update @@ -2142,6 +2502,9 @@ void S_AL_Update( void ) s_muted->modified = qfalse; } + S_AL_UpdateEnvironment(); + S_AL_UpdateUnderwater(); + // Update SFX channels S_AL_SrcUpdate(); @@ -2283,6 +2646,30 @@ void S_AL_SoundInfo( void ) } } +static void S_AL_ShutDownEffects(void) +{ + if (!s_alEffects.initialized) + return; + + // Delete Effect + if (s_alEffects.env.alEffect) + qalDeleteEffects(1, &s_alEffects.env.alEffect); + + // Delete Auxiliary Effect Slot + if (s_alEffects.env.alEffectSlot) + qalDeleteAuxiliaryEffectSlots(1, &s_alEffects.env.alEffectSlot); + + // Delete filter + if (s_alEffects.water.alFilter) + qalDeleteFilters(1, &s_alEffects.water.alFilter); + + Com_Memset(&s_alEffects, 0, sizeof(s_alEffects)); + + Cmd_RemoveCommand("s_alTestReverb"); + Cmd_RemoveCommand("s_alDumpSoundShader"); + Cmd_RemoveCommand("s_alDumpCustinfoparms"); +} + /* ================= S_AL_Shutdown @@ -2293,15 +2680,20 @@ void S_AL_Shutdown( void ) { // Shut down everything int i; + + S_AL_ShutDownEffects(); + for (i = 0; i < MAX_RAW_STREAMS; i++) S_AL_StreamDie(i); S_AL_StopBackgroundTrack( ); S_AL_SrcShutdown( ); S_AL_BufferShutdown( ); + qalcDestroyContext(alContext); qalcCloseDevice(alDevice); + #ifdef USE_VOIP if (alCaptureDevice != NULL) { qalcCaptureStop(alCaptureDevice); @@ -2322,6 +2714,355 @@ void S_AL_Shutdown( void ) #endif +/* +================= +S_AL_InitEFX +================= +*/ +static qboolean S_AL_InitEFX( ALCdevice* alDevice ) +{ + if (!qalcIsExtensionPresent(alDevice, "ALC_EXT_EFX")) + { + return qfalse; + } + + // Get function pointers + qalGenEffects = (LPALGENEFFECTS)qalGetProcAddress("alGenEffects"); + qalDeleteEffects = (LPALDELETEEFFECTS )qalGetProcAddress("alDeleteEffects"); + qalIsEffect = (LPALISEFFECT )qalGetProcAddress("alIsEffect"); + qalEffecti = (LPALEFFECTI)qalGetProcAddress("alEffecti"); + qalEffectiv = (LPALEFFECTIV)qalGetProcAddress("alEffectiv"); + qalEffectf = (LPALEFFECTF)qalGetProcAddress("alEffectf"); + qalEffectfv = (LPALEFFECTFV)qalGetProcAddress("alEffectfv"); + qalGetEffecti = (LPALGETEFFECTI)qalGetProcAddress("alGetEffecti"); + qalGetEffectiv = (LPALGETEFFECTIV)qalGetProcAddress("alGetEffectiv"); + qalGetEffectf = (LPALGETEFFECTF)qalGetProcAddress("alGetEffectf"); + qalGetEffectfv = (LPALGETEFFECTFV)qalGetProcAddress("alGetEffectfv"); + qalGenFilters = (LPALGENFILTERS)qalGetProcAddress("alGenFilters"); + qalDeleteFilters = (LPALDELETEFILTERS)qalGetProcAddress("alDeleteFilters"); + qalIsFilter = (LPALISFILTER)qalGetProcAddress("alIsFilter"); + qalFilteri = (LPALFILTERI)qalGetProcAddress("alFilteri"); + qalFilteriv = (LPALFILTERIV)qalGetProcAddress("alFilteriv"); + qalFilterf = (LPALFILTERF)qalGetProcAddress("alFilterf"); + qalFilterfv = (LPALFILTERFV)qalGetProcAddress("alFilterfv"); + qalGetFilteri = (LPALGETFILTERI )qalGetProcAddress("alGetFilteri"); + qalGetFilteriv= (LPALGETFILTERIV )qalGetProcAddress("alGetFilteriv"); + qalGetFilterf = (LPALGETFILTERF )qalGetProcAddress("alGetFilterf"); + qalGetFilterfv= (LPALGETFILTERFV )qalGetProcAddress("alGetFilterfv"); + qalGenAuxiliaryEffectSlots = (LPALGENAUXILIARYEFFECTSLOTS)qalGetProcAddress("alGenAuxiliaryEffectSlots"); + qalDeleteAuxiliaryEffectSlots = (LPALDELETEAUXILIARYEFFECTSLOTS)qalGetProcAddress("alDeleteAuxiliaryEffectSlots"); + qalIsAuxiliaryEffectSlot = (LPALISAUXILIARYEFFECTSLOT)qalGetProcAddress("alIsAuxiliaryEffectSlot"); + qalAuxiliaryEffectSloti = (LPALAUXILIARYEFFECTSLOTI)qalGetProcAddress("alAuxiliaryEffectSloti"); + qalAuxiliaryEffectSlotiv = (LPALAUXILIARYEFFECTSLOTIV)qalGetProcAddress("alAuxiliaryEffectSlotiv"); + qalAuxiliaryEffectSlotf = (LPALAUXILIARYEFFECTSLOTF)qalGetProcAddress("alAuxiliaryEffectSlotf"); + qalAuxiliaryEffectSlotfv = (LPALAUXILIARYEFFECTSLOTFV)qalGetProcAddress("alAuxiliaryEffectSlotfv"); + qalGetAuxiliaryEffectSloti = (LPALGETAUXILIARYEFFECTSLOTI)qalGetProcAddress("alGetAuxiliaryEffectSloti"); + qalGetAuxiliaryEffectSlotiv = (LPALGETAUXILIARYEFFECTSLOTIV)qalGetProcAddress("alGetAuxiliaryEffectSlotiv"); + qalGetAuxiliaryEffectSlotf = (LPALGETAUXILIARYEFFECTSLOTF)qalGetProcAddress("alGetAuxiliaryEffectSlotf"); + qalGetAuxiliaryEffectSlotfv = (LPALGETAUXILIARYEFFECTSLOTFV)qalGetProcAddress("alGetAuxiliaryEffectSlotfv"); + + if (qalGenEffects && qalDeleteEffects && qalIsEffect && qalEffecti && qalEffectiv && qalEffectf && + qalEffectfv && qalGetEffecti && qalGetEffectiv && qalGetEffectf && qalGetEffectfv && qalGenFilters && + qalDeleteFilters && qalIsFilter && qalFilteri && qalFilteriv && qalFilterf && qalFilterfv && + qalGetFilteri && qalGetFilteriv && qalGetFilterf && qalGetFilterfv && qalGenAuxiliaryEffectSlots && + qalDeleteAuxiliaryEffectSlots && qalIsAuxiliaryEffectSlot && qalAuxiliaryEffectSloti && + qalAuxiliaryEffectSlotiv && qalAuxiliaryEffectSlotf && qalAuxiliaryEffectSlotfv && + qalGetAuxiliaryEffectSloti && qalGetAuxiliaryEffectSlotiv && qalGetAuxiliaryEffectSlotf && + qalGetAuxiliaryEffectSlotfv) + return qtrue; + + return qfalse; +} + +/* +================= +S_Cmd_AL_TestReverb +================= +*/ +static void S_Cmd_AL_TestReverb( void ) +{ + int i; + const char* arg; + + if (Cmd_Argc() < 2) + { + Com_Printf( + "\n" + "Syntax: %s \n" + "\n" + "where can be any of the following:\n", + Cmd_Argv(0)); + + for (i=0; i> bit) & 1) flags |= CONTENTS_ENVBIT_##bit + + TEST_BIT(0); + TEST_BIT(1); + TEST_BIT(2); + TEST_BIT(3); + TEST_BIT(4); + TEST_BIT(5); + TEST_BIT(6); + + FS_Printf(file, "rq3_env%d\t\t0x%08x\t\t// %s\n", i, flags, s_alReverbPresets[i].name); + +# undef TEST_BIT + } + + FS_Printf(file, + "}\n" + "\n" + "\n" + "// Custom Surfaceflags\n" + "\n" + "{\n" + "rq3_gravel 0x80000 // custom grass surface\n" + "rq3_wood 0x81000 // custom wood surface\n" + "rq3_carpet 0x100000 // custom carpet surface\n" + "rq3_metal2 0x101000 // alternate metal clank\n" + "rq3_glass 0x180000 // custom glass mark/ricochet sound\n" + "rq3_grass 0x181000 // custom grass crunch surface\n" + "rq3_snow 0x200000 // custom snow crunch surface\n" + "rq3_mud 0x201000 // custom mud squish surface\n" + "rq3_wood2 0x280000 // alternate wood surface\n" + "rq3_hardmetal 0x281000 // alternate metal surface\n" + "rq3_leaves 0x300000 // custom leaves surface\n" + "rq3_cement 0x301000 // custom cement surface\n" + "rq3_marble 0x380000 // custom marble surface\n" + "rq3_snow2 0x381000 // alternate snow surface\n" + "rq3_hardsteps 0x400000 // custom alternate footstep sounds\n" + "rq3_sand 0x401000 // custom sand surface\n" + "}\n" + ); + + FS_FCloseFile(file); +} + +/* +================= +S_AL_CreateLowPassFilter +================= +*/ +static qboolean S_AL_CreateLowPassFilter(void) +{ + qalGenFilters(1, &s_alEffects.water.alFilter); + qalFilteri(s_alEffects.water.alFilter, AL_FILTER_TYPE, AL_FILTER_LOWPASS); + qalFilterf(s_alEffects.water.alFilter, AL_LOWPASS_GAIN, s_alEffects.water.current.gain); + qalFilterf(s_alEffects.water.alFilter, AL_LOWPASS_GAINHF, s_alEffects.water.current.gainHF); + + return qtrue; +} + +/* +================= +S_AL_CreateAuxEffectSlot +================= +*/ +static qboolean S_AL_CreateAuxEffectSlot(ALuint *puiAuxEffectSlot) +{ + qboolean bReturn = qfalse; + + // Clear AL Error state + qalGetError(); + + // Generate an Auxiliary Effect Slot + qalGenAuxiliaryEffectSlots(1, puiAuxEffectSlot); + if (qalGetError() == AL_NO_ERROR) + bReturn = qtrue; + + return bReturn; +} + +/* +================= +S_AL_CreateEffect +================= +*/ +static qboolean S_AL_CreateEffect(ALuint *puiEffect, ALenum eEffectType) +{ + qboolean bReturn = qfalse; + + if (puiEffect) + { + // Clear AL Error State + qalGetError(); + + // Generate an Effect + qalGenEffects(1, puiEffect); + if (qalGetError() == AL_NO_ERROR) + { + // Set the Effect Type + qalEffecti(*puiEffect, AL_EFFECT_TYPE, eEffectType); + if (qalGetError() == AL_NO_ERROR) + bReturn = qtrue; + else + qalDeleteEffects(1, puiEffect); + } + } + + return bReturn; +} + +/* +================= +S_AL_InitEffects +================= +*/ +static qboolean S_AL_InitEffects(ALCdevice* alDevice) +{ + Com_Memset(&s_alEffects, 0, sizeof(s_alEffects)); + + if (!s_alEffectsLevel->integer) + return qfalse; + + if (!S_AL_InitEFX(alDevice)) + return qfalse; + + s_alEffects.water.changeTime = -1; + s_alEffects.water.current.gain = 1.f; + s_alEffects.water.current.gainHF = 1.f; + s_alEffects.water.to = s_alEffects.water.current; + s_alEffects.water.from = s_alEffects.water.current; + + s_alEffects.env.changeTime = -1; + s_alEffects.env.current = s_alReverbPresets[0].data; + s_alEffects.env.to = s_alEffects.env.current; + s_alEffects.env.from = s_alEffects.env.current; + + if (!S_AL_CreateAuxEffectSlot(&s_alEffects.env.alEffectSlot)) + { + Com_Printf(S_COLOR_RED "ERROR: Failed to create aux effect slot\n"); + } + else if (!S_AL_CreateEffect(&s_alEffects.env.alEffect, AL_EFFECT_REVERB)) + { + Com_Printf(S_COLOR_RED "ERROR: Failed to create effect\n"); + } + else if (!S_AL_CreateLowPassFilter()) + { + Com_Printf(S_COLOR_RED "ERROR: Failed to create low-pass filter\n"); + } + else if (!S_AL_SetReverbParameters(&s_alEffects.env.current, s_alEffects.env.alEffect)) + { + Com_Printf(S_COLOR_RED "ERROR: Failed to set reverb params\n"); + } + else + { + Com_Printf("Successfully initialized effects\n"); + s_alEffects.initialized = qtrue; + + qalAuxiliaryEffectSloti(s_alEffects.env.alEffectSlot, AL_EFFECTSLOT_EFFECT, s_alEffects.env.alEffect); + + Cmd_AddCommand("s_alTestReverb", S_Cmd_AL_TestReverb); + Cmd_AddCommand("s_alDumpSoundShader", S_Cmd_AL_DumpSoundShader); + Cmd_AddCommand("s_alDumpCustinfoparms", S_Cmd_AL_DumpCustinfoparms); + } + + return s_alEffects.initialized; +} + /* ================= S_AL_Init @@ -2357,6 +3098,7 @@ qboolean S_AL_Init( soundInterface_t *si ) s_alDriver = Cvar_Get( "s_alDriver", ALDRIVER_DEFAULT, CVAR_ARCHIVE | CVAR_LATCH ); s_alDevice = Cvar_Get("s_alDevice", "", CVAR_ARCHIVE | CVAR_LATCH); + s_alEffectsLevel = Cvar_Get("s_alEffects", "1", CVAR_ARCHIVE | CVAR_LATCH ); // Load QAL if( !QAL_Init( s_alDriver->string ) ) @@ -2427,6 +3169,9 @@ qboolean S_AL_Init( soundInterface_t *si ) } qalcMakeContextCurrent( alContext ); + S_AL_InitEffects( alDevice ); + + // Initialize sources, buffers, music S_AL_BufferInit( ); S_AL_SrcInit( ); @@ -2436,6 +3181,7 @@ qboolean S_AL_Init( soundInterface_t *si ) qalDopplerFactor( s_alDopplerFactor->value ); qalDopplerVelocity( s_alDopplerSpeed->value ); + #ifdef USE_VOIP // !!! FIXME: some of these alcCaptureOpenDevice() values should be cvars. // !!! FIXME: add support for capture device enumeration.