Skip to content

Latest commit

 

History

History
1668 lines (1544 loc) · 40.9 KB

music.c

File metadata and controls

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