/*******************************************************************\
*                                                                   *
*  EAX.H - Environmental Audio Extensions version 4.0               *
*          for OpenAL and DirectSound3D                             *
*                                                                   *
*          File revision 1.6.3 (21 February 2003)                   *
*          EAX 4.0 API Spec version 1.6                             *
*                                                                   *
\*******************************************************************/

#ifndef EAX_H_INCLUDED
#define EAX_H_INCLUDED

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

#ifndef OPENAL
    #include <dsound.h>

    /*
     * EAX Unified Interface (using Direct X 7) {4FF53B81-1CE0-11d3-AAB8-00A0C95949D5}
     */
    DEFINE_GUID(CLSID_EAXDirectSound,
        0x4ff53b81,
        0x1ce0,
        0x11d3,
        0xaa, 0xb8, 0x0, 0xa0, 0xc9, 0x59, 0x49, 0xd5);

   /*
    * EAX Unified Interface (using Direct X 8) {CA503B60-B176-11d4-A094-D0C0BF3A560C}
    */
    DEFINE_GUID(CLSID_EAXDirectSound8,
        0xca503b60,
        0xb176,
        0x11d4,
        0xa0, 0x94, 0xd0, 0xc0, 0xbf, 0x3a, 0x56, 0xc);



#ifdef DIRECTSOUND_VERSION
#if DIRECTSOUND_VERSION >= 0x0800
    __declspec(dllimport) HRESULT WINAPI EAXDirectSoundCreate8(GUID*, LPDIRECTSOUND8*, IUnknown FAR *);
    typedef HRESULT (FAR PASCAL *LPEAXDIRECTSOUNDCREATE8)(GUID*, LPDIRECTSOUND8*, IUnknown FAR*);
#endif
#endif

    __declspec(dllimport) HRESULT WINAPI EAXDirectSoundCreate(GUID*, LPDIRECTSOUND*, IUnknown FAR *);
    typedef HRESULT (FAR PASCAL *LPEAXDIRECTSOUNDCREATE)(GUID*, LPDIRECTSOUND*, IUnknown FAR*);

#else // OPENAL
	#ifdef _WIN32
		#include "../OpenAL/al.h"
	#else
		#include <al.h>
	#endif

    #ifndef GUID_DEFINED
        #define GUID_DEFINED
        typedef struct _GUID
        {
            unsigned long Data1;
            unsigned short Data2;
            unsigned short Data3;
            unsigned char Data4[8];
        } GUID;
    #endif // GUID_DEFINED

    #ifndef DEFINE_GUID
        #ifndef INITGUID
            #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
                    extern const GUID /*FAR*/ name
        #else
            #define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
                    extern const GUID name = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }
        #endif // INITGUID
    #endif // DEFINE_GUID

    /*
     * EAX OpenAL Extensions
     */
    typedef ALenum (*EAXSet)(const GUID*, ALuint, ALuint, ALvoid*, ALuint);
    typedef ALenum (*EAXGet)(const GUID*, ALuint, ALuint, ALvoid*, ALuint);
#endif

#pragma pack(push, 4)




////////////////////////////////////////////////////////////////////////////
// Constants

#define EAX_MAX_FXSLOTS 4
#define EAX_MAX_ACTIVE_FXSLOTS 2

// The EAX_NULL_GUID is used by EAXFXSLOT_LOADEFFECT, EAXCONTEXT_PRIMARYFXSLOTID
// and EAXSOURCE_ACTIVEFXSLOTID

// {00000000-0000-0000-0000-000000000000}
DEFINE_GUID(EAX_NULL_GUID,
    0x00000000,
    0x0000,
    0x0000,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);

// The EAX_PrimaryFXSlotID GUID is used by EAXSOURCE_ACTIVEFXSLOTID

// {F317866D-924C-450C-861B-E6DAA25E7C20}
DEFINE_GUID(EAX_PrimaryFXSlotID,
    0xf317866d,
    0x924c,
    0x450c,
    0x86, 0x1b, 0xe6, 0xda, 0xa2, 0x5e, 0x7c, 0x20);


////////////////////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////////////////////
// Structures

// Use this structure for EAXCONTEXT_ALL property.
typedef struct _EAXCONTEXTPROPERTIES
{
    GUID          guidPrimaryFXSlotID;
    float         flDistanceFactor;
    float         flAirAbsorptionHF;
    float         flHFReference;
} EAXCONTEXTPROPERTIES, *LPEAXCONTEXTPROPERTIES;

// Use this structure for EAXSOURCE_ALLPARAMETERS
// - all levels are hundredths of decibels
// - all delays are in seconds
//
// NOTE: This structure may change in future EAX versions.
//       It is recommended to initialize fields by name:
//              myBuffer.lDirect = 0;
//              myBuffer.lDirectHF = -200;
//              ...
//              myBuffer.dwFlags = myFlags /* see EAXSOURCEFLAGS below */ ;
//       instead of:
//              myBuffer = { 0, -200, ... , 0x00000003 };
//
typedef struct _EAXSOURCEPROPERTIES
{
    long          lDirect;                 // direct path level (at low and mid frequencies)
    long          lDirectHF;               // relative direct path level at high frequencies
    long          lRoom;                   // room effect level (at low and mid frequencies)
    long          lRoomHF;                 // relative room effect level at high frequencies
    long          lObstruction;            // main obstruction control (attenuation at high frequencies)
    float         flObstructionLFRatio;    // obstruction low-frequency level re. main control
    long          lOcclusion;              // main occlusion control (attenuation at high frequencies)
    float         flOcclusionLFRatio;      // occlusion low-frequency level re. main control
    float         flOcclusionRoomRatio;    // relative occlusion control for room effect
    float         flOcclusionDirectRatio;  // relative occlusion control for direct path
    long          lExclusion;              // main exlusion control (attenuation at high frequencies)
    float         flExclusionLFRatio;      // exclusion low-frequency level re. main control
    long          lOutsideVolumeHF;        // outside sound cone level at high frequencies
    float         flDopplerFactor;         // like DS3D flDopplerFactor but per source
    float         flRolloffFactor;         // like DS3D flRolloffFactor but per source
    float         flRoomRolloffFactor;     // like DS3D flRolloffFactor but for room effect
    float         flAirAbsorptionFactor;   // multiplies EAXREVERB_AIRABSORPTIONHF
    unsigned long ulFlags;                 // modifies the behavior of properties
} EAXSOURCEPROPERTIES, *LPEAXSOURCEPROPERTIES;

// Use this structure for EAXSOURCE_ALLSENDPARAMETERS
// - all levels are hundredths of decibels
//
typedef struct _EAXSOURCEALLSENDPROPERTIES
{
	GUID          guidReceivingFXSlotID;
	long          lSend;                   // send level (at low and mid frequencies)
	long          lSendHF;                 // relative send level at high frequencies
	long          lOcclusion;
	float         flOcclusionLFRatio;
	float         flOcclusionRoomRatio;
	float         flOcclusionDirectRatio;
	long          lExclusion;
	float         flExclusionLFRatio;
} EAXSOURCEALLSENDPROPERTIES, *LPEAXSOURCEALLSENDPROPERTIES;

// Use this structure for EAXSOURCE_ACTIVEFXSLOTID
typedef struct _EAXACTIVEFXSLOTS
{
    GUID          guidActiveFXSlots[EAX_MAX_ACTIVE_FXSLOTS];
} EAXACTIVEFXSLOTS, *LPEAXACTIVEFXSLOTS;

// Use this structure for EAXSOURCE_OBSTRUCTIONPARAMETERS property.
typedef struct _EAXOBSTRUCTIONPROPERTIES
{
    long          lObstruction;
    float         flObstructionLFRatio;
} EAXOBSTRUCTIONPROPERTIES, *LPEAXOBSTRUCTIONPROPERTIES;

// Use this structure for EAXSOURCE_OCCLUSIONPARAMETERS property.
typedef struct _EAXOCCLUSIONPROPERTIES
{
    long          lOcclusion;
    float         flOcclusionLFRatio;
    float         flOcclusionRoomRatio;
    float         flOcclusionDirectRatio;
} EAXOCCLUSIONPROPERTIES, *LPEAXOCCLUSIONPROPERTIES;

// Use this structure for EAXSOURCE_EXCLUSIONPARAMETERS property.
typedef struct _EAXEXCLUSIONPROPERTIES
{
    long          lExclusion;
    float         flExclusionLFRatio;
} EAXEXCLUSIONPROPERTIES, *LPEAXEXCLUSIONPROPERTIES;

// Use this structure for EAXSOURCE_SENDPARAMETERS properties.
typedef struct _EAXSOURCESENDPROPERTIES
{
    GUID          guidReceivingFXSlotID;
    long          lSend;
    long          lSendHF;
} EAXSOURCESENDPROPERTIES, *LPEAXSOURCESENDPROPERTIES;

