api.h 51 KB

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