Skip to content

Latest commit

 

History

History
1432 lines (1338 loc) · 30.7 KB

music.c

File metadata and controls

1432 lines (1338 loc) · 30.7 KB
 
Oct 21, 1999
Oct 21, 1999
1
/*
Dec 14, 2001
Dec 14, 2001
2
SDL_mixer: An audio mixer library based on the SDL library
Dec 8, 2008
Dec 8, 2008
3
Copyright (C) 1997-2009 Sam Lantinga
Dec 26, 1999
Dec 26, 1999
4
Dec 14, 2001
Dec 14, 2001
5
6
7
8
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
Dec 26, 1999
Dec 26, 1999
9
Dec 14, 2001
Dec 14, 2001
10
11
12
13
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
Dec 26, 1999
Dec 26, 1999
14
Dec 14, 2001
Dec 14, 2001
15
16
17
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Dec 26, 1999
Dec 26, 1999
18
Dec 14, 2001
Dec 14, 2001
19
20
Sam Lantinga
slouken@libsdl.org
Oct 21, 1999
Oct 21, 1999
21
22
*/
Dec 14, 2001
Dec 14, 2001
23
/* $Id$ */
Dec 14, 2001
Dec 14, 2001
24
Oct 23, 1999
Oct 23, 1999
25
26
#include <stdlib.h>
#include <string.h>
Oct 16, 2001
Oct 16, 2001
27
#include <ctype.h>
Nov 19, 2005
Nov 19, 2005
28
#include <assert.h>
Dec 21, 1999
Dec 21, 1999
29
30
#include "SDL_endian.h"
#include "SDL_audio.h"
Dec 27, 1999
Dec 27, 1999
31
#include "SDL_timer.h"
Oct 21, 1999
Oct 21, 1999
32
Jan 14, 2000
Jan 14, 2000
33
#include "SDL_mixer.h"
Oct 21, 1999
Oct 21, 1999
34
35
36
37
38
39
40
#ifdef CMD_MUSIC
#include "music_cmd.h"
#endif
#ifdef WAV_MUSIC
#include "wavestream.h"
#endif
Nov 16, 2009
Nov 16, 2009
41
42
43
#ifdef MODPLUG_MUSIC
#include "music_modplug.h"
#endif
Oct 3, 2009
Oct 3, 2009
44
45
#ifdef MOD_MUSIC
#include "music_mod.h"
Oct 21, 1999
Oct 21, 1999
46
47
#endif
#ifdef MID_MUSIC
Sep 5, 2001
Sep 5, 2001
48
49
50
51
52
53
54
55
56
57
58
# ifdef USE_TIMIDITY_MIDI
# include "timidity.h"
# endif
# ifdef USE_NATIVE_MIDI
# include "native_midi.h"
# endif
# if defined(USE_TIMIDITY_MIDI) && defined(USE_NATIVE_MIDI)
# define MIDI_ELSE else
# else
# define MIDI_ELSE
# endif
Oct 21, 1999
Oct 21, 1999
59
#endif
Jul 3, 2000
Jul 3, 2000
60
61
62
#ifdef OGG_MUSIC
#include "music_ogg.h"
#endif
Oct 21, 1999
Oct 21, 1999
63
#ifdef MP3_MUSIC
May 12, 2006
May 12, 2006
64
#include "dynamic_mp3.h"
Jul 15, 2007
Jul 15, 2007
65
66
67
68
#endif
#ifdef MP3_MAD_MUSIC
#include "music_mad.h"
#endif
Feb 27, 2008
Feb 27, 2008
69
70
71
#ifdef FLAC_MUSIC
#include "music_flac.h"
#endif
Oct 21, 1999
Oct 21, 1999
72
Jul 15, 2007
Jul 15, 2007
73
#if defined(MP3_MUSIC) || defined(MP3_MAD_MUSIC)
Oct 21, 1999
Oct 21, 1999
74
75
76
static SDL_AudioSpec used_mixer;
#endif
Jul 15, 2007
Jul 15, 2007
77
Feb 1, 2000
Feb 1, 2000
78
79
int volatile music_active = 1;
static int volatile music_stopped = 0;
Oct 21, 1999
Oct 21, 1999
80
81
static int music_loops = 0;
static char *music_cmd = NULL;
Feb 1, 2000
Feb 1, 2000
82
static Mix_Music * volatile music_playing = NULL;
Nov 11, 1999
Nov 11, 1999
83
static int music_volume = MIX_MAX_VOLUME;
Oct 23, 1999
Oct 23, 1999
84
Oct 21, 1999
Oct 21, 1999
85
struct _Mix_Music {
May 19, 2002
May 19, 2002
86
Mix_MusicType type;
Oct 21, 1999
Oct 21, 1999
87
88
89
90
91
92
93
union {
#ifdef CMD_MUSIC
MusicCMD *cmd;
#endif
#ifdef WAV_MUSIC
WAVStream *wave;
#endif
Nov 16, 2009
Nov 16, 2009
94
95
96
#ifdef MODPLUG_MUSIC
modplug_data *modplug;
#endif
Oct 3, 2009
Oct 3, 2009
97
98
#ifdef MOD_MUSIC
struct MODULE *module;
Oct 21, 1999
Oct 21, 1999
99
100
#endif
#ifdef MID_MUSIC
Sep 5, 2001
Sep 5, 2001
101
#ifdef USE_TIMIDITY_MIDI
Oct 21, 1999
Oct 21, 1999
102
MidiSong *midi;
Sep 5, 2001
Sep 5, 2001
103
#endif
Aug 19, 2001
Aug 19, 2001
104
105
106
#ifdef USE_NATIVE_MIDI
NativeMidiSong *nativemidi;
#endif
Oct 21, 1999
Oct 21, 1999
107
#endif
Jul 3, 2000
Jul 3, 2000
108
109
110
#ifdef OGG_MUSIC
OGG_music *ogg;
#endif
Oct 21, 1999
Oct 21, 1999
111
112
#ifdef MP3_MUSIC
SMPEG *mp3;
Jul 15, 2007
Jul 15, 2007
113
114
115
#endif
#ifdef MP3_MAD_MUSIC
mad_data *mp3_mad;
Feb 27, 2008
Feb 27, 2008
116
117
118
#endif
#ifdef FLAC_MUSIC
FLAC_music *flac;
Oct 21, 1999
Oct 21, 1999
119
120
#endif
} data;
Oct 23, 1999
Oct 23, 1999
121
Mix_Fading fading;
Nov 11, 1999
Nov 11, 1999
122
123
int fade_step;
int fade_steps;
Oct 21, 1999
Oct 21, 1999
124
125
int error;
};
Dec 27, 1999
Dec 27, 1999
126
#ifdef MID_MUSIC
Sep 5, 2001
Sep 5, 2001
127
#ifdef USE_TIMIDITY_MIDI
Oct 21, 1999
Oct 21, 1999
128
static int timidity_ok;
Dec 17, 2001
Dec 17, 2001
129
static int samplesize;
Sep 5, 2001
Sep 5, 2001
130
#endif
Aug 19, 2001
Aug 19, 2001
131
132
133
#ifdef USE_NATIVE_MIDI
static int native_midi_ok;
#endif
Dec 27, 1999
Dec 27, 1999
134
#endif
Oct 21, 1999
Oct 21, 1999
135
Nov 11, 1999
Nov 11, 1999
136
137
138
/* Used to calculate fading steps */
static int ms_per_step;
Jun 5, 2009
Jun 5, 2009
139
140
141
142
/* rcg06042009 report available decoders at runtime. */
static const char **music_decoders = NULL;
static int num_decoders = 0;
Nov 5, 2009
Nov 5, 2009
143
int Mix_GetNumMusicDecoders(void)
Jun 5, 2009
Jun 5, 2009
144
145
146
147
148
149
150
151
152
153
154
155
156
157
{
return(num_decoders);
}
const char *Mix_GetMusicDecoder(int index)
{
if ((index < 0) || (index >= num_decoders)) {
return NULL;
}
return(music_decoders[index]);
}
static void add_music_decoder(const char *decoder)
{
Oct 3, 2009
Oct 3, 2009
158
void *ptr = realloc(music_decoders, (num_decoders + 1) * sizeof (const char **));
Jun 5, 2009
Jun 5, 2009
159
160
161
if (ptr == NULL) {
return; /* oh well, go on without it. */
}
Oct 3, 2009
Oct 3, 2009
162
music_decoders = (const char **) ptr;
Jun 5, 2009
Jun 5, 2009
163
164
165
music_decoders[num_decoders++] = decoder;
}
Oct 30, 1999
Oct 30, 1999
166
/* Local low-level functions prototypes */
Nov 9, 2003
Nov 9, 2003
167
static void music_internal_initialize_volume(void);
May 16, 2002
May 16, 2002
168
169
170
171
172
static void music_internal_volume(int volume);
static int music_internal_play(Mix_Music *music, double position);
static int music_internal_position(double position);
static int music_internal_playing();
static void music_internal_halt(void);
Oct 26, 1999
Oct 26, 1999
173
Dec 27, 1999
Dec 27, 1999
174
175
176
177
178
179
180
181
182
183
184
185
/* Support for hooking when the music has finished */
static void (*music_finished_hook)(void) = NULL;
void Mix_HookMusicFinished(void (*music_finished)(void))
{
SDL_LockAudio();
music_finished_hook = music_finished;
SDL_UnlockAudio();
}
Nov 19, 2005
Nov 19, 2005
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
/* If music isn't playing, halt it if no looping is required, restart it */
/* otherwhise. NOP if the music is playing */
static int music_halt_or_loop (void)
{
/* Restart music if it has to loop */
if (!music_internal_playing())
{
/* Restart music if it has to loop at a high level */
if (music_loops && --music_loops)
{
Mix_Fading current_fade = music_playing->fading;
music_internal_play(music_playing, 0.0);
music_playing->fading = current_fade;
}
else
{
music_internal_halt();
if (music_finished_hook)
music_finished_hook();
return 0;
}
}
return 1;
}
Oct 21, 1999
Oct 21, 1999
216
217
218
/* Mixing function */
void music_mixer(void *udata, Uint8 *stream, int len)
{
Oct 2, 2009
Oct 2, 2009
219
220
int left = 0;
May 16, 2002
May 16, 2002
221
if ( music_playing && music_active ) {
Nov 1, 1999
Nov 1, 1999
222
/* Handle fading */
Nov 11, 1999
Nov 11, 1999
223
224
if ( music_playing->fading != MIX_NO_FADING ) {
if ( music_playing->fade_step++ < music_playing->fade_steps ) {
May 16, 2002
May 16, 2002
225
int volume;
Dec 26, 1999
Dec 26, 1999
226
227
int fade_step = music_playing->fade_step;
int fade_steps = music_playing->fade_steps;
Nov 11, 1999
Nov 11, 1999
228
Oct 23, 1999
Oct 23, 1999
229
if ( music_playing->fading == MIX_FADING_OUT ) {
May 16, 2002
May 16, 2002
230
volume = (music_volume * (fade_steps-fade_step)) / fade_steps;
Nov 11, 1999
Nov 11, 1999
231
} else { /* Fading in */
May 16, 2002
May 16, 2002
232
volume = (music_volume * fade_step) / fade_steps;
Oct 23, 1999
Oct 23, 1999
233
}
May 16, 2002
May 16, 2002
234
music_internal_volume(volume);
Oct 23, 1999
Oct 23, 1999
235
236
} else {
if ( music_playing->fading == MIX_FADING_OUT ) {
May 16, 2002
May 16, 2002
237
238
239
240
music_internal_halt();
if ( music_finished_hook ) {
music_finished_hook();
}
Nov 11, 1999
Nov 11, 1999
241
return;
Oct 23, 1999
Oct 23, 1999
242
}
Nov 11, 1999
Nov 11, 1999
243
music_playing->fading = MIX_NO_FADING;
Oct 23, 1999
Oct 23, 1999
244
245
}
}
Nov 19, 2005
Nov 19, 2005
246
247
248
249
250
if (music_halt_or_loop() == 0)
return;
Oct 21, 1999
Oct 21, 1999
251
252
253
254
255
256
257
258
switch (music_playing->type) {
#ifdef CMD_MUSIC
case MUS_CMD:
/* The playing is done externally */
break;
#endif
#ifdef WAV_MUSIC
case MUS_WAV:
Oct 2, 2009
Oct 2, 2009
259
left = WAVStream_PlaySome(stream, len);
Oct 21, 1999
Oct 21, 1999
260
261
break;
#endif
Nov 16, 2009
Nov 16, 2009
262
263
264
265
266
#ifdef MODPLUG_MUSIC
case MUS_MODPLUG:
left = modplug_playAudio(music_playing->data.modplug, stream, len);
break;
#endif
Oct 3, 2009
Oct 3, 2009
267
#ifdef MOD_MUSIC
Oct 21, 1999
Oct 21, 1999
268
case MUS_MOD:
Oct 3, 2009
Oct 3, 2009
269
left = MOD_playAudio(music_playing->data.module, stream, len);
Oct 21, 1999
Oct 21, 1999
270
271
272
break;
#endif
#ifdef MID_MUSIC
Sep 5, 2001
Sep 5, 2001
273
#ifdef USE_TIMIDITY_MIDI
Oct 21, 1999
Oct 21, 1999
274
case MUS_MID:
Aug 19, 2001
Aug 19, 2001
275
276
277
278
if ( timidity_ok ) {
int samples = len / samplesize;
Timidity_PlaySome(stream, samples);
}
Oct 21, 1999
Oct 21, 1999
279
280
break;
#endif
Sep 5, 2001
Sep 5, 2001
281
#endif
Jul 3, 2000
Jul 3, 2000
282
283
#ifdef OGG_MUSIC
case MUS_OGG:
Nov 19, 2005
Nov 19, 2005
284
Oct 2, 2009
Oct 2, 2009
285
left = OGG_playAudio(music_playing->data.ogg, stream, len);
Jul 3, 2000
Jul 3, 2000
286
287
break;
#endif
Feb 27, 2008
Feb 27, 2008
288
289
#ifdef FLAC_MUSIC
case MUS_FLAC:
Oct 2, 2009
Oct 2, 2009
290
left = FLAC_playAudio(music_playing->data.flac, stream, len);
Feb 27, 2008
Feb 27, 2008
291
292
break;
#endif
Oct 21, 1999
Oct 21, 1999
293
#ifdef MP3_MUSIC
Dec 26, 1999
Dec 26, 1999
294
case MUS_MP3:
Oct 2, 2009
Oct 2, 2009
295
left = (len - smpeg.SMPEG_playAudio(music_playing->data.mp3, stream, len));
Oct 21, 1999
Oct 21, 1999
296
break;
Jul 15, 2007
Jul 15, 2007
297
298
299
#endif
#ifdef MP3_MAD_MUSIC
case MUS_MP3_MAD:
Oct 2, 2009
Oct 2, 2009
300
left = mad_getSamples(music_playing->data.mp3_mad, stream, len);
Jul 15, 2007
Jul 15, 2007
301
break;
Oct 21, 1999
Oct 21, 1999
302
303
304
305
306
307
#endif
default:
/* Unknown music type?? */
break;
}
}
Oct 2, 2009
Oct 2, 2009
308
309
310
311
312
/* Handle seamless music looping */
if (left > 0 && left < len && music_halt_or_loop()) {
music_mixer(udata, stream+(len-left), left);
}
Oct 21, 1999
Oct 21, 1999
313
314
315
316
317
318
}
/* Initialize the music players with a certain desired audio format */
int open_music(SDL_AudioSpec *mixer)
{
#ifdef WAV_MUSIC
Nov 14, 2009
Nov 14, 2009
319
if ( WAVStream_Init(mixer) == 0 ) {
Jun 5, 2009
Jun 5, 2009
320
add_music_decoder("WAVE");
Oct 21, 1999
Oct 21, 1999
321
322
}
#endif
Nov 16, 2009
Nov 16, 2009
323
#ifdef MODPLUG_MUSIC
Feb 4, 2010
Feb 4, 2010
324
if ( modplug_init(mixer) == 0 ) {
Nov 16, 2009
Nov 16, 2009
325
326
327
add_music_decoder("MODPLUG");
}
#endif
Oct 3, 2009
Oct 3, 2009
328
#ifdef MOD_MUSIC
Nov 14, 2009
Nov 14, 2009
329
if ( MOD_init(mixer) == 0 ) {
Oct 3, 2009
Oct 3, 2009
330
add_music_decoder("MIKMOD");
Oct 21, 1999
Oct 21, 1999
331
332
333
}
#endif
#ifdef MID_MUSIC
Sep 5, 2001
Sep 5, 2001
334
#ifdef USE_TIMIDITY_MIDI
Dec 17, 2001
Dec 17, 2001
335
samplesize = mixer->size / mixer->samples;
Aug 19, 2001
Aug 19, 2001
336
if ( Timidity_Init(mixer->freq, mixer->format,
Aug 20, 2001
Aug 20, 2001
337
mixer->channels, mixer->samples) == 0 ) {
Aug 19, 2001
Aug 19, 2001
338
timidity_ok = 1;
Jun 5, 2009
Jun 5, 2009
339
add_music_decoder("TIMIDITY");
Oct 21, 1999
Oct 21, 1999
340
341
342
} else {
timidity_ok = 0;
}
Sep 5, 2001
Sep 5, 2001
343
#endif
Aug 19, 2001
Aug 19, 2001
344
#ifdef USE_NATIVE_MIDI
Sep 5, 2001
Sep 5, 2001
345
#ifdef USE_TIMIDITY_MIDI
Aug 19, 2001
Aug 19, 2001
346
native_midi_ok = !timidity_ok;
Oct 3, 2009
Oct 3, 2009
347
348
349
if ( !native_midi_ok ) {
native_midi_ok = (getenv("SDL_NATIVE_MUSIC") != NULL);
}
Sep 5, 2001
Sep 5, 2001
350
351
if ( native_midi_ok )
#endif
Aug 19, 2001
Aug 19, 2001
352
native_midi_ok = native_midi_detect();
Jun 5, 2009
Jun 5, 2009
353
354
if ( native_midi_ok )
add_music_decoder("NATIVEMIDI");
Aug 19, 2001
Aug 19, 2001
355
#endif
Oct 21, 1999
Oct 21, 1999
356
#endif
Jul 3, 2000
Jul 3, 2000
357
#ifdef OGG_MUSIC
Nov 14, 2009
Nov 14, 2009
358
if ( OGG_init(mixer) == 0 ) {
Jun 5, 2009
Jun 5, 2009
359
add_music_decoder("OGG");
Jul 3, 2000
Jul 3, 2000
360
361
}
#endif
Feb 27, 2008
Feb 27, 2008
362
#ifdef FLAC_MUSIC
Nov 14, 2009
Nov 14, 2009
363
if ( FLAC_init(mixer) == 0 ) {
Jun 5, 2009
Jun 5, 2009
364
add_music_decoder("FLAC");
Feb 27, 2008
Feb 27, 2008
365
366
}
#endif
Jul 15, 2007
Jul 15, 2007
367
#if defined(MP3_MUSIC) || defined(MP3_MAD_MUSIC)
Oct 21, 1999
Oct 21, 1999
368
369
/* Keep a copy of the mixer */
used_mixer = *mixer;
Jun 5, 2009
Jun 5, 2009
370
add_music_decoder("MP3");
Oct 21, 1999
Oct 21, 1999
371
#endif
Jun 5, 2009
Jun 5, 2009
372
Feb 1, 2000
Feb 1, 2000
373
music_playing = NULL;
Oct 26, 1999
Oct 26, 1999
374
music_stopped = 0;
Oct 21, 1999
Oct 21, 1999
375
376
Mix_VolumeMusic(SDL_MIX_MAXVOLUME);
Dec 26, 1999
Dec 26, 1999
377
/* Calculate the number of ms for each callback */
Feb 2, 2000
Feb 2, 2000
378
ms_per_step = (int) (((float)mixer->samples * 1000.0) / mixer->freq);
Nov 11, 1999
Nov 11, 1999
379
Oct 21, 1999
Oct 21, 1999
380
381
382
return(0);
}
Oct 16, 2001
Oct 16, 2001
383
384
385
386
387
388
389
390
391
392
393
394
395
/* Portable case-insensitive string compare function */
int MIX_string_equals(const char *str1, const char *str2)
{
while ( *str1 && *str2 ) {
if ( toupper((unsigned char)*str1) !=
toupper((unsigned char)*str2) )
break;
++str1;
++str2;
}
return (!*str1 && !*str2);
}
Oct 21, 1999
Oct 21, 1999
396
397
398
399
/* Load a music file */
Mix_Music *Mix_LoadMUS(const char *file)
{
FILE *fp;
Oct 16, 2001
Oct 16, 2001
400
char *ext;
Aug 21, 2004
Aug 21, 2004
401
Uint8 magic[5], moremagic[9];
Oct 21, 1999
Oct 21, 1999
402
403
404
405
406
407
408
409
Mix_Music *music;
/* Figure out what kind of file this is */
fp = fopen(file, "rb");
if ( (fp == NULL) || !fread(magic, 4, 1, fp) ) {
if ( fp != NULL ) {
fclose(fp);
}
Dec 26, 1999
Dec 26, 1999
410
Mix_SetError("Couldn't read from '%s'", file);
Oct 21, 1999
Oct 21, 1999
411
412
return(NULL);
}
Aug 21, 2004
Aug 21, 2004
413
414
415
416
if (!fread(moremagic, 8, 1, fp)) {
Mix_SetError("Couldn't read from '%s'", file);
return(NULL);
}
Oct 21, 1999
Oct 21, 1999
417
magic[4] = '\0';
Aug 21, 2004
Aug 21, 2004
418
moremagic[8] = '\0';
Oct 21, 1999
Oct 21, 1999
419
420
fclose(fp);
Oct 16, 2001
Oct 16, 2001
421
422
423
424
/* Figure out the file extension, so we can determine the type */
ext = strrchr(file, '.');
if ( ext ) ++ext; /* skip the dot in the extension */
Oct 21, 1999
Oct 21, 1999
425
426
427
/* Allocate memory for the music structure */
music = (Mix_Music *)malloc(sizeof(Mix_Music));
if ( music == NULL ) {
Dec 26, 1999
Dec 26, 1999
428
Mix_SetError("Out of memory");
Oct 21, 1999
Oct 21, 1999
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
return(NULL);
}
music->error = 0;
#ifdef CMD_MUSIC
if ( music_cmd ) {
music->type = MUS_CMD;
music->data.cmd = MusicCMD_LoadSong(music_cmd, file);
if ( music->data.cmd == NULL ) {
music->error = 1;
}
} else
#endif
#ifdef WAV_MUSIC
/* WAVE files have the magic four bytes "RIFF"
AIFF files have the magic 12 bytes "FORM" XXXX "AIFF"
*/
Nov 30, 2001
Nov 30, 2001
446
if ( (ext && MIX_string_equals(ext, "WAV")) ||
Aug 21, 2004
Aug 21, 2004
447
((strcmp((char *)magic, "RIFF") == 0) && (strcmp((char *)(moremagic+4), "WAVE") == 0)) ||
Mar 4, 2000
Mar 4, 2000
448
(strcmp((char *)magic, "FORM") == 0) ) {
Oct 21, 1999
Oct 21, 1999
449
music->type = MUS_WAV;
Mar 4, 2000
Mar 4, 2000
450
music->data.wave = WAVStream_LoadSong(file, (char *)magic);
Oct 21, 1999
Oct 21, 1999
451
if ( music->data.wave == NULL ) {
Nov 30, 2001
Nov 30, 2001
452
Mix_SetError("Unable to load WAV file");
Oct 21, 1999
Oct 21, 1999
453
454
455
456
457
458
music->error = 1;
}
} else
#endif
#ifdef MID_MUSIC
/* MIDI files have the magic four bytes "MThd" */
Nov 30, 2001
Nov 30, 2001
459
460
if ( (ext && MIX_string_equals(ext, "MID")) ||
(ext && MIX_string_equals(ext, "MIDI")) ||
Aug 21, 2004
Aug 21, 2004
461
462
463
strcmp((char *)magic, "MThd") == 0 ||
( strcmp((char *)magic, "RIFF") == 0 &&
strcmp((char *)(moremagic+4), "RMID") == 0 ) ) {
Oct 21, 1999
Oct 21, 1999
464
music->type = MUS_MID;
Aug 19, 2001
Aug 19, 2001
465
466
#ifdef USE_NATIVE_MIDI
if ( native_midi_ok ) {
Sep 26, 2009
Sep 26, 2009
467
music->data.nativemidi = native_midi_loadsong(file);
Aug 19, 2001
Aug 19, 2001
468
469
470
471
if ( music->data.nativemidi == NULL ) {
Mix_SetError("%s", native_midi_error());
music->error = 1;
}
Sep 5, 2001
Sep 5, 2001
472
} MIDI_ELSE
Aug 19, 2001
Aug 19, 2001
473
#endif
Sep 5, 2001
Sep 5, 2001
474
#ifdef USE_TIMIDITY_MIDI
Oct 21, 1999
Oct 21, 1999
475
if ( timidity_ok ) {
Oct 10, 2009
Oct 10, 2009
476
music->data.midi = Timidity_LoadSong(file);
Oct 21, 1999
Oct 21, 1999
477
if ( music->data.midi == NULL ) {
Dec 26, 1999
Dec 26, 1999
478
Mix_SetError("%s", Timidity_Error());
Oct 21, 1999
Oct 21, 1999
479
480
music->error = 1;
}
Aug 19, 2001
Aug 19, 2001
481
} else {
Dec 26, 1999
Dec 26, 1999
482
Mix_SetError("%s", Timidity_Error());
Oct 21, 1999
Oct 21, 1999
483
484
music->error = 1;
}
Sep 5, 2001
Sep 5, 2001
485
#endif
Oct 21, 1999
Oct 21, 1999
486
487
} else
#endif
Jul 3, 2000
Jul 3, 2000
488
489
#ifdef OGG_MUSIC
/* Ogg Vorbis files have the magic four bytes "OggS" */
Nov 30, 2001
Nov 30, 2001
490
if ( (ext && MIX_string_equals(ext, "OGG")) ||
Nov 30, 2001
Nov 30, 2001
491
strcmp((char *)magic, "OggS") == 0 ) {
Jul 3, 2000
Jul 3, 2000
492
493
494
495
496
497
498
music->type = MUS_OGG;
music->data.ogg = OGG_new(file);
if ( music->data.ogg == NULL ) {
music->error = 1;
}
} else
#endif
Feb 27, 2008
Feb 27, 2008
499
500
501
502
503
504
505
506
507
508
509
#ifdef FLAC_MUSIC
/* FLAC files have the magic four bytes "fLaC" */
if ( (ext && MIX_string_equals(ext, "FLAC")) ||
strcmp((char *)magic, "fLaC") == 0 ) {
music->type = MUS_FLAC;
music->data.flac = FLAC_new(file);
if ( music->data.flac == NULL ) {
music->error = 1;
}
} else
#endif
Oct 21, 1999
Oct 21, 1999
510
#ifdef MP3_MUSIC
Nov 30, 2001
Nov 30, 2001
511
if ( (ext && MIX_string_equals(ext, "MPG")) ||
Jun 26, 2002
Jun 26, 2002
512
(ext && MIX_string_equals(ext, "MP3")) ||
Nov 30, 2001
Nov 30, 2001
513
(ext && MIX_string_equals(ext, "MPEG")) ||
Sep 26, 2009
Sep 26, 2009
514
515
(magic[0] == 0xFF && (magic[1] & 0xF0) == 0xF0) ||
(strncmp((char *)magic, "ID3", 3) == 0) ) {
Nov 8, 2009
Nov 8, 2009
516
if ( Mix_Init(MIX_INIT_MP3) ) {
May 12, 2006
May 12, 2006
517
518
519
520
521
522
523
524
525
SMPEG_Info info;
music->type = MUS_MP3;
music->data.mp3 = smpeg.SMPEG_new(file, &info, 0);
if ( !info.has_audio ) {
Mix_SetError("MPEG file does not have any audio stream.");
music->error = 1;
} else {
smpeg.SMPEG_actualSpec(music->data.mp3, &used_mixer);
}
Dec 21, 2004
Dec 21, 2004
526
} else {
May 12, 2006
May 12, 2006
527
music->error = 1;
Oct 21, 1999
Oct 21, 1999
528
529
530
}
} else
#endif
Jul 15, 2007
Jul 15, 2007
531
532
533
534
535
#ifdef MP3_MAD_MUSIC
if ( (ext && MIX_string_equals(ext, "MPG")) ||
(ext && MIX_string_equals(ext, "MP3")) ||
(ext && MIX_string_equals(ext, "MPEG")) ||
(ext && MIX_string_equals(ext, "MAD")) ||
Sep 26, 2009
Sep 26, 2009
536
537
(magic[0] == 0xFF && (magic[1] & 0xF0) == 0xF0) ||
(strncmp((char *)magic, "ID3", 3) == 0) ) {
Jul 15, 2007
Jul 15, 2007
538
539
540
541
542
543
544
545
music->type = MUS_MP3_MAD;
music->data.mp3_mad = mad_openFile(file, &used_mixer);
if (music->data.mp3_mad == 0) {
Mix_SetError("Could not initialize MPEG stream.");
music->error = 1;
}
} else
#endif
Nov 16, 2009
Nov 16, 2009
546
547
548
549
550
551
552
553
554
#ifdef MODPLUG_MUSIC
if ( 1 ) {
music->type = MUS_MODPLUG;
music->data.modplug = modplug_new(file);
if ( music->data.modplug == NULL ) {
music->error = 1;
}
} else
#endif
Oct 3, 2009
Oct 3, 2009
555
#ifdef MOD_MUSIC
Oct 21, 1999
Oct 21, 1999
556
557
if ( 1 ) {
music->type = MUS_MOD;
Oct 3, 2009
Oct 3, 2009
558
music->data.module = MOD_new(file);
Oct 21, 1999
Oct 21, 1999
559
560
561
562
563
564
if ( music->data.module == NULL ) {
music->error = 1;
}
} else
#endif
{
Dec 26, 1999
Dec 26, 1999
565
Mix_SetError("Unrecognized music format");
Oct 21, 1999
Oct 21, 1999
566
567
568
569
570
571
572
573
574
575
576
577
578
music->error = 1;
}
if ( music->error ) {
free(music);
music = NULL;
}
return(music);
}
/* Free a music chunk previously loaded */
void Mix_FreeMusic(Mix_Music *music)
{
if ( music ) {
May 16, 2002
May 16, 2002
579
580
581
582
583
584
585
586
587
588
589
/* Stop the music if it's currently playing */
SDL_LockAudio();
if ( music == music_playing ) {
/* Wait for any fade out to finish */
while ( music->fading == MIX_FADING_OUT ) {
SDL_UnlockAudio();
SDL_Delay(100);
SDL_LockAudio();
}
if ( music == music_playing ) {
music_internal_halt();
Oct 23, 1999
Oct 23, 1999
590
}
Oct 21, 1999
Oct 21, 1999
591
}
May 16, 2002
May 16, 2002
592
SDL_UnlockAudio();
Oct 21, 1999
Oct 21, 1999
593
594
595
596
597
598
599
600
601
602
603
switch (music->type) {
#ifdef CMD_MUSIC
case MUS_CMD:
MusicCMD_FreeSong(music->data.cmd);
break;
#endif
#ifdef WAV_MUSIC
case MUS_WAV:
WAVStream_FreeSong(music->data.wave);
break;
#endif
Nov 16, 2009
Nov 16, 2009
604
605
606
607
608
#ifdef MODPLUG_MUSIC
case MUS_MODPLUG:
modplug_delete(music->data.modplug);
break;
#endif
Oct 3, 2009
Oct 3, 2009
609
#ifdef MOD_MUSIC
Oct 21, 1999
Oct 21, 1999
610
case MUS_MOD:
Oct 3, 2009
Oct 3, 2009
611
MOD_delete(music->data.module);
Oct 21, 1999
Oct 21, 1999
612
613
614
615
break;
#endif
#ifdef MID_MUSIC
case MUS_MID:
Aug 19, 2001
Aug 19, 2001
616
617
618
#ifdef USE_NATIVE_MIDI
if ( native_midi_ok ) {
native_midi_freesong(music->data.nativemidi);
Sep 5, 2001
Sep 5, 2001
619
} MIDI_ELSE
Aug 19, 2001
Aug 19, 2001
620
#endif
Sep 5, 2001
Sep 5, 2001
621
#ifdef USE_TIMIDITY_MIDI
Aug 19, 2001
Aug 19, 2001
622
623
624
if ( timidity_ok ) {
Timidity_FreeSong(music->data.midi);
}
Sep 5, 2001
Sep 5, 2001
625
#endif
Oct 21, 1999
Oct 21, 1999
626
627
break;
#endif
Jul 3, 2000
Jul 3, 2000
628
629
630
631
632
#ifdef OGG_MUSIC
case MUS_OGG:
OGG_delete(music->data.ogg);
break;
#endif
Feb 27, 2008
Feb 27, 2008
633
634
635
636
637
#ifdef FLAC_MUSIC
case MUS_FLAC:
FLAC_delete(music->data.flac);
break;
#endif
Oct 21, 1999
Oct 21, 1999
638
#ifdef MP3_MUSIC
Dec 26, 1999
Dec 26, 1999
639
case MUS_MP3:
May 12, 2006
May 12, 2006
640
smpeg.SMPEG_delete(music->data.mp3);
Oct 21, 1999
Oct 21, 1999
641
break;
Jul 15, 2007
Jul 15, 2007
642
643
644
645
646
#endif
#ifdef MP3_MAD_MUSIC
case MUS_MP3_MAD:
mad_closeFile(music->data.mp3_mad);
break;
Oct 21, 1999
Oct 21, 1999
647
648
649
650
651
652
653
654
655
#endif
default:
/* Unknown music type?? */
break;
}
free(music);
}
}
May 19, 2002
May 19, 2002
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
/* Find out the music format of a mixer music, or the currently playing
music, if 'music' is NULL.
*/
Mix_MusicType Mix_GetMusicType(const Mix_Music *music)
{
Mix_MusicType type = MUS_NONE;
if ( music ) {
type = music->type;
} else {
SDL_LockAudio();
if ( music_playing ) {
type = music_playing->type;
}
SDL_UnlockAudio();
}
return(type);
}
May 16, 2002
May 16, 2002
675
676
677
/* Play a music chunk. Returns 0, or -1 if there was an error.
*/
static int music_internal_play(Mix_Music *music, double position)
Oct 21, 1999
Oct 21, 1999
678
{
May 16, 2002
May 16, 2002
679
680
681
682
683
684
685
int retval = 0;
/* Note the music we're playing */
if ( music_playing ) {
music_internal_halt();
}
music_playing = music;
Oct 30, 1999
Oct 30, 1999
686
May 16, 2002
May 16, 2002
687
/* Set the initial volume */
Nov 9, 2003
Nov 9, 2003
688
689
if ( music->type != MUS_MOD ) {
music_internal_initialize_volume();
May 16, 2002
May 16, 2002
690
691
692
}
/* Set up for playback */
Oct 21, 1999
Oct 21, 1999
693
694
switch (music->type) {
#ifdef CMD_MUSIC
May 16, 2002
May 16, 2002
695
696
697
case MUS_CMD:
MusicCMD_Start(music->data.cmd);
break;
Oct 21, 1999
Oct 21, 1999
698
699
#endif
#ifdef WAV_MUSIC
May 16, 2002
May 16, 2002
700
701
702
case MUS_WAV:
WAVStream_Start(music->data.wave);
break;
Oct 21, 1999
Oct 21, 1999
703
#endif
Nov 16, 2009
Nov 16, 2009
704
705
706
707
708
709
710
#ifdef MODPLUG_MUSIC
case MUS_MODPLUG:
/* can't set volume until file is loaded, so finally set it now */
music_internal_initialize_volume();
modplug_play(music->data.modplug);
break;
#endif
Oct 3, 2009
Oct 3, 2009
711
#ifdef MOD_MUSIC
May 16, 2002
May 16, 2002
712
case MUS_MOD:
Oct 3, 2009
Oct 3, 2009
713
MOD_play(music->data.module);
Nov 9, 2003
Nov 9, 2003
714
715
/* Player_SetVolume() does nothing before Player_Start() */
music_internal_initialize_volume();
May 16, 2002
May 16, 2002
716
break;
Oct 21, 1999
Oct 21, 1999
717
718
#endif
#ifdef MID_MUSIC
May 16, 2002
May 16, 2002
719
case MUS_MID:
Aug 19, 2001
Aug 19, 2001
720
#ifdef USE_NATIVE_MIDI
May 16, 2002
May 16, 2002
721
722
723
if ( native_midi_ok ) {
native_midi_start(music->data.nativemidi);
} MIDI_ELSE
Aug 19, 2001
Aug 19, 2001
724
#endif
Sep 5, 2001
Sep 5, 2001
725
#ifdef USE_TIMIDITY_MIDI
May 16, 2002
May 16, 2002
726
727
728
if ( timidity_ok ) {
Timidity_Start(music->data.midi);
}
Sep 5, 2001
Sep 5, 2001
729
#endif
May 16, 2002
May 16, 2002
730
break;
Oct 21, 1999
Oct 21, 1999
731
#endif
Jul 3, 2000
Jul 3, 2000
732
#ifdef OGG_MUSIC
May 16, 2002
May 16, 2002
733
734
735
case MUS_OGG:
OGG_play(music->data.ogg);
break;
Jul 3, 2000
Jul 3, 2000
736
#endif
Feb 27, 2008
Feb 27, 2008
737
738
739
740
741
#ifdef FLAC_MUSIC
case MUS_FLAC:
FLAC_play(music->data.flac);
break;
#endif
Oct 21, 1999
Oct 21, 1999
742
#ifdef MP3_MUSIC
May 16, 2002
May 16, 2002
743
case MUS_MP3:
May 12, 2006
May 12, 2006
744
745
746
smpeg.SMPEG_enableaudio(music->data.mp3,1);
smpeg.SMPEG_enablevideo(music->data.mp3,0);
smpeg.SMPEG_play(music_playing->data.mp3);
May 16, 2002
May 16, 2002
747
break;
Jul 15, 2007
Jul 15, 2007
748
749
750
751
752
#endif
#ifdef MP3_MAD_MUSIC
case MUS_MP3_MAD:
mad_start(music->data.mp3_mad);
break;
Oct 21, 1999
Oct 21, 1999
753
#endif
May 16, 2002
May 16, 2002
754
755
756
757
default:
Mix_SetError("Can't play unknown music type");
retval = -1;
break;
Oct 21, 1999
Oct 21, 1999
758
}
Oct 30, 1999
Oct 30, 1999
759
May 16, 2002
May 16, 2002
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
/* Set the playback position, note any errors if an offset is used */
if ( retval == 0 ) {
if ( position > 0.0 ) {
if ( music_internal_position(position) < 0 ) {
Mix_SetError("Position not implemented for music type");
retval = -1;
}
} else {
music_internal_position(0.0);
}
}
/* If the setup failed, we're not playing any music anymore */
if ( retval < 0 ) {
music_playing = NULL;
}
return(retval);
}
int Mix_FadeInMusicPos(Mix_Music *music, int loops, int ms, double position)
Oct 30, 1999
Oct 30, 1999
779
{
May 16, 2002
May 16, 2002
780
781
int retval;
Oct 30, 1999
Oct 30, 1999
782
783
/* Don't play null pointers :-) */
if ( music == NULL ) {
May 16, 2002
May 16, 2002
784
Mix_SetError("music parameter was NULL");
Oct 30, 1999
Oct 30, 1999
785
786
return(-1);
}
May 16, 2002
May 16, 2002
787
788
789
790
791
792
/* Setup the data */
if ( ms ) {
music->fading = MIX_FADING_IN;
} else {
music->fading = MIX_NO_FADING;
Oct 30, 1999
Oct 30, 1999
793
}
May 16, 2002
May 16, 2002
794
795
music->fade_step = 0;
music->fade_steps = ms/ms_per_step;
Oct 30, 1999
Oct 30, 1999
796
May 16, 2002
May 16, 2002
797
798
799
800
801
802
803
/* Play the puppy */
SDL_LockAudio();
/* If the current music is fading out, wait for the fade to complete */
while ( music_playing && (music_playing->fading == MIX_FADING_OUT) ) {
SDL_UnlockAudio();
SDL_Delay(100);
SDL_LockAudio();
Dec 26, 1999
Dec 26, 1999
804
}
Oct 21, 1999
Oct 21, 1999
805
music_active = 1;
Oct 30, 1999
Oct 30, 1999
806
music_loops = loops;
May 16, 2002
May 16, 2002
807
808
809
810
811
812
813
814
815
816
817
818
retval = music_internal_play(music, position);
SDL_UnlockAudio();
return(retval);
}
int Mix_FadeInMusic(Mix_Music *music, int loops, int ms)
{
return Mix_FadeInMusicPos(music, loops, ms, 0.0);
}
int Mix_PlayMusic(Mix_Music *music, int loops)
{
return Mix_FadeInMusicPos(music, loops, 0, 0.0);
Oct 23, 1999
Oct 23, 1999
819
820
}
May 16, 2002
May 16, 2002
821
822
/* Set the playing music position */
int music_internal_position(double position)
Dec 19, 2001
Dec 19, 2001
823
{
May 16, 2002
May 16, 2002
824
825
826
int retval = 0;
switch (music_playing->type) {
Nov 16, 2009
Nov 16, 2009
827
828
829
830
831
#ifdef MODPLUG_MUSIC
case MUS_MODPLUG:
modplug_jump_to_time(music_playing->data.modplug, position);
break;
#endif
Oct 3, 2009
Oct 3, 2009
832
#ifdef MOD_MUSIC
May 16, 2002
May 16, 2002
833
case MUS_MOD:
Oct 3, 2009
Oct 3, 2009
834
MOD_jump_to_time(music_playing->data.module, position);
May 16, 2002
May 16, 2002
835
break;
Dec 20, 2001
Dec 20, 2001
836
837
#endif
#ifdef OGG_MUSIC
May 16, 2002
May 16, 2002
838
839
840
case MUS_OGG:
OGG_jump_to_time(music_playing->data.ogg, position);
break;
Jan 14, 2002
Jan 14, 2002
841
#endif
Feb 27, 2008
Feb 27, 2008
842
843
844
845
846
#ifdef FLAC_MUSIC
case MUS_FLAC:
FLAC_jump_to_time(music_playing->data.flac, position);
break;
#endif
Jan 14, 2002
Jan 14, 2002
847
#ifdef MP3_MUSIC
May 16, 2002
May 16, 2002
848
case MUS_MP3:
May 19, 2002
May 19, 2002
849
if ( position > 0.0 ) {
May 12, 2006
May 12, 2006
850
smpeg.SMPEG_skip(music_playing->data.mp3, (float)position);
May 19, 2002
May 19, 2002
851
} else {
May 12, 2006
May 12, 2006
852
853
smpeg.SMPEG_rewind(music_playing->data.mp3);
smpeg.SMPEG_play(music_playing->data.mp3);
Dec 19, 2001
Dec 19, 2001
854
}
May 16, 2002
May 16, 2002
855
break;
Jul 15, 2007
Jul 15, 2007
856
857
858
859
860
#endif
#ifdef MP3_MAD_MUSIC
case MUS_MP3_MAD:
mad_seek(music_playing->data.mp3_mad, position);
break;
May 16, 2002
May 16, 2002
861
862
863
864
865
#endif
default:
/* TODO: Implement this for other music backends */
retval = -1;
break;
Dec 19, 2001
Dec 19, 2001
866
}
May 16, 2002
May 16, 2002
867
return(retval);
Dec 19, 2001
Dec 19, 2001
868
}
May 16, 2002
May 16, 2002
869
int Mix_SetMusicPosition(double position)
Oct 23, 1999
Oct 23, 1999
870
{
May 16, 2002
May 16, 2002
871
872
873
874
875
876
877
int retval;
SDL_LockAudio();
if ( music_playing ) {
retval = music_internal_position(position);
if ( retval < 0 ) {
Mix_SetError("Position not implemented for music type");
Dec 19, 2001
Dec 19, 2001
878
}
May 16, 2002
May 16, 2002
879
880
881
} else {
Mix_SetError("Music isn't playing");
retval = -1;
Oct 23, 1999
Oct 23, 1999
882
}
May 16, 2002
May 16, 2002
883
SDL_UnlockAudio();
Oct 21, 1999
Oct 21, 1999
884
May 16, 2002
May 16, 2002
885
return(retval);
Dec 19, 2001
Dec 19, 2001
886
887
}
Nov 9, 2003
Nov 9, 2003
888
889
890
891
892
893
894
895
896
897
/* Set the music's initial volume */
static void music_internal_initialize_volume(void)
{
if ( music_playing->fading == MIX_FADING_IN ) {
music_internal_volume(0);
} else {
music_internal_volume(music_volume);
}
}
Oct 21, 1999
Oct 21, 1999
898
/* Set the music volume */
May 16, 2002
May 16, 2002
899
static void music_internal_volume(int volume)
Oct 21, 1999
Oct 21, 1999
900
{
May 16, 2002
May 16, 2002
901
switch (music_playing->type) {
Oct 21, 1999
Oct 21, 1999
902
#ifdef CMD_MUSIC
May 16, 2002
May 16, 2002
903
904
905
case MUS_CMD:
MusicCMD_SetVolume(volume);
break;
Oct 21, 1999
Oct 21, 1999
906
907
#endif
#ifdef WAV_MUSIC
May 16, 2002
May 16, 2002
908
909
910
case MUS_WAV:
WAVStream_SetVolume(volume);
break;
Oct 21, 1999
Oct 21, 1999
911
#endif
Nov 16, 2009
Nov 16, 2009
912
913
914
915
916
#ifdef MODPLUG_MUSIC
case MUS_MODPLUG:
modplug_setvolume(music_playing->data.modplug, volume);
break;
#endif
Oct 3, 2009
Oct 3, 2009
917
#ifdef MOD_MUSIC
May 16, 2002
May 16, 2002
918
case MUS_MOD:
Oct 3, 2009
Oct 3, 2009
919
MOD_setvolume(music_playing->data.module, volume);
May 16, 2002
May 16, 2002
920
break;
Oct 21, 1999
Oct 21, 1999
921
922
#endif
#ifdef MID_MUSIC
May 16, 2002
May 16, 2002
923
case MUS_MID:
Aug 19, 2001
Aug 19, 2001
924
#ifdef USE_NATIVE_MIDI
May 16, 2002
May 16, 2002
925
926
927
if ( native_midi_ok ) {
native_midi_setvolume(volume);
} MIDI_ELSE
Aug 19, 2001
Aug 19, 2001
928
#endif
Sep 5, 2001
Sep 5, 2001
929
#ifdef USE_TIMIDITY_MIDI
May 16, 2002
May 16, 2002
930
931
932
if ( timidity_ok ) {
Timidity_SetVolume(volume);
}
Sep 5, 2001
Sep 5, 2001
933
#endif
May 16, 2002
May 16, 2002
934
break;
Oct 21, 1999
Oct 21, 1999
935
#endif
Jul 3, 2000
Jul 3, 2000
936
#ifdef OGG_MUSIC
May 16, 2002
May 16, 2002
937
938
939
case MUS_OGG:
OGG_setvolume(music_playing->data.ogg, volume);
break;
Jul 3, 2000
Jul 3, 2000
940
#endif
Feb 27, 2008
Feb 27, 2008
941
942
943
944
945
#ifdef FLAC_MUSIC
case MUS_FLAC:
FLAC_setvolume(music_playing->data.flac, volume);
break;
#endif
Oct 21, 1999
Oct 21, 1999
946
#ifdef MP3_MUSIC
May 16, 2002
May 16, 2002
947
case MUS_MP3:
May 12, 2006
May 12, 2006
948
smpeg.SMPEG_setvolume(music_playing->data.mp3,(int)(((float)volume/(float)MIX_MAX_VOLUME)*100.0));
May 16, 2002
May 16, 2002
949
break;
Jul 15, 2007
Jul 15, 2007
950
951
952
953
954
#endif
#ifdef MP3_MAD_MUSIC
case MUS_MP3_MAD:
mad_setVolume(music_playing->data.mp3_mad, volume);
break;
Oct 21, 1999
Oct 21, 1999
955
#endif
May 16, 2002
May 16, 2002
956
957
958
959
960
961
962
963
964
965
966
967
default:
/* Unknown music type?? */
break;
}
}
int Mix_VolumeMusic(int volume)
{
int prev_volume;
prev_volume = music_volume;
if ( volume < 0 ) {
return prev_volume;
Oct 21, 1999
Oct 21, 1999
968
}
May 16, 2002
May 16, 2002
969
970
971
972
973
974
975
976
977
if ( volume > SDL_MIX_MAXVOLUME ) {
volume = SDL_MIX_MAXVOLUME;
}
music_volume = volume;
SDL_LockAudio();
if ( music_playing ) {
music_internal_volume(music_volume);
}
SDL_UnlockAudio();
Oct 21, 1999
Oct 21, 1999
978
979
980
return(prev_volume);
}
May 16, 2002
May 16, 2002
981
982
/* Halt playing of music */
static void music_internal_halt(void)
Oct 21, 1999
Oct 21, 1999
983
{
Oct 26, 1999
Oct 26, 1999
984
switch (music_playing->type) {
Oct 21, 1999
Oct 21, 1999
985
#ifdef CMD_MUSIC
May 16, 2002
May 16, 2002
986
case MUS_CMD:
Oct 26, 1999
Oct 26, 1999
987
988
MusicCMD_Stop(music_playing->data.cmd);
break;
Oct 21, 1999
Oct 21, 1999
989
990
#endif
#ifdef WAV_MUSIC
May 16, 2002
May 16, 2002
991
case MUS_WAV:
Oct 26, 1999
Oct 26, 1999
992
993
WAVStream_Stop();
break;
Oct 21, 1999
Oct 21, 1999
994
#endif
Nov 16, 2009
Nov 16, 2009
995
996
997
998
999
#ifdef MODPLUG_MUSIC
case MUS_MODPLUG:
modplug_stop(music_playing->data.modplug);
break;
#endif
Oct 3, 2009
Oct 3, 2009
1000
#ifdef MOD_MUSIC