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