// Use this structure for EAXSOURCE_OCCLUSIONSENDPARAMETERS
typedef struct _EAXSOURCEOCCLUSIONSENDPROPERTIES
{
	GUID          guidReceivingFXSlotID;
	long          lOcclusion;
	float         flOcclusionLFRatio;
	float         flOcclusionRoomRatio;
	float         flOcclusionDirectRatio;
} EAXSOURCEOCCLUSIONSENDPROPERTIES, *LPEAXSOURCEOCCLUSIONSENDPROPERTIES;

// Use this structure for EAXSOURCE_EXCLUSIONSENDPARAMETERS
typedef struct _EAXSOURCEEXCLUSIONSENDPROPERTIES
{
	GUID          guidReceivingFXSlotID;
	long          lExclusion;
	float         flExclusionLFRatio;
} EAXSOURCEEXCLUSIONSENDPROPERTIES, *LPEAXSOURCEEXCLUSIONSENDPROPERTIES;

// Use this structure for EAXFXSLOT_ALLPARAMETERS
// - all levels are hundredths of decibels
//
// NOTE: This structure may change in future EAX versions.
//       It is recommended to initialize fields by name:
//              myFXSlot.guidLoadEffect = EAX_REVERB_EFFECT;
//              myFXSlot.lVolume = 0;
//              myFXSlot.lLock = 1;
//              myFXSlot.ulFlags = myFlags /* see EAXFXSLOTFLAGS below */ ;
//       instead of:
//              myFXSlot = { EAX_REVERB_EFFECT, 0, 1, 0x00000001 };
//
typedef struct _EAXFXSLOTPROPERTIES
{
	GUID          guidLoadEffect;
	long          lVolume;
	long          lLock;
	unsigned long ulFlags;
} EAXFXSLOTPROPERTIES, *LPEAXFXSLOTPROPERTIES;

// Use this structure for EAXREVERB_REFLECTIONSPAN and EAXREVERB_REVERBPAN properties.
#ifndef EAXVECTOR_DEFINED
#define EAXVECTOR_DEFINED
typedef struct _EAXVECTOR {
    float x;
    float y;
    float z;
} EAXVECTOR;
#endif


////////////////////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////////////////////
// Error Codes

#define EAX_OK                     0
#define EAXERR_INVALID_OPERATION   (-1)
#define EAXERR_INVALID_VALUE       (-2)
#define EAXERR_NO_EFFECT_LOADED    (-3)
#define EAXERR_UNKNOWN_EFFECT      (-4)
////////////////////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////////////////////
// Context Object

// {1D4870AD-0DEF-43c0-A40C-523632296342}
DEFINE_GUID(EAXPROPERTYID_EAX40_Context,
    0x1d4870ad,
    0xdef,
    0x43c0,
    0xa4, 0xc, 0x52, 0x36, 0x32, 0x29, 0x63, 0x42);

// For compatibility with future EAX versions:
#define EAXPROPERTYID_EAX_Context EAXPROPERTYID_EAX40_Context

typedef enum
{
    EAXCONTEXT_NONE = 0,
    EAXCONTEXT_ALLPARAMETERS,
    EAXCONTEXT_PRIMARYFXSLOTID,
    EAXCONTEXT_DISTANCEFACTOR,
    EAXCONTEXT_AIRABSORPTIONHF,
    EAXCONTEXT_HFREFERENCE,
    EAXCONTEXT_LASTERROR
} EAXCONTEXT_PROPERTY;

// OR these flags with property id
#define EAXCONTEXT_PARAMETER_IMMEDIATE 0x00000000 // changes take effect immediately
#define EAXCONTEXT_PARAMETER_DEFER     0x80000000 // changes take effect later
#define EAXCONTEXT_PARAMETER_COMMITDEFERREDSETTINGS (EAXCONTEXT_NONE | \
                                                      EAXCONTEXT_PARAMETER_IMMEDIATE)

// EAX Context property ranges and defaults:
#define EAXCONTEXT_DEFAULTPRIMARYFXSLOTID EAXPROPERTYID_EAX40_FXSlot0

#define EAXCONTEXT_MINDISTANCEFACTOR        FLT_MIN //minimum positive value
#define EAXCONTEXT_MAXDISTANCEFACTOR        FLT_MAX
#define EAXCONTEXT_DEFAULTDISTANCEFACTOR    1.0f

#define EAXCONTEXT_MINAIRABSORPTIONHF     (-100.0f)
#define EAXCONTEXT_MAXAIRABSORPTIONHF     0.0f
#define EAXCONTEXT_DEFAULTAIRABSORPTIONHF (-5.0f)

#define EAXCONTEXT_MINHFREFERENCE         1000.0f
#define EAXCONTEXT_MAXHFREFERENCE         20000.0f
#define EAXCONTEXT_DEFAULTHFREFERENCE     5000.0f

#define EAXCONTEXT_DEFAULTLASTERROR         EAX_OK

////////////////////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////////////////////
// Effect Slot Objects

// {C4D79F1E-F1AC-436b-A81D-A738E7045469}
DEFINE_GUID(EAXPROPERTYID_EAX40_FXSlot0,
    0xc4d79f1e,
    0xf1ac,
    0x436b,
    0xa8, 0x1d, 0xa7, 0x38, 0xe7, 0x4, 0x54, 0x69);

// {08C00E96-74BE-4491-93AA-E8AD35A49117}
DEFINE_GUID(EAXPROPERTYID_EAX40_FXSlot1,
    0x8c00e96,
    0x74be,
    0x4491,
    0x93, 0xaa, 0xe8, 0xad, 0x35, 0xa4, 0x91, 0x17);

// {1D433B88-F0F6-4637-919F-60E7E06B5EDD}
DEFINE_GUID(EAXPROPERTYID_EAX40_FXSlot2,
    0x1d433b88,
    0xf0f6,
    0x4637,
    0x91, 0x9f, 0x60, 0xe7, 0xe0, 0x6b, 0x5e, 0xdd);

// {EFFF08EA-C7D8-44ab-93AD-6DBD5F910064}
DEFINE_GUID(EAXPROPERTYID_EAX40_FXSlot3,
    0xefff08ea,
    0xc7d8,
    0x44ab,
    0x93, 0xad, 0x6d, 0xbd, 0x5f, 0x91, 0x0, 0x64);

// For compatibility with future EAX versions:
#define EAXPROPERTYID_EAX_FXSlot0 EAXPROPERTYID_EAX40_FXSlot0
#define EAXPROPERTYID_EAX_FXSlot1 EAXPROPERTYID_EAX40_FXSlot1
#define EAXPROPERTYID_EAX_FXSlot2 EAXPROPERTYID_EAX40_FXSlot2
#define EAXPROPERTYID_EAX_FXSlot3 EAXPROPERTYID_EAX40_FXSlot3

// FXSlot object properties
typedef enum
{
    EAXFXSLOT_PARAMETER = 0, // range 0-0x40 reserved for loaded effect parameters
    EAXFXSLOT_NONE = 0x10000,
	EAXFXSLOT_ALLPARAMETERS,
    EAXFXSLOT_LOADEFFECT,
    EAXFXSLOT_VOLUME,
	EAXFXSLOT_LOCK,
	EAXFXSLOT_FLAGS
} EAXFXSLOT_PROPERTY;

// Note: The number and order of flags may change in future EAX versions.
//       To insure future compatibility, use flag defines as follows:
//              myFlags = EAXFXSLOTFLAGS_ENVIRONMENT;
//       instead of:
//              myFlags = 0x00000001;
//
#define EAXFXSLOTFLAGS_ENVIRONMENT   0x00000001
#define EAXFXSLOTFLAGS_RESERVED      0xFFFFFFFE // reserved future use

// EAX Effect Slot property ranges and defaults:
#define EAXFXSLOT_MINVOLUME                    (-10000)
#define EAXFXSLOT_MAXVOLUME                    0
#define EAXFXSLOT_DEFAULTVOLUME                0

#define EAXFXSLOT_MINLOCK    0
#define EAXFXSLOT_MAXLOCK    1

enum
{
   EAXFXSLOT_UNLOCKED = 0,
   EAXFXSLOT_LOCKED = 1
};

#define EAXFXSLOT_DEFAULTFLAGS                 (EAXFXSLOTFLAGS_ENVIRONMENT)
////////////////////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////////////////////
// Source Object

// {1B86B823-22DF-4eae-8B3C-1278CE544227}
DEFINE_GUID(EAXPROPERTYID_EAX40_Source,
    0x1b86b823,
    0x22df,
    0x4eae,
    0x8b, 0x3c, 0x12, 0x78, 0xce, 0x54, 0x42, 0x27);

// For compatibility with future EAX versions:
#define EAXPROPERTYID_EAX_Source EAXPROPERTYID_EAX40_Source

