OpenAL special effects

This commit is contained in:
Andrei Drexler 2011-04-19 02:24:54 +00:00
parent 6d65ca4c38
commit 84a674813e
5 changed files with 2360 additions and 18 deletions

View file

@ -62,6 +62,7 @@ LPALSOURCEF qalSourcef;
LPALSOURCE3F qalSource3f; LPALSOURCE3F qalSource3f;
LPALSOURCEFV qalSourcefv; LPALSOURCEFV qalSourcefv;
LPALSOURCEI qalSourcei; LPALSOURCEI qalSourcei;
LPALSOURCE3I qalSource3i;
LPALGETSOURCEF qalGetSourcef; LPALGETSOURCEF qalGetSourcef;
LPALGETSOURCE3F qalGetSource3f; LPALGETSOURCE3F qalGetSource3f;
LPALGETSOURCEFV qalGetSourcefv; LPALGETSOURCEFV qalGetSourcefv;
@ -107,6 +108,46 @@ LPALCCAPTURESTART qalcCaptureStart;
LPALCCAPTURESTOP qalcCaptureStop; LPALCCAPTURESTOP qalcCaptureStop;
LPALCCAPTURESAMPLES qalcCaptureSamples; 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 void *OpenALLib = NULL;
static qboolean alinit_fail = qfalse; static qboolean alinit_fail = qfalse;
@ -195,6 +236,7 @@ qboolean QAL_Init(const char *libname)
qalSource3f = GPA("alSource3f"); qalSource3f = GPA("alSource3f");
qalSourcefv = GPA("alSourcefv"); qalSourcefv = GPA("alSourcefv");
qalSourcei = GPA("alSourcei"); qalSourcei = GPA("alSourcei");
qalSource3i = GPA("alSource3i");
qalGetSourcef = GPA("alGetSourcef"); qalGetSourcef = GPA("alGetSourcef");
qalGetSource3f = GPA("alGetSource3f"); qalGetSource3f = GPA("alGetSource3f");
qalGetSourcefv = GPA("alGetSourcefv"); qalGetSourcefv = GPA("alGetSourcefv");

View file

@ -47,6 +47,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#endif #endif
#endif #endif
#include "qal_efx.h"
#ifdef USE_OPENAL_DLOPEN #ifdef USE_OPENAL_DLOPEN
extern LPALENABLE qalEnable; extern LPALENABLE qalEnable;
extern LPALDISABLE qalDisable; extern LPALDISABLE qalDisable;
@ -142,6 +145,46 @@ extern LPALCCAPTURECLOSEDEVICE qalcCaptureCloseDevice;
extern LPALCCAPTURESTART qalcCaptureStart; extern LPALCCAPTURESTART qalcCaptureStart;
extern LPALCCAPTURESTOP qalcCaptureStop; extern LPALCCAPTURESTOP qalcCaptureStop;
extern LPALCCAPTURESAMPLES qalcCaptureSamples; 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 #else
#define qalEnable alEnable #define qalEnable alEnable
#define qalDisable alDisable #define qalDisable alDisable

View file

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

View file

@ -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, \
}

View file

