Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4680 | right-hear | 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_ */ |