1 /* 2 * Copyright 2011-2012 Arx Libertatis Team (see the AUTHORS file) 3 * 4 * This file is part of Arx Libertatis. 5 * 6 * Arx Libertatis is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * 11 * Arx Libertatis is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with Arx Libertatis. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 /****************************************************************** 20 * 21 * EAX.H - DirectSound3D Environmental Audio Extensions version 2.0 22 * Updated July 8, 1999 23 * 24 ******************************************************************* 25 */ 26 27 #ifndef ARX_AUDIO_DSOUND_EAX_H 28 #define ARX_AUDIO_DSOUND_EAX_H 29 30 #include "platform/Platform.h" 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif // __cplusplus 35 36 #if ARX_COMPILER_MSVC 37 #define EAX_IMPORT __declspec(dllimport) 38 #else 39 #define EAX_IMPORT 40 #endif 41 42 #include <windows.h> 43 #include <mmsystem.h> 44 #include <dsound.h> 45 46 /* 47 * EAX Wrapper Interface (using Direct X 7) {4FF53B81-1CE0-11d3-AAB8-00A0C95949D5} 48 */ 49 DEFINE_GUID(CLSID_EAXDirectSound, 50 0x4ff53b81, 51 0x1ce0, 52 0x11d3, 53 0xaa, 0xb8, 0x0, 0xa0, 0xc9, 0x59, 0x49, 0xd5); 54 55 /* 56 * EAX Wrapper Interface (using Direct X 8) {CA503B60-B176-11d4-A094-D0C0BF3A560C} 57 */ 58 DEFINE_GUID(CLSID_EAXDirectSound8, 59 0xca503b60, 60 0xb176, 61 0x11d4, 62 0xa0, 0x94, 0xd0, 0xc0, 0xbf, 0x3a, 0x56, 0xc); 63 64 #pragma pack(push, 4) 65 66 /* 67 * EAX 2.0 listener property set {0306A6A8-B224-11d2-99E5-0000E8D8C722} 68 */ 69 DEFINE_GUID(DSPROPSETID_EAX20_ListenerProperties, 70 0x306a6a8, 71 0xb224, 72 0x11d2, 73 0x99, 0xe5, 0x0, 0x0, 0xe8, 0xd8, 0xc7, 0x22); 74 75 // For compatibility with future EAX versions: 76 #define DSPROPSETID_EAX_ListenerProperties DSPROPSETID_EAX20_ListenerProperties 77 #define DSPROPSETID_EAX_SourceProperties DSPROPSETID_EAX20_BufferProperties 78 79 typedef enum 80 { 81 DSPROPERTY_EAXLISTENER_NONE, 82 DSPROPERTY_EAXLISTENER_ALLPARAMETERS, 83 DSPROPERTY_EAXLISTENER_ROOM, 84 DSPROPERTY_EAXLISTENER_ROOMHF, 85 DSPROPERTY_EAXLISTENER_ROOMROLLOFFFACTOR, 86 DSPROPERTY_EAXLISTENER_DECAYTIME, 87 DSPROPERTY_EAXLISTENER_DECAYHFRATIO, 88 DSPROPERTY_EAXLISTENER_REFLECTIONS, 89 DSPROPERTY_EAXLISTENER_REFLECTIONSDELAY, 90 DSPROPERTY_EAXLISTENER_REVERB, 91 DSPROPERTY_EAXLISTENER_REVERBDELAY, 92 DSPROPERTY_EAXLISTENER_ENVIRONMENT, 93 DSPROPERTY_EAXLISTENER_ENVIRONMENTSIZE, 94 DSPROPERTY_EAXLISTENER_ENVIRONMENTDIFFUSION, 95 DSPROPERTY_EAXLISTENER_AIRABSORPTIONHF, 96 DSPROPERTY_EAXLISTENER_FLAGS 97 } DSPROPERTY_EAX_LISTENERPROPERTY; 98 99 // OR these flags with property id 100 #define DSPROPERTY_EAXLISTENER_IMMEDIATE 0x00000000 // changes take effect immediately 101 #define DSPROPERTY_EAXLISTENER_DEFERRED 0x80000000 // changes take effect later 102 #define DSPROPERTY_EAXLISTENER_COMMITDEFERREDSETTINGS (DSPROPERTY_EAXLISTENER_NONE | \ 103 DSPROPERTY_EAXLISTENER_IMMEDIATE) 104 105 // Use this structure for DSPROPERTY_EAXLISTENER_ALLPARAMETERS 106 // - all levels are hundredths of decibels 107 // - all times are in seconds 108 // - the reference for high frequency controls is 5 kHz 109 // 110 // NOTE: This structure may change in future EAX versions. 111 // It is recommended to initialize fields by name: 112 // myListener.lRoom = -1000; 113 // myListener.lRoomHF = -100; 114 // ... 115 // myListener.dwFlags = myFlags /* see EAXLISTENERFLAGS below */ ; 116 // instead of: 117 // myListener = { -1000, -100, ... , 0x00000009 }; 118 // If you want to save and load presets in binary form, you 119 // should define your own structure to insure future compatibility. 120 // 121 typedef struct _EAXLISTENERPROPERTIES 122 { 123 long lRoom; // room effect level at low frequencies 124 long lRoomHF; // room effect high-frequency level re. low frequency level 125 float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect 126 float flDecayTime; // reverberation decay time at low frequencies 127 float flDecayHFRatio; // high-frequency to low-frequency decay time ratio 128 long lReflections; // early reflections level relative to room effect 129 float flReflectionsDelay; // initial reflection delay time 130 long lReverb; // late reverberation level relative to room effect 131 float flReverbDelay; // late reverberation delay time relative to initial reflection 132 unsigned long dwEnvironment; // sets all listener properties 133 float flEnvironmentSize; // environment size in meters 134 float flEnvironmentDiffusion; // environment diffusion 135 float flAirAbsorptionHF; // change in level per meter at 5 kHz 136 unsigned long dwFlags; // modifies the behavior of properties 137 } EAXLISTENERPROPERTIES, *LPEAXLISTENERPROPERTIES; 138 139 // used by DSPROPERTY_EAXLISTENER_ENVIRONMENT 140 enum 141 { 142 EAX_ENVIRONMENT_GENERIC, 143 EAX_ENVIRONMENT_PADDEDCELL, 144 EAX_ENVIRONMENT_ROOM, 145 EAX_ENVIRONMENT_BATHROOM, 146 EAX_ENVIRONMENT_LIVINGROOM, 147 EAX_ENVIRONMENT_STONEROOM, 148 EAX_ENVIRONMENT_AUDITORIUM, 149 EAX_ENVIRONMENT_CONCERTHALL, 150 EAX_ENVIRONMENT_CAVE, 151 EAX_ENVIRONMENT_ARENA, 152 EAX_ENVIRONMENT_HANGAR, 153 EAX_ENVIRONMENT_CARPETEDHALLWAY, 154 EAX_ENVIRONMENT_HALLWAY, 155 EAX_ENVIRONMENT_STONECORRIDOR, 156 EAX_ENVIRONMENT_ALLEY, 157 EAX_ENVIRONMENT_FOREST, 158 EAX_ENVIRONMENT_CITY, 159 EAX_ENVIRONMENT_MOUNTAINS, 160 EAX_ENVIRONMENT_QUARRY, 161 EAX_ENVIRONMENT_PLAIN, 162 EAX_ENVIRONMENT_PARKINGLOT, 163 EAX_ENVIRONMENT_SEWERPIPE, 164 EAX_ENVIRONMENT_UNDERWATER, 165 EAX_ENVIRONMENT_DRUGGED, 166 EAX_ENVIRONMENT_DIZZY, 167 EAX_ENVIRONMENT_PSYCHOTIC, 168 169 EAX_ENVIRONMENT_COUNT 170 }; 171 172 // Used by DSPROPERTY_EAXLISTENER_FLAGS 173 // 174 // Note: The number and order of flags may change in future EAX versions. 175 // It is recommended to use the flag defines as follows: 176 // myFlags = EAXLISTENERFLAGS_DECAYTIMESCALE | EAXLISTENERFLAGS_REVERBSCALE; 177 // instead of: 178 // myFlags = 0x00000009; 179 // 180 // These flags determine what properties are affected by environment size. 181 #define EAXLISTENERFLAGS_DECAYTIMESCALE 0x00000001 // reverberation decay time 182 #define EAXLISTENERFLAGS_REFLECTIONSSCALE 0x00000002 // reflection level 183 #define EAXLISTENERFLAGS_REFLECTIONSDELAYSCALE 0x00000004 // initial reflection delay time 184 #define EAXLISTENERFLAGS_REVERBSCALE 0x00000008 // reflections level 185 #define EAXLISTENERFLAGS_REVERBDELAYSCALE 0x00000010 // late reverberation delay time 186 187 // This flag limits high-frequency decay time according to air absorption. 188 #define EAXLISTENERFLAGS_DECAYHFLIMIT 0x00000020 189 190 #define EAXLISTENERFLAGS_RESERVED 0xFFFFFFC0 // reserved future use 191 192 // property ranges and defaults: 193 194 #define EAXLISTENER_MINROOM (-10000) 195 #define EAXLISTENER_MAXROOM 0 196 #define EAXLISTENER_DEFAULTROOM (-1000) 197 198 #define EAXLISTENER_MINROOMHF (-10000) 199 #define EAXLISTENER_MAXROOMHF 0 200 #define EAXLISTENER_DEFAULTROOMHF (-100) 201 202 #define EAXLISTENER_MINROOMROLLOFFFACTOR 0.0f 203 #define EAXLISTENER_MAXROOMROLLOFFFACTOR 10.0f 204 #define EAXLISTENER_DEFAULTROOMROLLOFFFACTOR 0.0f 205 206 #define EAXLISTENER_MINDECAYTIME 0.1f 207 #define EAXLISTENER_MAXDECAYTIME 20.0f 208 #define EAXLISTENER_DEFAULTDECAYTIME 1.49f 209 210 #define EAXLISTENER_MINDECAYHFRATIO 0.1f 211 #define EAXLISTENER_MAXDECAYHFRATIO 2.0f 212 #define EAXLISTENER_DEFAULTDECAYHFRATIO 0.83f 213 214 #define EAXLISTENER_MINREFLECTIONS (-10000) 215 #define EAXLISTENER_MAXREFLECTIONS 1000 216 #define EAXLISTENER_DEFAULTREFLECTIONS (-2602) 217 218 #define EAXLISTENER_MINREFLECTIONSDELAY 0.0f 219 #define EAXLISTENER_MAXREFLECTIONSDELAY 0.3f 220 #define EAXLISTENER_DEFAULTREFLECTIONSDELAY 0.007f 221 222 #define EAXLISTENER_MINREVERB (-10000) 223 #define EAXLISTENER_MAXREVERB 2000 224 #define EAXLISTENER_DEFAULTREVERB 200 225 226 #define EAXLISTENER_MINREVERBDELAY 0.0f 227 #define EAXLISTENER_MAXREVERBDELAY 0.1f 228 #define EAXLISTENER_DEFAULTREVERBDELAY 0.011f 229 230 #define EAXLISTENER_MINENVIRONMENT 0 231 #define EAXLISTENER_MAXENVIRONMENT (EAX_ENVIRONMENT_COUNT-1) 232 #define EAXLISTENER_DEFAULTENVIRONMENT EAX_ENVIRONMENT_GENERIC 233 234 #define EAXLISTENER_MINENVIRONMENTSIZE 1.0f 235 #define EAXLISTENER_MAXENVIRONMENTSIZE 100.0f 236 #define EAXLISTENER_DEFAULTENVIRONMENTSIZE 7.5f 237 238 #define EAXLISTENER_MINENVIRONMENTDIFFUSION 0.0f 239 #define EAXLISTENER_MAXENVIRONMENTDIFFUSION 1.0f 240 #define EAXLISTENER_DEFAULTENVIRONMENTDIFFUSION 1.0f 241 242 #define EAXLISTENER_MINAIRABSORPTIONHF (-100.0f) 243 #define EAXLISTENER_MAXAIRABSORPTIONHF 0.0f 244 #define EAXLISTENER_DEFAULTAIRABSORPTIONHF (-5.0f) 245 246 #define EAXLISTENER_DEFAULTFLAGS (EAXLISTENERFLAGS_DECAYTIMESCALE | \ 247 EAXLISTENERFLAGS_REFLECTIONSSCALE | \ 248 EAXLISTENERFLAGS_REFLECTIONSDELAYSCALE | \ 249 EAXLISTENERFLAGS_REVERBSCALE | \ 250 EAXLISTENERFLAGS_REVERBDELAYSCALE | \ 251 EAXLISTENERFLAGS_DECAYHFLIMIT) 252 253 254 255 /* 256 * EAX 2.0 buffer property set {0306A6A7-B224-11d2-99E5-0000E8D8C722} 257 */ 258 DEFINE_GUID(DSPROPSETID_EAX20_BufferProperties, 259 0x306a6a7, 260 0xb224, 261 0x11d2, 262 0x99, 0xe5, 0x0, 0x0, 0xe8, 0xd8, 0xc7, 0x22); 263 264 // For compatibility with future EAX versions: 265 #define DSPROPSETID_EAX_BufferProperties DSPROPSETID_EAX20_BufferProperties 266 267 typedef enum 268 { 269 DSPROPERTY_EAXBUFFER_NONE, 270 DSPROPERTY_EAXBUFFER_ALLPARAMETERS, 271 DSPROPERTY_EAXBUFFER_DIRECT, 272 DSPROPERTY_EAXBUFFER_DIRECTHF, 273 DSPROPERTY_EAXBUFFER_ROOM, 274 DSPROPERTY_EAXBUFFER_ROOMHF, 275 DSPROPERTY_EAXBUFFER_ROOMROLLOFFFACTOR, 276 DSPROPERTY_EAXBUFFER_OBSTRUCTION, 277 DSPROPERTY_EAXBUFFER_OBSTRUCTIONLFRATIO, 278 DSPROPERTY_EAXBUFFER_OCCLUSION, 279 DSPROPERTY_EAXBUFFER_OCCLUSIONLFRATIO, 280 DSPROPERTY_EAXBUFFER_OCCLUSIONROOMRATIO, 281 DSPROPERTY_EAXBUFFER_OUTSIDEVOLUMEHF, 282 DSPROPERTY_EAXBUFFER_AIRABSORPTIONFACTOR, 283 DSPROPERTY_EAXBUFFER_FLAGS 284 } DSPROPERTY_EAX_BUFFERPROPERTY; 285 286 // OR these flags with property id 287 #define DSPROPERTY_EAXBUFFER_IMMEDIATE 0x00000000 // changes take effect immediately 288 #define DSPROPERTY_EAXBUFFER_DEFERRED 0x80000000 // changes take effect later 289 #define DSPROPERTY_EAXBUFFER_COMMITDEFERREDSETTINGS (DSPROPERTY_EAXBUFFER_NONE | \ 290 DSPROPERTY_EAXBUFFER_IMMEDIATE) 291 292 // Use this structure for DSPROPERTY_EAXBUFFER_ALLPARAMETERS 293 // - all levels are hundredths of decibels 294 // 295 // NOTE: This structure may change in future EAX versions. 296 // It is recommended to initialize fields by name: 297 // myBuffer.lDirect = 0; 298 // myBuffer.lDirectHF = -200; 299 // ... 300 // myBuffer.dwFlags = myFlags /* see EAXBUFFERFLAGS below */ ; 301 // instead of: 302 // myBuffer = { 0, -200, ... , 0x00000003 }; 303 // 304 typedef struct _EAXBUFFERPROPERTIES 305 { 306 long lDirect; // direct path level 307 long lDirectHF; // direct path level at high frequencies 308 long lRoom; // room effect level 309 long lRoomHF; // room effect level at high frequencies 310 float flRoomRolloffFactor; // like DS3D flRolloffFactor but for room effect 311 long lObstruction; // main obstruction control (attenuation at high frequencies) 312 float flObstructionLFRatio; // obstruction low-frequency level re. main control 313 long lOcclusion; // main occlusion control (attenuation at high frequencies) 314 float flOcclusionLFRatio; // occlusion low-frequency level re. main control 315 float flOcclusionRoomRatio; // occlusion room effect level re. main control 316 long lOutsideVolumeHF; // outside sound cone level at high frequencies 317 float flAirAbsorptionFactor; // multiplies DSPROPERTY_EAXLISTENER_AIRABSORPTIONHF 318 unsigned long dwFlags; // modifies the behavior of properties 319 } EAXBUFFERPROPERTIES, *LPEAXBUFFERPROPERTIES; 320 321 // Used by DSPROPERTY_EAXBUFFER_FLAGS 322 // true: value is computed automatically - property is an offset 323 // false: value is used directly 324 // 325 // Note: The number and order of flags may change in future EAX versions. 326 // To insure future compatibility, use flag defines as follows: 327 // myFlags = EAXBUFFERFLAGS_DIRECTHFAUTO | EAXBUFFERFLAGS_ROOMAUTO; 328 // instead of: 329 // myFlags = 0x00000003; 330 // 331 #define EAXBUFFERFLAGS_DIRECTHFAUTO 0x00000001 // affects DSPROPERTY_EAXBUFFER_DIRECTHF 332 #define EAXBUFFERFLAGS_ROOMAUTO 0x00000002 // affects DSPROPERTY_EAXBUFFER_ROOM 333 #define EAXBUFFERFLAGS_ROOMHFAUTO 0x00000004 // affects DSPROPERTY_EAXBUFFER_ROOMHF 334 335 #define EAXBUFFERFLAGS_RESERVED 0xFFFFFFF8 // reserved future use 336 337 // property ranges and defaults: 338 339 #define EAXBUFFER_MINDIRECT (-10000) 340 #define EAXBUFFER_MAXDIRECT 1000 341 #define EAXBUFFER_DEFAULTDIRECT 0 342 343 #define EAXBUFFER_MINDIRECTHF (-10000) 344 #define EAXBUFFER_MAXDIRECTHF 0 345 #define EAXBUFFER_DEFAULTDIRECTHF 0 346 347 #define EAXBUFFER_MINROOM (-10000) 348 #define EAXBUFFER_MAXROOM 1000 349 #define EAXBUFFER_DEFAULTROOM 0 350 351 #define EAXBUFFER_MINROOMHF (-10000) 352 #define EAXBUFFER_MAXROOMHF 0 353 #define EAXBUFFER_DEFAULTROOMHF 0 354 355 #define EAXBUFFER_MINROOMROLLOFFFACTOR 0.0f 356 #define EAXBUFFER_MAXROOMROLLOFFFACTOR 10.f 357 #define EAXBUFFER_DEFAULTROOMROLLOFFFACTOR 0.0f 358 359 #define EAXBUFFER_MINOBSTRUCTION (-10000) 360 #define EAXBUFFER_MAXOBSTRUCTION 0 361 #define EAXBUFFER_DEFAULTOBSTRUCTION 0 362 363 #define EAXBUFFER_MINOBSTRUCTIONLFRATIO 0.0f 364 #define EAXBUFFER_MAXOBSTRUCTIONLFRATIO 1.0f 365 #define EAXBUFFER_DEFAULTOBSTRUCTIONLFRATIO 0.0f 366 367 #define EAXBUFFER_MINOCCLUSION (-10000) 368 #define EAXBUFFER_MAXOCCLUSION 0 369 #define EAXBUFFER_DEFAULTOCCLUSION 0 370 371 #define EAXBUFFER_MINOCCLUSIONLFRATIO 0.0f 372 #define EAXBUFFER_MAXOCCLUSIONLFRATIO 1.0f 373 #define EAXBUFFER_DEFAULTOCCLUSIONLFRATIO 0.25f 374 375 #define EAXBUFFER_MINOCCLUSIONROOMRATIO 0.0f 376 #define EAXBUFFER_MAXOCCLUSIONROOMRATIO 10.0f 377 #define EAXBUFFER_DEFAULTOCCLUSIONROOMRATIO 0.5f 378 379 #define EAXBUFFER_MINOUTSIDEVOLUMEHF (-10000) 380 #define EAXBUFFER_MAXOUTSIDEVOLUMEHF 0 381 #define EAXBUFFER_DEFAULTOUTSIDEVOLUMEHF 0 382 383 #define EAXBUFFER_MINAIRABSORPTIONFACTOR 0.0f 384 #define EAXBUFFER_MAXAIRABSORPTIONFACTOR 10.0f 385 #define EAXBUFFER_DEFAULTAIRABSORPTIONFACTOR 1.0f 386 387 #define EAXBUFFER_DEFAULTFLAGS (EAXBUFFERFLAGS_DIRECTHFAUTO | \ 388 EAXBUFFERFLAGS_ROOMAUTO | \ 389 EAXBUFFERFLAGS_ROOMHFAUTO) 390 391 // Material transmission presets 392 // 3 values in this order: 393 // 1: occlusion (or obstruction) 394 // 2: occlusion LF Ratio (or obstruction LF Ratio) 395 // 3: occlusion Room Ratio 396 397 // Single window material preset 398 #define EAX_MATERIAL_SINGLEWINDOW (-2800) 399 #define EAX_MATERIAL_SINGLEWINDOWLF 0.71f 400 #define EAX_MATERIAL_SINGLEWINDOWROOMRATIO 0.43f 401 402 // Double window material preset 403 #define EAX_MATERIAL_DOUBLEWINDOW (-5000) 404 #define EAX_MATERIAL_DOUBLEWINDOWHF 0.40f 405 #define EAX_MATERIAL_DOUBLEWINDOWROOMRATIO 0.24f 406 407 // Thin door material preset 408 #define EAX_MATERIAL_THINDOOR (-1800) 409 #define EAX_MATERIAL_THINDOORLF 0.66f 410 #define EAX_MATERIAL_THINDOORROOMRATIO 0.66f 411 412 // Thick door material preset 413 #define EAX_MATERIAL_THICKDOOR (-4400) 414 #define EAX_MATERIAL_THICKDOORLF 0.64f 415 #define EAX_MATERIAL_THICKDOORROOMRTATION 0.27f 416 417 // Wood wall material preset 418 #define EAX_MATERIAL_WOODWALL (-4000) 419 #define EAX_MATERIAL_WOODWALLLF 0.50f 420 #define EAX_MATERIAL_WOODWALLROOMRATIO 0.30f 421 422 // Brick wall material preset 423 #define EAX_MATERIAL_BRICKWALL (-5000) 424 #define EAX_MATERIAL_BRICKWALLLF 0.60f 425 #define EAX_MATERIAL_BRICKWALLROOMRATIO 0.24f 426 427 // Stone wall material preset 428 #define EAX_MATERIAL_STONEWALL (-6000) 429 #define EAX_MATERIAL_STONEWALLLF 0.68f 430 #define EAX_MATERIAL_STONEWALLROOMRATIO 0.20f 431 432 // Curtain material preset 433 #define EAX_MATERIAL_CURTAIN (-1200) 434 #define EAX_MATERIAL_CURTAINLF 0.15f 435 #define EAX_MATERIAL_CURTAINROOMRATIO 1.00f 436 437 438 #pragma pack(pop) 439 440 #ifdef __cplusplus 441 } 442 #endif // __cplusplus 443 444 #endif // ARX_AUDIO_DSOUND_EAX_H 445