- /* 
-   SDL_mixer:  An audio mixer library based on the SDL library 
-   Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org> 
-   
-   This software is provided 'as-is', without any express or implied 
-   warranty.  In no event will the authors be held liable for any damages 
-   arising from the use of this software. 
-   
-   Permission is granted to anyone to use this software for any purpose, 
-   including commercial applications, and to alter it and redistribute it 
-   freely, subject to the following restrictions: 
-   
-   1. The origin of this software must not be misrepresented; you must not 
-      claim that you wrote the original software. If you use this software 
-      in a product, an acknowledgment in the product documentation would be 
-      appreciated but is not required. 
-   2. Altered source versions must be plainly marked as such, and must not be 
-      misrepresented as being the original software. 
-   3. This notice may not be removed or altered from any source distribution. 
- */ 
-   
- #ifndef SDL_MIXER_H_ 
- #define SDL_MIXER_H_ 
-   
- #include <SDL2/SDL_stdinc.h> 
- #include <SDL2/SDL_rwops.h> 
- #include <SDL2/SDL_audio.h> 
- #include <SDL2/SDL_endian.h> 
- #include <SDL2/SDL_version.h> 
- #include <SDL2/begin_code.h> 
-   
- /* Set up for C function definitions, even when using C++ */ 
- #ifdef __cplusplus 
- extern "C" { 
- #endif 
-   
- /* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL 
- */ 
- #define SDL_MIXER_MAJOR_VERSION 2 
- #define SDL_MIXER_MINOR_VERSION 0 
- #define SDL_MIXER_PATCHLEVEL    2 
-   
- /* This macro can be used to fill a version structure with the compile-time 
-  * version of the SDL_mixer library. 
-  */ 
- #define SDL_MIXER_VERSION(X)                        \ 
- {                                                   \ 
-     (X)->major = SDL_MIXER_MAJOR_VERSION;           \ 
-     (X)->minor = SDL_MIXER_MINOR_VERSION;           \ 
-     (X)->patch = SDL_MIXER_PATCHLEVEL;              \ 
- } 
-   
- /* Backwards compatibility */ 
- #define MIX_MAJOR_VERSION   SDL_MIXER_MAJOR_VERSION 
- #define MIX_MINOR_VERSION   SDL_MIXER_MINOR_VERSION 
- #define MIX_PATCHLEVEL      SDL_MIXER_PATCHLEVEL 
- #define MIX_VERSION(X)      SDL_MIXER_VERSION(X) 
-   
- /** 
-  *  This is the version number macro for the current SDL_mixer version. 
-  */ 
- #define SDL_MIXER_COMPILEDVERSION \ 
-     SDL_VERSIONNUM(SDL_MIXER_MAJOR_VERSION, SDL_MIXER_MINOR_VERSION, SDL_MIXER_PATCHLEVEL) 
-   
- /** 
-  *  This macro will evaluate to true if compiled with SDL_mixer at least X.Y.Z. 
-  */ 
- #define SDL_MIXER_VERSION_ATLEAST(X, Y, Z) \ 
-     (SDL_MIXER_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z)) 
-   
- /* This function gets the version of the dynamically linked SDL_mixer library. 
-    it should NOT be used to fill a version structure, instead you should 
-    use the SDL_MIXER_VERSION() macro. 
-  */ 
- extern DECLSPEC const SDL_version * SDLCALL Mix_Linked_Version(void); 
-   
- typedef enum 
- { 
-     MIX_INIT_FLAC   = 0x00000001, 
-     MIX_INIT_MOD    = 0x00000002, 
-     MIX_INIT_MP3    = 0x00000008, 
-     MIX_INIT_OGG    = 0x00000010, 
-     MIX_INIT_MID    = 0x00000020 
- } MIX_InitFlags; 
-   
- /* Loads dynamic libraries and prepares them for use.  Flags should be 
-    one or more flags from MIX_InitFlags OR'd together. 
-    It returns the flags successfully initialized, or 0 on failure. 
-  */ 
- extern DECLSPEC int SDLCALL Mix_Init(int flags); 
-   
- /* Unloads libraries loaded with Mix_Init */ 
- extern DECLSPEC void SDLCALL Mix_Quit(void); 
-   
-   
- /* The default mixer has 8 simultaneous mixing channels */ 
- #ifndef MIX_CHANNELS 
- #define MIX_CHANNELS    8 
- #endif 
-   
- /* Good default values for a PC soundcard */ 
- #define MIX_DEFAULT_FREQUENCY   22050 
- #if SDL_BYTEORDER == SDL_LIL_ENDIAN 
- #define MIX_DEFAULT_FORMAT  AUDIO_S16LSB 
- #else 
- #define MIX_DEFAULT_FORMAT  AUDIO_S16MSB 
- #endif 
- #define MIX_DEFAULT_CHANNELS    2 
- #define MIX_MAX_VOLUME          SDL_MIX_MAXVOLUME /* Volume of a chunk */ 
-   
- /* The internal format for an audio chunk */ 
- typedef struct Mix_Chunk { 
-     int allocated; 
-     Uint8 *abuf; 
-     Uint32 alen; 
-     Uint8 volume;       /* Per-sample volume, 0-128 */ 
- } Mix_Chunk; 
-   
- /* The different fading types supported */ 
- typedef enum { 
-     MIX_NO_FADING, 
-     MIX_FADING_OUT, 
-     MIX_FADING_IN 
- } Mix_Fading; 
-   
- /* These are types of music files (not libraries used to load them) */ 
- typedef enum { 
-     MUS_NONE, 
-     MUS_CMD, 
-     MUS_WAV, 
-     MUS_MOD, 
-     MUS_MID, 
-     MUS_OGG, 
-     MUS_MP3, 
-     MUS_MP3_MAD_UNUSED, 
-     MUS_FLAC, 
-     MUS_MODPLUG_UNUSED 
- } Mix_MusicType; 
-   
- /* The internal format for a music chunk interpreted via mikmod */ 
- typedef struct _Mix_Music Mix_Music; 
-   
- /* Open the mixer with a certain audio format */ 
- extern DECLSPEC int SDLCALL Mix_OpenAudio(int frequency, Uint16 format, int channels, int chunksize); 
-   
- /* Open the mixer with specific device and certain audio format */ 
- extern DECLSPEC int SDLCALL Mix_OpenAudioDevice(int frequency, Uint16 format, int channels, int chunksize, const char* device, int allowed_changes); 
-   
- /* Dynamically change the number of channels managed by the mixer. 
-    If decreasing the number of channels, the upper channels are 
-    stopped. 
-    This function returns the new number of allocated channels. 
-  */ 
- extern DECLSPEC int SDLCALL Mix_AllocateChannels(int numchans); 
-   
- /* Find out what the actual audio device parameters are. 
-    This function returns 1 if the audio has been opened, 0 otherwise. 
-  */ 
- extern DECLSPEC int SDLCALL Mix_QuerySpec(int *frequency,Uint16 *format,int *channels); 
-   
- /* Load a wave file or a music (.mod .s3m .it .xm) file */ 
- extern DECLSPEC Mix_Chunk * SDLCALL Mix_LoadWAV_RW(SDL_RWops *src, int freesrc); 
- #define Mix_LoadWAV(file)   Mix_LoadWAV_RW(SDL_RWFromFile(file, "rb"), 1) 
- extern DECLSPEC Mix_Music * SDLCALL Mix_LoadMUS(const char *file); 
-   
- /* Load a music file from an SDL_RWop object (Ogg and MikMod specific currently) 
-    Matt Campbell (matt@campbellhome.dhs.org) April 2000 */ 
- extern DECLSPEC Mix_Music * SDLCALL Mix_LoadMUS_RW(SDL_RWops *src, int freesrc); 
-   
- /* Load a music file from an SDL_RWop object assuming a specific format */ 
- extern DECLSPEC Mix_Music * SDLCALL Mix_LoadMUSType_RW(SDL_RWops *src, Mix_MusicType type, int freesrc); 
-   
- /* Load a wave file of the mixer format from a memory buffer */ 
- extern DECLSPEC Mix_Chunk * SDLCALL Mix_QuickLoad_WAV(Uint8 *mem); 
-   
- /* Load raw audio data of the mixer format from a memory buffer */ 
- extern DECLSPEC Mix_Chunk * SDLCALL Mix_QuickLoad_RAW(Uint8 *mem, Uint32 len); 
-   
- /* Free an audio chunk previously loaded */ 
- extern DECLSPEC void SDLCALL Mix_FreeChunk(Mix_Chunk *chunk); 
- extern DECLSPEC void SDLCALL Mix_FreeMusic(Mix_Music *music); 
-   
- /* Get a list of chunk/music decoders that this build of SDL_mixer provides. 
-    This list can change between builds AND runs of the program, if external 
-    libraries that add functionality become available. 
-    You must successfully call Mix_OpenAudio() before calling these functions. 
-    This API is only available in SDL_mixer 1.2.9 and later. 
-   
-    // usage... 
-    int i; 
-    const int total = Mix_GetNumChunkDecoders(); 
-    for (i = 0; i < total; i++) 
-        printf("Supported chunk decoder: [%s]\n", Mix_GetChunkDecoder(i)); 
-   
-    Appearing in this list doesn't promise your specific audio file will 
-    decode...but it's handy to know if you have, say, a functioning Timidity 
-    install. 
-   
-    These return values are static, read-only data; do not modify or free it. 
-    The pointers remain valid until you call Mix_CloseAudio(). 
- */ 
- extern DECLSPEC int SDLCALL Mix_GetNumChunkDecoders(void); 
- extern DECLSPEC const char * SDLCALL Mix_GetChunkDecoder(int index); 
- extern DECLSPEC SDL_bool SDLCALL Mix_HasChunkDecoder(const char *name); 
- extern DECLSPEC int SDLCALL Mix_GetNumMusicDecoders(void); 
- extern DECLSPEC const char * SDLCALL Mix_GetMusicDecoder(int index); 
- extern DECLSPEC SDL_bool SDLCALL Mix_HasMusicDecoder(const char *name); 
-   
- /* Find out the music format of a mixer music, or the currently playing 
-    music, if 'music' is NULL. 
- */ 
- extern DECLSPEC Mix_MusicType SDLCALL Mix_GetMusicType(const Mix_Music *music); 
-   
- /* Set a function that is called after all mixing is performed. 
-    This can be used to provide real-time visual display of the audio stream 
-    or add a custom mixer filter for the stream data. 
- */ 
- extern DECLSPEC void SDLCALL Mix_SetPostMix(void (SDLCALL *mix_func)(void *udata, Uint8 *stream, int len), void *arg); 
-   
- /* Add your own music player or additional mixer function. 
-    If 'mix_func' is NULL, the default music player is re-enabled. 
-  */ 
- extern DECLSPEC void SDLCALL Mix_HookMusic(void (SDLCALL *mix_func)(void *udata, Uint8 *stream, int len), void *arg); 
-   
- /* Add your own callback for when the music has finished playing or when it is 
-  * stopped from a call to Mix_HaltMusic. 
-  */ 
- extern DECLSPEC void SDLCALL Mix_HookMusicFinished(void (SDLCALL *music_finished)(void)); 
-   
- /* Get a pointer to the user data for the current music hook */ 
- extern DECLSPEC void * SDLCALL Mix_GetMusicHookData(void); 
-   
- /* 
-  * Add your own callback when a channel has finished playing. NULL 
-  *  to disable callback. The callback may be called from the mixer's audio 
-  *  callback or it could be called as a result of Mix_HaltChannel(), etc. 
-  *  do not call SDL_LockAudio() from this callback; you will either be 
-  *  inside the audio callback, or SDL_mixer will explicitly lock the audio 
-  *  before calling your callback. 
-  */ 
- extern DECLSPEC void SDLCALL Mix_ChannelFinished(void (SDLCALL *channel_finished)(int channel)); 
-   
-   
- /* Special Effects API by ryan c. gordon. (icculus@icculus.org) */ 
-   
- #define MIX_CHANNEL_POST  -2 
-   
- /* This is the format of a special effect callback: 
-  * 
-  *   myeffect(int chan, void *stream, int len, void *udata); 
-  * 
-  * (chan) is the channel number that your effect is affecting. (stream) is 
-  *  the buffer of data to work upon. (len) is the size of (stream), and 
-  *  (udata) is a user-defined bit of data, which you pass as the last arg of 
-  *  Mix_RegisterEffect(), and is passed back unmolested to your callback. 
-  *  Your effect changes the contents of (stream) based on whatever parameters 
-  *  are significant, or just leaves it be, if you prefer. You can do whatever 
-  *  you like to the buffer, though, and it will continue in its changed state 
-  *  down the mixing pipeline, through any other effect functions, then finally 
-  *  to be mixed with the rest of the channels and music for the final output 
-  *  stream. 
-  * 
-  * DO NOT EVER call SDL_LockAudio() from your callback function! 
-  */ 
- typedef void (SDLCALL *Mix_EffectFunc_t)(int chan, void *stream, int len, void *udata); 
-   
- /* 
-  * This is a callback that signifies that a channel has finished all its 
-  *  loops and has completed playback. This gets called if the buffer 
-  *  plays out normally, or if you call Mix_HaltChannel(), implicitly stop 
-  *  a channel via Mix_AllocateChannels(), or unregister a callback while 
-  *  it's still playing. 
-  * 
-  * DO NOT EVER call SDL_LockAudio() from your callback function! 
-  */ 
- typedef void (SDLCALL *Mix_EffectDone_t)(int chan, void *udata); 
-   
-   
- /* Register a special effect function. At mixing time, the channel data is 
-  *  copied into a buffer and passed through each registered effect function. 
-  *  After it passes through all the functions, it is mixed into the final 
-  *  output stream. The copy to buffer is performed once, then each effect 
-  *  function performs on the output of the previous effect. Understand that 
-  *  this extra copy to a buffer is not performed if there are no effects 
-  *  registered for a given chunk, which saves CPU cycles, and any given 
-  *  effect will be extra cycles, too, so it is crucial that your code run 
-  *  fast. Also note that the data that your function is given is in the 
-  *  format of the sound device, and not the format you gave to Mix_OpenAudio(), 
-  *  although they may in reality be the same. This is an unfortunate but 
-  *  necessary speed concern. Use Mix_QuerySpec() to determine if you can 
-  *  handle the data before you register your effect, and take appropriate 
-  *  actions. 
-  * You may also specify a callback (Mix_EffectDone_t) that is called when 
-  *  the channel finishes playing. This gives you a more fine-grained control 
-  *  than Mix_ChannelFinished(), in case you need to free effect-specific 
-  *  resources, etc. If you don't need this, you can specify NULL. 
-  * You may set the callbacks before or after calling Mix_PlayChannel(). 
-  * Things like Mix_SetPanning() are just internal special effect functions, 
-  *  so if you are using that, you've already incurred the overhead of a copy 
-  *  to a separate buffer, and that these effects will be in the queue with 
-  *  any functions you've registered. The list of registered effects for a 
-  *  channel is reset when a chunk finishes playing, so you need to explicitly 
-  *  set them with each call to Mix_PlayChannel*(). 
-  * You may also register a special effect function that is to be run after 
-  *  final mixing occurs. The rules for these callbacks are identical to those 
-  *  in Mix_RegisterEffect, but they are run after all the channels and the 
-  *  music have been mixed into a single stream, whereas channel-specific 
-  *  effects run on a given channel before any other mixing occurs. These 
-  *  global effect callbacks are call "posteffects". Posteffects only have 
-  *  their Mix_EffectDone_t function called when they are unregistered (since 
-  *  the main output stream is never "done" in the same sense as a channel). 
-  *  You must unregister them manually when you've had enough. Your callback 
-  *  will be told that the channel being mixed is (MIX_CHANNEL_POST) if the 
-  *  processing is considered a posteffect. 
-  * 
-  * After all these effects have finished processing, the callback registered 
-  *  through Mix_SetPostMix() runs, and then the stream goes to the audio 
-  *  device. 
-  * 
-  * DO NOT EVER call SDL_LockAudio() from your callback function! 
-  * 
-  * returns zero if error (no such channel), nonzero if added. 
-  *  Error messages can be retrieved from Mix_GetError(). 
-  */ 
- extern DECLSPEC int SDLCALL Mix_RegisterEffect(int chan, Mix_EffectFunc_t f, Mix_EffectDone_t d, void *arg); 
-   
-   
- /* You may not need to call this explicitly, unless you need to stop an 
-  *  effect from processing in the middle of a chunk's playback. 
-  * Posteffects are never implicitly unregistered as they are for channels, 
-  *  but they may be explicitly unregistered through this function by 
-  *  specifying MIX_CHANNEL_POST for a channel. 
-  * returns zero if error (no such channel or effect), nonzero if removed. 
-  *  Error messages can be retrieved from Mix_GetError(). 
-  */ 
- extern DECLSPEC int SDLCALL Mix_UnregisterEffect(int channel, Mix_EffectFunc_t f); 
-   
-   
- /* You may not need to call this explicitly, unless you need to stop all 
-  *  effects from processing in the middle of a chunk's playback. Note that 
-  *  this will also shut off some internal effect processing, since 
-  *  Mix_SetPanning() and others may use this API under the hood. This is 
-  *  called internally when a channel completes playback. 
-  * Posteffects are never implicitly unregistered as they are for channels, 
-  *  but they may be explicitly unregistered through this function by 
-  *  specifying MIX_CHANNEL_POST for a channel. 
-  * returns zero if error (no such channel), nonzero if all effects removed. 
-  *  Error messages can be retrieved from Mix_GetError(). 
-  */ 
- extern DECLSPEC int SDLCALL Mix_UnregisterAllEffects(int channel); 
-   
-   
- #define MIX_EFFECTSMAXSPEED  "MIX_EFFECTSMAXSPEED" 
-   
- /* 
-  * These are the internally-defined mixing effects. They use the same API that 
-  *  effects defined in the application use, but are provided here as a 
-  *  convenience. Some effects can reduce their quality or use more memory in 
-  *  the name of speed; to enable this, make sure the environment variable 
-  *  MIX_EFFECTSMAXSPEED (see above) is defined before you call 
-  *  Mix_OpenAudio(). 
-  */ 
-   
-   
- /* Set the panning of a channel. The left and right channels are specified 
-  *  as integers between 0 and 255, quietest to loudest, respectively. 
-  * 
-  * Technically, this is just individual volume control for a sample with 
-  *  two (stereo) channels, so it can be used for more than just panning. 
-  *  If you want real panning, call it like this: 
-  * 
-  *   Mix_SetPanning(channel, left, 255 - left); 
-  * 
-  * ...which isn't so hard. 
-  * 
-  * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and 
-  *  the panning will be done to the final mixed stream before passing it on 
-  *  to the audio device. 
-  * 
-  * This uses the Mix_RegisterEffect() API internally, and returns without 
-  *  registering the effect function if the audio device is not configured 
-  *  for stereo output. Setting both (left) and (right) to 255 causes this 
-  *  effect to be unregistered, since that is the data's normal state. 
-  * 
-  * returns zero if error (no such channel or Mix_RegisterEffect() fails), 
-  *  nonzero if panning effect enabled. Note that an audio device in mono 
-  *  mode is a no-op, but this call will return successful in that case. 
-  *  Error messages can be retrieved from Mix_GetError(). 
-  */ 
- extern DECLSPEC int SDLCALL Mix_SetPanning(int channel, Uint8 left, Uint8 right); 
-   
-   
- /* Set the position of a channel. (angle) is an integer from 0 to 360, that 
-  *  specifies the location of the sound in relation to the listener. (angle) 
-  *  will be reduced as neccesary (540 becomes 180 degrees, -100 becomes 260). 
-  *  Angle 0 is due north, and rotates clockwise as the value increases. 
-  *  For efficiency, the precision of this effect may be limited (angles 1 
-  *  through 7 might all produce the same effect, 8 through 15 are equal, etc). 
-  *  (distance) is an integer between 0 and 255 that specifies the space 
-  *  between the sound and the listener. The larger the number, the further 
-  *  away the sound is. Using 255 does not guarantee that the channel will be 
-  *  culled from the mixing process or be completely silent. For efficiency, 
-  *  the precision of this effect may be limited (distance 0 through 5 might 
-  *  all produce the same effect, 6 through 10 are equal, etc). Setting (angle) 
-  *  and (distance) to 0 unregisters this effect, since the data would be 
-  *  unchanged. 
-  * 
-  * If you need more precise positional audio, consider using OpenAL for 
-  *  spatialized effects instead of SDL_mixer. This is only meant to be a 
-  *  basic effect for simple "3D" games. 
-  * 
-  * If the audio device is configured for mono output, then you won't get 
-  *  any effectiveness from the angle; however, distance attenuation on the 
-  *  channel will still occur. While this effect will function with stereo 
-  *  voices, it makes more sense to use voices with only one channel of sound, 
-  *  so when they are mixed through this effect, the positioning will sound 
-  *  correct. You can convert them to mono through SDL before giving them to 
-  *  the mixer in the first place if you like. 
-  * 
-  * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and 
-  *  the positioning will be done to the final mixed stream before passing it 
-  *  on to the audio device. 
-  * 
-  * This is a convenience wrapper over Mix_SetDistance() and Mix_SetPanning(). 
-  * 
-  * returns zero if error (no such channel or Mix_RegisterEffect() fails), 
-  *  nonzero if position effect is enabled. 
-  *  Error messages can be retrieved from Mix_GetError(). 
-  */ 
- extern DECLSPEC int SDLCALL Mix_SetPosition(int channel, Sint16 angle, Uint8 distance); 
-   
-   
- /* Set the "distance" of a channel. (distance) is an integer from 0 to 255 
-  *  that specifies the location of the sound in relation to the listener. 
-  *  Distance 0 is overlapping the listener, and 255 is as far away as possible 
-  *  A distance of 255 does not guarantee silence; in such a case, you might 
-  *  want to try changing the chunk's volume, or just cull the sample from the 
-  *  mixing process with Mix_HaltChannel(). 
-  * For efficiency, the precision of this effect may be limited (distances 1 
-  *  through 7 might all produce the same effect, 8 through 15 are equal, etc). 
-  *  (distance) is an integer between 0 and 255 that specifies the space 
-  *  between the sound and the listener. The larger the number, the further 
-  *  away the sound is. 
-  * Setting (distance) to 0 unregisters this effect, since the data would be 
-  *  unchanged. 
-  * If you need more precise positional audio, consider using OpenAL for 
-  *  spatialized effects instead of SDL_mixer. This is only meant to be a 
-  *  basic effect for simple "3D" games. 
-  * 
-  * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and 
-  *  the distance attenuation will be done to the final mixed stream before 
-  *  passing it on to the audio device. 
-  * 
-  * This uses the Mix_RegisterEffect() API internally. 
-  * 
-  * returns zero if error (no such channel or Mix_RegisterEffect() fails), 
-  *  nonzero if position effect is enabled. 
-  *  Error messages can be retrieved from Mix_GetError(). 
-  */ 
- extern DECLSPEC int SDLCALL Mix_SetDistance(int channel, Uint8 distance); 
-   
-   
- /* 
-  * !!! FIXME : Haven't implemented, since the effect goes past the 
-  *              end of the sound buffer. Will have to think about this. 
-  *               --ryan. 
-  */ 
- #if 0 
- /* Causes an echo effect to be mixed into a sound. (echo) is the amount 
-  *  of echo to mix. 0 is no echo, 255 is infinite (and probably not 
-  *  what you want). 
-  * 
-  * Setting (channel) to MIX_CHANNEL_POST registers this as a posteffect, and 
-  *  the reverbing will be done to the final mixed stream before passing it on 
-  *  to the audio device. 
-  * 
-  * This uses the Mix_RegisterEffect() API internally. If you specify an echo 
-  *  of zero, the effect is unregistered, as the data is already in that state. 
-  * 
-  * returns zero if error (no such channel or Mix_RegisterEffect() fails), 
-  *  nonzero if reversing effect is enabled. 
-  *  Error messages can be retrieved from Mix_GetError(). 
-  */ 
- extern no_parse_DECLSPEC int SDLCALL Mix_SetReverb(int channel, Uint8 echo); 
- #endif 
-   
- /* Causes a channel to reverse its stereo. This is handy if the user has his 
-  *  speakers hooked up backwards, or you would like to have a minor bit of 
-  *  psychedelia in your sound code.  :)  Calling this function with (flip) 
-  *  set to non-zero reverses the chunks's usual channels. If (flip) is zero, 
-  *  the effect is unregistered. 
-  * 
-  * This uses the Mix_RegisterEffect() API internally, and thus is probably 
-  *  more CPU intensive than having the user just plug in his speakers 
-  *  correctly. Mix_SetReverseStereo() returns without registering the effect 
-  *  function if the audio device is not configured for stereo output. 
-  * 
-  * If you specify MIX_CHANNEL_POST for (channel), then this the effect is used 
-  *  on the final mixed stream before sending it on to the audio device (a 
-  *  posteffect). 
-  * 
-  * returns zero if error (no such channel or Mix_RegisterEffect() fails), 
-  *  nonzero if reversing effect is enabled. Note that an audio device in mono 
-  *  mode is a no-op, but this call will return successful in that case. 
-  *  Error messages can be retrieved from Mix_GetError(). 
-  */ 
- extern DECLSPEC int SDLCALL Mix_SetReverseStereo(int channel, int flip); 
-   
- /* end of effects API. --ryan. */ 
-   
-   
- /* Reserve the first channels (0 -> n-1) for the application, i.e. don't allocate 
-    them dynamically to the next sample if requested with a -1 value below. 
-    Returns the number of reserved channels. 
-  */ 
- extern DECLSPEC int SDLCALL Mix_ReserveChannels(int num); 
-   
- /* Channel grouping functions */ 
-   
- /* Attach a tag to a channel. A tag can be assigned to several mixer 
-    channels, to form groups of channels. 
-    If 'tag' is -1, the tag is removed (actually -1 is the tag used to 
-    represent the group of all the channels). 
-    Returns true if everything was OK. 
-  */ 
- extern DECLSPEC int SDLCALL Mix_GroupChannel(int which, int tag); 
- /* Assign several consecutive channels to a group */ 
- extern DECLSPEC int SDLCALL Mix_GroupChannels(int from, int to, int tag); 
- /* Finds the first available channel in a group of channels, 
-    returning -1 if none are available. 
-  */ 
- extern DECLSPEC int SDLCALL Mix_GroupAvailable(int tag); 
- /* Returns the number of channels in a group. This is also a subtle 
-    way to get the total number of channels when 'tag' is -1 
-  */ 
- extern DECLSPEC int SDLCALL Mix_GroupCount(int tag); 
- /* Finds the "oldest" sample playing in a group of channels */ 
- extern DECLSPEC int SDLCALL Mix_GroupOldest(int tag); 
- /* Finds the "most recent" (i.e. last) sample playing in a group of channels */ 
- extern DECLSPEC int SDLCALL Mix_GroupNewer(int tag); 
-   
- /* Play an audio chunk on a specific channel. 
-    If the specified channel is -1, play on the first free channel. 
-    If 'loops' is greater than zero, loop the sound that many times. 
-    If 'loops' is -1, loop inifinitely (~65000 times). 
-    Returns which channel was used to play the sound. 
- */ 
- #define Mix_PlayChannel(channel,chunk,loops) Mix_PlayChannelTimed(channel,chunk,loops,-1) 
- /* The same as above, but the sound is played at most 'ticks' milliseconds */ 
- extern DECLSPEC int SDLCALL Mix_PlayChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ticks); 
- extern DECLSPEC int SDLCALL Mix_PlayMusic(Mix_Music *music, int loops); 
-   
- /* Fade in music or a channel over "ms" milliseconds, same semantics as the "Play" functions */ 
- extern DECLSPEC int SDLCALL Mix_FadeInMusic(Mix_Music *music, int loops, int ms); 
- extern DECLSPEC int SDLCALL Mix_FadeInMusicPos(Mix_Music *music, int loops, int ms, double position); 
- #define Mix_FadeInChannel(channel,chunk,loops,ms) Mix_FadeInChannelTimed(channel,chunk,loops,ms,-1) 
- extern DECLSPEC int SDLCALL Mix_FadeInChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ms, int ticks); 
-   
- /* Set the volume in the range of 0-128 of a specific channel or chunk. 
-    If the specified channel is -1, set volume for all channels. 
-    Returns the original volume. 
-    If the specified volume is -1, just return the current volume. 
- */ 
- extern DECLSPEC int SDLCALL Mix_Volume(int channel, int volume); 
- extern DECLSPEC int SDLCALL Mix_VolumeChunk(Mix_Chunk *chunk, int volume); 
- extern DECLSPEC int SDLCALL Mix_VolumeMusic(int volume); 
-   
- /* Halt playing of a particular channel */ 
- extern DECLSPEC int SDLCALL Mix_HaltChannel(int channel); 
- extern DECLSPEC int SDLCALL Mix_HaltGroup(int tag); 
- extern DECLSPEC int SDLCALL Mix_HaltMusic(void); 
-   
- /* Change the expiration delay for a particular channel. 
-    The sample will stop playing after the 'ticks' milliseconds have elapsed, 
-    or remove the expiration if 'ticks' is -1 
- */ 
- extern DECLSPEC int SDLCALL Mix_ExpireChannel(int channel, int ticks); 
-   
- /* Halt a channel, fading it out progressively till it's silent 
-    The ms parameter indicates the number of milliseconds the fading 
-    will take. 
-  */ 
- extern DECLSPEC int SDLCALL Mix_FadeOutChannel(int which, int ms); 
- extern DECLSPEC int SDLCALL Mix_FadeOutGroup(int tag, int ms); 
- extern DECLSPEC int SDLCALL Mix_FadeOutMusic(int ms); 
-   
- /* Query the fading status of a channel */ 
- extern DECLSPEC Mix_Fading SDLCALL Mix_FadingMusic(void); 
- extern DECLSPEC Mix_Fading SDLCALL Mix_FadingChannel(int which); 
-   
- /* Pause/Resume a particular channel */ 
- extern DECLSPEC void SDLCALL Mix_Pause(int channel); 
- extern DECLSPEC void SDLCALL Mix_Resume(int channel); 
- extern DECLSPEC int SDLCALL Mix_Paused(int channel); 
-   
- /* Pause/Resume the music stream */ 
- extern DECLSPEC void SDLCALL Mix_PauseMusic(void); 
- extern DECLSPEC void SDLCALL Mix_ResumeMusic(void); 
- extern DECLSPEC void SDLCALL Mix_RewindMusic(void); 
- extern DECLSPEC int SDLCALL Mix_PausedMusic(void); 
-   
- /* Set the current position in the music stream. 
-    This returns 0 if successful, or -1 if it failed or isn't implemented. 
-    This function is only implemented for MOD music formats (set pattern 
-    order number) and for OGG, FLAC, MP3_MAD, MP3_MPG and MODPLUG music 
-    (set position in seconds), at the moment. 
- */ 
- extern DECLSPEC int SDLCALL Mix_SetMusicPosition(double position); 
-   
- /* Check the status of a specific channel. 
-    If the specified channel is -1, check all channels. 
- */ 
- extern DECLSPEC int SDLCALL Mix_Playing(int channel); 
- extern DECLSPEC int SDLCALL Mix_PlayingMusic(void); 
-   
- /* Stop music and set external music playback command */ 
- extern DECLSPEC int SDLCALL Mix_SetMusicCMD(const char *command); 
-   
- /* Synchro value is set by MikMod from modules while playing */ 
- extern DECLSPEC int SDLCALL Mix_SetSynchroValue(int value); 
- extern DECLSPEC int SDLCALL Mix_GetSynchroValue(void); 
-   
- /* Set/Get/Iterate SoundFonts paths to use by supported MIDI backends */ 
- extern DECLSPEC int SDLCALL Mix_SetSoundFonts(const char *paths); 
- extern DECLSPEC const char* SDLCALL Mix_GetSoundFonts(void); 
- extern DECLSPEC int SDLCALL Mix_EachSoundFont(int (SDLCALL *function)(const char*, void*), void *data); 
-   
- /* Get the Mix_Chunk currently associated with a mixer channel 
-     Returns NULL if it's an invalid channel, or there's no chunk associated. 
- */ 
- extern DECLSPEC Mix_Chunk * SDLCALL Mix_GetChunk(int channel); 
-   
- /* Close the mixer, halting all playing audio */ 
- extern DECLSPEC void SDLCALL Mix_CloseAudio(void); 
-   
- /* We'll use SDL for reporting errors */ 
- #define Mix_SetError    SDL_SetError 
- #define Mix_GetError    SDL_GetError 
- #define Mix_ClearError  SDL_ClearError 
-   
- /* Ends C function definitions when using C++ */ 
- #ifdef __cplusplus 
- } 
- #endif 
- #include <SDL2/close_code.h> 
-   
- #endif /* SDL_MIXER_H_ */ 
-   
- /* vi: set ts=4 sw=4 expandtab: */ 
-