api.h 50 KB

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