// Source object properties
typedef enum
{
    EAXSOURCE_NONE,
    EAXSOURCE_ALLPARAMETERS,
    EAXSOURCE_OBSTRUCTIONPARAMETERS,
    EAXSOURCE_OCCLUSIONPARAMETERS,
    EAXSOURCE_EXCLUSIONPARAMETERS,
    EAXSOURCE_DIRECT,
    EAXSOURCE_DIRECTHF,
    EAXSOURCE_ROOM,
    EAXSOURCE_ROOMHF,
    EAXSOURCE_OBSTRUCTION,
    EAXSOURCE_OBSTRUCTIONLFRATIO,
    EAXSOURCE_OCCLUSION,
    EAXSOURCE_OCCLUSIONLFRATIO,
    EAXSOURCE_OCCLUSIONROOMRATIO,
    EAXSOURCE_OCCLUSIONDIRECTRATIO,
    EAXSOURCE_EXCLUSION,
    EAXSOURCE_EXCLUSIONLFRATIO,
    EAXSOURCE_OUTSIDEVOLUMEHF,
    EAXSOURCE_DOPPLERFACTOR,
    EAXSOURCE_ROLLOFFFACTOR,
    EAXSOURCE_ROOMROLLOFFFACTOR,
    EAXSOURCE_AIRABSORPTIONFACTOR,
    EAXSOURCE_FLAGS,
    EAXSOURCE_SENDPARAMETERS,
    EAXSOURCE_ALLSENDPARAMETERS,
    EAXSOURCE_OCCLUSIONSENDPARAMETERS,
    EAXSOURCE_EXCLUSIONSENDPARAMETERS,
    EAXSOURCE_ACTIVEFXSLOTID,
} EAXSOURCE_PROPERTY;

// OR these flags with property id
#define EAXSOURCE_PARAMETER_IMMEDIATE 0x00000000 // changes take effect immediately
#define EAXSOURCE_PARAMETER_DEFERRED  0x80000000 // changes take effect later
#define EAXSOURCE_PARAMETER_COMMITDEFERREDSETTINGS (EAXSOURCE_NONE | \
                                                    EAXSOURCE_PARAMETER_IMMEDIATE)
// Used by EAXSOURCE_FLAGS for EAXSOURCEFLAGS_xxxAUTO
//    TRUE:    value is computed automatically - property is an offset
//    FALSE:   value is used directly
//
// Note: The number and order of flags may change in future EAX versions.
//       To insure future compatibility, use flag defines as follows:
//              myFlags = EAXSOURCE_DIRECTHFAUTO | EAXSOURCE_ROOMAUTO;
//       instead of:
//              myFlags = 0x00000003;
//
#define EAXSOURCEFLAGS_DIRECTHFAUTO          0x00000001 // relates to EAXSOURCE_DIRECTHF
#define EAXSOURCEFLAGS_ROOMAUTO              0x00000002 // relates to EAXSOURCE_ROOM
#define EAXSOURCEFLAGS_ROOMHFAUTO            0x00000004 // relates to EAXSOURCE_ROOMHF
#define EAXSOURCEFLAGS_RESERVED              0xFFFFFFF8 // reserved future use

// EAX Source property ranges and defaults:
#define EAXSOURCE_MINSEND                      (-10000)
#define EAXSOURCE_MAXSEND                      0
#define EAXSOURCE_DEFAULTSEND                  0

#define EAXSOURCE_MINSENDHF                    (-10000)
#define EAXSOURCE_MAXSENDHF                    0
#define EAXSOURCE_DEFAULTSENDHF                0

#define EAXSOURCE_MINDIRECT                    (-10000)
#define EAXSOURCE_MAXDIRECT                    1000
#define EAXSOURCE_DEFAULTDIRECT                0

#define EAXSOURCE_MINDIRECTHF                  (-10000)
#define EAXSOURCE_MAXDIRECTHF                  0
#define EAXSOURCE_DEFAULTDIRECTHF              0

#define EAXSOURCE_MINROOM                      (-10000)
#define EAXSOURCE_MAXROOM                      1000
#define EAXSOURCE_DEFAULTROOM                  0

#define EAXSOURCE_MINROOMHF                    (-10000)
#define EAXSOURCE_MAXROOMHF                    0
#define EAXSOURCE_DEFAULTROOMHF                0

#define EAXSOURCE_MINOBSTRUCTION               (-10000)
#define EAXSOURCE_MAXOBSTRUCTION               0
#define EAXSOURCE_DEFAULTOBSTRUCTION           0

#define EAXSOURCE_MINOBSTRUCTIONLFRATIO        0.0f
#define EAXSOURCE_MAXOBSTRUCTIONLFRATIO        1.0f
#define EAXSOURCE_DEFAULTOBSTRUCTIONLFRATIO    0.0f

#define EAXSOURCE_MINOCCLUSION                 (-10000)
#define EAXSOURCE_MAXOCCLUSION                 0
#define EAXSOURCE_DEFAULTOCCLUSION             0

#define EAXSOURCE_MINOCCLUSIONLFRATIO          0.0f
#define EAXSOURCE_MAXOCCLUSIONLFRATIO          1.0f
#define EAXSOURCE_DEFAULTOCCLUSIONLFRATIO      0.25f

#define EAXSOURCE_MINOCCLUSIONROOMRATIO        0.0f
#define EAXSOURCE_MAXOCCLUSIONROOMRATIO        10.0f
#define EAXSOURCE_DEFAULTOCCLUSIONROOMRATIO    1.5f

#define EAXSOURCE_MINOCCLUSIONDIRECTRATIO      0.0f
#define EAXSOURCE_MAXOCCLUSIONDIRECTRATIO      10.0f
#define EAXSOURCE_DEFAULTOCCLUSIONDIRECTRATIO  1.0f

#define EAXSOURCE_MINEXCLUSION                 (-10000)
#define EAXSOURCE_MAXEXCLUSION                 0
#define EAXSOURCE_DEFAULTEXCLUSION             0

#define EAXSOURCE_MINEXCLUSIONLFRATIO          0.0f
#define EAXSOURCE_MAXEXCLUSIONLFRATIO          1.0f
#define EAXSOURCE_DEFAULTEXCLUSIONLFRATIO      1.0f

#define EAXSOURCE_MINOUTSIDEVOLUMEHF           (-10000)
#define EAXSOURCE_MAXOUTSIDEVOLUMEHF           0
#define EAXSOURCE_DEFAULTOUTSIDEVOLUMEHF       0

#define EAXSOURCE_MINDOPPLERFACTOR             0.0f
#define EAXSOURCE_MAXDOPPLERFACTOR             10.f
#define EAXSOURCE_DEFAULTDOPPLERFACTOR         1.0f

#define EAXSOURCE_MINROLLOFFFACTOR             0.0f
#define EAXSOURCE_MAXROLLOFFFACTOR             10.f
#define EAXSOURCE_DEFAULTROLLOFFFACTOR         0.0f

#define EAXSOURCE_MINROOMROLLOFFFACTOR         0.0f
#define EAXSOURCE_MAXROOMROLLOFFFACTOR         10.f
#define EAXSOURCE_DEFAULTROOMROLLOFFFACTOR     0.0f

#define EAXSOURCE_MINAIRABSORPTIONFACTOR       0.0f
#define EAXSOURCE_MAXAIRABSORPTIONFACTOR       10.0f
#define EAXSOURCE_DEFAULTAIRABSORPTIONFACTOR   0.0f

#define EAXSOURCE_DEFAULTFLAGS                 (EAXSOURCEFLAGS_DIRECTHFAUTO |       \
                                                EAXSOURCEFLAGS_ROOMAUTO     |       \
                                                EAXSOURCEFLAGS_ROOMHFAUTO  )

#define EAXSOURCE_DEFAULTACTIVEFXSLOTID  {{ EAX_NULL_GUID.Data1, EAX_NULL_GUID.Data2, EAX_NULL_GUID.Data3, \
                                    EAX_NULL_GUID.Data4[0],EAX_NULL_GUID.Data4[1],EAX_NULL_GUID.Data4[2],\
                                    EAX_NULL_GUID.Data4[3],EAX_NULL_GUID.Data4[4],EAX_NULL_GUID.Data4[5],\
                                    EAX_NULL_GUID.Data4[6],EAX_NULL_GUID.Data4[7] },                       \
                                  { EAX_PrimaryFXSlotID.Data1, EAX_PrimaryFXSlotID.Data2, \
                                    EAX_PrimaryFXSlotID.Data3, EAX_PrimaryFXSlotID.Data4[0],\
                                    EAX_PrimaryFXSlotID.Data4[1],EAX_PrimaryFXSlotID.Data4[2],\
                                    EAX_PrimaryFXSlotID.Data4[3],EAX_PrimaryFXSlotID.Data4[4],\
                                    EAX_PrimaryFXSlotID.Data4[5],EAX_PrimaryFXSlotID.Data4[6],\
                                    EAX_PrimaryFXSlotID.Data4[7] }}


