]> git.tdb.fi Git - ext/openal.git/blob - al/eax/api.h
Import OpenAL Soft 1.23.1 sources
[ext/openal.git] / al / eax / api.h
1 #ifndef EAX_API_INCLUDED
2 #define EAX_API_INCLUDED
3
4
5 //
6 // EAX API.
7 //
8 // Based on headers `eax[2-5].h` included in Doom 3 source code:
9 // https://github.com/id-Software/DOOM-3/tree/master/neo/openal/include
10 //
11
12
13 #include <cfloat>
14 #include <cstdint>
15 #include <cstring>
16
17 #include <array>
18
19 #include "AL/al.h"
20
21
22 #ifndef GUID_DEFINED
23 #define GUID_DEFINED
24 typedef struct _GUID {
25     std::uint32_t Data1;
26     std::uint16_t Data2;
27     std::uint16_t Data3;
28     std::uint8_t Data4[8];
29 } GUID;
30
31 #ifndef _SYS_GUID_OPERATOR_EQ_
32 #define _SYS_GUID_OPERATOR_EQ_
33 inline bool operator==(const GUID& lhs, const GUID& rhs) noexcept
34 { return std::memcmp(&lhs, &rhs, sizeof(GUID)) == 0; }
35
36 inline bool operator!=(const GUID& lhs, const GUID& rhs) noexcept
37 { return !(lhs == rhs); }
38 #endif  // _SYS_GUID_OPERATOR_EQ_
39 #endif // GUID_DEFINED
40
41
42 extern const GUID DSPROPSETID_EAX_ReverbProperties;
43
44 enum DSPROPERTY_EAX_REVERBPROPERTY : unsigned int {
45     DSPROPERTY_EAX_ALL,
46     DSPROPERTY_EAX_ENVIRONMENT,
47     DSPROPERTY_EAX_VOLUME,
48     DSPROPERTY_EAX_DECAYTIME,
49     DSPROPERTY_EAX_DAMPING,
50 }; // DSPROPERTY_EAX_REVERBPROPERTY
51
52 struct EAX_REVERBPROPERTIES {
53     unsigned long environment;
54     float fVolume;
55     float fDecayTime_sec;
56     float fDamping;
57 }; // EAX_REVERBPROPERTIES
58
59
60 extern const GUID DSPROPSETID_EAXBUFFER_ReverbProperties;
61
62 enum DSPROPERTY_EAXBUFFER_REVERBPROPERTY : unsigned int {
63     DSPROPERTY_EAXBUFFER_ALL,
64     DSPROPERTY_EAXBUFFER_REVERBMIX,
65 }; // DSPROPERTY_EAXBUFFER_REVERBPROPERTY
66
67 struct EAXBUFFER_REVERBPROPERTIES {
68     float fMix;
69 };
70
71 constexpr auto EAX_BUFFER_MINREVERBMIX = 0.0F;
72 constexpr auto EAX_BUFFER_MAXREVERBMIX = 1.0F;
73 constexpr auto EAX_REVERBMIX_USEDISTANCE = -1.0F;
74
75
76 extern const GUID DSPROPSETID_EAX20_ListenerProperties;
77
78 enum DSPROPERTY_EAX20_LISTENERPROPERTY : unsigned int {
79     DSPROPERTY_EAX20LISTENER_NONE,
80     DSPROPERTY_EAX20LISTENER_ALLPARAMETERS,
81     DSPROPERTY_EAX20LISTENER_ROOM,
82     DSPROPERTY_EAX20LISTENER_ROOMHF,
83     DSPROPERTY_EAX20LISTENER_ROOMROLLOFFFACTOR,
84     DSPROPERTY_EAX20LISTENER_DECAYTIME,
85     DSPROPERTY_EAX20LISTENER_DECAYHFRATIO,
86     DSPROPERTY_EAX20LISTENER_REFLECTIONS,
87     DSPROPERTY_EAX20LISTENER_REFLECTIONSDELAY,
88     DSPROPERTY_EAX20LISTENER_REVERB,
89     DSPROPERTY_EAX20LISTENER_REVERBDELAY,
90     DSPROPERTY_EAX20LISTENER_ENVIRONMENT,
91     DSPROPERTY_EAX20LISTENER_ENVIRONMENTSIZE,
92     DSPROPERTY_EAX20LISTENER_ENVIRONMENTDIFFUSION,
93     DSPROPERTY_EAX20LISTENER_AIRABSORPTIONHF,
94     DSPROPERTY_EAX20LISTENER_FLAGS
95 }; // DSPROPERTY_EAX20_LISTENERPROPERTY
96
97 struct EAX20LISTENERPROPERTIES {
98     long lRoom; // room effect level at low frequencies
99     long lRoomHF; // room effect high-frequency level re. low frequency level
100     float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect
101     float flDecayTime; // reverberation decay time at low frequencies
102     float flDecayHFRatio; // high-frequency to low-frequency decay time ratio
103     long lReflections; // early reflections level relative to room effect
104     float flReflectionsDelay; // initial reflection delay time
105     long lReverb; // late reverberation level relative to room effect
106     float flReverbDelay; // late reverberation delay time relative to initial reflection
107     unsigned long dwEnvironment; // sets all listener properties
108     float flEnvironmentSize; // environment size in meters
109     float flEnvironmentDiffusion; // environment diffusion
110     float flAirAbsorptionHF; // change in level per meter at 5 kHz
111     unsigned long dwFlags; // modifies the behavior of properties
112 }; // EAX20LISTENERPROPERTIES
113
114 enum : unsigned long {
115     EAX2_ENVIRONMENT_GENERIC,
116     EAX2_ENVIRONMENT_PADDEDCELL,
117     EAX2_ENVIRONMENT_ROOM,
118     EAX2_ENVIRONMENT_BATHROOM,
119     EAX2_ENVIRONMENT_LIVINGROOM,
120     EAX2_ENVIRONMENT_STONEROOM,
121     EAX2_ENVIRONMENT_AUDITORIUM,
122     EAX2_ENVIRONMENT_CONCERTHALL,
123     EAX2_ENVIRONMENT_CAVE,
124     EAX2_ENVIRONMENT_ARENA,
125     EAX2_ENVIRONMENT_HANGAR,
126     EAX2_ENVIRONMENT_CARPETEDHALLWAY,
127     EAX2_ENVIRONMENT_HALLWAY,
128     EAX2_ENVIRONMENT_STONECORRIDOR,
129     EAX2_ENVIRONMENT_ALLEY,
130     EAX2_ENVIRONMENT_FOREST,
131     EAX2_ENVIRONMENT_CITY,
132     EAX2_ENVIRONMENT_MOUNTAINS,
133     EAX2_ENVIRONMENT_QUARRY,
134     EAX2_ENVIRONMENT_PLAIN,
135     EAX2_ENVIRONMENT_PARKINGLOT,
136     EAX2_ENVIRONMENT_SEWERPIPE,
137     EAX2_ENVIRONMENT_UNDERWATER,
138     EAX2_ENVIRONMENT_DRUGGED,
139     EAX2_ENVIRONMENT_DIZZY,
140     EAX2_ENVIRONMENT_PSYCHOTIC,
141
142     EAX2_ENVIRONMENT_COUNT,
143 };
144
145 constexpr auto EAX2LISTENERFLAGS_DECAYTIMESCALE = 0x00000001UL;
146 constexpr auto EAX2LISTENERFLAGS_REFLECTIONSSCALE = 0x00000002UL;
147 constexpr auto EAX2LISTENERFLAGS_REFLECTIONSDELAYSCALE = 0x00000004UL;
148 constexpr auto EAX2LISTENERFLAGS_REVERBSCALE = 0x00000008UL;
149 constexpr auto EAX2LISTENERFLAGS_REVERBDELAYSCALE = 0x00000010UL;
150 constexpr auto EAX2LISTENERFLAGS_DECAYHFLIMIT = 0x00000020UL;
151 constexpr auto EAX2LISTENERFLAGS_RESERVED = 0xFFFFFFC0UL;
152
153 constexpr auto EAX2LISTENER_MINROOM = -10'000L;
154 constexpr auto EAX2LISTENER_MAXROOM = 0L;
155 constexpr auto EAX2LISTENER_DEFAULTROOM = -1'000L;
156
157 constexpr auto EAX2LISTENER_MINROOMHF = -10'000L;
158 constexpr auto EAX2LISTENER_MAXROOMHF = 0L;
159 constexpr auto EAX2LISTENER_DEFAULTROOMHF = -100L;
160
161 constexpr auto EAX2LISTENER_MINROOMROLLOFFFACTOR = 0.0F;
162 constexpr auto EAX2LISTENER_MAXROOMROLLOFFFACTOR = 10.0F;
163 constexpr auto EAX2LISTENER_DEFAULTROOMROLLOFFFACTOR = 0.0F;
164
165 constexpr auto EAX2LISTENER_MINDECAYTIME = 0.1F;
166 constexpr auto EAX2LISTENER_MAXDECAYTIME = 20.0F;
167 constexpr auto EAX2LISTENER_DEFAULTDECAYTIME = 1.49F;
168
169 constexpr auto EAX2LISTENER_MINDECAYHFRATIO = 0.1F;
170 constexpr auto EAX2LISTENER_MAXDECAYHFRATIO = 2.0F;
171 constexpr auto EAX2LISTENER_DEFAULTDECAYHFRATIO = 0.83F;
172
173 constexpr auto EAX2LISTENER_MINREFLECTIONS = -10'000L;
174 constexpr auto EAX2LISTENER_MAXREFLECTIONS = 1'000L;
175 constexpr auto EAX2LISTENER_DEFAULTREFLECTIONS = -2'602L;
176
177 constexpr auto EAX2LISTENER_MINREFLECTIONSDELAY = 0.0F;
178 constexpr auto EAX2LISTENER_MAXREFLECTIONSDELAY = 0.3F;
179 constexpr auto EAX2LISTENER_DEFAULTREFLECTIONSDELAY = 0.007F;
180
181 constexpr auto EAX2LISTENER_MINREVERB = -10'000L;
182 constexpr auto EAX2LISTENER_MAXREVERB = 2'000L;
183 constexpr auto EAX2LISTENER_DEFAULTREVERB = 200L;
184
185 constexpr auto EAX2LISTENER_MINREVERBDELAY = 0.0F;
186 constexpr auto EAX2LISTENER_MAXREVERBDELAY = 0.1F;
187 constexpr auto EAX2LISTENER_DEFAULTREVERBDELAY = 0.011F;
188
189 constexpr auto EAX2LISTENER_MINENVIRONMENT = 0UL;
190 constexpr auto EAX2LISTENER_MAXENVIRONMENT = EAX2_ENVIRONMENT_COUNT - 1;
191 constexpr auto EAX2LISTENER_DEFAULTENVIRONMENT = EAX2_ENVIRONMENT_GENERIC;
192
193 constexpr auto EAX2LISTENER_MINENVIRONMENTSIZE = 1.0F;
194 constexpr auto EAX2LISTENER_MAXENVIRONMENTSIZE = 100.0F;
195 constexpr auto EAX2LISTENER_DEFAULTENVIRONMENTSIZE = 7.5F;
196
197 constexpr auto EAX2LISTENER_MINENVIRONMENTDIFFUSION = 0.0F;
198 constexpr auto EAX2LISTENER_MAXENVIRONMENTDIFFUSION = 1.0F;
199 constexpr auto EAX2LISTENER_DEFAULTENVIRONMENTDIFFUSION = 1.0F;
200
201 constexpr auto EAX2LISTENER_MINAIRABSORPTIONHF = -100.0F;
202 constexpr auto EAX2LISTENER_MAXAIRABSORPTIONHF = 0.0F;
203 constexpr auto EAX2LISTENER_DEFAULTAIRABSORPTIONHF = -5.0F;
204
205 constexpr auto EAX2LISTENER_DEFAULTFLAGS =
206     EAX2LISTENERFLAGS_DECAYTIMESCALE |
207     EAX2LISTENERFLAGS_REFLECTIONSSCALE |
208     EAX2LISTENERFLAGS_REFLECTIONSDELAYSCALE |
209     EAX2LISTENERFLAGS_REVERBSCALE |
210     EAX2LISTENERFLAGS_REVERBDELAYSCALE |
211     EAX2LISTENERFLAGS_DECAYHFLIMIT;
212
213
214 extern const GUID DSPROPSETID_EAX20_BufferProperties;
215
216 enum DSPROPERTY_EAX20_BUFFERPROPERTY : unsigned int {
217     DSPROPERTY_EAX20BUFFER_NONE,
218     DSPROPERTY_EAX20BUFFER_ALLPARAMETERS,
219     DSPROPERTY_EAX20BUFFER_DIRECT,
220     DSPROPERTY_EAX20BUFFER_DIRECTHF,
221     DSPROPERTY_EAX20BUFFER_ROOM,
222     DSPROPERTY_EAX20BUFFER_ROOMHF,
223     DSPROPERTY_EAX20BUFFER_ROOMROLLOFFFACTOR,
224     DSPROPERTY_EAX20BUFFER_OBSTRUCTION,
225     DSPROPERTY_EAX20BUFFER_OBSTRUCTIONLFRATIO,
226     DSPROPERTY_EAX20BUFFER_OCCLUSION,
227     DSPROPERTY_EAX20BUFFER_OCCLUSIONLFRATIO,
228     DSPROPERTY_EAX20BUFFER_OCCLUSIONROOMRATIO,
229     DSPROPERTY_EAX20BUFFER_OUTSIDEVOLUMEHF,
230     DSPROPERTY_EAX20BUFFER_AIRABSORPTIONFACTOR,
231     DSPROPERTY_EAX20BUFFER_FLAGS
232 }; // DSPROPERTY_EAX20_BUFFERPROPERTY
233
234 struct EAX20BUFFERPROPERTIES {
235     long lDirect; // direct path level
236     long lDirectHF; // direct path level at high frequencies
237     long lRoom; // room effect level
238     long lRoomHF; // room effect level at high frequencies
239     float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect
240     long lObstruction; // main obstruction control (attenuation at high frequencies) 
241     float flObstructionLFRatio; // obstruction low-frequency level re. main control
242     long lOcclusion; // main occlusion control (attenuation at high frequencies)
243     float flOcclusionLFRatio; // occlusion low-frequency level re. main control
244     float flOcclusionRoomRatio; // occlusion room effect level re. main control
245     long lOutsideVolumeHF; // outside sound cone level at high frequencies
246     float flAirAbsorptionFactor; // multiplies DSPROPERTY_EAXLISTENER_AIRABSORPTIONHF
247     unsigned long dwFlags; // modifies the behavior of properties
248 }; // EAX20BUFFERPROPERTIES
249
250 extern const GUID DSPROPSETID_EAX30_ListenerProperties;
251
252 extern const GUID DSPROPSETID_EAX30_BufferProperties;
253
254
255 constexpr auto EAX_MAX_FXSLOTS = 4;
256
257 constexpr auto EAX40_MAX_ACTIVE_FXSLOTS = 2;
258 constexpr auto EAX50_MAX_ACTIVE_FXSLOTS = 4;
259
260
261 constexpr auto EAX_OK = 0L;
262 constexpr auto EAXERR_INVALID_OPERATION = -1L;
263 constexpr auto EAXERR_INVALID_VALUE = -2L;
264 constexpr auto EAXERR_NO_EFFECT_LOADED = -3L;
265 constexpr auto EAXERR_UNKNOWN_EFFECT = -4L;
266 constexpr auto EAXERR_INCOMPATIBLE_SOURCE_TYPE = -5L;
267 constexpr auto EAXERR_INCOMPATIBLE_EAX_VERSION = -6L;
268
269
270 extern const GUID EAX_NULL_GUID;
271
272 extern const GUID EAX_PrimaryFXSlotID;
273
274
275 struct EAXVECTOR {
276     float x;
277     float y;
278     float z;
279 }; // EAXVECTOR
280
281 inline bool operator==(const EAXVECTOR& lhs, const EAXVECTOR& rhs) noexcept
282 { return std::memcmp(&lhs, &rhs, sizeof(EAXVECTOR)) == 0; }
283
284 inline bool operator!=(const EAXVECTOR& lhs, const EAXVECTOR& rhs) noexcept
285 { return !(lhs == rhs); }
286
287
288 extern const GUID EAXPROPERTYID_EAX40_Context;
289
290 extern const GUID EAXPROPERTYID_EAX50_Context;
291
292 // EAX50
293 constexpr auto HEADPHONES = 0UL;
294 constexpr auto SPEAKERS_2 = 1UL;
295 constexpr auto SPEAKERS_4 = 2UL;
296 constexpr auto SPEAKERS_5 = 3UL; // 5.1 speakers
297 constexpr auto SPEAKERS_6 = 4UL; // 6.1 speakers
298 constexpr auto SPEAKERS_7 = 5UL; // 7.1 speakers
299
300 constexpr auto EAXCONTEXT_MINSPEAKERCONFIG = HEADPHONES;
301 constexpr auto EAXCONTEXT_MAXSPEAKERCONFIG = SPEAKERS_7;
302
303 // EAX50
304 constexpr auto EAX_40 = 5UL; // EAX 4.0
305 constexpr auto EAX_50 = 6UL; // EAX 5.0
306
307 constexpr auto EAXCONTEXT_MINEAXSESSION = EAX_40;
308 constexpr auto EAXCONTEXT_MAXEAXSESSION = EAX_50;
309 constexpr auto EAXCONTEXT_DEFAULTEAXSESSION = EAX_40;
310
311 constexpr auto EAXCONTEXT_MINMAXACTIVESENDS = 2UL;
312 constexpr auto EAXCONTEXT_MAXMAXACTIVESENDS = 4UL;
313 constexpr auto EAXCONTEXT_DEFAULTMAXACTIVESENDS = 2UL;
314
315 // EAX50
316 struct EAXSESSIONPROPERTIES {
317     unsigned long ulEAXVersion;
318     unsigned long ulMaxActiveSends;
319 }; // EAXSESSIONPROPERTIES
320
321 enum EAXCONTEXT_PROPERTY : unsigned int {
322     EAXCONTEXT_NONE = 0,
323     EAXCONTEXT_ALLPARAMETERS,
324     EAXCONTEXT_PRIMARYFXSLOTID,
325     EAXCONTEXT_DISTANCEFACTOR,
326     EAXCONTEXT_AIRABSORPTIONHF,
327     EAXCONTEXT_HFREFERENCE,
328     EAXCONTEXT_LASTERROR,
329
330     // EAX50
331     EAXCONTEXT_SPEAKERCONFIG,
332     EAXCONTEXT_EAXSESSION,
333     EAXCONTEXT_MACROFXFACTOR,
334 }; // EAXCONTEXT_PROPERTY
335
336 struct EAX40CONTEXTPROPERTIES {
337     GUID guidPrimaryFXSlotID;
338     float flDistanceFactor;
339     float flAirAbsorptionHF;
340     float flHFReference;
341 }; // EAX40CONTEXTPROPERTIES
342
343 struct EAX50CONTEXTPROPERTIES : public EAX40CONTEXTPROPERTIES {
344     float flMacroFXFactor;
345 }; // EAX50CONTEXTPROPERTIES
346
347
348 constexpr auto EAXCONTEXT_MINDISTANCEFACTOR = FLT_MIN;
349 constexpr auto EAXCONTEXT_MAXDISTANCEFACTOR = FLT_MAX;
350 constexpr auto EAXCONTEXT_DEFAULTDISTANCEFACTOR = 1.0F;
351
352 constexpr auto EAXCONTEXT_MINAIRABSORPTIONHF = -100.0F;
353 constexpr auto EAXCONTEXT_MAXAIRABSORPTIONHF = 0.0F;
354 constexpr auto EAXCONTEXT_DEFAULTAIRABSORPTIONHF = -5.0F;
355
356 constexpr auto EAXCONTEXT_MINHFREFERENCE = 1000.0F;
357 constexpr auto EAXCONTEXT_MAXHFREFERENCE = 20000.0F;
358 constexpr auto EAXCONTEXT_DEFAULTHFREFERENCE = 5000.0F;
359
360 constexpr auto EAXCONTEXT_MINMACROFXFACTOR = 0.0F;
361 constexpr auto EAXCONTEXT_MAXMACROFXFACTOR = 1.0F;
362 constexpr auto EAXCONTEXT_DEFAULTMACROFXFACTOR = 0.0F;
363
364
365 extern const GUID EAXPROPERTYID_EAX40_FXSlot0;
366 extern const GUID EAXPROPERTYID_EAX50_FXSlot0;
367 extern const GUID EAXPROPERTYID_EAX40_FXSlot1;
368 extern const GUID EAXPROPERTYID_EAX50_FXSlot1;
369 extern const GUID EAXPROPERTYID_EAX40_FXSlot2;
370 extern const GUID EAXPROPERTYID_EAX50_FXSlot2;
371 extern const GUID EAXPROPERTYID_EAX40_FXSlot3;
372 extern const GUID EAXPROPERTYID_EAX50_FXSlot3;
373
374 extern const GUID EAX40CONTEXT_DEFAULTPRIMARYFXSLOTID;
375 extern const GUID EAX50CONTEXT_DEFAULTPRIMARYFXSLOTID;
376
377 enum EAXFXSLOT_PROPERTY : unsigned int {
378     EAXFXSLOT_PARAMETER = 0,
379
380     EAXFXSLOT_NONE = 0x10000,
381     EAXFXSLOT_ALLPARAMETERS,
382     EAXFXSLOT_LOADEFFECT,
383     EAXFXSLOT_VOLUME,
384     EAXFXSLOT_LOCK,
385     EAXFXSLOT_FLAGS,
386
387     // EAX50
388     EAXFXSLOT_OCCLUSION,
389     EAXFXSLOT_OCCLUSIONLFRATIO,
390 }; // EAXFXSLOT_PROPERTY
391
392 constexpr auto EAXFXSLOTFLAGS_ENVIRONMENT = 0x00000001UL;
393 // EAX50
394 constexpr auto EAXFXSLOTFLAGS_UPMIX = 0x00000002UL;
395
396 constexpr auto EAX40FXSLOTFLAGS_RESERVED = 0xFFFFFFFEUL; // reserved future use
397 constexpr auto EAX50FXSLOTFLAGS_RESERVED = 0xFFFFFFFCUL; // reserved future use
398
399
400 constexpr auto EAXFXSLOT_MINVOLUME = -10'000L;
401 constexpr auto EAXFXSLOT_MAXVOLUME = 0L;
402 constexpr auto EAXFXSLOT_DEFAULTVOLUME = 0L;
403
404 constexpr auto EAXFXSLOT_MINLOCK = 0L;
405 constexpr auto EAXFXSLOT_MAXLOCK = 1L;
406
407 enum : long {
408     EAXFXSLOT_UNLOCKED = 0,
409     EAXFXSLOT_LOCKED = 1
410 };
411
412 constexpr auto EAXFXSLOT_MINOCCLUSION = -10'000L;
413 constexpr auto EAXFXSLOT_MAXOCCLUSION = 0L;
414 constexpr auto EAXFXSLOT_DEFAULTOCCLUSION = 0L;
415
416 constexpr auto EAXFXSLOT_MINOCCLUSIONLFRATIO = 0.0F;
417 constexpr auto EAXFXSLOT_MAXOCCLUSIONLFRATIO = 1.0F;
418 constexpr auto EAXFXSLOT_DEFAULTOCCLUSIONLFRATIO = 0.25F;
419
420 constexpr auto EAX40FXSLOT_DEFAULTFLAGS = EAXFXSLOTFLAGS_ENVIRONMENT;
421
422 constexpr auto EAX50FXSLOT_DEFAULTFLAGS =
423     EAXFXSLOTFLAGS_ENVIRONMENT |
424     EAXFXSLOTFLAGS_UPMIX; // ignored for reverb;
425
426 struct EAX40FXSLOTPROPERTIES {
427     GUID guidLoadEffect;
428     long lVolume;
429     long lLock;
430     unsigned long ulFlags;
431 }; // EAX40FXSLOTPROPERTIES
432
433 struct EAX50FXSLOTPROPERTIES : public EAX40FXSLOTPROPERTIES {
434     long lOcclusion;
435     float flOcclusionLFRatio;
436 }; // EAX50FXSLOTPROPERTIES
437
438 extern const GUID EAXPROPERTYID_EAX40_Source;
439 extern const GUID EAXPROPERTYID_EAX50_Source;
440
441 // Source object properties
442 enum EAXSOURCE_PROPERTY : unsigned int {
443     // EAX30
444     EAXSOURCE_NONE,
445     EAXSOURCE_ALLPARAMETERS,
446     EAXSOURCE_OBSTRUCTIONPARAMETERS,
447     EAXSOURCE_OCCLUSIONPARAMETERS,
448     EAXSOURCE_EXCLUSIONPARAMETERS,
449     EAXSOURCE_DIRECT,
450     EAXSOURCE_DIRECTHF,
451     EAXSOURCE_ROOM,
452     EAXSOURCE_ROOMHF,
453     EAXSOURCE_OBSTRUCTION,
454     EAXSOURCE_OBSTRUCTIONLFRATIO,
455     EAXSOURCE_OCCLUSION,
456     EAXSOURCE_OCCLUSIONLFRATIO,
457     EAXSOURCE_OCCLUSIONROOMRATIO,
458     EAXSOURCE_OCCLUSIONDIRECTRATIO,
459     EAXSOURCE_EXCLUSION,
460     EAXSOURCE_EXCLUSIONLFRATIO,
461     EAXSOURCE_OUTSIDEVOLUMEHF,
462     EAXSOURCE_DOPPLERFACTOR,
463     EAXSOURCE_ROLLOFFFACTOR,
464     EAXSOURCE_ROOMROLLOFFFACTOR,
465     EAXSOURCE_AIRABSORPTIONFACTOR,
466     EAXSOURCE_FLAGS,
467
468     // EAX40
469     EAXSOURCE_SENDPARAMETERS,
470     EAXSOURCE_ALLSENDPARAMETERS,
471     EAXSOURCE_OCCLUSIONSENDPARAMETERS,
472     EAXSOURCE_EXCLUSIONSENDPARAMETERS,
473     EAXSOURCE_ACTIVEFXSLOTID,
474
475     // EAX50
476     EAXSOURCE_MACROFXFACTOR,
477     EAXSOURCE_SPEAKERLEVELS,
478     EAXSOURCE_ALL2DPARAMETERS,
479 }; // EAXSOURCE_PROPERTY
480
481
482 constexpr auto EAXSOURCEFLAGS_DIRECTHFAUTO = 0x00000001UL; // relates to EAXSOURCE_DIRECTHF
483 constexpr auto EAXSOURCEFLAGS_ROOMAUTO = 0x00000002UL; // relates to EAXSOURCE_ROOM
484 constexpr auto EAXSOURCEFLAGS_ROOMHFAUTO = 0x00000004UL; // relates to EAXSOURCE_ROOMHF
485 // EAX50
486 constexpr auto EAXSOURCEFLAGS_3DELEVATIONFILTER = 0x00000008UL;
487 constexpr auto EAXSOURCEFLAGS_UPMIX = 0x00000010UL;
488 constexpr auto EAXSOURCEFLAGS_APPLYSPEAKERLEVELS = 0x00000020UL;
489
490 constexpr auto EAX20SOURCEFLAGS_RESERVED = 0xFFFFFFF8UL; // reserved future use
491 constexpr auto EAX50SOURCEFLAGS_RESERVED = 0xFFFFFFC0UL; // reserved future use
492
493
494 constexpr auto EAXSOURCE_MINSEND = -10'000L;
495 constexpr auto EAXSOURCE_MAXSEND = 0L;
496 constexpr auto EAXSOURCE_DEFAULTSEND = 0L;
497
498 constexpr auto EAXSOURCE_MINSENDHF = -10'000L;
499 constexpr auto EAXSOURCE_MAXSENDHF = 0L;
500 constexpr auto EAXSOURCE_DEFAULTSENDHF = 0L;
501
502 constexpr auto EAXSOURCE_MINDIRECT = -10'000L;
503 constexpr auto EAXSOURCE_MAXDIRECT = 1'000L;
504 constexpr auto EAXSOURCE_DEFAULTDIRECT = 0L;
505
506 constexpr auto EAXSOURCE_MINDIRECTHF = -10'000L;
507 constexpr auto EAXSOURCE_MAXDIRECTHF = 0L;
508 constexpr auto EAXSOURCE_DEFAULTDIRECTHF = 0L;
509
510 constexpr auto EAXSOURCE_MINROOM = -10'000L;
511 constexpr auto EAXSOURCE_MAXROOM = 1'000L;
512 constexpr auto EAXSOURCE_DEFAULTROOM = 0L;
513
514 constexpr auto EAXSOURCE_MINROOMHF = -10'000L;
515 constexpr auto EAXSOURCE_MAXROOMHF = 0L;
516 constexpr auto EAXSOURCE_DEFAULTROOMHF = 0L;
517
518 constexpr auto EAXSOURCE_MINOBSTRUCTION = -10'000L;
519 constexpr auto EAXSOURCE_MAXOBSTRUCTION = 0L;
520 constexpr auto EAXSOURCE_DEFAULTOBSTRUCTION = 0L;
521
522 constexpr auto EAXSOURCE_MINOBSTRUCTIONLFRATIO = 0.0F;
523 constexpr auto EAXSOURCE_MAXOBSTRUCTIONLFRATIO = 1.0F;
524 constexpr auto EAXSOURCE_DEFAULTOBSTRUCTIONLFRATIO = 0.0F;
525
526 constexpr auto EAXSOURCE_MINOCCLUSION = -10'000L;
527 constexpr auto EAXSOURCE_MAXOCCLUSION = 0L;
528 constexpr auto EAXSOURCE_DEFAULTOCCLUSION = 0L;
529
530 constexpr auto EAXSOURCE_MINOCCLUSIONLFRATIO = 0.0F;
531 constexpr auto EAXSOURCE_MAXOCCLUSIONLFRATIO = 1.0F;
532 constexpr auto EAXSOURCE_DEFAULTOCCLUSIONLFRATIO = 0.25F;
533
534 constexpr auto EAXSOURCE_MINOCCLUSIONROOMRATIO = 0.0F;
535 constexpr auto EAXSOURCE_MAXOCCLUSIONROOMRATIO = 10.0F;
536 constexpr auto EAXSOURCE_DEFAULTOCCLUSIONROOMRATIO = 1.5F;
537
538 constexpr auto EAXSOURCE_MINOCCLUSIONDIRECTRATIO = 0.0F;
539 constexpr auto EAXSOURCE_MAXOCCLUSIONDIRECTRATIO = 10.0F;
540 constexpr auto EAXSOURCE_DEFAULTOCCLUSIONDIRECTRATIO = 1.0F;
541
542 constexpr auto EAXSOURCE_MINEXCLUSION = -10'000L;
543 constexpr auto EAXSOURCE_MAXEXCLUSION = 0L;
544 constexpr auto EAXSOURCE_DEFAULTEXCLUSION = 0L;
545
546 constexpr auto EAXSOURCE_MINEXCLUSIONLFRATIO = 0.0F;
547 constexpr auto EAXSOURCE_MAXEXCLUSIONLFRATIO = 1.0F;
548 constexpr auto EAXSOURCE_DEFAULTEXCLUSIONLFRATIO = 1.0F;
549
550 constexpr auto EAXSOURCE_MINOUTSIDEVOLUMEHF = -10'000L;
551 constexpr auto EAXSOURCE_MAXOUTSIDEVOLUMEHF = 0L;
552 constexpr auto EAXSOURCE_DEFAULTOUTSIDEVOLUMEHF = 0L;
553
554 constexpr auto EAXSOURCE_MINDOPPLERFACTOR = 0.0F;
555 constexpr auto EAXSOURCE_MAXDOPPLERFACTOR = 10.0F;
556 constexpr auto EAXSOURCE_DEFAULTDOPPLERFACTOR = 1.0F;
557
558 constexpr auto EAXSOURCE_MINROLLOFFFACTOR = 0.0F;
559 constexpr auto EAXSOURCE_MAXROLLOFFFACTOR = 10.0F;
560 constexpr auto EAXSOURCE_DEFAULTROLLOFFFACTOR = 0.0F;
561
562 constexpr auto EAXSOURCE_MINROOMROLLOFFFACTOR = 0.0F;
563 constexpr auto EAXSOURCE_MAXROOMROLLOFFFACTOR = 10.0F;
564 constexpr auto EAXSOURCE_DEFAULTROOMROLLOFFFACTOR = 0.0F;
565
566 constexpr auto EAXSOURCE_MINAIRABSORPTIONFACTOR = 0.0F;
567 constexpr auto EAXSOURCE_MAXAIRABSORPTIONFACTOR = 10.0F;
568 constexpr auto EAXSOURCE_DEFAULTAIRABSORPTIONFACTOR = 0.0F;
569
570 // EAX50
571
572 constexpr auto EAXSOURCE_MINMACROFXFACTOR = 0.0F;
573 constexpr auto EAXSOURCE_MAXMACROFXFACTOR = 1.0F;
574 constexpr auto EAXSOURCE_DEFAULTMACROFXFACTOR = 1.0F;
575
576 constexpr auto EAXSOURCE_MINSPEAKERLEVEL = -10'000L;
577 constexpr auto EAXSOURCE_MAXSPEAKERLEVEL = 0L;
578 constexpr auto EAXSOURCE_DEFAULTSPEAKERLEVEL = -10'000L;
579
580 constexpr auto EAXSOURCE_DEFAULTFLAGS =
581     EAXSOURCEFLAGS_DIRECTHFAUTO |
582     EAXSOURCEFLAGS_ROOMAUTO |
583     EAXSOURCEFLAGS_ROOMHFAUTO;
584
585 enum : long {
586     EAXSPEAKER_FRONT_LEFT = 1,
587     EAXSPEAKER_FRONT_CENTER = 2,
588     EAXSPEAKER_FRONT_RIGHT = 3,
589     EAXSPEAKER_SIDE_RIGHT = 4,
590     EAXSPEAKER_REAR_RIGHT = 5,
591     EAXSPEAKER_REAR_CENTER = 6,
592     EAXSPEAKER_REAR_LEFT = 7,
593     EAXSPEAKER_SIDE_LEFT = 8,
594     EAXSPEAKER_LOW_FREQUENCY = 9
595 };
596
597 // EAXSOURCEFLAGS_DIRECTHFAUTO, EAXSOURCEFLAGS_ROOMAUTO and EAXSOURCEFLAGS_ROOMHFAUTO are ignored for 2D sources
598 // EAXSOURCEFLAGS_UPMIX is ignored for 3D sources
599 constexpr auto EAX50SOURCE_DEFAULTFLAGS =
600     EAXSOURCEFLAGS_DIRECTHFAUTO |
601     EAXSOURCEFLAGS_ROOMAUTO |
602     EAXSOURCEFLAGS_ROOMHFAUTO |
603     EAXSOURCEFLAGS_UPMIX;
604
605 struct EAX30SOURCEPROPERTIES {
606     long lDirect; // direct path level (at low and mid frequencies)
607     long lDirectHF; // relative direct path level at high frequencies
608     long lRoom; // room effect level (at low and mid frequencies)
609     long lRoomHF; // relative room effect level at high frequencies
610     long lObstruction; // main obstruction control (attenuation at high frequencies) 
611     float flObstructionLFRatio; // obstruction low-frequency level re. main control
612     long lOcclusion; // main occlusion control (attenuation at high frequencies)
613     float flOcclusionLFRatio; // occlusion low-frequency level re. main control
614     float flOcclusionRoomRatio; // relative occlusion control for room effect
615     float flOcclusionDirectRatio; // relative occlusion control for direct path
616     long lExclusion; // main exlusion control (attenuation at high frequencies)
617     float flExclusionLFRatio; // exclusion low-frequency level re. main control
618     long lOutsideVolumeHF; // outside sound cone level at high frequencies
619     float flDopplerFactor; // like DS3D flDopplerFactor but per source
620     float flRolloffFactor; // like DS3D flRolloffFactor but per source
621     float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect
622     float flAirAbsorptionFactor; // multiplies EAXREVERB_AIRABSORPTIONHF
623     unsigned long ulFlags; // modifies the behavior of properties
624 }; // EAX30SOURCEPROPERTIES
625
626 struct EAX50SOURCEPROPERTIES : public EAX30SOURCEPROPERTIES {
627     float flMacroFXFactor;
628 }; // EAX50SOURCEPROPERTIES
629
630 struct EAXSOURCEALLSENDPROPERTIES {
631     GUID guidReceivingFXSlotID;
632     long lSend; // send level (at low and mid frequencies)
633     long lSendHF; // relative send level at high frequencies
634     long lOcclusion;
635     float flOcclusionLFRatio;
636     float flOcclusionRoomRatio;
637     float flOcclusionDirectRatio;
638     long lExclusion;
639     float flExclusionLFRatio;
640 }; // EAXSOURCEALLSENDPROPERTIES
641
642 struct EAXSOURCE2DPROPERTIES {
643     long lDirect; // direct path level (at low and mid frequencies)
644     long lDirectHF; // relative direct path level at high frequencies
645     long lRoom; // room effect level (at low and mid frequencies)
646     long lRoomHF; // relative room effect level at high frequencies
647     unsigned long ulFlags; // modifies the behavior of properties
648 }; // EAXSOURCE2DPROPERTIES
649
650 struct EAXSPEAKERLEVELPROPERTIES {
651     long lSpeakerID;
652     long lLevel;
653 }; // EAXSPEAKERLEVELPROPERTIES
654
655 struct EAX40ACTIVEFXSLOTS {
656     GUID guidActiveFXSlots[EAX40_MAX_ACTIVE_FXSLOTS];
657 }; // EAX40ACTIVEFXSLOTS
658
659 struct EAX50ACTIVEFXSLOTS {
660     GUID guidActiveFXSlots[EAX50_MAX_ACTIVE_FXSLOTS];
661 }; // EAX50ACTIVEFXSLOTS
662
663 // Use this structure for EAXSOURCE_OBSTRUCTIONPARAMETERS property.
664 struct EAXOBSTRUCTIONPROPERTIES {
665     long lObstruction;
666     float flObstructionLFRatio;
667 }; // EAXOBSTRUCTIONPROPERTIES
668
669 // Use this structure for EAXSOURCE_OCCLUSIONPARAMETERS property.
670 struct EAXOCCLUSIONPROPERTIES {
671     long lOcclusion;
672     float flOcclusionLFRatio;
673     float flOcclusionRoomRatio;
674     float flOcclusionDirectRatio;
675 }; // EAXOCCLUSIONPROPERTIES
676
677 // Use this structure for EAXSOURCE_EXCLUSIONPARAMETERS property.
678 struct EAXEXCLUSIONPROPERTIES {
679     long lExclusion;
680     float flExclusionLFRatio;
681 }; // EAXEXCLUSIONPROPERTIES
682
683 // Use this structure for EAXSOURCE_SENDPARAMETERS properties.
684 struct EAXSOURCESENDPROPERTIES {
685     GUID guidReceivingFXSlotID;
686     long lSend;
687     long lSendHF;
688 }; // EAXSOURCESENDPROPERTIES
689
690 // Use this structure for EAXSOURCE_OCCLUSIONSENDPARAMETERS 
691 struct EAXSOURCEOCCLUSIONSENDPROPERTIES {
692     GUID guidReceivingFXSlotID;
693     long lOcclusion;
694     float flOcclusionLFRatio;
695     float flOcclusionRoomRatio;
696     float flOcclusionDirectRatio;
697 }; // EAXSOURCEOCCLUSIONSENDPROPERTIES
698
699 // Use this structure for EAXSOURCE_EXCLUSIONSENDPARAMETERS
700 struct EAXSOURCEEXCLUSIONSENDPROPERTIES {
701     GUID guidReceivingFXSlotID;
702     long lExclusion;
703     float flExclusionLFRatio;
704 }; // EAXSOURCEEXCLUSIONSENDPROPERTIES
705
706 extern const EAX40ACTIVEFXSLOTS EAX40SOURCE_DEFAULTACTIVEFXSLOTID;
707
708 extern const EAX50ACTIVEFXSLOTS EAX50SOURCE_3DDEFAULTACTIVEFXSLOTID;
709
710 extern const EAX50ACTIVEFXSLOTS EAX50SOURCE_2DDEFAULTACTIVEFXSLOTID;
711
712
713 // EAX Reverb Effect
714
715 extern const GUID EAX_REVERB_EFFECT;
716
717 // Reverb effect properties
718 enum EAXREVERB_PROPERTY : unsigned int {
719     EAXREVERB_NONE,
720     EAXREVERB_ALLPARAMETERS,
721     EAXREVERB_ENVIRONMENT,
722     EAXREVERB_ENVIRONMENTSIZE,
723     EAXREVERB_ENVIRONMENTDIFFUSION,
724     EAXREVERB_ROOM,
725     EAXREVERB_ROOMHF,
726     EAXREVERB_ROOMLF,
727     EAXREVERB_DECAYTIME,
728     EAXREVERB_DECAYHFRATIO,
729     EAXREVERB_DECAYLFRATIO,
730     EAXREVERB_REFLECTIONS,
731     EAXREVERB_REFLECTIONSDELAY,
732     EAXREVERB_REFLECTIONSPAN,
733     EAXREVERB_REVERB,
734     EAXREVERB_REVERBDELAY,
735     EAXREVERB_REVERBPAN,
736     EAXREVERB_ECHOTIME,
737     EAXREVERB_ECHODEPTH,
738     EAXREVERB_MODULATIONTIME,
739     EAXREVERB_MODULATIONDEPTH,
740     EAXREVERB_AIRABSORPTIONHF,
741     EAXREVERB_HFREFERENCE,
742     EAXREVERB_LFREFERENCE,
743     EAXREVERB_ROOMROLLOFFFACTOR,
744     EAXREVERB_FLAGS,
745 }; // EAXREVERB_PROPERTY
746
747 // used by EAXREVERB_ENVIRONMENT
748 enum : unsigned long {
749     EAX_ENVIRONMENT_GENERIC,
750     EAX_ENVIRONMENT_PADDEDCELL,
751     EAX_ENVIRONMENT_ROOM,
752     EAX_ENVIRONMENT_BATHROOM,
753     EAX_ENVIRONMENT_LIVINGROOM,
754     EAX_ENVIRONMENT_STONEROOM,
755     EAX_ENVIRONMENT_AUDITORIUM,
756     EAX_ENVIRONMENT_CONCERTHALL,
757     EAX_ENVIRONMENT_CAVE,
758     EAX_ENVIRONMENT_ARENA,
759     EAX_ENVIRONMENT_HANGAR,
760     EAX_ENVIRONMENT_CARPETEDHALLWAY,
761     EAX_ENVIRONMENT_HALLWAY,
762     EAX_ENVIRONMENT_STONECORRIDOR,
763     EAX_ENVIRONMENT_ALLEY,
764     EAX_ENVIRONMENT_FOREST,
765     EAX_ENVIRONMENT_CITY,
766     EAX_ENVIRONMENT_MOUNTAINS,
767     EAX_ENVIRONMENT_QUARRY,
768     EAX_ENVIRONMENT_PLAIN,
769     EAX_ENVIRONMENT_PARKINGLOT,
770     EAX_ENVIRONMENT_SEWERPIPE,
771     EAX_ENVIRONMENT_UNDERWATER,
772     EAX_ENVIRONMENT_DRUGGED,
773     EAX_ENVIRONMENT_DIZZY,
774     EAX_ENVIRONMENT_PSYCHOTIC,
775
776     EAX1_ENVIRONMENT_COUNT,
777
778     // EAX30
779     EAX_ENVIRONMENT_UNDEFINED = EAX1_ENVIRONMENT_COUNT,
780
781     EAX3_ENVIRONMENT_COUNT,
782 };
783
784
785 // reverberation decay time
786 constexpr auto EAXREVERBFLAGS_DECAYTIMESCALE = 0x00000001UL;
787
788 // reflection level
789 constexpr auto EAXREVERBFLAGS_REFLECTIONSSCALE = 0x00000002UL;
790
791 // initial reflection delay time
792 constexpr auto EAXREVERBFLAGS_REFLECTIONSDELAYSCALE = 0x00000004UL;
793
794 // reflections level
795 constexpr auto EAXREVERBFLAGS_REVERBSCALE = 0x00000008UL;
796
797 // late reverberation delay time
798 constexpr auto EAXREVERBFLAGS_REVERBDELAYSCALE = 0x00000010UL;
799
800 // echo time
801 // EAX30+
802 constexpr auto EAXREVERBFLAGS_ECHOTIMESCALE = 0x00000040UL;
803
804 // modulation time
805 // EAX30+
806 constexpr auto EAXREVERBFLAGS_MODULATIONTIMESCALE = 0x00000080UL;
807
808 // This flag limits high-frequency decay time according to air absorption.
809 constexpr auto EAXREVERBFLAGS_DECAYHFLIMIT = 0x00000020UL;
810
811 constexpr auto EAXREVERBFLAGS_RESERVED = 0xFFFFFF00UL; // reserved future use
812
813
814 struct EAXREVERBPROPERTIES {
815     unsigned long ulEnvironment; // sets all reverb properties
816     float flEnvironmentSize; // environment size in meters
817     float flEnvironmentDiffusion; // environment diffusion
818     long lRoom; // room effect level (at mid frequencies)
819     long lRoomHF; // relative room effect level at high frequencies
820     long lRoomLF; // relative room effect level at low frequencies  
821     float flDecayTime; // reverberation decay time at mid frequencies
822     float flDecayHFRatio; // high-frequency to mid-frequency decay time ratio
823     float flDecayLFRatio; // low-frequency to mid-frequency decay time ratio   
824     long lReflections; // early reflections level relative to room effect
825     float flReflectionsDelay; // initial reflection delay time
826     EAXVECTOR vReflectionsPan; // early reflections panning vector
827     long lReverb; // late reverberation level relative to room effect
828     float flReverbDelay; // late reverberation delay time relative to initial reflection
829     EAXVECTOR vReverbPan; // late reverberation panning vector
830     float flEchoTime; // echo time
831     float flEchoDepth; // echo depth
832     float flModulationTime; // modulation time
833     float flModulationDepth; // modulation depth
834     float flAirAbsorptionHF; // change in level per meter at high frequencies
835     float flHFReference; // reference high frequency
836     float flLFReference; // reference low frequency 
837     float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect
838     unsigned long ulFlags; // modifies the behavior of properties
839 }; // EAXREVERBPROPERTIES
840
841
842 constexpr auto EAXREVERB_MINENVIRONMENT = static_cast<unsigned long>(EAX_ENVIRONMENT_GENERIC);
843 constexpr auto EAX1REVERB_MAXENVIRONMENT = static_cast<unsigned long>(EAX_ENVIRONMENT_PSYCHOTIC);
844 constexpr auto EAX30REVERB_MAXENVIRONMENT = static_cast<unsigned long>(EAX_ENVIRONMENT_UNDEFINED);
845 constexpr auto EAXREVERB_DEFAULTENVIRONMENT = static_cast<unsigned long>(EAX_ENVIRONMENT_GENERIC);
846
847 constexpr auto EAXREVERB_MINENVIRONMENTSIZE = 1.0F;
848 constexpr auto EAXREVERB_MAXENVIRONMENTSIZE = 100.0F;
849 constexpr auto EAXREVERB_DEFAULTENVIRONMENTSIZE = 7.5F;
850
851 constexpr auto EAXREVERB_MINENVIRONMENTDIFFUSION = 0.0F;
852 constexpr auto EAXREVERB_MAXENVIRONMENTDIFFUSION = 1.0F;
853 constexpr auto EAXREVERB_DEFAULTENVIRONMENTDIFFUSION = 1.0F;
854
855 constexpr auto EAXREVERB_MINROOM = -10'000L;
856 constexpr auto EAXREVERB_MAXROOM = 0L;
857 constexpr auto EAXREVERB_DEFAULTROOM = -1'000L;
858
859 constexpr auto EAXREVERB_MINROOMHF = -10'000L;
860 constexpr auto EAXREVERB_MAXROOMHF = 0L;
861 constexpr auto EAXREVERB_DEFAULTROOMHF = -100L;
862
863 constexpr auto EAXREVERB_MINROOMLF = -10'000L;
864 constexpr auto EAXREVERB_MAXROOMLF = 0L;
865 constexpr auto EAXREVERB_DEFAULTROOMLF = 0L;
866
867 constexpr auto EAXREVERB_MINDECAYTIME = 0.1F;
868 constexpr auto EAXREVERB_MAXDECAYTIME = 20.0F;
869 constexpr auto EAXREVERB_DEFAULTDECAYTIME = 1.49F;
870
871 constexpr auto EAXREVERB_MINDECAYHFRATIO = 0.1F;
872 constexpr auto EAXREVERB_MAXDECAYHFRATIO = 2.0F;
873 constexpr auto EAXREVERB_DEFAULTDECAYHFRATIO = 0.83F;
874
875 constexpr auto EAXREVERB_MINDECAYLFRATIO = 0.1F;
876 constexpr auto EAXREVERB_MAXDECAYLFRATIO = 2.0F;
877 constexpr auto EAXREVERB_DEFAULTDECAYLFRATIO = 1.0F;
878
879 constexpr auto EAXREVERB_MINREFLECTIONS = -10'000L;
880 constexpr auto EAXREVERB_MAXREFLECTIONS = 1'000L;
881 constexpr auto EAXREVERB_DEFAULTREFLECTIONS = -2'602L;
882
883 constexpr auto EAXREVERB_MINREFLECTIONSDELAY = 0.0F;
884 constexpr auto EAXREVERB_MAXREFLECTIONSDELAY = 0.3F;
885 constexpr auto EAXREVERB_DEFAULTREFLECTIONSDELAY = 0.007F;
886
887 constexpr auto EAXREVERB_DEFAULTREFLECTIONSPAN = EAXVECTOR{0.0F, 0.0F, 0.0F};
888
889 constexpr auto EAXREVERB_MINREVERB = -10'000L;
890 constexpr auto EAXREVERB_MAXREVERB = 2'000L;
891 constexpr auto EAXREVERB_DEFAULTREVERB = 200L;
892
893 constexpr auto EAXREVERB_MINREVERBDELAY = 0.0F;
894 constexpr auto EAXREVERB_MAXREVERBDELAY = 0.1F;
895 constexpr auto EAXREVERB_DEFAULTREVERBDELAY = 0.011F;
896
897 constexpr auto EAXREVERB_DEFAULTREVERBPAN = EAXVECTOR{0.0F, 0.0F, 0.0F};
898
899 constexpr auto EAXREVERB_MINECHOTIME = 0.075F;
900 constexpr auto EAXREVERB_MAXECHOTIME = 0.25F;
901 constexpr auto EAXREVERB_DEFAULTECHOTIME = 0.25F;
902
903 constexpr auto EAXREVERB_MINECHODEPTH = 0.0F;
904 constexpr auto EAXREVERB_MAXECHODEPTH = 1.0F;
905 constexpr auto EAXREVERB_DEFAULTECHODEPTH = 0.0F;
906
907 constexpr auto EAXREVERB_MINMODULATIONTIME = 0.04F;
908 constexpr auto EAXREVERB_MAXMODULATIONTIME = 4.0F;
909 constexpr auto EAXREVERB_DEFAULTMODULATIONTIME = 0.25F;
910
911 constexpr auto EAXREVERB_MINMODULATIONDEPTH = 0.0F;
912 constexpr auto EAXREVERB_MAXMODULATIONDEPTH = 1.0F;
913 constexpr auto EAXREVERB_DEFAULTMODULATIONDEPTH = 0.0F;
914
915 constexpr auto EAXREVERB_MINAIRABSORPTIONHF = -100.0F;
916 constexpr auto EAXREVERB_MAXAIRABSORPTIONHF = 0.0F;
917 constexpr auto EAXREVERB_DEFAULTAIRABSORPTIONHF = -5.0F;
918
919 constexpr auto EAXREVERB_MINHFREFERENCE = 1'000.0F;
920 constexpr auto EAXREVERB_MAXHFREFERENCE = 20'000.0F;
921 constexpr auto EAXREVERB_DEFAULTHFREFERENCE = 5'000.0F;
922
923 constexpr auto EAXREVERB_MINLFREFERENCE = 20.0F;
924 constexpr auto EAXREVERB_MAXLFREFERENCE = 1'000.0F;
925 constexpr auto EAXREVERB_DEFAULTLFREFERENCE = 250.0F;
926
927 constexpr auto EAXREVERB_MINROOMROLLOFFFACTOR = 0.0F;
928 constexpr auto EAXREVERB_MAXROOMROLLOFFFACTOR = 10.0F;
929 constexpr auto EAXREVERB_DEFAULTROOMROLLOFFFACTOR = 0.0F;
930
931 constexpr auto EAX1REVERB_MINVOLUME = 0.0F;
932 constexpr auto EAX1REVERB_MAXVOLUME = 1.0F;
933
934 constexpr auto EAX1REVERB_MINDAMPING = 0.0F;
935 constexpr auto EAX1REVERB_MAXDAMPING = 2.0F;
936
937 constexpr auto EAXREVERB_DEFAULTFLAGS =
938     EAXREVERBFLAGS_DECAYTIMESCALE |
939     EAXREVERBFLAGS_REFLECTIONSSCALE |
940     EAXREVERBFLAGS_REFLECTIONSDELAYSCALE |
941     EAXREVERBFLAGS_REVERBSCALE |
942     EAXREVERBFLAGS_REVERBDELAYSCALE |
943     EAXREVERBFLAGS_DECAYHFLIMIT;
944
945
946 using Eax1ReverbPresets = std::array<EAX_REVERBPROPERTIES, EAX1_ENVIRONMENT_COUNT>;
947 extern const Eax1ReverbPresets EAX1REVERB_PRESETS;
948
949 using Eax2ReverbPresets = std::array<EAX20LISTENERPROPERTIES, EAX2_ENVIRONMENT_COUNT>;
950 extern const Eax2ReverbPresets EAX2REVERB_PRESETS;
951
952 using EaxReverbPresets = std::array<EAXREVERBPROPERTIES, EAX1_ENVIRONMENT_COUNT>;
953 extern const EaxReverbPresets EAXREVERB_PRESETS;
954
955
956 // AGC Compressor Effect
957
958 extern const GUID EAX_AGCCOMPRESSOR_EFFECT;
959
960 enum EAXAGCCOMPRESSOR_PROPERTY : unsigned int {
961     EAXAGCCOMPRESSOR_NONE,
962     EAXAGCCOMPRESSOR_ALLPARAMETERS,
963     EAXAGCCOMPRESSOR_ONOFF,
964 }; // EAXAGCCOMPRESSOR_PROPERTY
965
966 struct EAXAGCCOMPRESSORPROPERTIES {
967     unsigned long ulOnOff; // Switch Compressor on or off
968 }; // EAXAGCCOMPRESSORPROPERTIES
969
970
971 constexpr auto EAXAGCCOMPRESSOR_MINONOFF = 0UL;
972 constexpr auto EAXAGCCOMPRESSOR_MAXONOFF = 1UL;
973 constexpr auto EAXAGCCOMPRESSOR_DEFAULTONOFF = EAXAGCCOMPRESSOR_MAXONOFF;
974
975
976 // Autowah Effect
977
978 extern const GUID EAX_AUTOWAH_EFFECT;
979
980 enum EAXAUTOWAH_PROPERTY : unsigned int {
981     EAXAUTOWAH_NONE,
982     EAXAUTOWAH_ALLPARAMETERS,
983     EAXAUTOWAH_ATTACKTIME,
984     EAXAUTOWAH_RELEASETIME,
985     EAXAUTOWAH_RESONANCE,
986     EAXAUTOWAH_PEAKLEVEL,
987 }; // EAXAUTOWAH_PROPERTY
988
989 struct EAXAUTOWAHPROPERTIES {
990     float flAttackTime; // Attack time (seconds)
991     float flReleaseTime; // Release time (seconds)
992     long lResonance; // Resonance (mB)
993     long lPeakLevel; // Peak level (mB)
994 }; // EAXAUTOWAHPROPERTIES
995
996
997 constexpr auto EAXAUTOWAH_MINATTACKTIME = 0.0001F;
998 constexpr auto EAXAUTOWAH_MAXATTACKTIME = 1.0F;
999 constexpr auto EAXAUTOWAH_DEFAULTATTACKTIME = 0.06F;
1000
1001 constexpr auto EAXAUTOWAH_MINRELEASETIME = 0.0001F;
1002 constexpr auto EAXAUTOWAH_MAXRELEASETIME = 1.0F;
1003 constexpr auto EAXAUTOWAH_DEFAULTRELEASETIME = 0.06F;
1004
1005 constexpr auto EAXAUTOWAH_MINRESONANCE = 600L;
1006 constexpr auto EAXAUTOWAH_MAXRESONANCE = 6000L;
1007 constexpr auto EAXAUTOWAH_DEFAULTRESONANCE = 6000L;
1008
1009 constexpr auto EAXAUTOWAH_MINPEAKLEVEL = -9000L;
1010 constexpr auto EAXAUTOWAH_MAXPEAKLEVEL = 9000L;
1011 constexpr auto EAXAUTOWAH_DEFAULTPEAKLEVEL = 2100L;
1012
1013
1014 // Chorus Effect
1015
1016 extern const GUID EAX_CHORUS_EFFECT;
1017
1018 enum EAXCHORUS_PROPERTY : unsigned int {
1019     EAXCHORUS_NONE,
1020     EAXCHORUS_ALLPARAMETERS,
1021     EAXCHORUS_WAVEFORM,
1022     EAXCHORUS_PHASE,
1023     EAXCHORUS_RATE,
1024     EAXCHORUS_DEPTH,
1025     EAXCHORUS_FEEDBACK,
1026     EAXCHORUS_DELAY,
1027 }; // EAXCHORUS_PROPERTY
1028
1029 enum : unsigned long {
1030     EAX_CHORUS_SINUSOID,
1031     EAX_CHORUS_TRIANGLE,
1032 };
1033
1034 struct EAXCHORUSPROPERTIES {
1035     unsigned long ulWaveform; // Waveform selector - see enum above
1036     long lPhase; // Phase (Degrees)
1037     float flRate; // Rate (Hz)
1038     float flDepth; // Depth (0 to 1)
1039     float flFeedback; // Feedback (-1 to 1)
1040     float flDelay; // Delay (seconds)
1041 }; // EAXCHORUSPROPERTIES
1042
1043
1044 constexpr auto EAXCHORUS_MINWAVEFORM = 0UL;
1045 constexpr auto EAXCHORUS_MAXWAVEFORM = 1UL;
1046 constexpr auto EAXCHORUS_DEFAULTWAVEFORM = 1UL;
1047
1048 constexpr auto EAXCHORUS_MINPHASE = -180L;
1049 constexpr auto EAXCHORUS_MAXPHASE = 180L;
1050 constexpr auto EAXCHORUS_DEFAULTPHASE = 90L;
1051
1052 constexpr auto EAXCHORUS_MINRATE = 0.0F;
1053 constexpr auto EAXCHORUS_MAXRATE = 10.0F;
1054 constexpr auto EAXCHORUS_DEFAULTRATE = 1.1F;
1055
1056 constexpr auto EAXCHORUS_MINDEPTH = 0.0F;
1057 constexpr auto EAXCHORUS_MAXDEPTH = 1.0F;
1058 constexpr auto EAXCHORUS_DEFAULTDEPTH = 0.1F;
1059
1060 constexpr auto EAXCHORUS_MINFEEDBACK = -1.0F;
1061 constexpr auto EAXCHORUS_MAXFEEDBACK = 1.0F;
1062 constexpr auto EAXCHORUS_DEFAULTFEEDBACK = 0.25F;
1063
1064 constexpr auto EAXCHORUS_MINDELAY = 0.0002F;
1065 constexpr auto EAXCHORUS_MAXDELAY = 0.016F;
1066 constexpr auto EAXCHORUS_DEFAULTDELAY = 0.016F;
1067
1068
1069 // Distortion Effect
1070
1071 extern const GUID EAX_DISTORTION_EFFECT;
1072
1073 enum EAXDISTORTION_PROPERTY : unsigned int {
1074     EAXDISTORTION_NONE,
1075     EAXDISTORTION_ALLPARAMETERS,
1076     EAXDISTORTION_EDGE,
1077     EAXDISTORTION_GAIN,
1078     EAXDISTORTION_LOWPASSCUTOFF,
1079     EAXDISTORTION_EQCENTER,
1080     EAXDISTORTION_EQBANDWIDTH,
1081 }; // EAXDISTORTION_PROPERTY
1082
1083 struct EAXDISTORTIONPROPERTIES {
1084     float flEdge; // Controls the shape of the distortion (0 to 1)
1085     long lGain; // Controls the post distortion gain (mB)
1086     float flLowPassCutOff; // Controls the cut-off of the filter pre-distortion (Hz)
1087     float flEQCenter; // Controls the center frequency of the EQ post-distortion (Hz)
1088     float flEQBandwidth; // Controls the bandwidth of the EQ post-distortion (Hz)
1089 }; // EAXDISTORTIONPROPERTIES
1090
1091
1092 constexpr auto EAXDISTORTION_MINEDGE = 0.0F;
1093 constexpr auto EAXDISTORTION_MAXEDGE = 1.0F;
1094 constexpr auto EAXDISTORTION_DEFAULTEDGE = 0.2F;
1095
1096 constexpr auto EAXDISTORTION_MINGAIN = -6000L;
1097 constexpr auto EAXDISTORTION_MAXGAIN = 0L;
1098 constexpr auto EAXDISTORTION_DEFAULTGAIN = -2600L;
1099
1100 constexpr auto EAXDISTORTION_MINLOWPASSCUTOFF = 80.0F;
1101 constexpr auto EAXDISTORTION_MAXLOWPASSCUTOFF = 24000.0F;
1102 constexpr auto EAXDISTORTION_DEFAULTLOWPASSCUTOFF = 8000.0F;
1103
1104 constexpr auto EAXDISTORTION_MINEQCENTER = 80.0F;
1105 constexpr auto EAXDISTORTION_MAXEQCENTER = 24000.0F;
1106 constexpr auto EAXDISTORTION_DEFAULTEQCENTER = 3600.0F;
1107
1108 constexpr auto EAXDISTORTION_MINEQBANDWIDTH = 80.0F;
1109 constexpr auto EAXDISTORTION_MAXEQBANDWIDTH = 24000.0F;
1110 constexpr auto EAXDISTORTION_DEFAULTEQBANDWIDTH = 3600.0F;
1111
1112
1113 // Echo Effect
1114
1115 extern const GUID EAX_ECHO_EFFECT;
1116
1117 enum EAXECHO_PROPERTY : unsigned int {
1118     EAXECHO_NONE,
1119     EAXECHO_ALLPARAMETERS,
1120     EAXECHO_DELAY,
1121     EAXECHO_LRDELAY,
1122     EAXECHO_DAMPING,
1123     EAXECHO_FEEDBACK,
1124     EAXECHO_SPREAD,
1125 }; // EAXECHO_PROPERTY
1126
1127 struct EAXECHOPROPERTIES {
1128     float flDelay; // Controls the initial delay time (seconds)
1129     float flLRDelay; // Controls the delay time between the first and second taps (seconds)
1130     float flDamping; // Controls a low-pass filter that dampens the echoes (0 to 1)
1131     float flFeedback; // Controls the duration of echo repetition (0 to 1)
1132     float flSpread; // Controls the left-right spread of the echoes
1133 }; // EAXECHOPROPERTIES
1134
1135
1136 constexpr auto EAXECHO_MINDAMPING = 0.0F;
1137 constexpr auto EAXECHO_MAXDAMPING = 0.99F;
1138 constexpr auto EAXECHO_DEFAULTDAMPING = 0.5F;
1139
1140 constexpr auto EAXECHO_MINDELAY = 0.002F;
1141 constexpr auto EAXECHO_MAXDELAY = 0.207F;
1142 constexpr auto EAXECHO_DEFAULTDELAY = 0.1F;
1143
1144 constexpr auto EAXECHO_MINLRDELAY = 0.0F;
1145 constexpr auto EAXECHO_MAXLRDELAY = 0.404F;
1146 constexpr auto EAXECHO_DEFAULTLRDELAY = 0.1F;
1147
1148 constexpr auto EAXECHO_MINFEEDBACK = 0.0F;
1149 constexpr auto EAXECHO_MAXFEEDBACK = 1.0F;
1150 constexpr auto EAXECHO_DEFAULTFEEDBACK = 0.5F;
1151
1152 constexpr auto EAXECHO_MINSPREAD = -1.0F;
1153 constexpr auto EAXECHO_MAXSPREAD = 1.0F;
1154 constexpr auto EAXECHO_DEFAULTSPREAD = -1.0F;
1155
1156
1157 // Equalizer Effect
1158
1159 extern const GUID EAX_EQUALIZER_EFFECT;
1160
1161 enum EAXEQUALIZER_PROPERTY : unsigned int {
1162     EAXEQUALIZER_NONE,
1163     EAXEQUALIZER_ALLPARAMETERS,
1164     EAXEQUALIZER_LOWGAIN,
1165     EAXEQUALIZER_LOWCUTOFF,
1166     EAXEQUALIZER_MID1GAIN,
1167     EAXEQUALIZER_MID1CENTER,
1168     EAXEQUALIZER_MID1WIDTH,
1169     EAXEQUALIZER_MID2GAIN,
1170     EAXEQUALIZER_MID2CENTER,
1171     EAXEQUALIZER_MID2WIDTH,
1172     EAXEQUALIZER_HIGHGAIN,
1173     EAXEQUALIZER_HIGHCUTOFF,
1174 }; // EAXEQUALIZER_PROPERTY
1175
1176 struct EAXEQUALIZERPROPERTIES {
1177     long lLowGain; // (mB)
1178     float flLowCutOff; // (Hz)
1179     long lMid1Gain; // (mB)
1180     float flMid1Center; // (Hz)
1181     float flMid1Width; // (octaves)
1182     long lMid2Gain; // (mB)
1183     float flMid2Center; // (Hz)
1184     float flMid2Width; // (octaves)
1185     long lHighGain; // (mB)
1186     float flHighCutOff; // (Hz)
1187 }; // EAXEQUALIZERPROPERTIES
1188
1189
1190 constexpr auto EAXEQUALIZER_MINLOWGAIN = -1800L;
1191 constexpr auto EAXEQUALIZER_MAXLOWGAIN = 1800L;
1192 constexpr auto EAXEQUALIZER_DEFAULTLOWGAIN = 0L;
1193
1194 constexpr auto EAXEQUALIZER_MINLOWCUTOFF = 50.0F;
1195 constexpr auto EAXEQUALIZER_MAXLOWCUTOFF = 800.0F;
1196 constexpr auto EAXEQUALIZER_DEFAULTLOWCUTOFF = 200.0F;
1197
1198 constexpr auto EAXEQUALIZER_MINMID1GAIN = -1800L;
1199 constexpr auto EAXEQUALIZER_MAXMID1GAIN = 1800L;
1200 constexpr auto EAXEQUALIZER_DEFAULTMID1GAIN = 0L;
1201
1202 constexpr auto EAXEQUALIZER_MINMID1CENTER = 200.0F;
1203 constexpr auto EAXEQUALIZER_MAXMID1CENTER = 3000.0F;
1204 constexpr auto EAXEQUALIZER_DEFAULTMID1CENTER = 500.0F;
1205
1206 constexpr auto EAXEQUALIZER_MINMID1WIDTH = 0.01F;
1207 constexpr auto EAXEQUALIZER_MAXMID1WIDTH = 1.0F;
1208 constexpr auto EAXEQUALIZER_DEFAULTMID1WIDTH = 1.0F;
1209
1210 constexpr auto EAXEQUALIZER_MINMID2GAIN = -1800L;
1211 constexpr auto EAXEQUALIZER_MAXMID2GAIN = 1800L;
1212 constexpr auto EAXEQUALIZER_DEFAULTMID2GAIN = 0L;
1213
1214 constexpr auto EAXEQUALIZER_MINMID2CENTER = 1000.0F;
1215 constexpr auto EAXEQUALIZER_MAXMID2CENTER = 8000.0F;
1216 constexpr auto EAXEQUALIZER_DEFAULTMID2CENTER = 3000.0F;
1217
1218 constexpr auto EAXEQUALIZER_MINMID2WIDTH = 0.01F;
1219 constexpr auto EAXEQUALIZER_MAXMID2WIDTH = 1.0F;
1220 constexpr auto EAXEQUALIZER_DEFAULTMID2WIDTH = 1.0F;
1221
1222 constexpr auto EAXEQUALIZER_MINHIGHGAIN = -1800L;
1223 constexpr auto EAXEQUALIZER_MAXHIGHGAIN = 1800L;
1224 constexpr auto EAXEQUALIZER_DEFAULTHIGHGAIN = 0L;
1225
1226 constexpr auto EAXEQUALIZER_MINHIGHCUTOFF = 4000.0F;
1227 constexpr auto EAXEQUALIZER_MAXHIGHCUTOFF = 16000.0F;
1228 constexpr auto EAXEQUALIZER_DEFAULTHIGHCUTOFF = 6000.0F;
1229
1230
1231 // Flanger Effect
1232
1233 extern const GUID EAX_FLANGER_EFFECT;
1234
1235 enum EAXFLANGER_PROPERTY : unsigned int {
1236     EAXFLANGER_NONE,
1237     EAXFLANGER_ALLPARAMETERS,
1238     EAXFLANGER_WAVEFORM,
1239     EAXFLANGER_PHASE,
1240     EAXFLANGER_RATE,
1241     EAXFLANGER_DEPTH,
1242     EAXFLANGER_FEEDBACK,
1243     EAXFLANGER_DELAY,
1244 }; // EAXFLANGER_PROPERTY
1245
1246 enum : unsigned long {
1247     EAX_FLANGER_SINUSOID,
1248     EAX_FLANGER_TRIANGLE,
1249 };
1250
1251 struct EAXFLANGERPROPERTIES {
1252     unsigned long ulWaveform; // Waveform selector - see enum above
1253     long lPhase; // Phase (Degrees)
1254     float flRate; // Rate (Hz)
1255     float flDepth; // Depth (0 to 1)
1256     float flFeedback; // Feedback (0 to 1)
1257     float flDelay; // Delay (seconds)
1258 }; // EAXFLANGERPROPERTIES
1259
1260
1261 constexpr auto EAXFLANGER_MINWAVEFORM = 0UL;
1262 constexpr auto EAXFLANGER_MAXWAVEFORM = 1UL;
1263 constexpr auto EAXFLANGER_DEFAULTWAVEFORM = 1UL;
1264
1265 constexpr auto EAXFLANGER_MINPHASE = -180L;
1266 constexpr auto EAXFLANGER_MAXPHASE = 180L;
1267 constexpr auto EAXFLANGER_DEFAULTPHASE = 0L;
1268
1269 constexpr auto EAXFLANGER_MINRATE = 0.0F;
1270 constexpr auto EAXFLANGER_MAXRATE = 10.0F;
1271 constexpr auto EAXFLANGER_DEFAULTRATE = 0.27F;
1272
1273 constexpr auto EAXFLANGER_MINDEPTH = 0.0F;
1274 constexpr auto EAXFLANGER_MAXDEPTH = 1.0F;
1275 constexpr auto EAXFLANGER_DEFAULTDEPTH = 1.0F;
1276
1277 constexpr auto EAXFLANGER_MINFEEDBACK = -1.0F;
1278 constexpr auto EAXFLANGER_MAXFEEDBACK = 1.0F;
1279 constexpr auto EAXFLANGER_DEFAULTFEEDBACK = -0.5F;
1280
1281 constexpr auto EAXFLANGER_MINDELAY = 0.0002F;
1282 constexpr auto EAXFLANGER_MAXDELAY = 0.004F;
1283 constexpr auto EAXFLANGER_DEFAULTDELAY = 0.002F;
1284
1285
1286 // Frequency Shifter Effect
1287
1288 extern const GUID EAX_FREQUENCYSHIFTER_EFFECT;
1289
1290 enum EAXFREQUENCYSHIFTER_PROPERTY : unsigned int {
1291     EAXFREQUENCYSHIFTER_NONE,
1292     EAXFREQUENCYSHIFTER_ALLPARAMETERS,
1293     EAXFREQUENCYSHIFTER_FREQUENCY,
1294     EAXFREQUENCYSHIFTER_LEFTDIRECTION,
1295     EAXFREQUENCYSHIFTER_RIGHTDIRECTION,
1296 }; // EAXFREQUENCYSHIFTER_PROPERTY
1297
1298 enum : unsigned long {
1299     EAX_FREQUENCYSHIFTER_DOWN,
1300     EAX_FREQUENCYSHIFTER_UP,
1301     EAX_FREQUENCYSHIFTER_OFF
1302 };
1303
1304 struct EAXFREQUENCYSHIFTERPROPERTIES {
1305     float flFrequency; // (Hz)
1306     unsigned long ulLeftDirection; // see enum above
1307     unsigned long ulRightDirection; // see enum above
1308 }; // EAXFREQUENCYSHIFTERPROPERTIES
1309
1310
1311 constexpr auto EAXFREQUENCYSHIFTER_MINFREQUENCY = 0.0F;
1312 constexpr auto EAXFREQUENCYSHIFTER_MAXFREQUENCY = 24000.0F;
1313 constexpr auto EAXFREQUENCYSHIFTER_DEFAULTFREQUENCY = EAXFREQUENCYSHIFTER_MINFREQUENCY;
1314
1315 constexpr auto EAXFREQUENCYSHIFTER_MINLEFTDIRECTION = 0UL;
1316 constexpr auto EAXFREQUENCYSHIFTER_MAXLEFTDIRECTION = 2UL;
1317 constexpr auto EAXFREQUENCYSHIFTER_DEFAULTLEFTDIRECTION = EAXFREQUENCYSHIFTER_MINLEFTDIRECTION;
1318
1319 constexpr auto EAXFREQUENCYSHIFTER_MINRIGHTDIRECTION = 0UL;
1320 constexpr auto EAXFREQUENCYSHIFTER_MAXRIGHTDIRECTION = 2UL;
1321 constexpr auto EAXFREQUENCYSHIFTER_DEFAULTRIGHTDIRECTION = EAXFREQUENCYSHIFTER_MINRIGHTDIRECTION;
1322
1323
1324 // Vocal Morpher Effect
1325
1326 extern const GUID EAX_VOCALMORPHER_EFFECT;
1327
1328 enum EAXVOCALMORPHER_PROPERTY : unsigned int {
1329     EAXVOCALMORPHER_NONE,
1330     EAXVOCALMORPHER_ALLPARAMETERS,
1331     EAXVOCALMORPHER_PHONEMEA,
1332     EAXVOCALMORPHER_PHONEMEACOARSETUNING,
1333     EAXVOCALMORPHER_PHONEMEB,
1334     EAXVOCALMORPHER_PHONEMEBCOARSETUNING,
1335     EAXVOCALMORPHER_WAVEFORM,
1336     EAXVOCALMORPHER_RATE,
1337 }; // EAXVOCALMORPHER_PROPERTY
1338
1339 enum : unsigned long {
1340     A,
1341     E,
1342     I,
1343     O,
1344     U,
1345     AA,
1346     AE,
1347     AH,
1348     AO,
1349     EH,
1350     ER,
1351     IH,
1352     IY,
1353     UH,
1354     UW,
1355     B,
1356     D,
1357     F,
1358     G,
1359     J,
1360     K,
1361     L,
1362     M,
1363     N,
1364     P,
1365     R,
1366     S,
1367     T,
1368     V,
1369     Z,
1370 };
1371
1372 enum : unsigned long {
1373     EAX_VOCALMORPHER_SINUSOID,
1374     EAX_VOCALMORPHER_TRIANGLE,
1375     EAX_VOCALMORPHER_SAWTOOTH
1376 };
1377
1378 // Use this structure for EAXVOCALMORPHER_ALLPARAMETERS
1379 struct EAXVOCALMORPHERPROPERTIES {
1380     unsigned long ulPhonemeA; // see enum above
1381     long lPhonemeACoarseTuning; // (semitones)
1382     unsigned long ulPhonemeB; // see enum above
1383     long lPhonemeBCoarseTuning; // (semitones)
1384     unsigned long ulWaveform; // Waveform selector - see enum above
1385     float flRate; // (Hz)
1386 }; // EAXVOCALMORPHERPROPERTIES
1387
1388
1389 constexpr auto EAXVOCALMORPHER_MINPHONEMEA = 0UL;
1390 constexpr auto EAXVOCALMORPHER_MAXPHONEMEA = 29UL;
1391 constexpr auto EAXVOCALMORPHER_DEFAULTPHONEMEA = EAXVOCALMORPHER_MINPHONEMEA;
1392
1393 constexpr auto EAXVOCALMORPHER_MINPHONEMEACOARSETUNING = -24L;
1394 constexpr auto EAXVOCALMORPHER_MAXPHONEMEACOARSETUNING = 24L;
1395 constexpr auto EAXVOCALMORPHER_DEFAULTPHONEMEACOARSETUNING = 0L;
1396
1397 constexpr auto EAXVOCALMORPHER_MINPHONEMEB = 0UL;
1398 constexpr auto EAXVOCALMORPHER_MAXPHONEMEB = 29UL;
1399 constexpr auto EAXVOCALMORPHER_DEFAULTPHONEMEB = 10UL;
1400
1401 constexpr auto EAXVOCALMORPHER_MINPHONEMEBCOARSETUNING = -24L;
1402 constexpr auto EAXVOCALMORPHER_MAXPHONEMEBCOARSETUNING = 24L;
1403 constexpr auto EAXVOCALMORPHER_DEFAULTPHONEMEBCOARSETUNING = 0L;
1404
1405 constexpr auto EAXVOCALMORPHER_MINWAVEFORM = 0UL;
1406 constexpr auto EAXVOCALMORPHER_MAXWAVEFORM = 2UL;
1407 constexpr auto EAXVOCALMORPHER_DEFAULTWAVEFORM = EAXVOCALMORPHER_MINWAVEFORM;
1408
1409 constexpr auto EAXVOCALMORPHER_MINRATE = 0.0F;
1410 constexpr auto EAXVOCALMORPHER_MAXRATE = 10.0F;
1411 constexpr auto EAXVOCALMORPHER_DEFAULTRATE = 1.41F;
1412
1413
1414 // Pitch Shifter Effect
1415
1416 extern const GUID EAX_PITCHSHIFTER_EFFECT;
1417
1418 enum EAXPITCHSHIFTER_PROPERTY : unsigned int {
1419     EAXPITCHSHIFTER_NONE,
1420     EAXPITCHSHIFTER_ALLPARAMETERS,
1421     EAXPITCHSHIFTER_COARSETUNE,
1422     EAXPITCHSHIFTER_FINETUNE,
1423 }; // EAXPITCHSHIFTER_PROPERTY
1424
1425 struct EAXPITCHSHIFTERPROPERTIES {
1426     long lCoarseTune; // Amount of pitch shift (semitones)
1427     long lFineTune; // Amount of pitch shift (cents)
1428 }; // EAXPITCHSHIFTERPROPERTIES
1429
1430
1431 constexpr auto EAXPITCHSHIFTER_MINCOARSETUNE = -12L;
1432 constexpr auto EAXPITCHSHIFTER_MAXCOARSETUNE = 12L;
1433 constexpr auto EAXPITCHSHIFTER_DEFAULTCOARSETUNE = 12L;
1434
1435 constexpr auto EAXPITCHSHIFTER_MINFINETUNE = -50L;
1436 constexpr auto EAXPITCHSHIFTER_MAXFINETUNE = 50L;
1437 constexpr auto EAXPITCHSHIFTER_DEFAULTFINETUNE = 0L;
1438
1439
1440 // Ring Modulator Effect
1441
1442 extern const GUID EAX_RINGMODULATOR_EFFECT;
1443
1444 enum EAXRINGMODULATOR_PROPERTY : unsigned int {
1445     EAXRINGMODULATOR_NONE,
1446     EAXRINGMODULATOR_ALLPARAMETERS,
1447     EAXRINGMODULATOR_FREQUENCY,
1448     EAXRINGMODULATOR_HIGHPASSCUTOFF,
1449     EAXRINGMODULATOR_WAVEFORM,
1450 }; // EAXRINGMODULATOR_PROPERTY
1451
1452 enum : unsigned long {
1453     EAX_RINGMODULATOR_SINUSOID,
1454     EAX_RINGMODULATOR_SAWTOOTH,
1455     EAX_RINGMODULATOR_SQUARE,
1456 };
1457
1458 // Use this structure for EAXRINGMODULATOR_ALLPARAMETERS
1459 struct EAXRINGMODULATORPROPERTIES {
1460     float flFrequency; // Frequency of modulation (Hz)
1461     float flHighPassCutOff; // Cut-off frequency of high-pass filter (Hz)
1462     unsigned long ulWaveform; // Waveform selector - see enum above
1463 }; // EAXRINGMODULATORPROPERTIES
1464
1465
1466 constexpr auto EAXRINGMODULATOR_MINFREQUENCY = 0.0F;
1467 constexpr auto EAXRINGMODULATOR_MAXFREQUENCY = 8000.0F;
1468 constexpr auto EAXRINGMODULATOR_DEFAULTFREQUENCY = 440.0F;
1469
1470 constexpr auto EAXRINGMODULATOR_MINHIGHPASSCUTOFF = 0.0F;
1471 constexpr auto EAXRINGMODULATOR_MAXHIGHPASSCUTOFF = 24000.0F;
1472 constexpr auto EAXRINGMODULATOR_DEFAULTHIGHPASSCUTOFF = 800.0F;
1473
1474 constexpr auto EAXRINGMODULATOR_MINWAVEFORM = 0UL;
1475 constexpr auto EAXRINGMODULATOR_MAXWAVEFORM = 2UL;
1476 constexpr auto EAXRINGMODULATOR_DEFAULTWAVEFORM = EAXRINGMODULATOR_MINWAVEFORM;
1477
1478
1479 using LPEAXSET = ALenum(AL_APIENTRY*)(
1480     const GUID* property_set_id,
1481     ALuint property_id,
1482     ALuint property_source_id,
1483     ALvoid* property_buffer,
1484     ALuint property_size);
1485
1486 using LPEAXGET = ALenum(AL_APIENTRY*)(
1487     const GUID* property_set_id,
1488     ALuint property_id,
1489     ALuint property_source_id,
1490     ALvoid* property_buffer,
1491     ALuint property_size);
1492
1493 #endif // !EAX_API_INCLUDED