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