////////////////////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////////////////////
// Reverb Effect

// EAX REVERB {0CF95C8F-A3CC-4849-B0B6-832ECC1822DF}
DEFINE_GUID(EAX_REVERB_EFFECT,
    0xcf95c8f,
    0xa3cc,
    0x4849,
    0xb0, 0xb6, 0x83, 0x2e, 0xcc, 0x18, 0x22, 0xdf);

// Reverb effect properties
typedef enum
{
    EAXREVERB_NONE,
    EAXREVERB_ALLPARAMETERS,
    EAXREVERB_ENVIRONMENT,
    EAXREVERB_ENVIRONMENTSIZE,
    EAXREVERB_ENVIRONMENTDIFFUSION,
    EAXREVERB_ROOM,
    EAXREVERB_ROOMHF,
    EAXREVERB_ROOMLF,
    EAXREVERB_DECAYTIME,
    EAXREVERB_DECAYHFRATIO,
    EAXREVERB_DECAYLFRATIO,
    EAXREVERB_REFLECTIONS,
    EAXREVERB_REFLECTIONSDELAY,
    EAXREVERB_REFLECTIONSPAN,
    EAXREVERB_REVERB,
    EAXREVERB_REVERBDELAY,
    EAXREVERB_REVERBPAN,
    EAXREVERB_ECHOTIME,
    EAXREVERB_ECHODEPTH,
    EAXREVERB_MODULATIONTIME,
    EAXREVERB_MODULATIONDEPTH,
    EAXREVERB_AIRABSORPTIONHF,
    EAXREVERB_HFREFERENCE,
    EAXREVERB_LFREFERENCE,
    EAXREVERB_ROOMROLLOFFFACTOR,
    EAXREVERB_FLAGS,
} EAXREVERB_PROPERTY;

// OR these flags with property id
#define EAXREVERB_IMMEDIATE 0x00000000 // changes take effect immediately
#define EAXREVERB_DEFERRED  0x80000000 // changes take effect later
#define EAXREVERB_COMMITDEFERREDSETTINGS (EAXREVERB_NONE | \
                                          EAXREVERB_IMMEDIATE)

// used by EAXREVERB_ENVIRONMENT
enum
{
    EAX_ENVIRONMENT_GENERIC,
    EAX_ENVIRONMENT_PADDEDCELL,
    EAX_ENVIRONMENT_ROOM,
    EAX_ENVIRONMENT_BATHROOM,
    EAX_ENVIRONMENT_LIVINGROOM,
    EAX_ENVIRONMENT_STONEROOM,
    EAX_ENVIRONMENT_AUDITORIUM,
    EAX_ENVIRONMENT_CONCERTHALL,
    EAX_ENVIRONMENT_CAVE,
    EAX_ENVIRONMENT_ARENA,
    EAX_ENVIRONMENT_HANGAR,
    EAX_ENVIRONMENT_CARPETEDHALLWAY,
    EAX_ENVIRONMENT_HALLWAY,
    EAX_ENVIRONMENT_STONECORRIDOR,
    EAX_ENVIRONMENT_ALLEY,
    EAX_ENVIRONMENT_FOREST,
    EAX_ENVIRONMENT_CITY,
    EAX_ENVIRONMENT_MOUNTAINS,
    EAX_ENVIRONMENT_QUARRY,
    EAX_ENVIRONMENT_PLAIN,
    EAX_ENVIRONMENT_PARKINGLOT,
    EAX_ENVIRONMENT_SEWERPIPE,
    EAX_ENVIRONMENT_UNDERWATER,
    EAX_ENVIRONMENT_DRUGGED,
    EAX_ENVIRONMENT_DIZZY,
    EAX_ENVIRONMENT_PSYCHOTIC,

    EAX_ENVIRONMENT_UNDEFINED,

    EAX_ENVIRONMENT_COUNT
};

// Used by EAXREVERB_FLAGS
//
// Note: The number and order of flags may change in future EAX versions.
//       It is recommended to use the flag defines as follows:
//              myFlags = EAXREVERBFLAGS_DECAYTIMESCALE | EAXREVERBFLAGS_REVERBSCALE;
//       instead of:
//              myFlags = 0x00000009;
//
// These flags determine what properties are affected by environment size.
#define EAXREVERBFLAGS_DECAYTIMESCALE        0x00000001 // reverberation decay time
#define EAXREVERBFLAGS_REFLECTIONSSCALE      0x00000002 // reflection level
#define EAXREVERBFLAGS_REFLECTIONSDELAYSCALE 0x00000004 // initial reflection delay time
#define EAXREVERBFLAGS_REVERBSCALE           0x00000008 // reflections level
#define EAXREVERBFLAGS_REVERBDELAYSCALE      0x00000010 // late reverberation delay time
#define EAXREVERBFLAGS_ECHOTIMESCALE         0x00000040 // echo time
#define EAXREVERBFLAGS_MODULATIONTIMESCALE   0x00000080 // modulation time
// This flag limits high-frequency decay time according to air absorption.
#define EAXREVERBFLAGS_DECAYHFLIMIT          0x00000020
#define EAXREVERBFLAGS_RESERVED              0xFFFFFF00 // reserved future use

// Use this structure for EAXREVERB_ALLPARAMETERS
// - all levels are hundredths of decibels
// - all times and delays are in seconds
//
// NOTE: This structure may change in future EAX versions.
//       It is recommended to initialize fields by name:
//              myReverb.lRoom = -1000;
//              myReverb.lRoomHF = -100;
//              ...
//              myReverb.dwFlags = myFlags /* see EAXREVERBFLAGS below */ ;
//       instead of:
//              myReverb = { -1000, -100, ... , 0x00000009 };
//       If you want to save and load presets in binary form, you
//       should define your own structure to insure future compatibility.
//
typedef struct _EAXREVERBPROPERTIES
{
    unsigned long ulEnvironment;   // sets all reverb properties
    float flEnvironmentSize;       // environment size in meters
    float flEnvironmentDiffusion;  // environment diffusion
    long lRoom;                    // room effect level (at mid frequencies)
    long lRoomHF;                  // relative room effect level at high frequencies
    long lRoomLF;                  // relative room effect level at low frequencies
    float flDecayTime;             // reverberation decay time at mid frequencies
    float flDecayHFRatio;          // high-frequency to mid-frequency decay time ratio
    float flDecayLFRatio;          // low-frequency to mid-frequency decay time ratio
    long lReflections;             // early reflections level relative to room effect
    float flReflectionsDelay;      // initial reflection delay time
    EAXVECTOR vReflectionsPan;     // early reflections panning vector
    long lReverb;                  // late reverberation level relative to room effect
    float flReverbDelay;           // late reverberation delay time relative to initial reflection
    EAXVECTOR vReverbPan;          // late reverberation panning vector
    float flEchoTime;              // echo time
    float flEchoDepth;             // echo depth
    float flModulationTime;        // modulation time
    float flModulationDepth;       // modulation depth
    float flAirAbsorptionHF;       // change in level per meter at high frequencies
    float flHFReference;           // reference high frequency
    float flLFReference;           // reference low frequency
    float flRoomRolloffFactor;     // like DS3D flRolloffFactor but for room effect
    unsigned long ulFlags;         // modifies the behavior of properties
} EAXREVERBPROPERTIES, *LPEAXREVERBPROPERTIES;

// Property ranges and defaults:
#define EAXREVERB_MINENVIRONMENT                0
#define EAXREVERB_MAXENVIRONMENT               (EAX_ENVIRONMENT_COUNT-1)
#define EAXREVERB_DEFAULTENVIRONMENT            EAX_ENVIRONMENT_GENERIC

#define EAXREVERB_MINENVIRONMENTSIZE            1.0f
#define EAXREVERB_MAXENVIRONMENTSIZE            100.0f
#define EAXREVERB_DEFAULTENVIRONMENTSIZE        7.5f

#define EAXREVERB_MINENVIRONMENTDIFFUSION       0.0f
#define EAXREVERB_MAXENVIRONMENTDIFFUSION       1.0f
#define EAXREVERB_DEFAULTENVIRONMENTDIFFUSION   1.0f

#define EAXREVERB_MINROOM                       (-10000)
#define EAXREVERB_MAXROOM                       0
#define EAXREVERB_DEFAULTROOM                   (-1000)

#define EAXREVERB_MINROOMHF                     (-10000)
#define EAXREVERB_MAXROOMHF                     0
#define EAXREVERB_DEFAULTROOMHF                 (-100)

#define EAXREVERB_MINROOMLF                     (-10000)
#define EAXREVERB_MAXROOMLF                     0
#define EAXREVERB_DEFAULTROOMLF                 0

#define EAXREVERB_MINDECAYTIME                  0.1f
#define EAXREVERB_MAXDECAYTIME                  20.0f
#define EAXREVERB_DEFAULTDECAYTIME              1.49f

