]> git.jsancho.org Git - lugaru.git/blob - Source/fmod_header.h
Added GPL license and headers.
[lugaru.git] / Source / fmod_header.h
1 /*
2 Copyright (C) 2003, 2010 - Wolfire Games
3
4 This file is part of Lugaru.
5
6 Lugaru is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License
8 as published by the Free Software Foundation; either version 2
9 of the License, or (at your option) any later version.
10
11 This program 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.  
14
15 See the GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20 */
21
22 /* ========================================================================================== */
23 /* FMOD Main header file. Copyright (c), Firelight Technologies Pty, Ltd. 1999-2004.          */
24 /* ========================================================================================== */
25
26 #ifndef _FMOD_H_
27 #define _FMOD_H_
28
29 /* ========================================================================================== */
30 /* DEFINITIONS                                                                                */
31 /* ========================================================================================== */
32
33 #if (!defined(WIN32) && !defined(_WIN32) && !defined(__WIN32__) && !defined(_WIN64) && !defined(_WIN32_WCE) && !defined(_XBOX)) || (defined(__GNUC__) && defined(WIN32))
34     #ifndef __cdecl
35         #define __cdecl
36     #endif
37     #ifndef __stdcall
38         #define __stdcall
39     #endif
40 #endif 
41
42 #if defined(_WIN32_WCE)
43     #define F_API _cdecl
44     #define F_CALLBACKAPI _cdecl
45 #else
46     #define F_API __stdcall
47     #define F_CALLBACKAPI __stdcall
48 #endif
49
50 #ifdef DLL_EXPORTS
51     #define DLL_API __declspec(dllexport)
52 #else
53     #if defined(__LCC__) || defined(__MINGW32__) || defined(__CYGWIN32__)
54         #define DLL_API F_API
55     #else
56         #define DLL_API
57     #endif /* __LCC__ ||  __MINGW32__ || __CYGWIN32__ */
58 #endif /* DLL_EXPORTS */
59
60 #define FMOD_VERSION    3.74f
61
62 /* 
63     FMOD defined types 
64 */
65 typedef struct FSOUND_SAMPLE    FSOUND_SAMPLE;
66 typedef struct FSOUND_STREAM    FSOUND_STREAM;
67 typedef struct FSOUND_DSPUNIT   FSOUND_DSPUNIT;
68 typedef struct FSOUND_SYNCPOINT FSOUND_SYNCPOINT;
69 typedef struct FMUSIC_MODULE    FMUSIC_MODULE;
70
71 /* 
72     Callback types
73 */
74 typedef void *      (F_CALLBACKAPI *FSOUND_OPENCALLBACK)    (const char *name);
75 typedef void        (F_CALLBACKAPI *FSOUND_CLOSECALLBACK)   (void *handle);
76 typedef int         (F_CALLBACKAPI *FSOUND_READCALLBACK)    (void *buffer, int size, void *handle);
77 typedef int         (F_CALLBACKAPI *FSOUND_SEEKCALLBACK)    (void *handle, int pos, signed char mode);
78 typedef int         (F_CALLBACKAPI *FSOUND_TELLCALLBACK)    (void *handle);
79
80 typedef void *      (F_CALLBACKAPI *FSOUND_ALLOCCALLBACK)   (unsigned int size);
81 typedef void *      (F_CALLBACKAPI *FSOUND_REALLOCCALLBACK) (void *ptr, unsigned int size);
82 typedef void        (F_CALLBACKAPI *FSOUND_FREECALLBACK)    (void *ptr);
83
84 typedef void *      (F_CALLBACKAPI *FSOUND_DSPCALLBACK)     (void *originalbuffer, void *newbuffer, int length, void *userdata);
85 typedef signed char (F_CALLBACKAPI *FSOUND_STREAMCALLBACK)  (FSOUND_STREAM *stream, void *buff, int len, void *userdata);
86 typedef signed char (F_CALLBACKAPI *FSOUND_METADATACALLBACK)(char *name, char *value, void *userdata);
87 typedef void        (F_CALLBACKAPI *FMUSIC_CALLBACK)        (FMUSIC_MODULE *mod, unsigned char param);
88
89
90 /*
91 [ENUM]
92 [
93     [DESCRIPTION]   
94     On failure of commands in FMOD, use FSOUND_GetError to attain what happened.
95     
96     [SEE_ALSO]      
97     FSOUND_GetError
98 ]
99 */
100 enum FMOD_ERRORS 
101 {
102     FMOD_ERR_NONE,             /* No errors */
103     FMOD_ERR_BUSY,             /* Cannot call this command after FSOUND_Init.  Call FSOUND_Close first. */
104     FMOD_ERR_UNINITIALIZED,    /* This command failed because FSOUND_Init or FSOUND_SetOutput was not called */
105     FMOD_ERR_INIT,             /* Error initializing output device. */
106     FMOD_ERR_ALLOCATED,        /* Error initializing output device, but more specifically, the output device is already in use and cannot be reused. */
107     FMOD_ERR_PLAY,             /* Playing the sound failed. */
108     FMOD_ERR_OUTPUT_FORMAT,    /* Soundcard does not support the features needed for this soundsystem (16bit stereo output) */
109     FMOD_ERR_COOPERATIVELEVEL, /* Error setting cooperative level for hardware. */
110     FMOD_ERR_CREATEBUFFER,     /* Error creating hardware sound buffer. */
111     FMOD_ERR_FILE_NOTFOUND,    /* File not found */
112     FMOD_ERR_FILE_FORMAT,      /* Unknown file format */
113     FMOD_ERR_FILE_BAD,         /* Error loading file */
114     FMOD_ERR_MEMORY,           /* Not enough memory or resources */
115     FMOD_ERR_VERSION,          /* The version number of this file format is not supported */
116     FMOD_ERR_INVALID_PARAM,    /* An invalid parameter was passed to this function */
117     FMOD_ERR_NO_EAX,           /* Tried to use an EAX command on a non EAX enabled channel or output. */
118     FMOD_ERR_CHANNEL_ALLOC,    /* Failed to allocate a new channel */
119     FMOD_ERR_RECORD,           /* Recording is not supported on this machine */
120     FMOD_ERR_MEDIAPLAYER,      /* Windows Media Player not installed so cannot play wma or use internet streaming. */
121     FMOD_ERR_CDDEVICE          /* An error occured trying to open the specified CD device */
122 };
123
124
125 /*
126 [ENUM]
127 [
128     [DESCRIPTION]   
129     These output types are used with FSOUND_SetOutput, to choose which output driver to use.
130     
131     FSOUND_OUTPUT_DSOUND will not support hardware 3d acceleration if the sound card driver 
132     does not support DirectX 6 Voice Manager Extensions.
133
134     FSOUND_OUTPUT_WINMM is recommended for NT and CE.
135
136     [SEE_ALSO]      
137     FSOUND_SetOutput
138     FSOUND_GetOutput
139 ]
140 */
141 enum FSOUND_OUTPUTTYPES
142 {
143     FSOUND_OUTPUT_NOSOUND,    /* NoSound driver, all calls to this succeed but do nothing. */
144     FSOUND_OUTPUT_WINMM,      /* Windows Multimedia driver. */
145     FSOUND_OUTPUT_DSOUND,     /* DirectSound driver.  You need this to get EAX2 or EAX3 support, or FX api support. */
146     FSOUND_OUTPUT_A3D,        /* A3D driver. */
147
148     FSOUND_OUTPUT_OSS,        /* Linux/Unix OSS (Open Sound System) driver, i.e. the kernel sound drivers. */
149     FSOUND_OUTPUT_ESD,        /* Linux/Unix ESD (Enlightment Sound Daemon) driver. */
150     FSOUND_OUTPUT_ALSA,       /* Linux Alsa driver. */
151
152     FSOUND_OUTPUT_ASIO,       /* Low latency ASIO driver */
153     FSOUND_OUTPUT_XBOX,       /* Xbox driver */
154     FSOUND_OUTPUT_PS2,        /* PlayStation 2 driver */
155     FSOUND_OUTPUT_MAC,        /* Mac SoundManager driver */
156     FSOUND_OUTPUT_GC,         /* Gamecube driver */
157
158     FSOUND_OUTPUT_NOSOUND_NONREALTIME   /* This is the same as nosound, but the sound generation is driven by FSOUND_Update */
159 };
160
161
162 /*
163 [ENUM]
164 [
165     [DESCRIPTION]   
166     These mixer types are used with FSOUND_SetMixer, to choose which mixer to use, or to act 
167     upon for other reasons using FSOUND_GetMixer.
168     It is not nescessary to set the mixer.  FMOD will autodetect the best mixer for you.
169
170     [SEE_ALSO]      
171     FSOUND_SetMixer
172     FSOUND_GetMixer
173 ]
174 */
175 enum FSOUND_MIXERTYPES
176 {
177     FSOUND_MIXER_AUTODETECT,        /* CE/PS2/GC Only - Non interpolating/low quality mixer. */
178     FSOUND_MIXER_BLENDMODE,         /* Removed / obsolete. */
179     FSOUND_MIXER_MMXP5,             /* Removed / obsolete. */
180     FSOUND_MIXER_MMXP6,             /* Removed / obsolete. */
181
182     FSOUND_MIXER_QUALITY_AUTODETECT,/* All platforms - Autodetect the fastest quality mixer based on your cpu. */
183     FSOUND_MIXER_QUALITY_FPU,       /* Win32/Linux only - Interpolating/volume ramping FPU mixer.  */
184     FSOUND_MIXER_QUALITY_MMXP5,     /* Win32/Linux only - Interpolating/volume ramping P5 MMX mixer.  */
185     FSOUND_MIXER_QUALITY_MMXP6,     /* Win32/Linux only - Interpolating/volume ramping ppro+ MMX mixer. */
186
187     FSOUND_MIXER_MONO,              /* CE/PS2/GC only - MONO non interpolating/low quality mixer. For speed*/
188     FSOUND_MIXER_QUALITY_MONO,      /* CE/PS2/GC only - MONO Interpolating mixer.  For speed */
189
190     FSOUND_MIXER_MAX
191 };
192
193
194 /*
195 [ENUM]
196 [
197     [DESCRIPTION]   
198     These definitions describe the type of song being played.
199
200     [SEE_ALSO]      
201     FMUSIC_GetType  
202 ]
203 */
204 enum FMUSIC_TYPES
205 {
206     FMUSIC_TYPE_NONE,       
207     FMUSIC_TYPE_MOD,        /* Protracker / Fasttracker */
208     FMUSIC_TYPE_S3M,        /* ScreamTracker 3 */
209     FMUSIC_TYPE_XM,         /* FastTracker 2 */
210     FMUSIC_TYPE_IT,         /* Impulse Tracker. */
211     FMUSIC_TYPE_MIDI,       /* MIDI file */
212     FMUSIC_TYPE_FSB         /* FMOD Sample Bank file */
213 };
214
215
216 /*
217 [DEFINE_START] 
218 [
219     [NAME] 
220     FSOUND_DSP_PRIORITIES
221
222     [DESCRIPTION]   
223     These default priorities are used by FMOD internal system DSP units.  They describe the 
224     position of the DSP chain, and the order of how audio processing is executed.
225     You can actually through the use of FSOUND_DSP_GetxxxUnit (where xxx is the name of the DSP
226     unit), disable or even change the priority of a DSP unit.
227
228     [SEE_ALSO]      
229     FSOUND_DSP_Create
230     FSOUND_DSP_SetPriority
231     FSOUND_DSP_GetSpectrum
232 ]
233 */
234 #define FSOUND_DSP_DEFAULTPRIORITY_CLEARUNIT        0       /* DSP CLEAR unit - done first */
235 #define FSOUND_DSP_DEFAULTPRIORITY_SFXUNIT          100     /* DSP SFX unit - done second */
236 #define FSOUND_DSP_DEFAULTPRIORITY_MUSICUNIT        200     /* DSP MUSIC unit - done third */
237 #define FSOUND_DSP_DEFAULTPRIORITY_USER             300     /* User priority, use this as reference for your own DSP units */
238 #define FSOUND_DSP_DEFAULTPRIORITY_FFTUNIT          900     /* This reads data for FSOUND_DSP_GetSpectrum, so it comes after user units */
239 #define FSOUND_DSP_DEFAULTPRIORITY_CLIPANDCOPYUNIT  1000    /* DSP CLIP AND COPY unit - last */
240 /* [DEFINE_END] */
241
242
243 /*
244 [DEFINE_START] 
245 [
246     [NAME] 
247     FSOUND_CAPS
248
249     [DESCRIPTION]   
250     Driver description bitfields.  Use FSOUND_Driver_GetCaps to determine if a driver enumerated
251     has the settings you are after.  The enumerated driver depends on the output mode, see
252     FSOUND_OUTPUTTYPES
253
254     [SEE_ALSO]
255     FSOUND_GetDriverCaps
256     FSOUND_OUTPUTTYPES
257 ]
258 */
259 #define FSOUND_CAPS_HARDWARE                0x1     /* This driver supports hardware accelerated 3d sound. */
260 #define FSOUND_CAPS_EAX2                    0x2     /* This driver supports EAX 2 reverb */
261 #define FSOUND_CAPS_EAX3                    0x10    /* This driver supports EAX 3 reverb */
262 /* [DEFINE_END] */
263
264
265 /*
266 [DEFINE_START] 
267 [
268     [NAME] 
269     FSOUND_MODES
270     
271     [DESCRIPTION]   
272     Sample description bitfields, OR them together for loading and describing samples.
273     NOTE.  If the file format being loaded already has a defined format, such as WAV or MP3, then 
274     trying to override the pre-defined format with a new set of format flags will not work.  For
275     example, an 8 bit WAV file will not load as 16bit if you specify FSOUND_16BITS.  It will just
276     ignore the flag and go ahead loading it as 8bits.  For these type of formats the only flags
277     you can specify that will really alter the behaviour of how it is loaded, are the following.
278     ---------
279     Looping behaviour - FSOUND_LOOP_OFF, FSOUND_LOOP_NORMAL, FSOUND_LOOP_BIDI 
280     Load destination - FSOUND_HW3D, FSOUND_HW2D, FSOUND_2D
281     Loading behaviour - FSOUND_NONBLOCKING, FSOUND_LOADMEMORY, FSOUND_LOADRAW, FSOUND_MPEGACCURATE, FSOUND_MPEGHALFRATE, FSOUND_FORCEMONO
282     Playback behaviour - FSOUND_STREAMABLE, FSOUND_ENABLEFX
283     PlayStation 2 only - FSOUND_USECORE0, FSOUND_USECORE1, FSOUND_LOADMEMORYIOP    
284     ---------
285     See flag descriptions for what these do.
286 ]
287 */
288 #define FSOUND_LOOP_OFF      0x00000001  /* For non looping samples. */
289 #define FSOUND_LOOP_NORMAL   0x00000002  /* For forward looping samples. */
290 #define FSOUND_LOOP_BIDI     0x00000004  /* For bidirectional looping samples.  (no effect if in hardware). */
291 #define FSOUND_8BITS         0x00000008  /* For 8 bit samples. */
292 #define FSOUND_16BITS        0x00000010  /* For 16 bit samples. */
293 #define FSOUND_MONO          0x00000020  /* For mono samples. */
294 #define FSOUND_STEREO        0x00000040  /* For stereo samples. */
295 #define FSOUND_UNSIGNED      0x00000080  /* For user created source data containing unsigned samples. */
296 #define FSOUND_SIGNED        0x00000100  /* For user created source data containing signed data. */
297 #define FSOUND_DELTA         0x00000200  /* For user created source data stored as delta values. */
298 #define FSOUND_IT214         0x00000400  /* For user created source data stored using IT214 compression. */
299 #define FSOUND_IT215         0x00000800  /* For user created source data stored using IT215 compression. */
300 #define FSOUND_HW3D          0x00001000  /* Attempts to make samples use 3d hardware acceleration. (if the card supports it) */
301 #define FSOUND_2D            0x00002000  /* Tells software (not hardware) based sample not to be included in 3d processing. */
302 #define FSOUND_STREAMABLE    0x00004000  /* For a streamimg sound where you feed the data to it. */
303 #define FSOUND_LOADMEMORY    0x00008000  /* "name" will be interpreted as a pointer to data for streaming and samples. */
304 #define FSOUND_LOADRAW       0x00010000  /* Will ignore file format and treat as raw pcm. */
305 #define FSOUND_MPEGACCURATE  0x00020000  /* For FSOUND_Stream_Open - for accurate FSOUND_Stream_GetLengthMs/FSOUND_Stream_SetTime.  WARNING, see FSOUND_Stream_Open for inital opening time performance issues. */
306 #define FSOUND_FORCEMONO     0x00040000  /* For forcing stereo streams and samples to be mono - needed if using FSOUND_HW3D and stereo data - incurs a small speed hit for streams */
307 #define FSOUND_HW2D          0x00080000  /* 2D hardware sounds.  allows hardware specific effects */
308 #define FSOUND_ENABLEFX      0x00100000  /* Allows DX8 FX to be played back on a sound.  Requires DirectX 8 - Note these sounds cannot be played more than once, be 8 bit, be less than a certain size, or have a changing frequency */
309 #define FSOUND_MPEGHALFRATE  0x00200000  /* For FMODCE only - decodes mpeg streams using a lower quality decode, but faster execution */
310 #define FSOUND_IMAADPCM      0x00400000  /* Contents are stored compressed as IMA ADPCM */
311 #define FSOUND_VAG           0x00800000  /* For PS2 only - Contents are compressed as Sony VAG format */
312 #define FSOUND_NONBLOCKING   0x01000000  /* For FSOUND_Stream_Open/FMUSIC_LoadSong - Causes stream or music to open in the background and not block the foreground app.  See FSOUND_Stream_GetOpenState or FMUSIC_GetOpenState to determine when it IS ready. */
313 #define FSOUND_GCADPCM       0x02000000  /* For Gamecube only - Contents are compressed as Gamecube DSP-ADPCM format */
314 #define FSOUND_MULTICHANNEL  0x04000000  /* For PS2 and Gamecube only - Contents are interleaved into a multi-channel (more than stereo) format */
315 #define FSOUND_USECORE0      0x08000000  /* For PS2 only - Sample/Stream is forced to use hardware voices 00-23 */
316 #define FSOUND_USECORE1      0x10000000  /* For PS2 only - Sample/Stream is forced to use hardware voices 24-47 */
317 #define FSOUND_LOADMEMORYIOP 0x20000000  /* For PS2 only - "name" will be interpreted as a pointer to data for streaming and samples.  The address provided will be an IOP address */
318 #define FSOUND_IGNORETAGS    0x40000000  /* Skips id3v2 etc tag checks when opening a stream, to reduce seek/read overhead when opening files (helps with CD performance) */
319 #define FSOUND_STREAM_NET    0x80000000  /* Specifies an internet stream */
320
321 #define FSOUND_NORMAL       (FSOUND_16BITS | FSOUND_SIGNED | FSOUND_MONO)      
322 /* [DEFINE_END] */
323
324
325
326 /*
327 [DEFINE_START] 
328 [
329     [NAME] 
330     FSOUND_CDPLAYMODES
331     
332     [DESCRIPTION]   
333     Playback method for a CD Audio track, with FSOUND_CD_SetPlayMode
334
335     [SEE_ALSO]    
336     FSOUND_CD_SetPlayMode  
337     FSOUND_CD_Play
338 ]
339 */
340 #define FSOUND_CD_PLAYCONTINUOUS    0   /* Starts from the current track and plays to end of CD. */
341 #define FSOUND_CD_PLAYONCE          1   /* Plays the specified track then stops. */
342 #define FSOUND_CD_PLAYLOOPED        2   /* Plays the specified track looped, forever until stopped manually. */
343 #define FSOUND_CD_PLAYRANDOM        3   /* Plays tracks in random order */
344 /* [DEFINE_END] */
345
346
347 /*
348 [DEFINE_START] 
349 [
350     [NAME] 
351     FSOUND_MISC_VALUES
352     
353     [DESCRIPTION]
354     Miscellaneous values for FMOD functions.
355
356     [SEE_ALSO]
357     FSOUND_PlaySound
358     FSOUND_PlaySoundEx
359     FSOUND_Sample_Alloc
360     FSOUND_Sample_Load
361     FSOUND_SetPan
362 ]
363 */
364 #define FSOUND_FREE             -1      /* value to play on any free channel, or to allocate a sample in a free sample slot. */
365 #define FSOUND_UNMANAGED        -2      /* value to allocate a sample that is NOT managed by FSOUND or placed in a sample slot. */
366 #define FSOUND_ALL              -3      /* for a channel index , this flag will affect ALL channels available!  Not supported by every function. */
367 #define FSOUND_STEREOPAN        -1      /* value for FSOUND_SetPan so that stereo sounds are not played at half volume.  See FSOUND_SetPan for more on this. */
368 #define FSOUND_SYSTEMCHANNEL    -1000   /* special 'channel' ID for all channel based functions that want to alter the global FSOUND software mixing output channel */
369 #define FSOUND_SYSTEMSAMPLE     -1000   /* special 'sample' ID for all sample based functions that want to alter the global FSOUND software mixing output sample */
370
371 /* [DEFINE_END] */
372
373
374 /*
375 [STRUCTURE] 
376 [
377     [DESCRIPTION]
378     Structure defining a reverb environment.
379     For more indepth descriptions of the reverb properties under win32, please see the EAX2 and EAX3
380     documentation at http://developer.creative.com/ under the 'downloads' section.
381     If they do not have the EAX3 documentation, then most information can be attained from
382     the EAX2 documentation, as EAX3 only adds some more parameters and functionality on top of EAX2.
383     Note the default reverb properties are the same as the FSOUND_PRESET_GENERIC preset.
384     Note that integer values that typically range from -10,000 to 1000 are represented in decibels, and are of a logarithmic scale, not linear, wheras float values are typically linear.
385     PORTABILITY: Each member has the platform it supports in braces ie (win32/xbox).  
386     Some reverb parameters are only supported in win32 and some only on xbox. If all parameters are set then the reverb should product a similar effect on either platform.
387     
388     The numerical values listed below are the maximum, minimum and default values for each variable respectively.
389
390     [SEE_ALSO]
391     FSOUND_Reverb_SetProperties
392     FSOUND_Reverb_GetProperties
393     FSOUND_REVERB_PRESETS
394     FSOUND_REVERB_FLAGS
395 ]
396 */
397 typedef struct _FSOUND_REVERB_PROPERTIES /* MIN     MAX    DEFAULT   DESCRIPTION */
398 {                                   
399     unsigned int Environment;            /* 0     , 25    , 0      , sets all listener properties (WIN32/PS2 only) */
400     float        EnvSize;                /* 1.0   , 100.0 , 7.5    , environment size in meters (WIN32 only) */
401     float        EnvDiffusion;           /* 0.0   , 1.0   , 1.0    , environment diffusion (WIN32/XBOX) */
402     int          Room;                   /* -10000, 0     , -1000  , room effect level (at mid frequencies) (WIN32/XBOX/PS2) */
403     int          RoomHF;                 /* -10000, 0     , -100   , relative room effect level at high frequencies (WIN32/XBOX) */
404     int          RoomLF;                 /* -10000, 0     , 0      , relative room effect level at low frequencies (WIN32 only) */
405     float        DecayTime;              /* 0.1   , 20.0  , 1.49   , reverberation decay time at mid frequencies (WIN32/XBOX) */
406     float        DecayHFRatio;           /* 0.1   , 2.0   , 0.83   , high-frequency to mid-frequency decay time ratio (WIN32/XBOX) */
407     float        DecayLFRatio;           /* 0.1   , 2.0   , 1.0    , low-frequency to mid-frequency decay time ratio (WIN32 only) */
408     int          Reflections;            /* -10000, 1000  , -2602  , early reflections level relative to room effect (WIN32/XBOX) */
409     float        ReflectionsDelay;       /* 0.0   , 0.3   , 0.007  , initial reflection delay time (WIN32/XBOX) */
410     float        ReflectionsPan[3];      /*       ,       , [0,0,0], early reflections panning vector (WIN32 only) */
411     int          Reverb;                 /* -10000, 2000  , 200    , late reverberation level relative to room effect (WIN32/XBOX) */
412     float        ReverbDelay;            /* 0.0   , 0.1   , 0.011  , late reverberation delay time relative to initial reflection (WIN32/XBOX) */
413     float        ReverbPan[3];           /*       ,       , [0,0,0], late reverberation panning vector (WIN32 only) */
414     float        EchoTime;               /* .075  , 0.25  , 0.25   , echo time (WIN32/PS2 only.  PS2 = Delay time for ECHO/DELAY modes only) */
415     float        EchoDepth;              /* 0.0   , 1.0   , 0.0    , echo depth (WIN32/PS2 only.  PS2 = Feedback level for ECHO mode only) */
416     float        ModulationTime;         /* 0.04  , 4.0   , 0.25   , modulation time (WIN32 only) */
417     float        ModulationDepth;        /* 0.0   , 1.0   , 0.0    , modulation depth (WIN32 only) */
418     float        AirAbsorptionHF;        /* -100  , 0.0   , -5.0   , change in level per meter at high frequencies (WIN32 only) */
419     float        HFReference;            /* 1000.0, 20000 , 5000.0 , reference high frequency (hz) (WIN32/XBOX) */
420     float        LFReference;            /* 20.0  , 1000.0, 250.0  , reference low frequency (hz) (WIN32 only) */
421     float        RoomRolloffFactor;      /* 0.0   , 10.0  , 0.0    , like FSOUND_3D_SetRolloffFactor but for room effect (WIN32/XBOX) */
422     float        Diffusion;              /* 0.0   , 100.0 , 100.0  , Value that controls the echo density in the late reverberation decay. (XBOX only) */
423     float        Density;                /* 0.0   , 100.0 , 100.0  , Value that controls the modal density in the late reverberation decay (XBOX only) */
424     unsigned int Flags;                  /* FSOUND_REVERB_FLAGS - modifies the behavior of above properties (WIN32/PS2 only) */
425 } FSOUND_REVERB_PROPERTIES;
426
427
428 /*
429 [DEFINE_START] 
430 [
431     [NAME] 
432     FSOUND_REVERB_FLAGS
433     
434     [DESCRIPTION]
435     Values for the Flags member of the FSOUND_REVERB_PROPERTIES structure.
436
437     [SEE_ALSO]
438     FSOUND_REVERB_PROPERTIES
439 ]
440 */
441 #define FSOUND_REVERB_FLAGS_DECAYTIMESCALE        0x00000001 /* 'EnvSize' affects reverberation decay time */
442 #define FSOUND_REVERB_FLAGS_REFLECTIONSSCALE      0x00000002 /* 'EnvSize' affects reflection level */
443 #define FSOUND_REVERB_FLAGS_REFLECTIONSDELAYSCALE 0x00000004 /* 'EnvSize' affects initial reflection delay time */
444 #define FSOUND_REVERB_FLAGS_REVERBSCALE           0x00000008 /* 'EnvSize' affects reflections level */
445 #define FSOUND_REVERB_FLAGS_REVERBDELAYSCALE      0x00000010 /* 'EnvSize' affects late reverberation delay time */
446 #define FSOUND_REVERB_FLAGS_DECAYHFLIMIT          0x00000020 /* AirAbsorptionHF affects DecayHFRatio */
447 #define FSOUND_REVERB_FLAGS_ECHOTIMESCALE         0x00000040 /* 'EnvSize' affects echo time */
448 #define FSOUND_REVERB_FLAGS_MODULATIONTIMESCALE   0x00000080 /* 'EnvSize' affects modulation time */
449 #define FSOUND_REVERB_FLAGS_CORE0                 0x00000100 /* PS2 Only - Reverb is applied to CORE0 (hw voices 0-23) */
450 #define FSOUND_REVERB_FLAGS_CORE1                 0x00000200 /* PS2 Only - Reverb is applied to CORE1 (hw voices 24-47) */
451 #define FSOUND_REVERB_FLAGS_DEFAULT              (FSOUND_REVERB_FLAGS_DECAYTIMESCALE |        \
452                                                   FSOUND_REVERB_FLAGS_REFLECTIONSSCALE |      \
453                                                   FSOUND_REVERB_FLAGS_REFLECTIONSDELAYSCALE | \
454                                                   FSOUND_REVERB_FLAGS_REVERBSCALE |           \
455                                                   FSOUND_REVERB_FLAGS_REVERBDELAYSCALE |      \
456                                                   FSOUND_REVERB_FLAGS_DECAYHFLIMIT |          \
457                                                   FSOUND_REVERB_FLAGS_CORE0 |                 \
458                                                   FSOUND_REVERB_FLAGS_CORE1 )
459 /* [DEFINE_END] */
460
461
462
463
464 /*
465 [DEFINE_START] 
466 [
467     [NAME] 
468     FSOUND_REVERB_PRESETS
469     
470     [DESCRIPTION]   
471     A set of predefined environment PARAMETERS, created by Creative Labs
472     These are used to initialize an FSOUND_REVERB_PROPERTIES structure statically.
473     ie 
474     FSOUND_REVERB_PROPERTIES prop = FSOUND_PRESET_GENERIC;
475
476     [SEE_ALSO]
477     FSOUND_Reverb_SetProperties
478 ]
479 */
480 /*                                     Env  Size    Diffus  Room   RoomHF  RmLF DecTm   DecHF  DecLF   Refl  RefDel  RefPan               Revb  RevDel  ReverbPan           EchoTm  EchDp  ModTm  ModDp  AirAbs  HFRef    LFRef  RRlOff Diffus  Densty  FLAGS */
481 #define FSOUND_PRESET_OFF              {0,      7.5f,   1.00f, -10000, -10000, 0,   1.00f,  1.00f, 1.0f,  -2602, 0.007f, { 0.0f,0.0f,0.0f },   200, 0.011f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f,   0.0f,   0.0f, 0x33f }
482 #define FSOUND_PRESET_GENERIC          {0,      7.5f,   1.00f, -1000,  -100,   0,   1.49f,  0.83f, 1.0f,  -2602, 0.007f, { 0.0f,0.0f,0.0f },   200, 0.011f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x3f }
483 #define FSOUND_PRESET_PADDEDCELL       {1,      1.4f,   1.00f, -1000,  -6000,  0,   0.17f,  0.10f, 1.0f,  -1204, 0.001f, { 0.0f,0.0f,0.0f },   207, 0.002f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x3f }
484 #define FSOUND_PRESET_ROOM                 {2,  1.9f,   1.00f, -1000,  -454,   0,   0.40f,  0.83f, 1.0f,  -1646, 0.002f, { 0.0f,0.0f,0.0f },    53, 0.003f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x3f }
485 #define FSOUND_PRESET_BATHROOM         {3,      1.4f,   1.00f, -1000,  -1200,  0,   1.49f,  0.54f, 1.0f,   -370, 0.007f, { 0.0f,0.0f,0.0f },  1030, 0.011f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f,  60.0f, 0x3f }
486 #define FSOUND_PRESET_LIVINGROOM       {4,      2.5f,   1.00f, -1000,  -6000,  0,   0.50f,  0.10f, 1.0f,  -1376, 0.003f, { 0.0f,0.0f,0.0f }, -1104, 0.004f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x3f }
487 #define FSOUND_PRESET_STONEROOM        {5,      11.6f,  1.00f, -1000,  -300,   0,   2.31f,  0.64f, 1.0f,   -711, 0.012f, { 0.0f,0.0f,0.0f },    83, 0.017f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x3f }
488 #define FSOUND_PRESET_AUDITORIUM       {6,      21.6f,  1.00f, -1000,  -476,   0,   4.32f,  0.59f, 1.0f,   -789, 0.020f, { 0.0f,0.0f,0.0f },  -289, 0.030f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x3f }
489 #define FSOUND_PRESET_CONCERTHALL      {7,      19.6f,  1.00f, -1000,  -500,   0,   3.92f,  0.70f, 1.0f,  -1230, 0.020f, { 0.0f,0.0f,0.0f },    -2, 0.029f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x3f }
490 #define FSOUND_PRESET_CAVE             {8,      14.6f,  1.00f, -1000,  0,      0,   2.91f,  1.30f, 1.0f,   -602, 0.015f, { 0.0f,0.0f,0.0f },  -302, 0.022f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x1f }
491 #define FSOUND_PRESET_ARENA            {9,      36.2f,  1.00f, -1000,  -698,   0,   7.24f,  0.33f, 1.0f,  -1166, 0.020f, { 0.0f,0.0f,0.0f },    16, 0.030f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x3f }
492 #define FSOUND_PRESET_HANGAR           {10,     50.3f,  1.00f, -1000,  -1000,  0,   10.05f, 0.23f, 1.0f,   -602, 0.020f, { 0.0f,0.0f,0.0f },   198, 0.030f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x3f }
493 #define FSOUND_PRESET_CARPETTEDHALLWAY {11,     1.9f,   1.00f, -1000,  -4000,  0,   0.30f,  0.10f, 1.0f,  -1831, 0.002f, { 0.0f,0.0f,0.0f }, -1630, 0.030f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x3f }
494 #define FSOUND_PRESET_HALLWAY          {12,     1.8f,   1.00f, -1000,  -300,   0,   1.49f,  0.59f, 1.0f,  -1219, 0.007f, { 0.0f,0.0f,0.0f },   441, 0.011f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x3f }
495 #define FSOUND_PRESET_STONECORRIDOR    {13,     13.5f,  1.00f, -1000,  -237,   0,   2.70f,  0.79f, 1.0f,  -1214, 0.013f, { 0.0f,0.0f,0.0f },   395, 0.020f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x3f }
496 #define FSOUND_PRESET_ALLEY            {14,     7.5f,   0.30f, -1000,  -270,   0,   1.49f,  0.86f, 1.0f,  -1204, 0.007f, { 0.0f,0.0f,0.0f },    -4, 0.011f, { 0.0f,0.0f,0.0f }, 0.125f, 0.95f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x3f }
497 #define FSOUND_PRESET_FOREST           {15,     38.0f,  0.30f, -1000,  -3300,  0,   1.49f,  0.54f, 1.0f,  -2560, 0.162f, { 0.0f,0.0f,0.0f },  -229, 0.088f, { 0.0f,0.0f,0.0f }, 0.125f, 1.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f,  79.0f, 100.0f, 0x3f }
498 #define FSOUND_PRESET_CITY             {16,     7.5f,   0.50f, -1000,  -800,   0,   1.49f,  0.67f, 1.0f,  -2273, 0.007f, { 0.0f,0.0f,0.0f }, -1691, 0.011f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f,  50.0f, 100.0f, 0x3f }
499 #define FSOUND_PRESET_MOUNTAINS        {17,     100.0f, 0.27f, -1000,  -2500,  0,   1.49f,  0.21f, 1.0f,  -2780, 0.300f, { 0.0f,0.0f,0.0f }, -1434, 0.100f, { 0.0f,0.0f,0.0f }, 0.250f, 1.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f,  27.0f, 100.0f, 0x1f }
500 #define FSOUND_PRESET_QUARRY           {18,     17.5f,  1.00f, -1000,  -1000,  0,   1.49f,  0.83f, 1.0f, -10000, 0.061f, { 0.0f,0.0f,0.0f },   500, 0.025f, { 0.0f,0.0f,0.0f }, 0.125f, 0.70f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x3f }
501 #define FSOUND_PRESET_PLAIN            {19,     42.5f,  0.21f, -1000,  -2000,  0,   1.49f,  0.50f, 1.0f,  -2466, 0.179f, { 0.0f,0.0f,0.0f }, -1926, 0.100f, { 0.0f,0.0f,0.0f }, 0.250f, 1.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f,  21.0f, 100.0f, 0x3f }
502 #define FSOUND_PRESET_PARKINGLOT       {20,     8.3f,   1.00f, -1000,  0,      0,   1.65f,  1.50f, 1.0f,  -1363, 0.008f, { 0.0f,0.0f,0.0f }, -1153, 0.012f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x1f }
503 #define FSOUND_PRESET_SEWERPIPE        {21,     1.7f,   0.80f, -1000,  -1000,  0,   2.81f,  0.14f, 1.0f,    429, 0.014f, { 0.0f,0.0f,0.0f },  1023, 0.021f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 0.000f, -5.0f, 5000.0f, 250.0f, 0.0f,  80.0f,  60.0f, 0x3f }
504 #define FSOUND_PRESET_UNDERWATER       {22,     1.8f,   1.00f, -1000,  -4000,  0,   1.49f,  0.10f, 1.0f,   -449, 0.007f, { 0.0f,0.0f,0.0f },  1700, 0.011f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 1.18f, 0.348f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x3f }
505
506 /* Non I3DL2 presets */
507
508 #define FSOUND_PRESET_DRUGGED          {23,     1.9f,   0.50f, -1000,  0,      0,   8.39f,  1.39f, 1.0f,  -115,  0.002f, { 0.0f,0.0f,0.0f },   985, 0.030f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 0.25f, 1.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x1f }
509 #define FSOUND_PRESET_DIZZY            {24,     1.8f,   0.60f, -1000,  -400,   0,   17.23f, 0.56f, 1.0f,  -1713, 0.020f, { 0.0f,0.0f,0.0f },  -613, 0.030f, { 0.0f,0.0f,0.0f }, 0.250f, 1.00f, 0.81f, 0.310f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x1f }
510 #define FSOUND_PRESET_PSYCHOTIC        {25,     1.0f,   0.50f, -1000,  -151,   0,   7.56f,  0.91f, 1.0f,  -626,  0.020f, { 0.0f,0.0f,0.0f },   774, 0.030f, { 0.0f,0.0f,0.0f }, 0.250f, 0.00f, 4.00f, 1.000f, -5.0f, 5000.0f, 250.0f, 0.0f, 100.0f, 100.0f, 0x1f }
511
512 /* PlayStation 2 Only presets */
513
514 #define FSOUND_PRESET_PS2_ROOM         {1,      0,          0,         0,  0,      0,   0.0f,   0.0f,  0.0f,     0,  0.000f, { 0.0f,0.0f,0.0f },     0, 0.000f, { 0.0f,0.0f,0.0f }, 0.000f, 0.00f, 0.00f, 0.000f,  0.0f, 0000.0f,   0.0f, 0.0f,   0.0f,   0.0f, 0x31f }
515 #define FSOUND_PRESET_PS2_STUDIO_A     {2,      0,          0,         0,  0,      0,   0.0f,   0.0f,  0.0f,     0,  0.000f, { 0.0f,0.0f,0.0f },     0, 0.000f, { 0.0f,0.0f,0.0f }, 0.000f, 0.00f, 0.00f, 0.000f,  0.0f, 0000.0f,   0.0f, 0.0f,   0.0f,   0.0f, 0x31f }
516 #define FSOUND_PRESET_PS2_STUDIO_B     {3,      0,          0,         0,  0,      0,   0.0f,   0.0f,  0.0f,     0,  0.000f, { 0.0f,0.0f,0.0f },     0, 0.000f, { 0.0f,0.0f,0.0f }, 0.000f, 0.00f, 0.00f, 0.000f,  0.0f, 0000.0f,   0.0f, 0.0f,   0.0f,   0.0f, 0x31f }
517 #define FSOUND_PRESET_PS2_STUDIO_C     {4,      0,          0,         0,  0,      0,   0.0f,   0.0f,  0.0f,     0,  0.000f, { 0.0f,0.0f,0.0f },     0, 0.000f, { 0.0f,0.0f,0.0f }, 0.000f, 0.00f, 0.00f, 0.000f,  0.0f, 0000.0f,   0.0f, 0.0f,   0.0f,   0.0f, 0x31f }
518 #define FSOUND_PRESET_PS2_HALL         {5,      0,          0,         0,  0,      0,   0.0f,   0.0f,  0.0f,     0,  0.000f, { 0.0f,0.0f,0.0f },     0, 0.000f, { 0.0f,0.0f,0.0f }, 0.000f, 0.00f, 0.00f, 0.000f,  0.0f, 0000.0f,   0.0f, 0.0f,   0.0f,   0.0f, 0x31f }
519 #define FSOUND_PRESET_PS2_SPACE        {6,      0,          0,         0,  0,      0,   0.0f,   0.0f,  0.0f,     0,  0.000f, { 0.0f,0.0f,0.0f },     0, 0.000f, { 0.0f,0.0f,0.0f }, 0.000f, 0.00f, 0.00f, 0.000f,  0.0f, 0000.0f,   0.0f, 0.0f,   0.0f,   0.0f, 0x31f }
520 #define FSOUND_PRESET_PS2_ECHO         {7,      0,          0,         0,  0,      0,   0.0f,   0.0f,  0.0f,     0,  0.000f, { 0.0f,0.0f,0.0f },     0, 0.000f, { 0.0f,0.0f,0.0f }, 0.000f, 0.00f, 0.00f, 0.000f,  0.0f, 0000.0f,   0.0f, 0.0f,   0.0f,   0.0f, 0x31f }
521 #define FSOUND_PRESET_PS2_DELAY        {8,      0,          0,         0,  0,      0,   0.0f,   0.0f,  0.0f,     0,  0.000f, { 0.0f,0.0f,0.0f },     0, 0.000f, { 0.0f,0.0f,0.0f }, 0.000f, 0.00f, 0.00f, 0.000f,  0.0f, 0000.0f,   0.0f, 0.0f,   0.0f,   0.0f, 0x31f }
522 #define FSOUND_PRESET_PS2_PIPE         {9,      0,          0,         0,  0,      0,   0.0f,   0.0f,  0.0f,     0,  0.000f, { 0.0f,0.0f,0.0f },     0, 0.000f, { 0.0f,0.0f,0.0f }, 0.000f, 0.00f, 0.00f, 0.000f,  0.0f, 0000.0f,   0.0f, 0.0f,   0.0f,   0.0f, 0x31f }
523
524 /* [DEFINE_END] */
525
526
527 /*
528 [STRUCTURE] 
529 [
530     [DESCRIPTION]
531     Structure defining the properties for a reverb source, related to a FSOUND channel.
532     For more indepth descriptions of the reverb properties under win32, please see the EAX3
533     documentation at http://developer.creative.com/ under the 'downloads' section.
534     If they do not have the EAX3 documentation, then most information can be attained from
535     the EAX2 documentation, as EAX3 only adds some more parameters and functionality on top of 
536     EAX2.
537     
538     Note the default reverb properties are the same as the FSOUND_PRESET_GENERIC preset.
539     Note that integer values that typically range from -10,000 to 1000 are represented in 
540     decibels, and are of a logarithmic scale, not linear, wheras float values are typically linear.
541     PORTABILITY: Each member has the platform it supports in braces ie (win32/xbox).  
542     Some reverb parameters are only supported in win32 and some only on xbox. If all parameters are set then
543     the reverb should product a similar effect on either platform.
544     Linux and FMODCE do not support the reverb api.
545     
546     The numerical values listed below are the maximum, minimum and default values for each variable respectively.
547
548     [SEE_ALSO]
549     FSOUND_Reverb_SetChannelProperties
550     FSOUND_Reverb_GetChannelProperties
551     FSOUND_REVERB_CHANNELFLAGS
552 ]
553 */
554 typedef struct _FSOUND_REVERB_CHANNELPROPERTIES /* MIN     MAX    DEFAULT */
555 {                                   
556     int    Direct;                              /* -10000, 1000,  0,    direct path level (at low and mid frequencies) (WIN32/XBOX) */
557     int    DirectHF;                            /* -10000, 0,     0,    relative direct path level at high frequencies (WIN32/XBOX) */
558     int    Room;                                /* -10000, 1000,  0,    room effect level (at low and mid frequencies) (WIN32/XBOX/PS2) */
559     int    RoomHF;                              /* -10000, 0,     0,    relative room effect level at high frequencies (WIN32/XBOX) */
560     int    Obstruction;                         /* -10000, 0,     0,    main obstruction control (attenuation at high frequencies)  (WIN32/XBOX) */
561     float  ObstructionLFRatio;                  /* 0.0,    1.0,   0.0,  obstruction low-frequency level re. main control (WIN32/XBOX) */
562     int    Occlusion;                           /* -10000, 0,     0,    main occlusion control (attenuation at high frequencies) (WIN32/XBOX) */
563     float  OcclusionLFRatio;                    /* 0.0,    1.0,   0.25, occlusion low-frequency level re. main control (WIN32/XBOX) */
564     float  OcclusionRoomRatio;                  /* 0.0,    10.0,  1.5,  relative occlusion control for room effect (WIN32) */
565     float  OcclusionDirectRatio;                /* 0.0,    10.0,  1.0,  relative occlusion control for direct path (WIN32) */
566     int    Exclusion;                           /* -10000, 0,     0,    main exlusion control (attenuation at high frequencies) (WIN32) */
567     float  ExclusionLFRatio;                    /* 0.0,    1.0,   1.0,  exclusion low-frequency level re. main control (WIN32) */
568     int    OutsideVolumeHF;                     /* -10000, 0,     0,    outside sound cone level at high frequencies (WIN32) */
569     float  DopplerFactor;                       /* 0.0,    10.0,  0.0,  like DS3D flDopplerFactor but per source (WIN32) */
570     float  RolloffFactor;                       /* 0.0,    10.0,  0.0,  like DS3D flRolloffFactor but per source (WIN32) */
571     float  RoomRolloffFactor;                   /* 0.0,    10.0,  0.0,  like DS3D flRolloffFactor but for room effect (WIN32/XBOX) */
572     float  AirAbsorptionFactor;                 /* 0.0,    10.0,  1.0,  multiplies AirAbsorptionHF member of FSOUND_REVERB_PROPERTIES (WIN32) */
573     int    Flags;                               /* FSOUND_REVERB_CHANNELFLAGS - modifies the behavior of properties (WIN32) */
574 } FSOUND_REVERB_CHANNELPROPERTIES;
575
576
577 /*
578 [DEFINE_START] 
579 [
580     [NAME] 
581     FSOUND_REVERB_CHANNELFLAGS
582     
583     [DESCRIPTION]
584     Values for the Flags member of the FSOUND_REVERB_CHANNELPROPERTIES structure.
585
586     [SEE_ALSO]
587     FSOUND_REVERB_CHANNELPROPERTIES
588 ]
589 */
590 #define FSOUND_REVERB_CHANNELFLAGS_DIRECTHFAUTO  0x00000001 /* Automatic setting of 'Direct'  due to distance from listener */
591 #define FSOUND_REVERB_CHANNELFLAGS_ROOMAUTO      0x00000002 /* Automatic setting of 'Room'  due to distance from listener */
592 #define FSOUND_REVERB_CHANNELFLAGS_ROOMHFAUTO    0x00000004 /* Automatic setting of 'RoomHF' due to distance from listener */
593 #define FSOUND_REVERB_CHANNELFLAGS_DEFAULT       (FSOUND_REVERB_CHANNELFLAGS_DIRECTHFAUTO |   \
594                                                   FSOUND_REVERB_CHANNELFLAGS_ROOMAUTO|        \
595                                                   FSOUND_REVERB_CHANNELFLAGS_ROOMHFAUTO)
596 /* [DEFINE_END] */
597
598
599 /*
600 [ENUM] 
601 [
602     [DESCRIPTION]
603     These values are used with FSOUND_FX_Enable to enable DirectX 8 FX for a channel.
604
605     [SEE_ALSO]
606     FSOUND_FX_Enable
607     FSOUND_FX_Disable
608     FSOUND_FX_SetChorus
609     FSOUND_FX_SetCompressor
610     FSOUND_FX_SetDistortion
611     FSOUND_FX_SetEcho
612     FSOUND_FX_SetFlanger
613     FSOUND_FX_SetGargle
614     FSOUND_FX_SetI3DL2Reverb
615     FSOUND_FX_SetParamEQ
616     FSOUND_FX_SetWavesReverb
617 ]
618 */
619 enum FSOUND_FX_MODES
620 {
621     FSOUND_FX_CHORUS,
622     FSOUND_FX_COMPRESSOR,
623     FSOUND_FX_DISTORTION,
624     FSOUND_FX_ECHO,
625     FSOUND_FX_FLANGER,
626     FSOUND_FX_GARGLE,
627     FSOUND_FX_I3DL2REVERB,
628     FSOUND_FX_PARAMEQ,
629     FSOUND_FX_WAVES_REVERB,
630
631     FSOUND_FX_MAX
632 };
633
634 /*
635 [ENUM]
636 [
637     [DESCRIPTION]   
638     These are speaker types defined for use with the FSOUND_SetSpeakerMode command.
639     Note - Only reliably works with FSOUND_OUTPUT_DSOUND or FSOUND_OUTPUT_XBOX output modes.  Other output modes will only 
640     interpret FSOUND_SPEAKERMODE_MONO and set everything else to be stereo.
641
642     Using either DolbyDigital or DTS will use whatever 5.1 digital mode is available if destination hardware is unsure.
643
644     [SEE_ALSO]
645     FSOUND_SetSpeakerMode
646
647 ]
648 */
649 enum FSOUND_SPEAKERMODES
650 {
651     FSOUND_SPEAKERMODE_DOLBYDIGITAL,        /* Dolby Digital Output (XBOX or PC only). */
652     FSOUND_SPEAKERMODE_HEADPHONES,          /* The speakers are headphones. */
653     FSOUND_SPEAKERMODE_MONO,                /* The speakers are monaural. */
654     FSOUND_SPEAKERMODE_QUAD,                /* The speakers are quadraphonic.  */
655     FSOUND_SPEAKERMODE_STEREO,              /* The speakers are stereo (default value). */
656     FSOUND_SPEAKERMODE_SURROUND,            /* The speakers are surround sound. */
657     FSOUND_SPEAKERMODE_DTS,                 /* DTS output (XBOX only). */
658     FSOUND_SPEAKERMODE_PROLOGIC2,           /* Dolby Prologic 2.  Playstation 2 and Gamecube only.  PlayStation 2 doesnt support interior panning, but supports 48 voices simultaneously. */
659     FSOUND_SPEAKERMODE_PROLOGIC2_INTERIOR   /* Dolby Prologic 2.  Playstation 2 and Gamecube only.  PlayStation 2 does support interior panning, but only supports 24 voices simultaneously. */
660 };
661
662
663 /*
664 [DEFINE_START] 
665 [
666     [NAME] 
667     FSOUND_INIT_FLAGS
668     
669     [DESCRIPTION]   
670     Initialization flags.  Use them with FSOUND_Init in the flags parameter to change various behaviour.
671     
672     FSOUND_INIT_ENABLESYSTEMCHANNELFX Is an init mode which enables the FSOUND mixer buffer to be affected by DirectX 8 effects.
673     Note that due to limitations of DirectSound, FSOUND_Init may fail if this is enabled because the buffersize is too small.
674     This can be fixed with FSOUND_SetBufferSize.  Increase the BufferSize until it works.
675     When it is enabled you can use the FSOUND_FX api, and use FSOUND_SYSTEMCHANNEL as the channel id when setting parameters.
676
677     [SEE_ALSO]
678     FSOUND_Init
679 ]
680 */
681 #define FSOUND_INIT_USEDEFAULTMIDISYNTH     0x0001    /* Win32 only - Causes MIDI playback to force software decoding. */
682 #define FSOUND_INIT_GLOBALFOCUS             0x0002    /* Win32 only - For DirectSound output - sound is not muted when window is out of focus. */
683 #define FSOUND_INIT_ENABLESYSTEMCHANNELFX   0x0004    /* Win32 only - For DirectSound output - Allows FSOUND_FX api to be used on global software mixer output! (use FSOUND_SYSTEMCHANNEL as channel id) */
684 #define FSOUND_INIT_ACCURATEVULEVELS        0x0008    /* This latency adjusts FSOUND_GetCurrentLevels, but incurs a small cpu and memory hit */
685 #define FSOUND_INIT_PS2_DISABLECORE0REVERB  0x0010    /* PS2 only   - Disable reverb on CORE 0 (SPU2 voices 00-23) to regain SRAM */
686 #define FSOUND_INIT_PS2_DISABLECORE1REVERB  0x0020    /* PS2 only   - Disable reverb on CORE 1 (SPU2 voices 24-47) to regain SRAM */
687 #define FSOUND_INIT_PS2_SWAPDMACORES        0x0040    /* PS2 only   - By default FMOD uses DMA CH0 for mixing, CH1 for uploads, this flag swaps them around */
688 #define FSOUND_INIT_DONTLATENCYADJUST       0x0080    /* Callbacks are not latency adjusted, and are called at mix time.  Also information functions are immediate */
689 #define FSOUND_INIT_GC_INITLIBS             0x0100    /* GC only    - Initializes GC audio libraries */
690 #define FSOUND_INIT_STREAM_FROM_MAIN_THREAD 0x0200    /* Turns off fmod streamer thread, and makes streaming update from FSOUND_Update called by the user */
691 #define FSOUND_INIT_PS2_USEVOLUMERAMPING    0x0400    /* PS2 only   - Turns on volume ramping system to remove hardware clicks. */
692 #define FSOUND_INIT_DSOUND_DEFERRED         0x0800    /* Win32 only - For DirectSound output.  3D commands are batched together and executed at FSOUND_Update. */
693 #define FSOUND_INIT_DSOUND_HRTF_LIGHT       0x1000    /* Win32 only - For DirectSound output.  FSOUND_HW3D buffers use a slightly higher quality algorithm when 3d hardware acceleration is not present. */
694 #define FSOUND_INIT_DSOUND_HRTF_FULL        0x2000    /* Win32 only - For DirectSound output.  FSOUND_HW3D buffers use full quality 3d playback when 3d hardware acceleration is not present. */
695 /* [DEFINE_END] */
696
697
698 /*
699 [ENUM]
700 [
701     [DESCRIPTION]   
702     Status values for internet streams. Use FSOUND_Stream_Net_GetStatus to get the current status of an internet stream.
703
704     [SEE_ALSO]
705     FSOUND_Stream_Net_GetStatus
706 ]
707 */
708 enum FSOUND_STREAM_NET_STATUS
709 {
710     FSOUND_STREAM_NET_NOTCONNECTED = 0,     /* Stream hasn't connected yet */
711     FSOUND_STREAM_NET_CONNECTING,           /* Stream is connecting to remote host */
712     FSOUND_STREAM_NET_BUFFERING,            /* Stream is buffering data */
713     FSOUND_STREAM_NET_READY,                /* Stream is ready to play */
714     FSOUND_STREAM_NET_ERROR                 /* Stream has suffered a fatal error */
715 };
716
717
718 /*
719 [ENUM]
720 [
721     [DESCRIPTION]   
722     Describes the type of a particular tag field.
723
724     [SEE_ALSO]
725     FSOUND_Stream_GetNumTagFields
726     FSOUND_Stream_GetTagField
727     FSOUND_Stream_FindTagField
728 ]
729 */
730 enum FSOUND_TAGFIELD_TYPE
731 {
732     FSOUND_TAGFIELD_VORBISCOMMENT = 0,      /* A vorbis comment */
733     FSOUND_TAGFIELD_ID3V1,                  /* Part of an ID3v1 tag */
734     FSOUND_TAGFIELD_ID3V2,                  /* An ID3v2 frame */
735     FSOUND_TAGFIELD_SHOUTCAST,              /* A SHOUTcast header line */
736     FSOUND_TAGFIELD_ICECAST,                /* An Icecast header line */
737     FSOUND_TAGFIELD_ASF                     /* An Advanced Streaming Format header line */
738 };
739
740
741 /*
742 [DEFINE_START] 
743 [
744     [NAME] 
745     FSOUND_STATUS_FLAGS
746     
747     [DESCRIPTION]   
748     These values describe the protocol and format of an internet stream. Use FSOUND_Stream_Net_GetStatus to retrieve this information for an open internet stream.
749     
750     [SEE_ALSO]
751     FSOUND_Stream_Net_GetStatus
752 ]
753 */
754 #define FSOUND_PROTOCOL_SHOUTCAST   0x00000001
755 #define FSOUND_PROTOCOL_ICECAST     0x00000002
756 #define FSOUND_PROTOCOL_HTTP        0x00000004
757 #define FSOUND_FORMAT_MPEG          0x00010000
758 #define FSOUND_FORMAT_OGGVORBIS     0x00020000
759 /* [DEFINE_END] */
760
761
762 /*
763 [STRUCTURE] 
764 [
765     [DESCRIPTION]
766     Structure defining a CD table of contents. This structure is returned as a tag from FSOUND_Stream_FindTagField when the tag name "CD_TOC" is specified.
767     Note: All tracks on the CD - including data tracks- will be represented in this structure so it's use for anything other than generating disc id information is not recommended.
768     See the cdda example program for info on retrieving and using this structure.
769
770     [SEE_ALSO]
771     FSOUND_Stream_Open
772     FSOUND_Stream_FindTagField
773 ]
774 */
775 typedef struct _FSOUND_TOC_TAG
776 {
777     char name[4];                           /* The string "TOC", just in case this structure is accidentally treated as a string */
778     int  numtracks;                         /* The number of tracks on the CD */
779     int  min[100];                          /* The start offset of each track in minutes */
780     int  sec[100];                          /* The start offset of each track in seconds */
781     int  frame[100];                        /* The start offset of each track in frames */
782
783 } FSOUND_TOC_TAG;
784
785
786 /* ========================================================================================== */
787 /* FUNCTION PROTOTYPES                                                                        */
788 /* ========================================================================================== */
789
790 #ifdef __cplusplus
791 extern "C" {
792 #endif
793
794 /* ================================== */
795 /* Initialization / Global functions. */
796 /* ================================== */
797
798 /* 
799     PRE - FSOUND_Init functions. These can't be called after FSOUND_Init is 
800     called (they will fail). They set up FMOD system functionality. 
801 */
802
803 DLL_API signed char     F_API FSOUND_SetOutput(int outputtype);
804 DLL_API signed char     F_API FSOUND_SetDriver(int driver);
805 DLL_API signed char     F_API FSOUND_SetMixer(int mixer);
806 DLL_API signed char     F_API FSOUND_SetBufferSize(int len_ms);
807 DLL_API signed char     F_API FSOUND_SetHWND(void *hwnd);
808 DLL_API signed char     F_API FSOUND_SetMinHardwareChannels(int min);
809 DLL_API signed char     F_API FSOUND_SetMaxHardwareChannels(int max);
810 DLL_API signed char     F_API FSOUND_SetMemorySystem(void *pool, 
811                                                      int poollen, 
812                                                      FSOUND_ALLOCCALLBACK   useralloc,
813                                                      FSOUND_REALLOCCALLBACK userrealloc,
814                                                      FSOUND_FREECALLBACK    userfree);
815 /* 
816     Main initialization / closedown functions.
817     Note : Use FSOUND_INIT_USEDEFAULTMIDISYNTH with FSOUND_Init for software override 
818            with MIDI playback.
819          : Use FSOUND_INIT_GLOBALFOCUS with FSOUND_Init to make sound audible no matter 
820            which window is in focus. (FSOUND_OUTPUT_DSOUND only)
821 */
822
823 DLL_API signed char     F_API FSOUND_Init(int mixrate, int maxsoftwarechannels, unsigned int flags);
824 DLL_API void            F_API FSOUND_Close();
825
826 /* 
827     Runtime system level functions 
828 */
829
830 DLL_API void            F_API FSOUND_Update();   /* This is called to update 3d sound / non-realtime output */
831
832 DLL_API void            F_API FSOUND_SetSpeakerMode(unsigned int speakermode);
833 DLL_API void            F_API FSOUND_SetSFXMasterVolume(int volume);
834 DLL_API void            F_API FSOUND_SetPanSeperation(float pansep);
835 DLL_API void            F_API FSOUND_File_SetCallbacks(FSOUND_OPENCALLBACK  useropen,
836                                                        FSOUND_CLOSECALLBACK userclose,
837                                                        FSOUND_READCALLBACK  userread,
838                                                        FSOUND_SEEKCALLBACK  userseek,
839                                                        FSOUND_TELLCALLBACK  usertell);
840
841 /* 
842     System information functions. 
843 */
844
845 DLL_API int             F_API FSOUND_GetError();
846 DLL_API float           F_API FSOUND_GetVersion();
847 DLL_API int             F_API FSOUND_GetOutput();
848 DLL_API void *          F_API FSOUND_GetOutputHandle();
849 DLL_API int             F_API FSOUND_GetDriver();
850 DLL_API int             F_API FSOUND_GetMixer();
851 DLL_API int             F_API FSOUND_GetNumDrivers();
852 DLL_API const char *    F_API FSOUND_GetDriverName(int id);
853 DLL_API signed char     F_API FSOUND_GetDriverCaps(int id, unsigned int *caps);
854 DLL_API int             F_API FSOUND_GetOutputRate();
855 DLL_API int             F_API FSOUND_GetMaxChannels();
856 DLL_API int             F_API FSOUND_GetMaxSamples();
857 DLL_API int             F_API FSOUND_GetSFXMasterVolume();
858 DLL_API signed char     F_API FSOUND_GetNumHWChannels(int *num2d, int *num3d, int *total);
859 DLL_API int             F_API FSOUND_GetChannelsPlaying();
860 DLL_API float           F_API FSOUND_GetCPUUsage();
861 DLL_API void            F_API FSOUND_GetMemoryStats(unsigned int *currentalloced, unsigned int *maxalloced);
862
863 /* =================================== */
864 /* Sample management / load functions. */
865 /* =================================== */
866
867 /* 
868     Sample creation and management functions
869     Note : Use FSOUND_LOADMEMORY   flag with FSOUND_Sample_Load to load from memory.
870            Use FSOUND_LOADRAW      flag with FSOUND_Sample_Load to treat as as raw pcm data.
871 */
872
873 DLL_API FSOUND_SAMPLE * F_API FSOUND_Sample_Load(int index, const char *name_or_data, unsigned int mode, int offset, int length);
874 DLL_API FSOUND_SAMPLE * F_API FSOUND_Sample_Alloc(int index, int length, unsigned int mode, int deffreq, int defvol, int defpan, int defpri);
875 DLL_API void            F_API FSOUND_Sample_Free(FSOUND_SAMPLE *sptr);
876 DLL_API signed char     F_API FSOUND_Sample_Upload(FSOUND_SAMPLE *sptr, void *srcdata, unsigned int mode);
877 DLL_API signed char     F_API FSOUND_Sample_Lock(FSOUND_SAMPLE *sptr, int offset, int length, void **ptr1, void **ptr2, unsigned int *len1, unsigned int *len2);
878 DLL_API signed char     F_API FSOUND_Sample_Unlock(FSOUND_SAMPLE *sptr, void *ptr1, void *ptr2, unsigned int len1, unsigned int len2);
879
880 /*
881     Sample control functions
882 */
883
884 DLL_API signed char     F_API FSOUND_Sample_SetMode(FSOUND_SAMPLE *sptr, unsigned int mode);
885 DLL_API signed char     F_API FSOUND_Sample_SetLoopPoints(FSOUND_SAMPLE *sptr, int loopstart, int loopend);
886 DLL_API signed char     F_API FSOUND_Sample_SetDefaults(FSOUND_SAMPLE *sptr, int deffreq, int defvol, int defpan, int defpri);
887 DLL_API signed char     F_API FSOUND_Sample_SetDefaultsEx(FSOUND_SAMPLE *sptr, int deffreq, int defvol, int defpan, int defpri, int varfreq, int varvol, int varpan);
888 DLL_API signed char     F_API FSOUND_Sample_SetMinMaxDistance(FSOUND_SAMPLE *sptr, float min, float max);
889 DLL_API signed char     F_API FSOUND_Sample_SetMaxPlaybacks(FSOUND_SAMPLE *sptr, int max);
890
891 /* 
892     Sample information functions
893 */
894
895 DLL_API FSOUND_SAMPLE * F_API FSOUND_Sample_Get(int sampno);
896 DLL_API const char *    F_API FSOUND_Sample_GetName(FSOUND_SAMPLE *sptr);
897 DLL_API unsigned int    F_API FSOUND_Sample_GetLength(FSOUND_SAMPLE *sptr);
898 DLL_API signed char     F_API FSOUND_Sample_GetLoopPoints(FSOUND_SAMPLE *sptr, int *loopstart, int *loopend);
899 DLL_API signed char     F_API FSOUND_Sample_GetDefaults(FSOUND_SAMPLE *sptr, int *deffreq, int *defvol, int *defpan, int *defpri);
900 DLL_API signed char     F_API FSOUND_Sample_GetDefaultsEx(FSOUND_SAMPLE *sptr, int *deffreq, int *defvol, int *defpan, int *defpri, int *varfreq, int *varvol, int *varpan);
901 DLL_API unsigned int    F_API FSOUND_Sample_GetMode(FSOUND_SAMPLE *sptr);
902 DLL_API signed char     F_API FSOUND_Sample_GetMinMaxDistance(FSOUND_SAMPLE *sptr, float *min, float *max);
903   
904 /* ============================ */
905 /* Channel control functions.   */
906 /* ============================ */
907
908 /* 
909     Playing and stopping sounds.  
910     Note : Use FSOUND_FREE as the 'channel' variable, to let FMOD pick a free channel for you.
911            Use FSOUND_ALL as the 'channel' variable to control ALL channels with one function call!
912 */
913
914 DLL_API int             F_API FSOUND_PlaySound(int channel, FSOUND_SAMPLE *sptr);
915 DLL_API int             F_API FSOUND_PlaySoundEx(int channel, FSOUND_SAMPLE *sptr, FSOUND_DSPUNIT *dsp, signed char startpaused);
916 DLL_API signed char     F_API FSOUND_StopSound(int channel);
917
918 /* 
919     Functions to control playback of a channel.
920     Note : FSOUND_ALL can be used on most of these functions as a channel value.
921 */
922
923 DLL_API signed char     F_API FSOUND_SetFrequency(int channel, int freq);
924 DLL_API signed char     F_API FSOUND_SetVolume(int channel, int vol);
925 DLL_API signed char     F_API FSOUND_SetVolumeAbsolute(int channel, int vol);
926 DLL_API signed char     F_API FSOUND_SetPan(int channel, int pan);
927 DLL_API signed char     F_API FSOUND_SetSurround(int channel, signed char surround);
928 DLL_API signed char     F_API FSOUND_SetMute(int channel, signed char mute);
929 DLL_API signed char     F_API FSOUND_SetPriority(int channel, int priority);
930 DLL_API signed char     F_API FSOUND_SetReserved(int channel, signed char reserved);
931 DLL_API signed char     F_API FSOUND_SetPaused(int channel, signed char paused);
932 DLL_API signed char     F_API FSOUND_SetLoopMode(int channel, unsigned int loopmode);
933 DLL_API signed char     F_API FSOUND_SetCurrentPosition(int channel, unsigned int offset);
934 DLL_API signed char     F_API FSOUND_3D_SetAttributes(int channel, const float *pos, const float *vel);
935 DLL_API signed char     F_API FSOUND_3D_SetMinMaxDistance(int channel, float min, float max);
936
937 /* 
938     Channel information functions.
939 */
940
941 DLL_API signed char     F_API FSOUND_IsPlaying(int channel);
942 DLL_API int             F_API FSOUND_GetFrequency(int channel);
943 DLL_API int             F_API FSOUND_GetVolume(int channel);
944 DLL_API int             F_API FSOUND_GetAmplitude(int channel);
945 DLL_API int             F_API FSOUND_GetPan(int channel);
946 DLL_API signed char     F_API FSOUND_GetSurround(int channel);
947 DLL_API signed char     F_API FSOUND_GetMute(int channel);
948 DLL_API int             F_API FSOUND_GetPriority(int channel);
949 DLL_API signed char     F_API FSOUND_GetReserved(int channel);
950 DLL_API signed char     F_API FSOUND_GetPaused(int channel);
951 DLL_API unsigned int    F_API FSOUND_GetLoopMode(int channel);
952 DLL_API unsigned int    F_API FSOUND_GetCurrentPosition(int channel);
953 DLL_API FSOUND_SAMPLE * F_API FSOUND_GetCurrentSample(int channel);
954 DLL_API signed char     F_API FSOUND_GetCurrentLevels(int channel, float *l, float *r);
955 DLL_API int             F_API FSOUND_GetNumSubChannels(int channel);
956 DLL_API int             F_API FSOUND_GetSubChannel(int channel, int subchannel);
957 DLL_API signed char     F_API FSOUND_3D_GetAttributes(int channel, float *pos, float *vel);
958 DLL_API signed char     F_API FSOUND_3D_GetMinMaxDistance(int channel, float *min, float *max);
959
960 /* ========================== */
961 /* Global 3D sound functions. */
962 /* ========================== */
963
964 /*
965     See also 3d sample and channel based functions above.
966     Call FSOUND_Update once a frame to process 3d information.
967 */
968
969 DLL_API void            F_API FSOUND_3D_Listener_SetAttributes(const float *pos, const float *vel, float fx, float fy, float fz, float tx, float ty, float tz);
970 DLL_API void            F_API FSOUND_3D_Listener_GetAttributes(float *pos, float *vel, float *fx, float *fy, float *fz, float *tx, float *ty, float *tz);
971 DLL_API void            F_API FSOUND_3D_Listener_SetCurrent(int current, int numlisteners);  /* use this if you use multiple listeners / splitscreen */
972 DLL_API void            F_API FSOUND_3D_SetDopplerFactor(float scale);
973 DLL_API void            F_API FSOUND_3D_SetDistanceFactor(float scale);
974 DLL_API void            F_API FSOUND_3D_SetRolloffFactor(float scale);
975
976 /* =================== */
977 /* FX functions.       */
978 /* =================== */
979
980 /* 
981     Functions to control DX8 only effects processing.
982
983     - FX enabled samples can only be played once at a time, not multiple times at once.
984     - Sounds have to be created with FSOUND_HW2D or FSOUND_HW3D for this to work.
985     - FSOUND_INIT_ENABLESYSTEMCHANNELFX can be used to apply hardware effect processing to the
986       global mixed output of FMOD's software channels.
987     - FSOUND_FX_Enable returns an FX handle that you can use to alter fx parameters.
988     - FSOUND_FX_Enable can be called multiple times in a row, even on the same FX type,
989       it will return a unique handle for each FX.
990     - FSOUND_FX_Enable cannot be called if the sound is playing or locked.
991     - FSOUND_FX_Disable must be called to reset/clear the FX from a channel.
992 */
993
994 DLL_API int             F_API FSOUND_FX_Enable(int channel, unsigned int fxtype);    /* See FSOUND_FX_MODES */
995 DLL_API signed char     F_API FSOUND_FX_Disable(int channel);                        /* Disables all effects */
996
997 DLL_API signed char     F_API FSOUND_FX_SetChorus(int fxid, float WetDryMix, float Depth, float Feedback, float Frequency, int Waveform, float Delay, int Phase);
998 DLL_API signed char     F_API FSOUND_FX_SetCompressor(int fxid, float Gain, float Attack, float Release, float Threshold, float Ratio, float Predelay);
999 DLL_API signed char     F_API FSOUND_FX_SetDistortion(int fxid, float Gain, float Edge, float PostEQCenterFrequency, float PostEQBandwidth, float PreLowpassCutoff);
1000 DLL_API signed char     F_API FSOUND_FX_SetEcho(int fxid, float WetDryMix, float Feedback, float LeftDelay, float RightDelay, int PanDelay);
1001 DLL_API signed char     F_API FSOUND_FX_SetFlanger(int fxid, float WetDryMix, float Depth, float Feedback, float Frequency, int Waveform, float Delay, int Phase);
1002 DLL_API signed char     F_API FSOUND_FX_SetGargle(int fxid, int RateHz, int WaveShape);
1003 DLL_API signed char     F_API FSOUND_FX_SetI3DL2Reverb(int fxid, int Room, int RoomHF, float RoomRolloffFactor, float DecayTime, float DecayHFRatio, int Reflections, float ReflectionsDelay, int Reverb, float ReverbDelay, float Diffusion, float Density, float HFReference);
1004 DLL_API signed char     F_API FSOUND_FX_SetParamEQ(int fxid, float Center, float Bandwidth, float Gain);
1005 DLL_API signed char     F_API FSOUND_FX_SetWavesReverb(int fxid, float InGain, float ReverbMix, float ReverbTime, float HighFreqRTRatio);  
1006  
1007 /* ========================= */
1008 /* File Streaming functions. */
1009 /* ========================= */
1010
1011 /*
1012     Note : Use FSOUND_LOADMEMORY   flag with FSOUND_Stream_Open to stream from memory.
1013            Use FSOUND_LOADRAW      flag with FSOUND_Stream_Open to treat stream as raw pcm data.
1014            Use FSOUND_MPEGACCURATE flag with FSOUND_Stream_Open to open mpegs in 'accurate mode' for settime/gettime/getlengthms.
1015            Use FSOUND_FREE as the 'channel' variable, to let FMOD pick a free channel for you.
1016 */
1017
1018 DLL_API signed char        F_API FSOUND_Stream_SetBufferSize(int ms);      /* call this before opening streams, not after */
1019                            
1020 DLL_API FSOUND_STREAM *    F_API FSOUND_Stream_Open(const char *name_or_data, unsigned int mode, int offset, int length);
1021 DLL_API FSOUND_STREAM *    F_API FSOUND_Stream_Create(FSOUND_STREAMCALLBACK callback, int length, unsigned int mode, int samplerate, void *userdata);
1022 DLL_API signed char        F_API FSOUND_Stream_Close(FSOUND_STREAM *stream);
1023                            
1024 DLL_API int                F_API FSOUND_Stream_Play(int channel, FSOUND_STREAM *stream);
1025 DLL_API int                F_API FSOUND_Stream_PlayEx(int channel, FSOUND_STREAM *stream, FSOUND_DSPUNIT *dsp, signed char startpaused);
1026 DLL_API signed char        F_API FSOUND_Stream_Stop(FSOUND_STREAM *stream);
1027                            
1028 DLL_API signed char        F_API FSOUND_Stream_SetPosition(FSOUND_STREAM *stream, unsigned int position);
1029 DLL_API unsigned int       F_API FSOUND_Stream_GetPosition(FSOUND_STREAM *stream);
1030 DLL_API signed char        F_API FSOUND_Stream_SetTime(FSOUND_STREAM *stream, int ms);
1031 DLL_API int                F_API FSOUND_Stream_GetTime(FSOUND_STREAM *stream);
1032 DLL_API int                F_API FSOUND_Stream_GetLength(FSOUND_STREAM *stream);
1033 DLL_API int                F_API FSOUND_Stream_GetLengthMs(FSOUND_STREAM *stream);
1034                            
1035 DLL_API signed char        F_API FSOUND_Stream_SetMode(FSOUND_STREAM *stream, unsigned int mode);
1036 DLL_API unsigned int       F_API FSOUND_Stream_GetMode(FSOUND_STREAM *stream);
1037 DLL_API signed char        F_API FSOUND_Stream_SetLoopPoints(FSOUND_STREAM *stream, unsigned int loopstartpcm, unsigned int loopendpcm);
1038 DLL_API signed char        F_API FSOUND_Stream_SetLoopCount(FSOUND_STREAM *stream, int count);
1039 DLL_API int                F_API FSOUND_Stream_GetOpenState(FSOUND_STREAM *stream);                /* use with FSOUND_NONBLOCKING opened streams */
1040 DLL_API FSOUND_SAMPLE *    F_API FSOUND_Stream_GetSample(FSOUND_STREAM *stream);
1041 DLL_API FSOUND_DSPUNIT *   F_API FSOUND_Stream_CreateDSP(FSOUND_STREAM *stream, FSOUND_DSPCALLBACK callback, int priority, void *userdata);
1042                            
1043 DLL_API signed char        F_API FSOUND_Stream_SetEndCallback(FSOUND_STREAM *stream, FSOUND_STREAMCALLBACK callback, void *userdata);
1044 DLL_API signed char        F_API FSOUND_Stream_SetSyncCallback(FSOUND_STREAM *stream, FSOUND_STREAMCALLBACK callback, void *userdata);
1045
1046 DLL_API FSOUND_SYNCPOINT * F_API FSOUND_Stream_AddSyncPoint(FSOUND_STREAM *stream, unsigned int pcmoffset, const char *name);
1047 DLL_API signed char        F_API FSOUND_Stream_DeleteSyncPoint(FSOUND_SYNCPOINT *point);
1048 DLL_API int                F_API FSOUND_Stream_GetNumSyncPoints(FSOUND_STREAM *stream);
1049 DLL_API FSOUND_SYNCPOINT * F_API FSOUND_Stream_GetSyncPoint(FSOUND_STREAM *stream, int index);
1050 DLL_API char *             F_API FSOUND_Stream_GetSyncPointInfo(FSOUND_SYNCPOINT *point, unsigned int *pcmoffset);
1051
1052 DLL_API signed char        F_API FSOUND_Stream_SetSubStream(FSOUND_STREAM *stream, int index);     /* For FMOD .FSB bank files. */
1053 DLL_API int                F_API FSOUND_Stream_GetNumSubStreams(FSOUND_STREAM *stream);            /* For FMOD .FSB bank files. */
1054 DLL_API signed char        F_API FSOUND_Stream_SetSubStreamSentence(FSOUND_STREAM *stream, const int *sentencelist, int numitems);
1055
1056 DLL_API signed char        F_API FSOUND_Stream_GetNumTagFields(FSOUND_STREAM *stream, int *num);
1057 DLL_API signed char        F_API FSOUND_Stream_GetTagField(FSOUND_STREAM *stream, int num, int *type, char **name, void **value, int *length);
1058 DLL_API signed char        F_API FSOUND_Stream_FindTagField(FSOUND_STREAM *stream, int type, const char *name, void **value, int *length);
1059
1060 /*
1061     Internet streaming functions
1062 */
1063
1064 DLL_API signed char        F_API FSOUND_Stream_Net_SetProxy(const char *proxy);
1065 DLL_API char *             F_API FSOUND_Stream_Net_GetLastServerStatus();
1066 DLL_API signed char        F_API FSOUND_Stream_Net_SetBufferProperties(int buffersize, int prebuffer_percent, int rebuffer_percent);
1067 DLL_API signed char        F_API FSOUND_Stream_Net_GetBufferProperties(int *buffersize, int *prebuffer_percent, int *rebuffer_percent);
1068 DLL_API signed char        F_API FSOUND_Stream_Net_SetMetadataCallback(FSOUND_STREAM *stream, FSOUND_METADATACALLBACK callback, void *userdata);
1069 DLL_API signed char        F_API FSOUND_Stream_Net_GetStatus(FSOUND_STREAM *stream, int *status, int *bufferpercentused, int *bitrate, unsigned int *flags);
1070
1071 /* =================== */
1072 /* CD audio functions. */
1073 /* =================== */
1074
1075 /*
1076     Note : 0 = default cdrom.  Otherwise specify the drive letter, for example. 'D'. 
1077 */
1078
1079 DLL_API signed char     F_API FSOUND_CD_Play(char drive, int track);
1080 DLL_API void            F_API FSOUND_CD_SetPlayMode(char drive, signed char mode);
1081 DLL_API signed char     F_API FSOUND_CD_Stop(char drive);
1082 DLL_API signed char     F_API FSOUND_CD_SetPaused(char drive, signed char paused);
1083 DLL_API signed char     F_API FSOUND_CD_SetVolume(char drive, int volume);
1084 DLL_API signed char     F_API FSOUND_CD_SetTrackTime(char drive, unsigned int ms);
1085 DLL_API signed char     F_API FSOUND_CD_OpenTray(char drive, signed char open);
1086
1087 DLL_API signed char     F_API FSOUND_CD_GetPaused(char drive);
1088 DLL_API int             F_API FSOUND_CD_GetTrack(char drive);
1089 DLL_API int             F_API FSOUND_CD_GetNumTracks(char drive);
1090 DLL_API int             F_API FSOUND_CD_GetVolume(char drive);
1091 DLL_API int             F_API FSOUND_CD_GetTrackLength(char drive, int track); 
1092 DLL_API int             F_API FSOUND_CD_GetTrackTime(char drive);
1093
1094 /* ============== */
1095 /* DSP functions. */
1096 /* ============== */
1097
1098 /* 
1099     DSP Unit control and information functions. 
1100     These functions allow you access to the mixed stream that FMOD uses to play back sound on.
1101 */
1102
1103 DLL_API FSOUND_DSPUNIT *F_API FSOUND_DSP_Create(FSOUND_DSPCALLBACK callback, int priority, void *userdata);
1104 DLL_API void            F_API FSOUND_DSP_Free(FSOUND_DSPUNIT *unit);
1105 DLL_API void            F_API FSOUND_DSP_SetPriority(FSOUND_DSPUNIT *unit, int priority);
1106 DLL_API int             F_API FSOUND_DSP_GetPriority(FSOUND_DSPUNIT *unit);
1107 DLL_API void            F_API FSOUND_DSP_SetActive(FSOUND_DSPUNIT *unit, signed char active);
1108 DLL_API signed char     F_API FSOUND_DSP_GetActive(FSOUND_DSPUNIT *unit);
1109
1110 /* 
1111     Functions to get hold of FSOUND 'system DSP unit' handles. 
1112 */
1113
1114 DLL_API FSOUND_DSPUNIT *F_API FSOUND_DSP_GetClearUnit();
1115 DLL_API FSOUND_DSPUNIT *F_API FSOUND_DSP_GetSFXUnit();
1116 DLL_API FSOUND_DSPUNIT *F_API FSOUND_DSP_GetMusicUnit();
1117 DLL_API FSOUND_DSPUNIT *F_API FSOUND_DSP_GetFFTUnit();
1118 DLL_API FSOUND_DSPUNIT *F_API FSOUND_DSP_GetClipAndCopyUnit();
1119
1120 /* 
1121     Miscellaneous DSP functions 
1122     Note for the spectrum analysis function to work, you have to enable the FFT DSP unit with 
1123     the following code FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), TRUE);
1124     It is off by default to save cpu usage.
1125 */
1126
1127 DLL_API signed char     F_API FSOUND_DSP_MixBuffers(void *destbuffer, void *srcbuffer, int len, int freq, int vol, int pan, unsigned int mode);
1128 DLL_API void            F_API FSOUND_DSP_ClearMixBuffer();
1129 DLL_API int             F_API FSOUND_DSP_GetBufferLength();      /* Length of each DSP update */
1130 DLL_API int             F_API FSOUND_DSP_GetBufferLengthTotal(); /* Total buffer length due to FSOUND_SetBufferSize */
1131 DLL_API float *         F_API FSOUND_DSP_GetSpectrum();          /* Array of 512 floats - call FSOUND_DSP_SetActive(FSOUND_DSP_GetFFTUnit(), TRUE)) for this to work. */
1132
1133 /* =================================================================================== */
1134 /* Reverb functions. (eax2/eax3 reverb)  (ONLY SUPPORTED ON WIN32 W/ FSOUND_HW3D FLAG) */
1135 /* =================================================================================== */
1136
1137 /*
1138     See top of file for definitions and information on the reverb parameters.
1139 */
1140
1141 DLL_API signed char     F_API FSOUND_Reverb_SetProperties(const FSOUND_REVERB_PROPERTIES *prop);
1142 DLL_API signed char     F_API FSOUND_Reverb_GetProperties(FSOUND_REVERB_PROPERTIES *prop);
1143 DLL_API signed char     F_API FSOUND_Reverb_SetChannelProperties(int channel, const FSOUND_REVERB_CHANNELPROPERTIES *prop);
1144 DLL_API signed char     F_API FSOUND_Reverb_GetChannelProperties(int channel, FSOUND_REVERB_CHANNELPROPERTIES *prop);
1145
1146 /* ===================================================== */
1147 /* Recording functions  (ONLY SUPPORTED IN WIN32, WINCE) */
1148 /* ===================================================== */
1149
1150 /*
1151     Recording initialization functions
1152 */
1153
1154 DLL_API signed char     F_API FSOUND_Record_SetDriver(int outputtype);
1155 DLL_API int             F_API FSOUND_Record_GetNumDrivers();
1156 DLL_API const char *    F_API FSOUND_Record_GetDriverName(int id);
1157 DLL_API int             F_API FSOUND_Record_GetDriver();
1158
1159 /*
1160     Recording functionality.  Only one recording session will work at a time.
1161 */
1162
1163 DLL_API signed char     F_API FSOUND_Record_StartSample(FSOUND_SAMPLE *sptr, signed char loop);
1164 DLL_API signed char     F_API FSOUND_Record_Stop();
1165 DLL_API int             F_API FSOUND_Record_GetPosition();  
1166
1167 /* ========================================================================================== */
1168 /* FMUSIC API (MOD,S3M,XM,IT,MIDI PLAYBACK)                                                   */
1169 /* ========================================================================================== */
1170
1171 /* 
1172     Song management / playback functions.
1173 */
1174
1175 DLL_API FMUSIC_MODULE * F_API FMUSIC_LoadSong(const char *name);
1176 DLL_API FMUSIC_MODULE * F_API FMUSIC_LoadSongEx(const char *name_or_data, int offset, int length, unsigned int mode, const int *samplelist, int samplelistnum);
1177 DLL_API int             F_API FMUSIC_GetOpenState(FMUSIC_MODULE *mod);
1178 DLL_API signed char     F_API FMUSIC_FreeSong(FMUSIC_MODULE *mod);
1179 DLL_API signed char     F_API FMUSIC_PlaySong(FMUSIC_MODULE *mod);
1180 DLL_API signed char     F_API FMUSIC_StopSong(FMUSIC_MODULE *mod);
1181 DLL_API void            F_API FMUSIC_StopAllSongs();
1182
1183 DLL_API signed char     F_API FMUSIC_SetZxxCallback(FMUSIC_MODULE *mod, FMUSIC_CALLBACK callback);
1184 DLL_API signed char     F_API FMUSIC_SetRowCallback(FMUSIC_MODULE *mod, FMUSIC_CALLBACK callback, int rowstep);
1185 DLL_API signed char     F_API FMUSIC_SetOrderCallback(FMUSIC_MODULE *mod, FMUSIC_CALLBACK callback, int orderstep);
1186 DLL_API signed char     F_API FMUSIC_SetInstCallback(FMUSIC_MODULE *mod, FMUSIC_CALLBACK callback, int instrument);
1187
1188 DLL_API signed char     F_API FMUSIC_SetSample(FMUSIC_MODULE *mod, int sampno, FSOUND_SAMPLE *sptr);
1189 DLL_API signed char     F_API FMUSIC_SetUserData(FMUSIC_MODULE *mod, void *userdata);
1190 DLL_API signed char     F_API FMUSIC_OptimizeChannels(FMUSIC_MODULE *mod, int maxchannels, int minvolume);
1191
1192 /*
1193     Runtime song functions. 
1194 */
1195
1196 DLL_API signed char     F_API FMUSIC_SetReverb(signed char reverb);             /* MIDI only */
1197 DLL_API signed char     F_API FMUSIC_SetLooping(FMUSIC_MODULE *mod, signed char looping);
1198 DLL_API signed char     F_API FMUSIC_SetOrder(FMUSIC_MODULE *mod, int order);
1199 DLL_API signed char     F_API FMUSIC_SetPaused(FMUSIC_MODULE *mod, signed char pause);
1200 DLL_API signed char     F_API FMUSIC_SetMasterVolume(FMUSIC_MODULE *mod, int volume);
1201 DLL_API signed char     F_API FMUSIC_SetMasterSpeed(FMUSIC_MODULE *mode, float speed);
1202 DLL_API signed char     F_API FMUSIC_SetPanSeperation(FMUSIC_MODULE *mod, float pansep);
1203  
1204 /* 
1205     Static song information functions.
1206 */
1207
1208 DLL_API const char *    F_API FMUSIC_GetName(FMUSIC_MODULE *mod);
1209 DLL_API int             F_API FMUSIC_GetType(FMUSIC_MODULE *mod);
1210 DLL_API int             F_API FMUSIC_GetNumOrders(FMUSIC_MODULE *mod);
1211 DLL_API int             F_API FMUSIC_GetNumPatterns(FMUSIC_MODULE *mod);
1212 DLL_API int             F_API FMUSIC_GetNumInstruments(FMUSIC_MODULE *mod);
1213 DLL_API int             F_API FMUSIC_GetNumSamples(FMUSIC_MODULE *mod);
1214 DLL_API int             F_API FMUSIC_GetNumChannels(FMUSIC_MODULE *mod);
1215 DLL_API FSOUND_SAMPLE * F_API FMUSIC_GetSample(FMUSIC_MODULE *mod, int sampno);
1216 DLL_API int             F_API FMUSIC_GetPatternLength(FMUSIC_MODULE *mod, int orderno);
1217  
1218 /* 
1219     Runtime song information.
1220 */
1221
1222 DLL_API signed char     F_API FMUSIC_IsFinished(FMUSIC_MODULE *mod);
1223 DLL_API signed char     F_API FMUSIC_IsPlaying(FMUSIC_MODULE *mod);
1224 DLL_API int             F_API FMUSIC_GetMasterVolume(FMUSIC_MODULE *mod);
1225 DLL_API int             F_API FMUSIC_GetGlobalVolume(FMUSIC_MODULE *mod);
1226 DLL_API int             F_API FMUSIC_GetOrder(FMUSIC_MODULE *mod);
1227 DLL_API int             F_API FMUSIC_GetPattern(FMUSIC_MODULE *mod);
1228 DLL_API int             F_API FMUSIC_GetSpeed(FMUSIC_MODULE *mod);
1229 DLL_API int             F_API FMUSIC_GetBPM(FMUSIC_MODULE *mod);
1230 DLL_API int             F_API FMUSIC_GetRow(FMUSIC_MODULE *mod);
1231 DLL_API signed char     F_API FMUSIC_GetPaused(FMUSIC_MODULE *mod);
1232 DLL_API int             F_API FMUSIC_GetTime(FMUSIC_MODULE *mod);
1233 DLL_API int             F_API FMUSIC_GetRealChannel(FMUSIC_MODULE *mod, int modchannel);
1234 DLL_API void *          F_API FMUSIC_GetUserData(FMUSIC_MODULE *mod);
1235
1236 #ifdef __cplusplus
1237 }
1238 #endif
1239
1240 #endif
1241