@ -24,6 +24,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include "snd_local.h" #include "snd_local.h"
#include "snd_codec.h" #include "snd_codec.h"
#include "client.h" #include "client.h"
#include "../qcommon/qcommon.h"
extern int Sys_MilliSeconds(void);
#ifdef USE_OPENAL #ifdef USE_OPENAL
@ -42,6 +45,8 @@ cvar_t *s_alGraceDistance;
cvar_t *s_alDriver; cvar_t *s_alDriver;
cvar_t *s_alDevice; cvar_t *s_alDevice;
cvar_t *s_alAvailableDevices; 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 typedef struct alSfx_s
{ {
@ -597,6 +707,8 @@ static void S_AL_ScaleGain(src_t *chksrc, vec3_t origin)
if(!chksrc->local) if(!chksrc->local)
distance = Distance(origin, lastListenerOrigin); distance = Distance(origin, lastListenerOrigin);
else
distance = 0.f;
// If we exceed a certain distance, scale the gain linearly until the sound // If we exceed a certain distance, scale the gain linearly until the sound
// vanishes into nothingness. // 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); qalSourcei(curSource->alSource, AL_SOURCE_RELATIVE, AL_FALSE);
qalSourcef(curSource->alSource, AL_ROLLOFF_FACTOR, s_alRolloff->value); 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; 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 S_AL_StartLocalSound
@ -1149,23 +1306,7 @@ Play a local (non-spatialized) sound effect
static static
void S_AL_StartLocalSound(sfxHandle_t sfx, int channel) void S_AL_StartLocalSound(sfxHandle_t sfx, int channel)
{ {
srcHandle_t src; S_AL_StartLocalSoundEx(sfx, channel, -1);
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);
} }
/* /*
@ -1195,7 +1336,7 @@ static void S_AL_StartSound( vec3_t origin, int entnum, int entchannel, sfxHandl
if(S_AL_HearingThroughEntity(entnum)) if(S_AL_HearingThroughEntity(entnum))
{ {
S_AL_StartLocalSound(sfx, entchannel); S_AL_StartLocalSoundEx(sfx, entchannel, entnum);
return; return;
} }
@ -2090,6 +2231,59 @@ void S_AL_StopAllSounds( void )
S_AL_StreamDie(i); 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 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 velocity[3] = {0.0f, 0.0f, 0.0f};
float orientation[6]; float orientation[6];
vec3_t sorigin; vec3_t sorigin;
int contents;
int changedContents;
VectorCopy( origin, sorigin ); VectorCopy( origin, sorigin );
S_AL_SanitiseVector( 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 ); 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 // Set OpenAL listener paramaters
qalListenerfv(AL_POSITION, (ALfloat *)sorigin); qalListenerfv(AL_POSITION, (ALfloat *)sorigin);
qalListenerfv(AL_VELOCITY, velocity); qalListenerfv(AL_VELOCITY, velocity);
qalListenerfv(AL_ORIENTATION, orientation); 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; i<srcCount; ++i)
{
src_t* src = &srcList[i];
if (src->isActive && !src->local)
qalSourcei(src->alSource, AL_DIRECT_FILTER, s_alEffects.water.alFilter);
}
}
}
/* /*
================= =================
S_AL_Update S_AL_Update
@ -2142,6 +2502,9 @@ void S_AL_Update( void )
s_muted->modified = qfalse; s_muted->modified = qfalse;
} }
S_AL_UpdateEnvironment();
S_AL_UpdateUnderwater();
// Update SFX channels // Update SFX channels
S_AL_SrcUpdate(); 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 S_AL_Shutdown
@ -2293,15 +2680,20 @@ void S_AL_Shutdown( void )
{ {
// Shut down everything // Shut down everything
int i; int i;
S_AL_ShutDownEffects();
for (i = 0; i < MAX_RAW_STREAMS; i++) for (i = 0; i < MAX_RAW_STREAMS; i++)
S_AL_StreamDie(i); S_AL_StreamDie(i);
S_AL_StopBackgroundTrack( ); S_AL_StopBackgroundTrack( );
S_AL_SrcShutdown( ); S_AL_SrcShutdown( );
S_AL_BufferShutdown( ); S_AL_BufferShutdown( );
qalcDestroyContext(alContext); qalcDestroyContext(alContext);
qalcCloseDevice(alDevice); qalcCloseDevice(alDevice);
#ifdef USE_VOIP #ifdef USE_VOIP
if (alCaptureDevice != NULL) { if (alCaptureDevice != NULL) {
qalcCaptureStop(alCaptureDevice); qalcCaptureStop(alCaptureDevice);
@ -2322,6 +2714,355 @@ void S_AL_Shutdown( void )
#endif #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 <envname>\n"
"\n"
"where <envname> can be any of the following:\n",
Cmd_Argv(0));
for (i=0; i<ARRAY_LEN(s_alReverbPresets); ++i)
Com_Printf(" %s\n", s_alReverbPresets[i].name);
return;
}
arg = Cmd_Argv(1);
for (i=0; i<ARRAY_LEN(s_alReverbPresets); ++i)
{
if (Q_stricmp(s_alReverbPresets[i].name, arg) == 0)
{
S_AL_ChangeEnvironment(&s_alReverbPresets[i].data);
return;
}
}
Com_Printf(S_COLOR_RED "Error: could not find reverb settings for '%s'\n", arg);
}
/*
=================
S_Cmd_AL_DumpSoundShader
=================
*/
static void S_Cmd_AL_DumpSoundShader( void )
{
const char* filename;
fileHandle_t file;
int i;
if (Cmd_Argc() < 2)
filename = "scripts/sound.shader";
else
filename = Cmd_Argv(1);
file = FS_FOpenFileWrite(filename);
if (!file)
{
Com_Printf ("Couldn't write %s.\n", filename );
return;
}
Com_Printf("Writing %s\n", filename);
for (i=1; i<ARRAY_LEN(s_alReverbPresets); ++i)
{
FS_Printf(file,
"textures/sound/%s\n"
"{\n"
"\tqer_trans 0.50\n"
"\tqer_editorimage textures/common/trigger.tga\n"
"\tqer_nocarve\n"
"\tsurfaceparm nodraw\n"
"\tsurfaceparm nonsolid\n"
"\tsurfaceparm trans\n"
"\tsurfaceparm rq3_env%d\n"
"}\n"
"\n",
s_alReverbPresets[i].name,
i
);
}
FS_FCloseFile(file);
}
/*
=================
S_Cmd_AL_DumpCustinfoparms
=================
*/
static void S_Cmd_AL_DumpCustinfoparms( void )
{
const char* filename;
fileHandle_t file;
int i, end;
if (Cmd_Argc() < 2)
filename = "scripts/custinfoparms.txt";
else
filename = Cmd_Argv(1);
file = FS_FOpenFileWrite(filename);
if (!file)
{
Com_Printf ("Couldn't write %s.\n", filename );
return;
}
Com_Printf("Writing %s\n", filename);
FS_Printf(file,
"// Reaction Quake 3 Available Surfaces (custinfoparms.txt)\n"
"// Custom Surfaceparms file\n"
"\n"
"// Custom Contentsflags\n"
"\n"
"{\n"
);
for (i=1; i<ARRAY_LEN(s_alReverbPresets); ++i)
{
int flags = 0;
# define TEST_BIT(bit) if ((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 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_alDriver = Cvar_Get( "s_alDriver", ALDRIVER_DEFAULT, CVAR_ARCHIVE | CVAR_LATCH );
s_alDevice = Cvar_Get("s_alDevice", "", 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 // Load QAL
if( !QAL_Init( s_alDriver->string ) ) if( !QAL_Init( s_alDriver->string ) )
@ -2427,6 +3169,9 @@ qboolean S_AL_Init( soundInterface_t *si )
} }
qalcMakeContextCurrent( alContext ); qalcMakeContextCurrent( alContext );
S_AL_InitEffects( alDevice );
// Initialize sources, buffers, music // Initialize sources, buffers, music
S_AL_BufferInit( ); S_AL_BufferInit( );
S_AL_SrcInit( ); S_AL_SrcInit( );
@ -2436,6 +3181,7 @@ qboolean S_AL_Init( soundInterface_t *si )
qalDopplerFactor( s_alDopplerFactor->value ); qalDopplerFactor( s_alDopplerFactor->value );
qalDopplerVelocity( s_alDopplerSpeed->value ); qalDopplerVelocity( s_alDopplerSpeed->value );
#ifdef USE_VOIP #ifdef USE_VOIP
// !!! FIXME: some of these alcCaptureOpenDevice() values should be cvars. // !!! FIXME: some of these alcCaptureOpenDevice() values should be cvars.
// !!! FIXME: add support for capture device enumeration. // !!! FIXME: add support for capture device enumeration.