#define EAXREVERB_MINDECAYHFRATIO               0.1f
#define EAXREVERB_MAXDECAYHFRATIO               2.0f
#define EAXREVERB_DEFAULTDECAYHFRATIO           0.83f

#define EAXREVERB_MINDECAYLFRATIO               0.1f
#define EAXREVERB_MAXDECAYLFRATIO               2.0f
#define EAXREVERB_DEFAULTDECAYLFRATIO           1.00f

#define EAXREVERB_MINREFLECTIONS                (-10000)
#define EAXREVERB_MAXREFLECTIONS                1000
#define EAXREVERB_DEFAULTREFLECTIONS            (-2602)

#define EAXREVERB_MINREFLECTIONSDELAY           0.0f
#define EAXREVERB_MAXREFLECTIONSDELAY           0.3f
#define EAXREVERB_DEFAULTREFLECTIONSDELAY       0.007f

#define EAXREVERB_DEFAULTREFLECTIONSPAN         {0.0f, 0.0f, 0.0f}

#define EAXREVERB_MINREVERB                     (-10000)
#define EAXREVERB_MAXREVERB                     2000
#define EAXREVERB_DEFAULTREVERB                 200

#define EAXREVERB_MINREVERBDELAY                0.0f
#define EAXREVERB_MAXREVERBDELAY                0.1f
#define EAXREVERB_DEFAULTREVERBDELAY            0.011f

#define EAXREVERB_DEFAULTREVERBPAN              {0.0f, 0.0f, 0.0f}

#define EAXREVERB_MINECHOTIME                   0.075f
#define EAXREVERB_MAXECHOTIME                      0.25f
#define EAXREVERB_DEFAULTECHOTIME               0.25f

#define EAXREVERB_MINECHODEPTH                  0.0f
#define EAXREVERB_MAXECHODEPTH                  1.0f
#define EAXREVERB_DEFAULTECHODEPTH              0.0f

#define EAXREVERB_MINMODULATIONTIME             0.04f
#define EAXREVERB_MAXMODULATIONTIME             4.0f
#define EAXREVERB_DEFAULTMODULATIONTIME         0.25f

#define EAXREVERB_MINMODULATIONDEPTH            0.0f
#define EAXREVERB_MAXMODULATIONDEPTH            1.0f
#define EAXREVERB_DEFAULTMODULATIONDEPTH        0.0f

#define EAXREVERB_MINAIRABSORPTIONHF            (-100.0f)
#define EAXREVERB_MAXAIRABSORPTIONHF            0.0f
#define EAXREVERB_DEFAULTAIRABSORPTIONHF        (-5.0f)

#define EAXREVERB_MINHFREFERENCE                1000.0f
#define EAXREVERB_MAXHFREFERENCE                20000.0f
#define EAXREVERB_DEFAULTHFREFERENCE            5000.0f

#define EAXREVERB_MINLFREFERENCE                20.0f
#define EAXREVERB_MAXLFREFERENCE                1000.0f
#define EAXREVERB_DEFAULTLFREFERENCE            250.0f

#define EAXREVERB_MINROOMROLLOFFFACTOR          0.0f
#define EAXREVERB_MAXROOMROLLOFFFACTOR          10.0f
#define EAXREVERB_DEFAULTROOMROLLOFFFACTOR      0.0f

#define EAXREVERB_DEFAULTFLAGS                  (EAXREVERBFLAGS_DECAYTIMESCALE |        \
                                                 EAXREVERBFLAGS_REFLECTIONSSCALE |      \
                                                 EAXREVERBFLAGS_REFLECTIONSDELAYSCALE | \
                                                 EAXREVERBFLAGS_REVERBSCALE |           \
                                                 EAXREVERBFLAGS_REVERBDELAYSCALE |      \
                                                 EAXREVERBFLAGS_DECAYHFLIMIT)
////////////////////////////////////////////////////////////////////////////




////////////////////////////////////////////////////////////////////////////

//          New Effect Types

////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////
// AGC Compressor Effect

// EAX AGC COMPRESSOR {BFB7A01E-7825-4039-927F-3AABDA0C560}

DEFINE_GUID(EAX_AGCCOMPRESSOR_EFFECT,
    0xbfb7a01e,
    0x7825,
    0x4039,
    0x92, 0x7f, 0x3, 0xaa, 0xbd, 0xa0, 0xc5, 0x60);

// AGC Compressor properties
typedef enum
{
    EAXAGCCOMPRESSOR_NONE,
    EAXAGCCOMPRESSOR_ALLPARAMETERS,
    EAXAGCCOMPRESSOR_ONOFF
} EAXAGCCOMPRESSOR_PROPERTY;

// OR these flags with property id
#define EAXAGCCOMPRESSOR_IMMEDIATE 0x00000000 // changes take effect immediately
#define EAXAGCCOMPRESSOR_DEFERRED  0x80000000 // changes take effect later
#define EAXAGCCOMPRESSOR_COMMITDEFERREDSETTINGS (EAXAGCCOMPRESSOR_NONE | \
                                                 EAXAGCCOMPRESSOR_IMMEDIATE)

// Use this structure for EAXAGCCOMPRESSOR_ALLPARAMETERS
typedef struct _EAXAGCCOMPRESSORPROPERTIES
{
    unsigned long ulOnOff;   // Switch Compressor on or off
} EAXAGCCOMPRESSORPROPERTIES, *LPEAXAGCCOMPRESSORPROPERTIES;

// Property ranges and defaults:

#define EAXAGCCOMPRESSOR_MINONOFF           0
#define EAXAGCCOMPRESSOR_MAXONOFF           1
#define EAXAGCCOMPRESSOR_DEFAULTONOFF       1

////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////
// Autowah Effect

// EAX AUTOWAH {EC3130C0-AC7A-11D2-88DD-A024D13CE1}
DEFINE_GUID(EAX_AUTOWAH_EFFECT,
    0xec3130c0,
    0xac7a,
    0x11d2,
    0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1);

// Autowah properties
typedef enum
{
    EAXAUTOWAH_NONE,
    EAXAUTOWAH_ALLPARAMETERS,
    EAXAUTOWAH_ATTACKTIME,
    EAXAUTOWAH_RELEASETIME,
    EAXAUTOWAH_RESONANCE,
    EAXAUTOWAH_PEAKLEVEL
} EAXAUTOWAH_PROPERTY;

// OR these flags with property id
#define EAXAUTOWAH_IMMEDIATE 0x00000000 // changes take effect immediately
#define EAXAUTOWAH_DEFERRED  0x80000000 // changes take effect later
#define EAXAUTOWAH_COMMITDEFERREDSETTINGS (EAXAUTOWAH_NONE | \
                                           EAXAUTOWAH_IMMEDIATE)

// Use this structure for EAXAUTOWAH_ALLPARAMETERS
typedef struct _EAXAUTOWAHPROPERTIES
{
    float   flAttackTime;                // Attack time (seconds)
    float   flReleaseTime;          // Release time (seconds)
    long    lResonance;             // Resonance (mB)
    long    lPeakLevel;             // Peak level (mB)
} EAXAUTOWAHPROPERTIES, *LPEAXAUTOWAHPROPERTIES;

// Property ranges and defaults:

#define EAXAUTOWAH_MINATTACKTIME            0.0001f
#define EAXAUTOWAH_MAXATTACKTIME            1.0f
#define EAXAUTOWAH_DEFAULTATTACKTIME        0.06f

#define EAXAUTOWAH_MINRELEASETIME           0.0001f
#define EAXAUTOWAH_MAXRELEASETIME           1.0f
#define EAXAUTOWAH_DEFAULTRELEASETIME       0.06f

#define EAXAUTOWAH_MINRESONANCE             600
#define EAXAUTOWAH_MAXRESONANCE             6000
#define EAXAUTOWAH_DEFAULTRESONANCE         6000

#define EAXAUTOWAH_MINPEAKLEVEL             (-9000)
#define EAXAUTOWAH_MAXPEAKLEVEL             9000
#define EAXAUTOWAH_DEFAULTPEAKLEVEL         2100

////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////
// Chorus Effect

// EAX CHORUS {DE6D6FE0-AC79-11D2-88DD-A024D13CE1}

DEFINE_GUID(EAX_CHORUS_EFFECT,
    0xde6d6fe0,
    0xac79,
    0x11d2,
    0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1);


// Chorus properties
typedef enum
{
    EAXCHORUS_NONE,
    EAXCHORUS_ALLPARAMETERS,
    EAXCHORUS_WAVEFORM,
    EAXCHORUS_PHASE,
    EAXCHORUS_RATE,
    EAXCHORUS_DEPTH,
    EAXCHORUS_FEEDBACK,
    EAXCHORUS_DELAY
} EAXCHORUS_PROPERTY;

