Subversion Repositories Kolibri OS

Rev

Go to most recent revision | 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_ */