Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.     MIXERLIB:  An audio mixer library based on the SDL library
  3.     Copyright (C) 1997-1999  Sam Lantinga
  4.  
  5.     This library is free software; you can redistribute it and/or
  6.     modify it under the terms of the GNU Library General Public
  7.     License as published by the Free Software Foundation; either
  8.     version 2 of the License, or (at your option) any later version.
  9.  
  10.     This library is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.     Library General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU Library General Public
  16.     License along with this library; if not, write to the Free
  17.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  
  19.     Sam Lantinga
  20.     5635-34 Springhouse Dr.
  21.     Pleasanton, CA 94588 (USA)
  22.     slouken@devolution.com
  23. */
  24.  
  25. #ifndef _MIXER_H_
  26. #define _MIXER_H_
  27.  
  28. #include "SDL_types.h"
  29. #include "SDL_rwops.h"
  30. #include "SDL_audio.h"
  31. #include "SDL_byteorder.h"
  32. #include "begin_code.h"
  33.  
  34. /* Set up for C function definitions, even when using C++ */
  35. #ifdef __cplusplus
  36. extern "C" {
  37. #endif
  38.  
  39. /* The default mixer has 8 simultaneous mixing channels */
  40. #ifndef MIX_CHANNELS
  41. #define MIX_CHANNELS    8
  42. #endif
  43.  
  44. /* Good default values for a PC soundcard */
  45. #define MIX_DEFAULT_FREQUENCY   22050
  46. #if SDL_BYTEORDER == SDL_LIL_ENDIAN
  47. #define MIX_DEFAULT_FORMAT      AUDIO_S16LSB
  48. #else
  49. #define MIX_DEFAULT_FORMAT      AUDIO_S16MSB
  50. #endif
  51. #define MIX_DEFAULT_CHANNELS    2
  52. #define MIX_MAX_VOLUME          128     /* Volume of a chunk */
  53.  
  54. /* The internal format for an audio chunk */
  55. typedef struct {
  56.         int allocated;
  57.         Uint8 *abuf;
  58.         Uint32 alen;
  59.         Uint8 volume;           /* Per-sample volume, 0-128 */
  60. } Mix_Chunk;
  61.  
  62. /* The different fading types supported */
  63. typedef enum {
  64.         MIX_NO_FADING,
  65.         MIX_FADING_OUT,
  66.         MIX_FADING_IN
  67. } Mix_Fading;
  68.  
  69. /* The internal format for a music chunk interpreted via mikmod */
  70. typedef struct _Mix_Music Mix_Music;
  71.  
  72. /* Open the mixer with a certain audio format */
  73. extern DECLSPEC int Mix_OpenAudio(int frequency, Uint16 format, int channels,
  74.                                                         int chunksize);
  75.  
  76. /* Dynamically change the number of channels managed by the mixer.
  77.    If decreasing the number of channels, the upper channels are
  78.    stopped.
  79.    This function returns the new number of allocated channels.
  80.  */
  81. extern DECLSPEC int Mix_AllocateChannels(int numchans);
  82.  
  83. /* Find out what the actual audio device parameters are.
  84.    This function returns 1 if the audio has been opened, 0 otherwise.
  85.  */
  86. extern DECLSPEC int Mix_QuerySpec(int *frequency,Uint16 *format,int *channels);
  87.  
  88. /* Load a wave file or a music (.mod .s3m .it .xm) file */
  89. extern DECLSPEC Mix_Chunk *Mix_LoadWAV_RW(SDL_RWops *src, int freesrc);
  90. #define Mix_LoadWAV(file)       Mix_LoadWAV_RW(SDL_RWFromFile(file, "rb"), 1)
  91. extern DECLSPEC Mix_Music *Mix_LoadMUS(const char *file);
  92.  
  93. #if 0 /* This hasn't been hooked into music.c yet */
  94. /* Load a music file from an SDL_RWop object (MikMod-specific currently)
  95.    Matt Campbell (matt@campbellhome.dhs.org) April 2000 */
  96. extern DECLSPEC Mix_Music *Mix_LoadMUS_RW(SDL_RWops *rw);
  97. #endif
  98.  
  99. /* Load a wave file of the mixer format from a memory buffer */
  100. extern DECLSPEC Mix_Chunk *Mix_QuickLoad_WAV(Uint8 *mem);
  101.  
  102. /* Free an audio chunk previously loaded */
  103. extern DECLSPEC void Mix_FreeChunk(Mix_Chunk *chunk);
  104. extern DECLSPEC void Mix_FreeMusic(Mix_Music *music);
  105.  
  106. /* Set a function that is called after all mixing is performed.
  107.    This can be used to provide real-time visual display of the audio stream
  108.    or add a custom mixer filter for the stream data.
  109. */
  110. extern DECLSPEC void Mix_SetPostMix(void (*mix_func)
  111.                              (void *udata, Uint8 *stream, int len), void *arg);
  112.  
  113. /* Add your own music player or additional mixer function.
  114.    If 'mix_func' is NULL, the default music player is re-enabled.
  115.  */
  116. extern DECLSPEC void Mix_HookMusic(void (*mix_func)
  117.                           (void *udata, Uint8 *stream, int len), void *arg);
  118.  
  119. /* Add your own callback when the music has finished playing.
  120.  */
  121. extern DECLSPEC void Mix_HookMusicFinished(void (*music_finished)(void));
  122.  
  123. /* Get a pointer to the user data for the current music hook */
  124. extern DECLSPEC void *Mix_GetMusicHookData(void);
  125.  
  126. /* Reserve the first channels (0 -> n-1) for the application, i.e. don't allocate
  127.    them dynamically to the next sample if requested with a -1 value below.
  128.    Returns the number of reserved channels.
  129.  */
  130. extern DECLSPEC int Mix_ReserveChannels(int num);
  131.  
  132. /* Channel grouping functions */
  133.  
  134. /* Attach a tag to a channel. A tag can be assigned to several mixer
  135.    channels, to form groups of channels.
  136.    If 'tag' is -1, the tag is removed (actually -1 is the tag used to
  137.    represent the group of all the channels).
  138.    Returns true if everything was OK.
  139.  */
  140. extern DECLSPEC int Mix_GroupChannel(int which, int tag);
  141. /* Assign several consecutive channels to a group */
  142. extern DECLSPEC int Mix_GroupChannels(int from, int to, int tag);
  143. /* Finds the first available channel in a group of channels */
  144. extern DECLSPEC int Mix_GroupAvailable(int tag);
  145. /* Returns the number of channels in a group. This is also a subtle
  146.    way to get the total number of channels when 'tag' is -1
  147.  */
  148. extern DECLSPEC int Mix_GroupCount(int tag);
  149. /* Finds the "oldest" sample playing in a group of channels */
  150. extern DECLSPEC int Mix_GroupOldest(int tag);
  151. /* Finds the "most recent" (i.e. last) sample playing in a group of channels */
  152. extern DECLSPEC int Mix_GroupNewer(int tag);
  153.  
  154. /* Play an audio chunk on a specific channel.
  155.    If the specified channel is -1, play on the first free channel.
  156.    If 'loops' is greater than zero, loop the sound that many times.
  157.    If 'loops' is -1, loop inifinitely (~65000 times).
  158.    Returns which channel was used to play the sound.
  159. */
  160. #define Mix_PlayChannel(channel,chunk,loops) Mix_PlayChannelTimed(channel,chunk,loops,-1)
  161. /* The same as above, but the sound is played at most 'ticks' milliseconds */
  162. extern DECLSPEC int Mix_PlayChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ticks);
  163. extern DECLSPEC int Mix_PlayMusic(Mix_Music *music, int loops);
  164.  
  165. /* Fade in music or a channel over "ms" milliseconds, same semantics as the "Play" functions */
  166. extern DECLSPEC int Mix_FadeInMusic(Mix_Music *music, int loops, int ms);
  167. #define Mix_FadeInChannel(channel,chunk,loops,ms) Mix_FadeInChannelTimed(channel,chunk,loops,ms,-1)
  168. extern DECLSPEC int Mix_FadeInChannelTimed(int channel, Mix_Chunk *chunk, int loops, int ms, int ticks);
  169.  
  170. /* Set the volume in the range of 0-128 of a specific channel or chunk.
  171.    If the specified channel is -1, set volume for all channels.
  172.    Returns the original volume.
  173.    If the specified volume is -1, just return the current volume.
  174. */
  175. extern DECLSPEC int Mix_Volume(int channel, int volume);
  176. extern DECLSPEC int Mix_VolumeChunk(Mix_Chunk *chunk, int volume);
  177. extern DECLSPEC int Mix_VolumeMusic(int volume);
  178.  
  179. /* Halt playing of a particular channel */
  180. extern DECLSPEC int Mix_HaltChannel(int channel);
  181. extern DECLSPEC int Mix_HaltGroup(int tag);
  182. extern DECLSPEC int Mix_HaltMusic(void);
  183.  
  184. /* Change the expiration delay for a particular channel.
  185.    The sample will stop playing after the 'ticks' milliseconds have elapsed,
  186.    or remove the expiration if 'ticks' is -1
  187. */
  188. extern DECLSPEC int Mix_ExpireChannel(int channel, int ticks);
  189.  
  190. /* Halt a channel, fading it out progressively till it's silent
  191.    The ms parameter indicates the number of milliseconds the fading
  192.    will take.
  193.  */
  194. extern DECLSPEC int Mix_FadeOutChannel(int which, int ms);
  195. extern DECLSPEC int Mix_FadeOutGroup(int tag, int ms);
  196. extern DECLSPEC int Mix_FadeOutMusic(int ms);
  197.  
  198. /* Query the fading status of a channel */
  199. extern DECLSPEC Mix_Fading Mix_FadingMusic(void);
  200. extern DECLSPEC Mix_Fading Mix_FadingChannel(int which);
  201.  
  202. /* Pause/Resume a particular channel */
  203. extern DECLSPEC void Mix_Pause(int channel);
  204. extern DECLSPEC void Mix_Resume(int channel);
  205. extern DECLSPEC int  Mix_Paused(int channel);
  206.  
  207. /* Pause/Resume the music stream */
  208. extern DECLSPEC void Mix_PauseMusic(void);
  209. extern DECLSPEC void Mix_ResumeMusic(void);
  210. extern DECLSPEC void Mix_RewindMusic(void);
  211. extern DECLSPEC int  Mix_PausedMusic(void);
  212.  
  213. /* Check the status of a specific channel.
  214.    If the specified channel is -1, check all channels.
  215. */
  216. extern DECLSPEC int Mix_Playing(int channel);
  217. extern DECLSPEC int Mix_PlayingMusic(void);
  218.  
  219. /* Stop music and set external music playback command */
  220. extern DECLSPEC int Mix_SetMusicCMD(const char *command);
  221.  
  222. /* Close the mixer, halting all playing audio */
  223. extern DECLSPEC void Mix_CloseAudio(void);
  224.  
  225. /* We'll use SDL for reporting errors */
  226. #define Mix_SetError    SDL_SetError
  227. #define Mix_GetError    SDL_GetError
  228.  
  229. /* Ends C function definitions when using C++ */
  230. #ifdef __cplusplus
  231. }
  232. #endif
  233. #include "close_code.h"
  234.  
  235. #endif /* _MIXER_H_ */
  236.