// OR these flags with property id
#define EAXCHORUS_IMMEDIATE 0x00000000 // changes take effect immediately
#define EAXCHORUS_DEFERRED  0x80000000 // changes take effect later
#define EAXCHORUS_COMMITDEFERREDSETTINGS (EAXCHORUS_NONE | \
                                          EAXCHORUS_IMMEDIATE)

// used by EAXCHORUS_WAVEFORM
enum
{
    EAX_CHORUS_SINUSOID,
    EAX_CHORUS_TRIANGLE
};

// Use this structure for EAXCHORUS_ALLPARAMETERS
typedef struct _EAXCHORUSPROPERTIES
{
    unsigned long   ulWaveform;      // Waveform selector - see enum above
    long            lPhase;         // Phase (Degrees)
    float           flRate;         // Rate (Hz)
    float           flDepth;        // Depth (0 to 1)
    float           flFeedback;     // Feedback (-1 to 1)
    float           flDelay;        // Delay (seconds)
} EAXCHORUSPROPERTIES, *LPEAXCHORUSPROPERTIES;

// Property ranges and defaults:

#define EAXCHORUS_MINWAVEFORM               0
#define EAXCHORUS_MAXWAVEFORM               1
#define EAXCHORUS_DEFAULTWAVEFORM           1

#define EAXCHORUS_MINPHASE              (-180)
#define EAXCHORUS_MAXPHASE              180
#define EAXCHORUS_DEFAULTPHASE          90

#define EAXCHORUS_MINRATE               0.0f
#define EAXCHORUS_MAXRATE               10.0f
#define EAXCHORUS_DEFAULTRATE           1.1f

#define EAXCHORUS_MINDEPTH              0.0f
#define EAXCHORUS_MAXDEPTH              1.0f
#define EAXCHORUS_DEFAULTDEPTH          0.1f

#define EAXCHORUS_MINFEEDBACK           (-1.0f)
#define EAXCHORUS_MAXFEEDBACK           1.0f
#define EAXCHORUS_DEFAULTFEEDBACK       0.25f

#define EAXCHORUS_MINDELAY              0.0f
#define EAXCHORUS_MAXDELAY              0.016f
#define EAXCHORUS_DEFAULTDELAY          0.016f

////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////
// Distortion Effect

// EAX DISTORTION {975A4CE0-AC7E-11D2-88DD-A024D13CE1}

DEFINE_GUID(EAX_DISTORTION_EFFECT,
    0x975a4ce0,
    0xac7e,
    0x11d2,
    0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1);

// Distortion properties
typedef enum
{
    EAXDISTORTION_NONE,
    EAXDISTORTION_ALLPARAMETERS,
    EAXDISTORTION_EDGE,
    EAXDISTORTION_GAIN,
    EAXDISTORTION_LOWPASSCUTOFF,
    EAXDISTORTION_EQCENTER,
    EAXDISTORTION_EQBANDWIDTH
} EAXDISTORTION_PROPERTY;

// OR these flags with property id
#define EAXDISTORTION_IMMEDIATE 0x00000000 // changes take effect immediately
#define EAXDISTORTION_DEFERRED  0x80000000 // changes take effect later
#define EAXDISTORTION_COMMITDEFERREDSETTINGS (EAXDISTORTION_NONE | \
                                              EAXDISTORTION_IMMEDIATE)

// Use this structure for EAXDISTORTION_ALLPARAMETERS
typedef struct _EAXDISTORTIONPROPERTIES
{
    float   flEdge;             // Controls the shape of the distortion (0 to 1)
    long    lGain;              // Controls the post distortion gain (mB)
    float   flLowPassCutOff;    // Controls the cut-off of the filter pre-distortion (Hz)
    float   flEQCenter;         // Controls the center frequency of the EQ post-distortion (Hz)
    float   flEQBandwidth;      // Controls the bandwidth of the EQ post-distortion (Hz)
} EAXDISTORTIONPROPERTIES, *LPEAXDISTORTIONPROPERTIES;

// Property ranges and defaults:

#define EAXDISTORTION_MINEDGE               0.0f
#define EAXDISTORTION_MAXEDGE               1.0f
#define EAXDISTORTION_DEFAULTEDGE           0.2f

#define EAXDISTORTION_MINGAIN               (-6000)
#define EAXDISTORTION_MAXGAIN               0
#define EAXDISTORTION_DEFAULTGAIN           (-2600)

#define EAXDISTORTION_MINLOWPASSCUTOFF      80.0f
#define EAXDISTORTION_MAXLOWPASSCUTOFF      24000.0f
#define EAXDISTORTION_DEFAULTLOWPASSCUTOFF  8000.0f

#define EAXDISTORTION_MINEQCENTER           80.0f
#define EAXDISTORTION_MAXEQCENTER           24000.0f
#define EAXDISTORTION_DEFAULTEQCENTER       3600.0f

#define EAXDISTORTION_MINEQBANDWIDTH        80.0f
#define EAXDISTORTION_MAXEQBANDWIDTH        24000.0f
#define EAXDISTORTION_DEFAULTEQBANDWIDTH    3600.0f

////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////
// Echo Effect

// EAX ECHO {E9F1BC0-AC82-11D2-88DD-A024D13CE1}

DEFINE_GUID(EAX_ECHO_EFFECT,
    0xe9f1bc0,
    0xac82,
    0x11d2,
    0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1);

// Echo properties
typedef enum
{
    EAXECHO_NONE,
    EAXECHO_ALLPARAMETERS,
    EAXECHO_DELAY,
    EAXECHO_LRDELAY,
    EAXECHO_DAMPING,
    EAXECHO_FEEDBACK,
    EAXECHO_SPREAD
} EAXECHO_PROPERTY;

// OR these flags with property id
#define EAXECHO_IMMEDIATE 0x00000000 // changes take effect immediately
#define EAXECHO_DEFERRED  0x80000000 // changes take effect later
#define EAXECHO_COMMITDEFERREDSETTINGS (EAXECHO_NONE | \
                                        EAXECHO_IMMEDIATE)

// Use this structure for EAXECHO_ALLPARAMETERS
typedef struct _EAXECHOPROPERTIES
{
    float   flDelay;            // Controls the initial delay time (seconds)
    float   flLRDelay;          // Controls the delay time between the first and second taps (seconds)
    float   flDamping;          // Controls a low-pass filter that dampens the echoes (0 to 1)
    float   flFeedback;         // Controls the duration of echo repetition (0 to 1)
    float   flSpread;           // Controls the left-right spread of the echoes
} EAXECHOPROPERTIES, *LPEAXECHOPROPERTIES;

// Property ranges and defaults:

#define EAXECHO_MINDAMPING          0.0f
#define EAXECHO_MAXDAMPING          0.99f
#define EAXECHO_DEFAULTDAMPING      0.5f

#define EAXECHO_MINDELAY            0.0f
#define EAXECHO_MAXDELAY            0.207f
#define EAXECHO_DEFAULTDELAY        0.1f

#define EAXECHO_MINLRDELAY          0.0f
#define EAXECHO_MAXLRDELAY          0.404f
#define EAXECHO_DEFAULTLRDELAY      0.1f

#define EAXECHO_MINFEEDBACK         0.0f
#define EAXECHO_MAXFEEDBACK         1.0f
#define EAXECHO_DEFAULTFEEDBACK     0.5f

#define EAXECHO_MINSPREAD           (-1.0f)
#define EAXECHO_MAXSPREAD             1.0f
#define EAXECHO_DEFAULTSPREAD       (-1.0f)

////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////
// Equalizer Effect

// EAX EQUALIZER {65F94CE0-9793-11D3-939D-C0F02DD6F0}

DEFINE_GUID(EAX_EQUALIZER_EFFECT,
    0x65f94ce0,
    0x9793,
    0x11d3,
    0x93, 0x9d, 0x0, 0xc0, 0xf0, 0x2d, 0xd6, 0xf0);


// Equalizer properties
typedef enum
{
    EAXEQUALIZER_NONE,
    EAXEQUALIZER_ALLPARAMETERS,
    EAXEQUALIZER_LOWGAIN,
    EAXEQUALIZER_LOWCUTOFF,
    EAXEQUALIZER_MID1GAIN,
    EAXEQUALIZER_MID1CENTER,
    EAXEQUALIZER_MID1WIDTH,
    EAXEQUALIZER_MID2GAIN,
    EAXEQUALIZER_MID2CENTER,
    EAXEQUALIZER_MID2WIDTH,
    EAXEQUALIZER_HIGHGAIN,
    EAXEQUALIZER_HIGHCUTOFF
} EAXEQUALIZER_PROPERTY;

// OR these flags with property id
#define EAXEQUALIZER_IMMEDIATE 0x00000000 // changes take effect immediately
#define EAXEQUALIZER_DEFERRED  0x80000000 // changes take effect later
#define EAXEQUALIZER_COMMITDEFERREDSETTINGS (EAXEQUALIZER_NONE | \
                                             EAXEQUALIZER_IMMEDIATE)

// Use this structure for EAXEQUALIZER_ALLPARAMETERS
typedef struct _EAXEQUALIZERPROPERTIES
{
    long    lLowGain;           // (mB)
    float   flLowCutOff;        // (Hz)
    long    lMid1Gain;          // (mB)
    float   flMid1Center;       // (Hz)
    float   flMid1Width;        // (octaves)
    long    lMid2Gain;          // (mB)
    float   flMid2Center;       // (Hz)
    float   flMid2Width;        // (octaves)
    long    lHighGain;          // (mB)
    float   flHighCutOff;       // (Hz)
} EAXEQUALIZERPROPERTIES, *LPEAXEQUALIZERPROPERTIES;

// Property ranges and defaults:

#define EAXEQUALIZER_MINLOWGAIN         (-1800)
#define EAXEQUALIZER_MAXLOWGAIN         1800
#define EAXEQUALIZER_DEFAULTLOWGAIN     0

#define EAXEQUALIZER_MINLOWCUTOFF       50.0f
#define EAXEQUALIZER_MAXLOWCUTOFF       800.0f
#define EAXEQUALIZER_DEFAULTLOWCUTOFF   200.0f

#define EAXEQUALIZER_MINMID1GAIN        (-1800)
#define EAXEQUALIZER_MAXMID1GAIN        1800
#define EAXEQUALIZER_DEFAULTMID1GAIN    0

#define EAXEQUALIZER_MINMID1CENTER      200.0f
#define EAXEQUALIZER_MAXMID1CENTER      3000.0f
#define EAXEQUALIZER_DEFAULTMID1CENTER  500.0f

#define EAXEQUALIZER_MINMID1WIDTH       0.01f
#define EAXEQUALIZER_MAXMID1WIDTH       1.0f
#define EAXEQUALIZER_DEFAULTMID1WIDTH   1.0f

#define EAXEQUALIZER_MINMID2GAIN        (-1800)
#define EAXEQUALIZER_MAXMID2GAIN        1800
#define EAXEQUALIZER_DEFAULTMID2GAIN    0

#define EAXEQUALIZER_MINMID2CENTER      1000.0f
#define EAXEQUALIZER_MAXMID2CENTER      8000.0f
#define EAXEQUALIZER_DEFAULTMID2CENTER  3000.0f

#define EAXEQUALIZER_MINMID2WIDTH       0.01f
#define EAXEQUALIZER_MAXMID2WIDTH       1.0f
#define EAXEQUALIZER_DEFAULTMID2WIDTH   1.0f

#define EAXEQUALIZER_MINHIGHGAIN        (-1800)
#define EAXEQUALIZER_MAXHIGHGAIN        1800
#define EAXEQUALIZER_DEFAULTHIGHGAIN    0

#define EAXEQUALIZER_MINHIGHCUTOFF      4000.0f
#define EAXEQUALIZER_MAXHIGHCUTOFF      16000.0f
#define EAXEQUALIZER_DEFAULTHIGHCUTOFF  6000.0f

////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////
// Flanger Effect

// EAX FLANGER {A70007C0-7D2-11D3-9B1E-A024D13CE1}

DEFINE_GUID(EAX_FLANGER_EFFECT,
    0xa70007c0,
    0x7d2,
    0x11d3,
    0x9b, 0x1e, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1);

// Flanger properties
typedef enum
{
    EAXFLANGER_NONE,
    EAXFLANGER_ALLPARAMETERS,
    EAXFLANGER_WAVEFORM,
    EAXFLANGER_PHASE,
    EAXFLANGER_RATE,
    EAXFLANGER_DEPTH,
    EAXFLANGER_FEEDBACK,
    EAXFLANGER_DELAY
} EAXFLANGER_PROPERTY;

// OR these flags with property id
#define EAXFLANGER_IMMEDIATE 0x00000000 // changes take effect immediately
#define EAXFLANGER_DEFERRED  0x80000000 // changes take effect later
#define EAXFLANGER_COMMITDEFERREDSETTINGS (EAXFLANGER_NONE | \
                                           EAXFLANGER_IMMEDIATE)

// used by EAXFLANGER_WAVEFORM
enum
{
    EAX_FLANGER_SINUSOID,
    EAX_FLANGER_TRIANGLE
};

// Use this structure for EAXFLANGER_ALLPARAMETERS
typedef struct _EAXFLANGERPROPERTIES
{
    unsigned long   ulWaveform;  // Waveform selector - see enum above
    long            lPhase;     // Phase (Degrees)
    float           flRate;     // Rate (Hz)
    float           flDepth;    // Depth (0 to 1)
    float           flFeedback; // Feedback (0 to 1)
    float           flDelay;    // Delay (seconds)
} EAXFLANGERPROPERTIES, *LPEAXFLANGERPROPERTIES;

// Property ranges and defaults:

#define EAXFLANGER_MINWAVEFORM              0
#define EAXFLANGER_MAXWAVEFORM              1
#define EAXFLANGER_DEFAULTWAVEFORM          1

#define EAXFLANGER_MINPHASE             (-180)
#define EAXFLANGER_MAXPHASE             180
#define EAXFLANGER_DEFAULTPHASE         0

#define EAXFLANGER_MINRATE              0.0f
#define EAXFLANGER_MAXRATE              10.0f
#define EAXFLANGER_DEFAULTRATE          0.27f

#define EAXFLANGER_MINDEPTH             0.0f
#define EAXFLANGER_MAXDEPTH             1.0f
#define EAXFLANGER_DEFAULTDEPTH         1.0f

#define EAXFLANGER_MINFEEDBACK          (-1.0f)
#define EAXFLANGER_MAXFEEDBACK          1.0f
#define EAXFLANGER_DEFAULTFEEDBACK      (-0.5f)

#define EAXFLANGER_MINDELAY             0.0f
#define EAXFLANGER_MAXDELAY             0.004f
#define EAXFLANGER_DEFAULTDELAY         0.002f

////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////
// Frequency Shifter Effect

// EAX FREQUENCY SHIFTER {DC3E1880-9212-11D3-939D-C0F02DD6F0}

DEFINE_GUID(EAX_FREQUENCYSHIFTER_EFFECT,
    0xdc3e1880,
    0x9212,
    0x11d3,
    0x93, 0x9d, 0x0, 0xc0, 0xf0, 0x2d, 0xd6, 0xf0);

// Frequency Shifter properties
typedef enum
{
    EAXFREQUENCYSHIFTER_NONE,
    EAXFREQUENCYSHIFTER_ALLPARAMETERS,
    EAXFREQUENCYSHIFTER_FREQUENCY,
    EAXFREQUENCYSHIFTER_LEFTDIRECTION,
    EAXFREQUENCYSHIFTER_RIGHTDIRECTION
} EAXFREQUENCYSHIFTER_PROPERTY;

// OR these flags with property id
#define EAXFREQUENCYSHIFTER_IMMEDIATE 0x00000000 // changes take effect immediately
#define EAXFREQUENCYSHIFTER_DEFERRED  0x80000000 // changes take effect later
#define EAXFREQUENCYSHIFTER_COMMITDEFERREDSETTINGS (EAXFREQUENCYSHIFTER_NONE | \
                                                    EAXFREQUENCYSHIFTER_IMMEDIATE)

// used by EAXFREQUENCYSHIFTER_LEFTDIRECTION and EAXFREQUENCYSHIFTER_RIGHTDIRECTION
enum
{
    EAX_FREQUENCYSHIFTER_DOWN,
    EAX_FREQUENCYSHIFTER_UP,
    EAX_FREQUENCYSHIFTER_OFF
};

// Use this structure for EAXFREQUENCYSHIFTER_ALLPARAMETERS
typedef struct _EAXFREQUENCYSHIFTERPROPERTIES
{
    float           flFrequency;        // (Hz)
    unsigned long   ulLeftDirection;     // see enum above
    unsigned long   ulRightDirection;    // see enum above
} EAXFREQUENCYSHIFTERPROPERTIES, *LPEAXFREQUENCYSHIFTERPROPERTIES;

// Property ranges and defaults:

#define EAXFREQUENCYSHIFTER_MINFREQUENCY            0.0f
#define EAXFREQUENCYSHIFTER_MAXFREQUENCY            24000.0f
#define EAXFREQUENCYSHIFTER_DEFAULTFREQUENCY        0.0f

#define EAXFREQUENCYSHIFTER_MINLEFTDIRECTION        0
#define EAXFREQUENCYSHIFTER_MAXLEFTDIRECTION        2
#define EAXFREQUENCYSHIFTER_DEFAULTLEFTDIRECTION    0

#define EAXFREQUENCYSHIFTER_MINRIGHTDIRECTION       0
#define EAXFREQUENCYSHIFTER_MAXRIGHTDIRECTION       2
#define EAXFREQUENCYSHIFTER_DEFAULTRIGHTDIRECTION   0

////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////
// Vocal Morpher Effect

// EAX VOCAL MORPHER {E41CF10C-3383-11D2-88DD-A024D13CE1}

DEFINE_GUID(EAX_VOCALMORPHER_EFFECT,
    0xe41cf10c,
    0x3383,
    0x11d2,
    0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1);

// Vocal Morpher properties
typedef enum
{
    EAXVOCALMORPHER_NONE,
    EAXVOCALMORPHER_ALLPARAMETERS,
    EAXVOCALMORPHER_PHONEMEA,
    EAXVOCALMORPHER_PHONEMEACOARSETUNING,
    EAXVOCALMORPHER_PHONEMEB,
    EAXVOCALMORPHER_PHONEMEBCOARSETUNING,
    EAXVOCALMORPHER_WAVEFORM,
    EAXVOCALMORPHER_RATE
} EAXVOCALMORPHER_PROPERTY;

// OR these flags with property id
#define EAXVOCALMORPHER_IMMEDIATE 0x00000000 // changes take effect immediately
#define EAXVOCALMORPHER_DEFERRED  0x80000000 // changes take effect later
#define EAXVOCALMORPHER_COMMITDEFERREDSETTINGS (EAXVOCALMORPHER_NONE | \
                                                EAXVOCALMORPHER_IMMEDIATE)

// used by EAXVOCALMORPHER_PHONEMEA and EAXVOCALMORPHER_PHONEMEB
enum
{
    A, E, I, O, U, AA, AE, AH, AO, EH, ER, IH, IY, UH, UW, B, D, F, G,
    J, K, L, M, N, P, R, S, T, V, Z
};

// used by EAXVOCALMORPHER_WAVEFORM
enum
{
    EAX_VOCALMORPHER_SINUSOID,
    EAX_VOCALMORPHER_TRIANGLE,
    EAX_VOCALMORPHER_SAWTOOTH
};

// Use this structure for EAXVOCALMORPHER_ALLPARAMETERS
typedef struct _EAXVOCALMORPHERPROPERTIES
{
    unsigned long   ulPhonemeA;              // see enum above
    long            lPhonemeACoarseTuning;  // (semitones)
    unsigned long   ulPhonemeB;              // see enum above
    long            lPhonemeBCoarseTuning;  // (semitones)
    unsigned long   ulWaveform;              // Waveform selector - see enum above
    float           flRate;                 // (Hz)
} EAXVOCALMORPHERPROPERTIES, *LPEAXVOCALMORPHERPROPERTIES;

// Property ranges and defaults:

#define EAXVOCALMORPHER_MINPHONEMEA                 0
#define EAXVOCALMORPHER_MAXPHONEMEA                 29
#define EAXVOCALMORPHER_DEFAULTPHONEMEA             0

#define EAXVOCALMORPHER_MINPHONEMEACOARSETUNING     (-24)
#define EAXVOCALMORPHER_MAXPHONEMEACOARSETUNING     24
#define EAXVOCALMORPHER_DEFAULTPHONEMEACOARSETUNING 0

#define EAXVOCALMORPHER_MINPHONEMEB                 0
#define EAXVOCALMORPHER_MAXPHONEMEB                 29
#define EAXVOCALMORPHER_DEFAULTPHONEMEB             10

#define EAXVOCALMORPHER_MINPHONEMEBCOARSETUNING     (-24)
#define EAXVOCALMORPHER_MAXPHONEMEBCOARSETUNING     24
#define EAXVOCALMORPHER_DEFAULTPHONEMEBCOARSETUNING 0

#define EAXVOCALMORPHER_MINWAVEFORM                 0
#define EAXVOCALMORPHER_MAXWAVEFORM                 2
#define EAXVOCALMORPHER_DEFAULTWAVEFORM             0

#define EAXVOCALMORPHER_MINRATE                     0.0f
#define EAXVOCALMORPHER_MAXRATE                     10.0f
#define EAXVOCALMORPHER_DEFAULTRATE                 1.41f

////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////
// Pitch Shifter Effect

// EAX PITCH SHIFTER {E7905100-AFB2-11D2-88DD-A024D13CE1}

DEFINE_GUID(EAX_PITCHSHIFTER_EFFECT,
    0xe7905100,
    0xafb2,
    0x11d2,
    0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1);

// Pitch Shifter properties
typedef enum
{
    EAXPITCHSHIFTER_NONE,
    EAXPITCHSHIFTER_ALLPARAMETERS,
    EAXPITCHSHIFTER_COARSETUNE,
    EAXPITCHSHIFTER_FINETUNE
} EAXPITCHSHIFTER_PROPERTY;

// OR these flags with property id
#define EAXPITCHSHIFTER_IMMEDIATE 0x00000000 // changes take effect immediately
#define EAXPITCHSHIFTER_DEFERRED  0x80000000 // changes take effect later
#define EAXPITCHSHIFTER_COMMITDEFERREDSETTINGS (EAXPITCHSHIFTER_NONE | \
                                                EAXPITCHSHIFTER_IMMEDIATE)

// Use this structure for EAXPITCHSHIFTER_ALLPARAMETERS
typedef struct _EAXPITCHSHIFTERPROPERTIES
{
    long    lCoarseTune;    // Amount of pitch shift (semitones)
    long    lFineTune;      // Amount of pitch shift (cents)
} EAXPITCHSHIFTERPROPERTIES, *LPEAXPITCHSHIFTERPROPERTIES;

// Property ranges and defaults:

#define EAXPITCHSHIFTER_MINCOARSETUNE       (-12)
#define EAXPITCHSHIFTER_MAXCOARSETUNE       12
#define EAXPITCHSHIFTER_DEFAULTCOARSETUNE   12

#define EAXPITCHSHIFTER_MINFINETUNE         (-50)
#define EAXPITCHSHIFTER_MAXFINETUNE         50
#define EAXPITCHSHIFTER_DEFAULTFINETUNE     0

////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////
// Ring Modulator Effect

// EAX RING MODULATOR {B89FE60-AFB5-11D2-88DD-A024D13CE1}

DEFINE_GUID(EAX_RINGMODULATOR_EFFECT,
    0xb89fe60,
    0xafb5,
    0x11d2,
    0x88, 0xdd, 0x0, 0xa0, 0x24, 0xd1, 0x3c, 0xe1);

// Ring Modulator properties
typedef enum
{
    EAXRINGMODULATOR_NONE,
    EAXRINGMODULATOR_ALLPARAMETERS,
    EAXRINGMODULATOR_FREQUENCY,
    EAXRINGMODULATOR_HIGHPASSCUTOFF,
    EAXRINGMODULATOR_WAVEFORM
} EAXRINGMODULATOR_PROPERTY;

// OR these flags with property id
#define EAXRINGMODULATOR_IMMEDIATE 0x00000000 // changes take effect immediately
#define EAXRINGMODULATOR_DEFERRED  0x80000000 // changes take effect later
#define EAXRINGMODULATOR_COMMITDEFERREDSETTINGS (EAXRINGMODULATOR_NONE | \
                                                 EAXRINGMODULATOR_IMMEDIATE)

// used by EAXRINGMODULATOR_WAVEFORM
enum
{
    EAX_RINGMODULATOR_SINUSOID,
    EAX_RINGMODULATOR_SAWTOOTH,
    EAX_RINGMODULATOR_SQUARE
};

// Use this structure for EAXRINGMODULATOR_ALLPARAMETERS
typedef struct _EAXRINGMODULATORPROPERTIES
{
    float           flFrequency;        // Frequency of modulation (Hz)
    float           flHighPassCutOff;   // Cut-off frequency of high-pass filter (Hz)
    unsigned long   ulWaveform;          // Waveform selector - see enum above
} EAXRINGMODULATORPROPERTIES, *LPEAXRINGMODULATORPROPERTIES;

// Property ranges and defaults:

#define EAXRINGMODULATOR_MINFREQUENCY           0.0f
#define EAXRINGMODULATOR_MAXFREQUENCY           8000.0f
#define EAXRINGMODULATOR_DEFAULTFREQUENCY       440.0f

#define EAXRINGMODULATOR_MINHIGHPASSCUTOFF      0.0f
#define EAXRINGMODULATOR_MAXHIGHPASSCUTOFF      24000.0f
#define EAXRINGMODULATOR_DEFAULTHIGHPASSCUTOFF  800.0f

#define EAXRINGMODULATOR_MINWAVEFORM            0
#define EAXRINGMODULATOR_MAXWAVEFORM            2
#define EAXRINGMODULATOR_DEFAULTWAVEFORM        0

////////////////////////////////////////////////////////////////////////////

#pragma pack(pop)

#ifdef __cplusplus
}
#endif // __cplusplus

#endif
