Skip to content

Latest commit

 

History

History
1171 lines (1029 loc) · 31.1 KB

music.c

File metadata and controls

1171 lines (1029 loc) · 31.1 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 5, 2019
Jan 5, 2019
3
Copyright (C) 1997-2019 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
*/
Oct 17, 2017
Oct 17, 2017
21
#include <string.h> /* for strtok() and strtok_s() */
Oct 21, 1999
Oct 21, 1999
22
Oct 17, 2017
Oct 17, 2017
23
#include "SDL_hints.h"
Oct 21, 2017
Oct 21, 2017
24
#include "SDL_log.h"
Dec 27, 1999
Dec 27, 1999
25
#include "SDL_timer.h"
Oct 21, 1999
Oct 21, 1999
26
Jan 14, 2000
Jan 14, 2000
27
#include "SDL_mixer.h"
Jan 29, 2016
Jan 29, 2016
28
#include "mixer.h"
Oct 17, 2017
Oct 17, 2017
29
#include "music.h"
Oct 21, 1999
Oct 21, 1999
30
31
#include "music_cmd.h"
Oct 17, 2017
Oct 17, 2017
32
33
#include "music_wav.h"
#include "music_mikmod.h"
Nov 16, 2009
Nov 16, 2009
34
#include "music_modplug.h"
Oct 17, 2017
Oct 17, 2017
35
36
37
#include "music_nativemidi.h"
#include "music_fluidsynth.h"
#include "music_timidity.h"
Jul 3, 2000
Jul 3, 2000
38
#include "music_ogg.h"
Jun 15, 2018
Jun 15, 2018
39
#include "music_opus.h"
Oct 17, 2017
Oct 17, 2017
40
#include "music_mpg123.h"
Jul 15, 2007
Jul 15, 2007
41
#include "music_mad.h"
Feb 27, 2008
Feb 27, 2008
42
#include "music_flac.h"
Oct 17, 2017
Oct 17, 2017
43
#include "native_midi/native_midi.h"
Oct 21, 1999
Oct 21, 1999
44
Oct 25, 2017
Oct 25, 2017
45
46
47
48
49
/* Check to make sure we are building with a new enough SDL */
#if SDL_COMPILEDVERSION < SDL_VERSIONNUM(2, 0, 7)
#error You need SDL 2.0.7 or newer from http://www.libsdl.org
#endif
Oct 25, 2017
Oct 25, 2017
50
51
52
/* Set this hint to true if you want verbose logging of music interfaces */
#define SDL_MIXER_HINT_DEBUG_MUSIC_INTERFACES \
"SDL_MIXER_DEBUG_MUSIC_INTERFACES"
Jul 15, 2007
Jul 15, 2007
53
Oct 17, 2017
Oct 17, 2017
54
char *music_cmd = NULL;
Oct 21, 2017
Oct 21, 2017
55
56
static SDL_bool music_active = SDL_TRUE;
static int music_volume = MIX_MAX_VOLUME;
Feb 1, 2000
Feb 1, 2000
57
static Mix_Music * volatile music_playing = NULL;
Oct 17, 2017
Oct 17, 2017
58
SDL_AudioSpec music_spec;
Oct 23, 1999
Oct 23, 1999
59
Oct 21, 1999
Oct 21, 1999
60
struct _Mix_Music {
Oct 17, 2017
Oct 17, 2017
61
62
63
64
Mix_MusicInterface *interface;
void *context;
SDL_bool playing;
May 22, 2013
May 22, 2013
65
66
67
Mix_Fading fading;
int fade_step;
int fade_steps;
Oct 21, 1999
Oct 21, 1999
68
69
};
Nov 11, 1999
Nov 11, 1999
70
71
72
/* Used to calculate fading steps */
static int ms_per_step;
Jun 5, 2009
Jun 5, 2009
73
74
75
76
/* rcg06042009 report available decoders at runtime. */
static const char **music_decoders = NULL;
static int num_decoders = 0;
Mar 20, 2011
Mar 20, 2011
77
/* Semicolon-separated SoundFont paths */
Oct 21, 2017
Oct 21, 2017
78
static char* soundfont_paths = NULL;
Mar 20, 2011
Mar 20, 2011
79
Nov 17, 2019
Nov 17, 2019
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
* public domain strtok_r() by Charlie Gordon
*
* from comp.lang.c 9/14/2007
*
* http://groups.google.com/group/comp.lang.c/msg/2ab1ecbb86646684
*
* (Declaration that it's public domain):
* http://groups.google.com/group/comp.lang.c/msg/7c7b39328fefab9c
*/
char *Mix_strtok_safe(char *str, const char *delim, char **nextp)
{
char *ret;
if (str == NULL) {
str = *nextp;
}
str += strspn(str, delim);
if (*str == '\0') {
return NULL;
}
ret = str;
str += strcspn(str, delim);
if (*str) {
*str++ = '\0';
}
*nextp = str;
return ret;
}
Oct 17, 2017
Oct 17, 2017
112
113
114
115
116
117
118
119
120
/* Interfaces for the various music interfaces, ordered by priority */
static Mix_MusicInterface *s_music_interfaces[] =
{
#ifdef MUSIC_CMD
&Mix_MusicInterface_CMD,
#endif
#ifdef MUSIC_WAV
&Mix_MusicInterface_WAV,
#endif
Oct 22, 2017
Oct 22, 2017
121
122
123
124
125
126
#ifdef MUSIC_FLAC
&Mix_MusicInterface_FLAC,
#endif
#ifdef MUSIC_OGG
&Mix_MusicInterface_OGG,
#endif
Jun 15, 2018
Jun 15, 2018
127
128
129
#ifdef MUSIC_OPUS
&Mix_MusicInterface_Opus,
#endif
Oct 22, 2017
Oct 22, 2017
130
131
132
133
134
135
#ifdef MUSIC_MP3_MPG123
&Mix_MusicInterface_MPG123,
#endif
#ifdef MUSIC_MP3_MAD
&Mix_MusicInterface_MAD,
#endif
Oct 17, 2017
Oct 17, 2017
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#ifdef MUSIC_MOD_MODPLUG
&Mix_MusicInterface_MODPLUG,
#endif
#ifdef MUSIC_MOD_MIKMOD
&Mix_MusicInterface_MIKMOD,
#endif
#ifdef MUSIC_MID_FLUIDSYNTH
&Mix_MusicInterface_FLUIDSYNTH,
#endif
#ifdef MUSIC_MID_TIMIDITY
&Mix_MusicInterface_TIMIDITY,
#endif
#ifdef MUSIC_MID_NATIVE
&Mix_MusicInterface_NATIVEMIDI,
#endif
};
int get_num_music_interfaces(void)
{
return SDL_arraysize(s_music_interfaces);
}
Mix_MusicInterface *get_music_interface(int index)
{
return s_music_interfaces[index];
}
Nov 5, 2009
Nov 5, 2009
163
int Mix_GetNumMusicDecoders(void)
Jun 5, 2009
Jun 5, 2009
164
{
May 22, 2013
May 22, 2013
165
return(num_decoders);
Jun 5, 2009
Jun 5, 2009
166
167
168
169
}
const char *Mix_GetMusicDecoder(int index)
{
May 22, 2013
May 22, 2013
170
171
172
173
if ((index < 0) || (index >= num_decoders)) {
return NULL;
}
return(music_decoders[index]);
Jun 5, 2009
Jun 5, 2009
174
175
176
177
}
static void add_music_decoder(const char *decoder)
{
Oct 25, 2017
Oct 25, 2017
178
179
180
181
182
183
184
185
186
187
188
void *ptr;
int i;
/* Check to see if we already have this decoder */
for (i = 0; i < num_decoders; ++i) {
if (SDL_strcmp(music_decoders[i], decoder) == 0) {
return;
}
}
ptr = SDL_realloc((void *)music_decoders, (num_decoders + 1) * sizeof (const char *));
May 22, 2013
May 22, 2013
189
190
191
192
193
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
194
195
}
Oct 30, 1999
Oct 30, 1999
196
/* Local low-level functions prototypes */
Nov 9, 2003
Nov 9, 2003
197
static void music_internal_initialize_volume(void);
May 16, 2002
May 16, 2002
198
static void music_internal_volume(int volume);
Oct 21, 2017
Oct 21, 2017
199
static int music_internal_play(Mix_Music *music, int play_count, double position);
May 16, 2002
May 16, 2002
200
static int music_internal_position(double position);
Oct 17, 2017
Oct 17, 2017
201
static SDL_bool music_internal_playing(void);
May 16, 2002
May 16, 2002
202
static void music_internal_halt(void);
Oct 26, 1999
Oct 26, 1999
203
Dec 27, 1999
Dec 27, 1999
204
205
/* Support for hooking when the music has finished */
Oct 21, 2017
Oct 21, 2017
206
static void (SDLCALL *music_finished_hook)(void) = NULL;
Dec 27, 1999
Dec 27, 1999
207
Oct 21, 2017
Oct 21, 2017
208
void Mix_HookMusicFinished(void (SDLCALL *music_finished)(void))
Dec 27, 1999
Dec 27, 1999
209
{
Jan 29, 2016
Jan 29, 2016
210
Mix_LockAudio();
May 22, 2013
May 22, 2013
211
music_finished_hook = music_finished;
Jan 29, 2016
Jan 29, 2016
212
Mix_UnlockAudio();
Dec 27, 1999
Dec 27, 1999
213
214
}
Oct 21, 2017
Oct 21, 2017
215
216
217
218
219
/* Convenience function to fill audio and mix at the specified volume
This is called from many music player's GetAudio callback.
*/
int music_pcm_getaudio(void *context, void *data, int bytes, int volume,
int (*GetSome)(void *context, void *data, int bytes, SDL_bool *done))
Nov 19, 2005
Nov 19, 2005
220
{
Oct 21, 2017
Oct 21, 2017
221
222
223
224
Uint8 *snd = (Uint8 *)data;
Uint8 *dst;
int len = bytes;
SDL_bool done = SDL_FALSE;
May 22, 2013
May 22, 2013
225
Oct 21, 2017
Oct 21, 2017
226
227
228
229
230
231
232
233
234
if (volume == MIX_MAX_VOLUME) {
dst = snd;
} else {
dst = SDL_stack_alloc(Uint8, bytes);
}
while (len > 0 && !done) {
int consumed = GetSome(context, dst, len, &done);
if (consumed < 0) {
break;
May 22, 2013
May 22, 2013
235
236
}
Oct 21, 2017
Oct 21, 2017
237
238
239
240
241
if (volume == MIX_MAX_VOLUME) {
dst += consumed;
} else {
SDL_MixAudioFormat(snd, dst, music_spec.format, (Uint32)consumed, volume);
snd += consumed;
May 22, 2013
May 22, 2013
242
}
Oct 21, 2017
Oct 21, 2017
243
len -= consumed;
May 22, 2013
May 22, 2013
244
}
Oct 21, 2017
Oct 21, 2017
245
246
247
248
if (volume != MIX_MAX_VOLUME) {
SDL_stack_free(dst);
}
return len;
Nov 19, 2005
Nov 19, 2005
249
250
}
Oct 21, 1999
Oct 21, 1999
251
/* Mixing function */
Oct 21, 2017
Oct 21, 2017
252
void SDLCALL music_mixer(void *udata, Uint8 *stream, int len)
Oct 21, 1999
Oct 21, 1999
253
{
Nov 17, 2019
Nov 17, 2019
254
MIX_UNUSED(udata);
Oct 21, 2017
Oct 21, 2017
255
while (music_playing && music_active && len > 0) {
May 22, 2013
May 22, 2013
256
/* Handle fading */
Oct 17, 2017
Oct 17, 2017
257
258
if (music_playing->fading != MIX_NO_FADING) {
if (music_playing->fade_step++ < music_playing->fade_steps) {
May 22, 2013
May 22, 2013
259
260
261
262
int volume;
int fade_step = music_playing->fade_step;
int fade_steps = music_playing->fade_steps;
Oct 17, 2017
Oct 17, 2017
263
if (music_playing->fading == MIX_FADING_OUT) {
May 22, 2013
May 22, 2013
264
265
266
267
268
269
volume = (music_volume * (fade_steps-fade_step)) / fade_steps;
} else { /* Fading in */
volume = (music_volume * fade_step) / fade_steps;
}
music_internal_volume(volume);
} else {
Oct 17, 2017
Oct 17, 2017
270
if (music_playing->fading == MIX_FADING_OUT) {
May 22, 2013
May 22, 2013
271
music_internal_halt();
Oct 17, 2017
Oct 17, 2017
272
if (music_finished_hook) {
May 22, 2013
May 22, 2013
273
274
275
276
277
278
279
280
music_finished_hook();
}
return;
}
music_playing->fading = MIX_NO_FADING;
}
}
Oct 17, 2017
Oct 17, 2017
281
282
if (music_playing->interface->GetAudio) {
int left = music_playing->interface->GetAudio(music_playing->context, stream, len);
Oct 21, 2017
Oct 21, 2017
283
284
if (left != 0) {
/* Either an error or finished playing with data left */
Oct 17, 2017
Oct 17, 2017
285
286
music_playing->playing = SDL_FALSE;
}
Oct 21, 2017
Oct 21, 2017
287
288
289
290
291
292
293
294
295
if (left > 0) {
stream += (len - left);
len = left;
} else {
len = 0;
}
} else {
len = 0;
}
May 22, 2013
May 22, 2013
296
Oct 21, 2017
Oct 21, 2017
297
298
299
300
if (!music_internal_playing()) {
music_internal_halt();
if (music_finished_hook) {
music_finished_hook();
Oct 17, 2017
Oct 17, 2017
301
}
May 22, 2013
May 22, 2013
302
303
}
}
Oct 21, 1999
Oct 21, 1999
304
305
}
Oct 25, 2017
Oct 25, 2017
306
307
/* Load the music interface libraries for a given music type */
SDL_bool load_music_type(Mix_MusicType type)
Oct 21, 1999
Oct 21, 1999
308
{
Nov 17, 2019
Nov 17, 2019
309
310
size_t i;
int loaded = 0;
Oct 17, 2017
Oct 17, 2017
311
312
for (i = 0; i < SDL_arraysize(s_music_interfaces); ++i) {
Mix_MusicInterface *interface = s_music_interfaces[i];
Oct 25, 2017
Oct 25, 2017
313
if (interface->type != type) {
Oct 17, 2017
Oct 17, 2017
314
315
continue;
}
Oct 25, 2017
Oct 25, 2017
316
317
318
319
320
321
if (!interface->loaded) {
char hint[64];
SDL_snprintf(hint, sizeof(hint), "SDL_MIXER_DISABLE_%s", interface->tag);
if (SDL_GetHintBoolean(hint, SDL_FALSE)) {
continue;
}
Nov 11, 1999
Nov 11, 1999
322
Oct 25, 2017
Oct 25, 2017
323
324
325
326
327
328
if (interface->Load && interface->Load() < 0) {
if (SDL_GetHintBoolean(SDL_MIXER_HINT_DEBUG_MUSIC_INTERFACES, SDL_FALSE)) {
SDL_Log("Couldn't load %s: %s\n", interface->tag, Mix_GetError());
}
continue;
}
Oct 17, 2017
Oct 17, 2017
329
330
interface->loaded = SDL_TRUE;
}
Oct 25, 2017
Oct 25, 2017
331
++loaded;
Oct 17, 2017
Oct 17, 2017
332
}
Oct 25, 2017
Oct 25, 2017
333
return (loaded > 0) ? SDL_TRUE : SDL_FALSE;
Oct 21, 1999
Oct 21, 1999
334
335
}
Oct 25, 2017
Oct 25, 2017
336
337
/* Open the music interfaces for a given music type */
SDL_bool open_music_type(Mix_MusicType type)
Oct 16, 2001
Oct 16, 2001
338
{
Nov 17, 2019
Nov 17, 2019
339
340
size_t i;
int opened = 0;
Oct 17, 2017
Oct 17, 2017
341
SDL_bool use_native_midi = SDL_FALSE;
May 22, 2013
May 22, 2013
342
Oct 25, 2017
Oct 25, 2017
343
344
345
if (!music_spec.format) {
/* Music isn't opened yet */
return SDL_FALSE;
Oct 21, 2017
Oct 21, 2017
346
347
}
Oct 17, 2017
Oct 17, 2017
348
#ifdef MUSIC_MID_NATIVE
Oct 25, 2017
Oct 25, 2017
349
if (type == MUS_MID && SDL_GetHintBoolean("SDL_NATIVE_MUSIC", SDL_FALSE) && native_midi_detect()) {
Oct 17, 2017
Oct 17, 2017
350
use_native_midi = SDL_TRUE;
May 22, 2013
May 22, 2013
351
}
Oct 17, 2017
Oct 17, 2017
352
#endif
Jan 4, 2012
Jan 4, 2012
353
Oct 17, 2017
Oct 17, 2017
354
355
356
357
358
for (i = 0; i < SDL_arraysize(s_music_interfaces); ++i) {
Mix_MusicInterface *interface = s_music_interfaces[i];
if (!interface->loaded) {
continue;
}
Oct 25, 2017
Oct 25, 2017
359
360
361
if (type != MUS_NONE && interface->type != type) {
continue;
}
May 22, 2013
May 22, 2013
362
Oct 17, 2017
Oct 17, 2017
363
364
365
366
if (interface->type == MUS_MID && use_native_midi && interface->api != MIX_MUSIC_NATIVEMIDI) {
continue;
}
Oct 25, 2017
Oct 25, 2017
367
368
369
370
371
372
373
if (!interface->opened) {
if (interface->Open && interface->Open(&music_spec) < 0) {
if (SDL_GetHintBoolean(SDL_MIXER_HINT_DEBUG_MUSIC_INTERFACES, SDL_FALSE)) {
SDL_Log("Couldn't open %s: %s\n", interface->tag, Mix_GetError());
}
continue;
}
Oct 17, 2017
Oct 17, 2017
374
375
376
interface->opened = SDL_TRUE;
add_music_decoder(interface->tag);
}
Oct 25, 2017
Oct 25, 2017
377
++opened;
May 22, 2013
May 22, 2013
378
379
}
Oct 17, 2017
Oct 17, 2017
380
381
if (has_music(MUS_MOD)) {
add_music_decoder("MOD");
Oct 25, 2017
Oct 25, 2017
382
add_chunk_decoder("MOD");
Oct 17, 2017
Oct 17, 2017
383
384
385
}
if (has_music(MUS_MID)) {
add_music_decoder("MIDI");
Oct 25, 2017
Oct 25, 2017
386
387
388
389
390
add_chunk_decoder("MID");
}
if (has_music(MUS_OGG)) {
add_music_decoder("OGG");
add_chunk_decoder("OGG");
Oct 17, 2017
Oct 17, 2017
391
}
Jun 15, 2018
Jun 15, 2018
392
393
394
395
if (has_music(MUS_OPUS)) {
add_music_decoder("OPUS");
add_chunk_decoder("OPUS");
}
Oct 17, 2017
Oct 17, 2017
396
397
if (has_music(MUS_MP3)) {
add_music_decoder("MP3");
Oct 25, 2017
Oct 25, 2017
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
add_chunk_decoder("MP3");
}
if (has_music(MUS_FLAC)) {
add_music_decoder("FLAC");
add_chunk_decoder("FLAC");
}
return (opened > 0) ? SDL_TRUE : SDL_FALSE;
}
/* Initialize the music interfaces with a certain desired audio format */
void open_music(const SDL_AudioSpec *spec)
{
#ifdef MIX_INIT_SOUNDFONT_PATHS
if (!soundfont_paths) {
soundfont_paths = SDL_strdup(MIX_INIT_SOUNDFONT_PATHS);
May 22, 2013
May 22, 2013
414
}
Oct 25, 2017
Oct 25, 2017
415
416
417
418
419
420
421
422
423
#endif
/* Load the music interfaces that don't have explicit initialization */
load_music_type(MUS_CMD);
load_music_type(MUS_WAV);
/* Open all the interfaces that are loaded */
music_spec = *spec;
open_music_type(MUS_NONE);
May 22, 2013
May 22, 2013
424
Oct 17, 2017
Oct 17, 2017
425
426
427
428
Mix_VolumeMusic(MIX_MAX_VOLUME);
/* Calculate the number of ms for each callback */
ms_per_step = (int) (((float)spec->samples * 1000.0) / spec->freq);
Oct 25, 2017
Oct 25, 2017
429
}
Oct 17, 2017
Oct 17, 2017
430
Oct 25, 2017
Oct 25, 2017
431
432
433
/* Return SDL_TRUE if the music type is available */
SDL_bool has_music(Mix_MusicType type)
{
Nov 17, 2019
Nov 17, 2019
434
size_t i;
Oct 25, 2017
Oct 25, 2017
435
436
437
438
439
440
441
442
443
444
for (i = 0; i < SDL_arraysize(s_music_interfaces); ++i) {
Mix_MusicInterface *interface = s_music_interfaces[i];
if (interface->type != type) {
continue;
}
if (interface->opened) {
return SDL_TRUE;
}
}
return SDL_FALSE;
Oct 17, 2017
Oct 17, 2017
445
446
}
Oct 5, 2019
Oct 5, 2019
447
Mix_MusicType detect_music_type(SDL_RWops *src)
Oct 17, 2017
Oct 17, 2017
448
{
Oct 5, 2019
Oct 5, 2019
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
Uint8 magic[12];
if (SDL_RWread(src, magic, 1, 12) != 12) {
Mix_SetError("Couldn't read first 12 bytes of audio data");
return MUS_NONE;
}
SDL_RWseek(src, -12, RW_SEEK_CUR);
/* WAVE files have the magic four bytes "RIFF"
AIFF files have the magic 12 bytes "FORM" XXXX "AIFF" */
if (((SDL_memcmp(magic, "RIFF", 4) == 0) && (SDL_memcmp((magic+8), "WAVE", 4) == 0)) ||
(SDL_memcmp(magic, "FORM", 4) == 0)) {
return MUS_WAV;
}
May 22, 2013
May 22, 2013
464
/* Ogg Vorbis files have the magic four bytes "OggS" */
Oct 17, 2017
Oct 17, 2017
465
if (SDL_memcmp(magic, "OggS", 4) == 0) {
Oct 5, 2019
Oct 5, 2019
466
467
SDL_RWseek(src, 28, RW_SEEK_CUR);
SDL_RWread(src, magic, 1, 8);
Oct 7, 2019
Oct 7, 2019
468
SDL_RWseek(src,-36, RW_SEEK_CUR);
Oct 5, 2019
Oct 5, 2019
469
470
471
if (SDL_memcmp(magic, "OpusHead", 8) == 0) {
return MUS_OPUS;
}
May 22, 2013
May 22, 2013
472
473
474
475
return MUS_OGG;
}
/* FLAC files have the magic four bytes "fLaC" */
Oct 17, 2017
Oct 17, 2017
476
if (SDL_memcmp(magic, "fLaC", 4) == 0) {
May 22, 2013
May 22, 2013
477
478
479
480
return MUS_FLAC;
}
/* MIDI files have the magic four bytes "MThd" */
Oct 17, 2017
Oct 17, 2017
481
if (SDL_memcmp(magic, "MThd", 4) == 0) {
May 22, 2013
May 22, 2013
482
483
484
return MUS_MID;
}
Oct 17, 2017
Oct 17, 2017
485
486
if (SDL_memcmp(magic, "ID3", 3) == 0 ||
(magic[0] == 0xFF && (magic[1] & 0xFE) == 0xFA)) {
May 22, 2013
May 22, 2013
487
488
489
490
491
492
493
494
495
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
496
497
}
Oct 21, 1999
Oct 21, 1999
498
499
500
/* Load a music file */
Mix_Music *Mix_LoadMUS(const char *file)
{
Nov 17, 2019
Nov 17, 2019
501
size_t i;
Oct 17, 2017
Oct 17, 2017
502
503
void *context;
char *ext;
May 22, 2013
May 22, 2013
504
Mix_MusicType type;
Oct 17, 2017
Oct 17, 2017
505
506
507
508
509
510
SDL_RWops *src;
for (i = 0; i < SDL_arraysize(s_music_interfaces); ++i) {
Mix_MusicInterface *interface = s_music_interfaces[i];
if (!interface->opened || !interface->CreateFromFile) {
continue;
May 22, 2013
May 22, 2013
511
}
Oct 17, 2017
Oct 17, 2017
512
513
514
515
516
517
518
519
520
521
522
523
context = interface->CreateFromFile(file);
if (context) {
/* Allocate memory for the music structure */
Mix_Music *music = (Mix_Music *)SDL_calloc(1, sizeof(Mix_Music));
if (music == NULL) {
Mix_SetError("Out of memory");
return NULL;
}
music->interface = interface;
music->context = context;
return music;
May 22, 2013
May 22, 2013
524
525
526
}
}
Jun 2, 2013
Jun 2, 2013
527
src = SDL_RWFromFile(file, "rb");
Oct 17, 2017
Oct 17, 2017
528
if (src == NULL) {
May 22, 2013
May 22, 2013
529
530
531
532
533
534
535
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, '.');
Oct 17, 2017
Oct 17, 2017
536
if (ext) {
May 22, 2013
May 22, 2013
537
++ext; /* skip the dot in the extension */
Oct 17, 2017
Oct 17, 2017
538
if (SDL_strcasecmp(ext, "WAV") == 0) {
May 22, 2013
May 22, 2013
539
type = MUS_WAV;
Oct 17, 2017
Oct 17, 2017
540
541
542
} else if (SDL_strcasecmp(ext, "MID") == 0 ||
SDL_strcasecmp(ext, "MIDI") == 0 ||
SDL_strcasecmp(ext, "KAR") == 0) {
May 22, 2013
May 22, 2013
543
type = MUS_MID;
Oct 17, 2017
Oct 17, 2017
544
} else if (SDL_strcasecmp(ext, "OGG") == 0) {
May 22, 2013
May 22, 2013
545
type = MUS_OGG;
Jun 15, 2018
Jun 15, 2018
546
547
} else if (SDL_strcasecmp(ext, "OPUS") == 0) {
type = MUS_OPUS;
Oct 17, 2017
Oct 17, 2017
548
} else if (SDL_strcasecmp(ext, "FLAC") == 0) {
May 22, 2013
May 22, 2013
549
type = MUS_FLAC;
Oct 17, 2017
Oct 17, 2017
550
551
552
553
} else if (SDL_strcasecmp(ext, "MPG") == 0 ||
SDL_strcasecmp(ext, "MPEG") == 0 ||
SDL_strcasecmp(ext, "MP3") == 0 ||
SDL_strcasecmp(ext, "MAD") == 0) {
May 22, 2013
May 22, 2013
554
type = MUS_MP3;
Oct 17, 2017
Oct 17, 2017
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
} else if (SDL_strcasecmp(ext, "669") == 0 ||
SDL_strcasecmp(ext, "AMF") == 0 ||
SDL_strcasecmp(ext, "AMS") == 0 ||
SDL_strcasecmp(ext, "DBM") == 0 ||
SDL_strcasecmp(ext, "DSM") == 0 ||
SDL_strcasecmp(ext, "FAR") == 0 ||
SDL_strcasecmp(ext, "IT") == 0 ||
SDL_strcasecmp(ext, "MED") == 0 ||
SDL_strcasecmp(ext, "MDL") == 0 ||
SDL_strcasecmp(ext, "MOD") == 0 ||
SDL_strcasecmp(ext, "MOL") == 0 ||
SDL_strcasecmp(ext, "MTM") == 0 ||
SDL_strcasecmp(ext, "NST") == 0 ||
SDL_strcasecmp(ext, "OKT") == 0 ||
SDL_strcasecmp(ext, "PTM") == 0 ||
SDL_strcasecmp(ext, "S3M") == 0 ||
SDL_strcasecmp(ext, "STM") == 0 ||
SDL_strcasecmp(ext, "ULT") == 0 ||
SDL_strcasecmp(ext, "UMX") == 0 ||
SDL_strcasecmp(ext, "WOW") == 0 ||
SDL_strcasecmp(ext, "XM") == 0) {
type = MUS_MOD;
May 22, 2013
May 22, 2013
577
578
}
}
Oct 17, 2017
Oct 17, 2017
579
return Mix_LoadMUSType_RW(src, type, SDL_TRUE);
Jan 4, 2012
Jan 4, 2012
580
581
}
Jun 2, 2013
Jun 2, 2013
582
Mix_Music *Mix_LoadMUS_RW(SDL_RWops *src, int freesrc)
Jan 4, 2012
Jan 4, 2012
583
{
Jun 2, 2013
Jun 2, 2013
584
return Mix_LoadMUSType_RW(src, MUS_NONE, freesrc);
Jan 4, 2012
Jan 4, 2012
585
586
}
Jun 2, 2013
Jun 2, 2013
587
Mix_Music *Mix_LoadMUSType_RW(SDL_RWops *src, Mix_MusicType type, int freesrc)
Jan 4, 2012
Jan 4, 2012
588
{
Nov 17, 2019
Nov 17, 2019
589
size_t i;
Oct 17, 2017
Oct 17, 2017
590
void *context;
Jun 2, 2013
Jun 2, 2013
591
Sint64 start;
May 22, 2013
May 22, 2013
592
Jun 2, 2013
Jun 2, 2013
593
if (!src) {
May 22, 2013
May 22, 2013
594
595
596
Mix_SetError("RWops pointer is NULL");
return NULL;
}
Jun 2, 2013
Jun 2, 2013
597
start = SDL_RWtell(src);
May 22, 2013
May 22, 2013
598
599
600
601
/* If the caller wants auto-detection, figure out what kind of file
* this is. */
if (type == MUS_NONE) {
Jun 2, 2013
Jun 2, 2013
602
if ((type = detect_music_type(src)) == MUS_NONE) {
Oct 17, 2017
Oct 17, 2017
603
/* Don't call Mix_SetError() since detect_music_type() does that. */
Jun 2, 2013
Jun 2, 2013
604
605
606
if (freesrc) {
SDL_RWclose(src);
}
May 22, 2013
May 22, 2013
607
608
609
610
return NULL;
}
}
Oct 17, 2017
Oct 17, 2017
611
Mix_ClearError();
May 22, 2013
May 22, 2013
612
Oct 25, 2017
Oct 25, 2017
613
614
615
616
617
618
if (load_music_type(type) && open_music_type(type)) {
for (i = 0; i < SDL_arraysize(s_music_interfaces); ++i) {
Mix_MusicInterface *interface = s_music_interfaces[i];
if (!interface->opened || type != interface->type || !interface->CreateFromRW) {
continue;
}
Oct 17, 2017
Oct 17, 2017
619
Oct 25, 2017
Oct 25, 2017
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
context = interface->CreateFromRW(src, freesrc);
if (context) {
/* Allocate memory for the music structure */
Mix_Music *music = (Mix_Music *)SDL_calloc(1, sizeof(Mix_Music));
if (music == NULL) {
interface->Delete(context);
Mix_SetError("Out of memory");
return NULL;
}
music->interface = interface;
music->context = context;
if (SDL_GetHintBoolean(SDL_MIXER_HINT_DEBUG_MUSIC_INTERFACES, SDL_FALSE)) {
SDL_Log("Loaded music with %s\n", interface->tag);
}
return music;
May 22, 2013
May 22, 2013
636
}
Oct 17, 2017
Oct 17, 2017
637
Oct 25, 2017
Oct 25, 2017
638
639
640
/* Reset the stream for the next decoder */
SDL_RWseek(src, start, RW_SEEK_SET);
}
Oct 17, 2017
Oct 17, 2017
641
}
Mar 20, 2011
Mar 20, 2011
642
Oct 17, 2017
Oct 17, 2017
643
644
if (!*Mix_GetError()) {
Mix_SetError("Unrecognized audio format");
May 22, 2013
May 22, 2013
645
}
Oct 17, 2017
Oct 17, 2017
646
647
648
649
650
651
if (freesrc) {
SDL_RWclose(src);
} else {
SDL_RWseek(src, start, RW_SEEK_SET);
}
return NULL;
Oct 21, 1999
Oct 21, 1999
652
653
654
655
656
}
/* Free a music chunk previously loaded */
void Mix_FreeMusic(Mix_Music *music)
{
Oct 17, 2017
Oct 17, 2017
657
if (music) {
May 22, 2013
May 22, 2013
658
/* Stop the music if it's currently playing */
Jan 29, 2016
Jan 29, 2016
659
Mix_LockAudio();
Oct 17, 2017
Oct 17, 2017
660
if (music == music_playing) {
May 22, 2013
May 22, 2013
661
/* Wait for any fade out to finish */
Oct 17, 2017
Oct 17, 2017
662
while (music->fading == MIX_FADING_OUT) {
Jan 29, 2016
Jan 29, 2016
663
Mix_UnlockAudio();
May 22, 2013
May 22, 2013
664
SDL_Delay(100);
Jan 29, 2016
Jan 29, 2016
665
Mix_LockAudio();
May 22, 2013
May 22, 2013
666
}
Oct 17, 2017
Oct 17, 2017
667
if (music == music_playing) {
May 22, 2013
May 22, 2013
668
669
670
music_internal_halt();
}
}
Jan 29, 2016
Jan 29, 2016
671
Mix_UnlockAudio();
Mar 20, 2011
Mar 20, 2011
672
Oct 17, 2017
Oct 17, 2017
673
music->interface->Delete(music->context);
May 22, 2013
May 22, 2013
674
675
SDL_free(music);
}
Oct 21, 1999
Oct 21, 1999
676
677
}
May 19, 2002
May 19, 2002
678
679
680
681
682
/* 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
683
684
Mix_MusicType type = MUS_NONE;
Oct 17, 2017
Oct 17, 2017
685
686
if (music) {
type = music->interface->type;
May 22, 2013
May 22, 2013
687
} else {
Jan 29, 2016
Jan 29, 2016
688
Mix_LockAudio();
Oct 17, 2017
Oct 17, 2017
689
690
if (music_playing) {
type = music_playing->interface->type;
May 22, 2013
May 22, 2013
691
}
Jan 29, 2016
Jan 29, 2016
692
Mix_UnlockAudio();
May 22, 2013
May 22, 2013
693
694
}
return(type);
May 19, 2002
May 19, 2002
695
696
}
May 16, 2002
May 16, 2002
697
698
/* Play a music chunk. Returns 0, or -1 if there was an error.
*/
Oct 21, 2017
Oct 21, 2017
699
static int music_internal_play(Mix_Music *music, int play_count, double position)
Oct 21, 1999
Oct 21, 1999
700
{
May 22, 2013
May 22, 2013
701
int retval = 0;
May 16, 2002
May 16, 2002
702
Oct 17, 2017
Oct 17, 2017
703
#if defined(__MACOSX__) && defined(MID_MUSIC_NATIVE)
May 22, 2013
May 22, 2013
704
705
706
/* This fixes a bug with native MIDI on Mac OS X, where you
can't really stop and restart MIDI from the audio callback.
*/
Oct 17, 2017
Oct 17, 2017
707
if (music == music_playing && music->api == MIX_MUSIC_NATIVEMIDI) {
May 22, 2013
May 22, 2013
708
709
710
711
712
713
714
/* Just a seek suffices to restart playing */
music_internal_position(position);
return 0;
}
#endif
/* Note the music we're playing */
Oct 17, 2017
Oct 17, 2017
715
if (music_playing) {
May 22, 2013
May 22, 2013
716
717
718
music_internal_halt();
}
music_playing = music;
Oct 17, 2017
Oct 17, 2017
719
music_playing->playing = SDL_TRUE;
May 22, 2013
May 22, 2013
720
721
/* Set the initial volume */
Oct 17, 2017
Oct 17, 2017
722
music_internal_initialize_volume();
May 22, 2013
May 22, 2013
723
724
/* Set up for playback */
Oct 21, 2017
Oct 21, 2017
725
retval = music->interface->Play(music->context, play_count);
Oct 30, 1999
Oct 30, 1999
726
May 22, 2013
May 22, 2013
727
/* Set the playback position, note any errors if an offset is used */
Oct 17, 2017
Oct 17, 2017
728
729
730
if (retval == 0) {
if (position > 0.0) {
if (music_internal_position(position) < 0) {
May 22, 2013
May 22, 2013
731
732
733
734
735
736
737
738
739
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 */
Oct 17, 2017
Oct 17, 2017
740
if (retval < 0) {
Oct 21, 2017
Oct 21, 2017
741
music->playing = SDL_FALSE;
May 22, 2013
May 22, 2013
742
743
744
music_playing = NULL;
}
return(retval);
May 16, 2002
May 16, 2002
745
}
Oct 17, 2017
Oct 17, 2017
746
May 16, 2002
May 16, 2002
747
int Mix_FadeInMusicPos(Mix_Music *music, int loops, int ms, double position)
Oct 30, 1999
Oct 30, 1999
748
{
May 22, 2013
May 22, 2013
749
750
int retval;
Oct 17, 2017
Oct 17, 2017
751
if (ms_per_step == 0) {
May 22, 2013
May 22, 2013
752
753
754
755
756
SDL_SetError("Audio device hasn't been opened");
return(-1);
}
/* Don't play null pointers :-) */
Oct 17, 2017
Oct 17, 2017
757
if (music == NULL) {
May 22, 2013
May 22, 2013
758
759
760
761
762
Mix_SetError("music parameter was NULL");
return(-1);
}
/* Setup the data */
Oct 17, 2017
Oct 17, 2017
763
if (ms) {
May 22, 2013
May 22, 2013
764
765
766
767
768
769
770
771
music->fading = MIX_FADING_IN;
} else {
music->fading = MIX_NO_FADING;
}
music->fade_step = 0;
music->fade_steps = ms/ms_per_step;
/* Play the puppy */
Jan 29, 2016
Jan 29, 2016
772
Mix_LockAudio();
May 22, 2013
May 22, 2013
773
/* If the current music is fading out, wait for the fade to complete */
Oct 17, 2017
Oct 17, 2017
774
while (music_playing && (music_playing->fading == MIX_FADING_OUT)) {
Jan 29, 2016
Jan 29, 2016
775
Mix_UnlockAudio();
May 22, 2013
May 22, 2013
776
SDL_Delay(100);
Jan 29, 2016
Jan 29, 2016
777
Mix_LockAudio();
May 22, 2013
May 22, 2013
778
}
Oct 21, 2017
Oct 21, 2017
779
if (loops == 0) {
May 22, 2013
May 22, 2013
780
/* Loop is the number of times to play the audio */
Oct 21, 2017
Oct 21, 2017
781
loops = 1;
May 22, 2013
May 22, 2013
782
}
Oct 21, 2017
Oct 21, 2017
783
retval = music_internal_play(music, loops, position);
Nov 17, 2019
Nov 17, 2019
784
/* Set music as active */
Aug 7, 2018
Aug 7, 2018
785
music_active = (retval == 0);
Jan 29, 2016
Jan 29, 2016
786
Mix_UnlockAudio();
May 22, 2013
May 22, 2013
787
788
return(retval);
May 16, 2002
May 16, 2002
789
790
791
}
int Mix_FadeInMusic(Mix_Music *music, int loops, int ms)
{
May 22, 2013
May 22, 2013
792
return Mix_FadeInMusicPos(music, loops, ms, 0.0);
May 16, 2002
May 16, 2002
793
794
795
}
int Mix_PlayMusic(Mix_Music *music, int loops)
{
May 22, 2013
May 22, 2013
796
return Mix_FadeInMusicPos(music, loops, 0, 0.0);
Oct 23, 1999
Oct 23, 1999
797
798
}
May 16, 2002
May 16, 2002
799
800
/* Set the playing music position */
int music_internal_position(double position)
Dec 19, 2001
Dec 19, 2001
801
{
Oct 17, 2017
Oct 17, 2017
802
803
if (music_playing->interface->Seek) {
return music_playing->interface->Seek(music_playing->context, position);
May 22, 2013
May 22, 2013
804
}
Oct 17, 2017
Oct 17, 2017
805
return -1;
Dec 19, 2001
Dec 19, 2001
806
}
May 16, 2002
May 16, 2002
807
int Mix_SetMusicPosition(double position)
Oct 23, 1999
Oct 23, 1999
808
{
May 22, 2013
May 22, 2013
809
810
int retval;
Jan 29, 2016
Jan 29, 2016
811
Mix_LockAudio();
Oct 17, 2017
Oct 17, 2017
812
if (music_playing) {
May 22, 2013
May 22, 2013
813
retval = music_internal_position(position);
Oct 17, 2017
Oct 17, 2017
814
if (retval < 0) {
May 22, 2013
May 22, 2013
815
816
817
818
819
820
Mix_SetError("Position not implemented for music type");
}
} else {
Mix_SetError("Music isn't playing");
retval = -1;
}
Jan 29, 2016
Jan 29, 2016
821
Mix_UnlockAudio();
May 22, 2013
May 22, 2013
822
823
return(retval);
Dec 19, 2001
Dec 19, 2001
824
825
}
Nov 9, 2003
Nov 9, 2003
826
827
828
/* Set the music's initial volume */
static void music_internal_initialize_volume(void)
{
Oct 17, 2017
Oct 17, 2017
829
if (music_playing->fading == MIX_FADING_IN) {
May 22, 2013
May 22, 2013
830
831
832
833
music_internal_volume(0);
} else {
music_internal_volume(music_volume);
}
Nov 9, 2003
Nov 9, 2003
834
835
}
Oct 21, 1999
Oct 21, 1999
836
/* Set the music volume */
May 16, 2002
May 16, 2002
837
static void music_internal_volume(int volume)
Oct 21, 1999
Oct 21, 1999
838
{
Oct 17, 2017
Oct 17, 2017
839
840
if (music_playing->interface->SetVolume) {
music_playing->interface->SetVolume(music_playing->context, volume);
May 22, 2013
May 22, 2013
841
}
May 16, 2002
May 16, 2002
842
843
844
}
int Mix_VolumeMusic(int volume)
{
May 22, 2013
May 22, 2013
845
846
847
int prev_volume;
prev_volume = music_volume;
Oct 17, 2017
Oct 17, 2017
848
if (volume < 0) {
May 22, 2013
May 22, 2013
849
850
return prev_volume;
}
Oct 17, 2017
Oct 17, 2017
851
if (volume > SDL_MIX_MAXVOLUME) {
May 22, 2013
May 22, 2013
852
853
854
volume = SDL_MIX_MAXVOLUME;
}
music_volume = volume;
Jan 29, 2016
Jan 29, 2016
855
Mix_LockAudio();
Oct 17, 2017
Oct 17, 2017
856
if (music_playing) {
May 22, 2013
May 22, 2013
857
858
music_internal_volume(music_volume);
}
Jan 29, 2016
Jan 29, 2016
859
Mix_UnlockAudio();
May 22, 2013
May 22, 2013
860
return(prev_volume);
Oct 21, 1999
Oct 21, 1999
861
862
}
May 16, 2002
May 16, 2002
863
864
/* Halt playing of music */
static void music_internal_halt(void)
Oct 21, 1999
Oct 21, 1999
865
{
Oct 17, 2017
Oct 17, 2017
866
867
if (music_playing->interface->Stop) {
music_playing->interface->Stop(music_playing->context);
May 22, 2013
May 22, 2013
868
}
Mar 20, 2011
Mar 20, 2011
869
Oct 17, 2017
Oct 17, 2017
870
music_playing->playing = SDL_FALSE;
May 22, 2013
May 22, 2013
871
872
music_playing->fading = MIX_NO_FADING;
music_playing = NULL;
Oct 26, 1999
Oct 26, 1999
873
874
875
}
int Mix_HaltMusic(void)
{
Jan 29, 2016
Jan 29, 2016
876
Mix_LockAudio();
Oct 17, 2017
Oct 17, 2017
877
if (music_playing) {
May 22, 2013
May 22, 2013
878
music_internal_halt();
Oct 17, 2017
Oct 17, 2017
879
if (music_finished_hook) {
May 22, 2013
May 22, 2013
880
881
882
music_finished_hook();
}
}
Jan 29, 2016
Jan 29, 2016
883
Mix_UnlockAudio();
May 22, 2013
May 22, 2013
884
885
return(0);
Oct 21, 1999
Oct 21, 1999
886
887
}
Oct 23, 1999
Oct 23, 1999
888
889
890
/* Progressively stop the music */
int Mix_FadeOutMusic(int ms)
{
May 22, 2013
May 22, 2013
891
int retval = 0;
May 16, 2002
May 16, 2002
892
Oct 17, 2017
Oct 17, 2017
893
if (ms_per_step == 0) {
May 22, 2013
May 22, 2013
894
895
896
SDL_SetError("Audio device hasn't been opened");
return 0;
}
Jan 24, 2011
Jan 24, 2011
897
May 22, 2013
May 22, 2013
898
899
900
901
if (ms <= 0) { /* just halt immediately. */
Mix_HaltMusic();
return 1;
}
Nov 19, 2005
Nov 19, 2005
902
Jan 29, 2016
Jan 29, 2016
903
Mix_LockAudio();
Oct 17, 2017
Oct 17, 2017
904
905
906
907
908
909
910
911
912
913
914
915
916
917
if (music_playing) {
int fade_steps = (ms + ms_per_step - 1) / ms_per_step;
if (music_playing->fading == MIX_NO_FADING) {
music_playing->fade_step = 0;
} else {
int step;
int old_fade_steps = music_playing->fade_steps;
if (music_playing->fading == MIX_FADING_OUT) {
step = music_playing->fade_step;
} else {
step = old_fade_steps - music_playing->fade_step + 1;
}
music_playing->fade_step = (step * fade_steps) / old_fade_steps;
}
May 22, 2013
May 22, 2013
918
919
920
921
music_playing->fading = MIX_FADING_OUT;
music_playing->fade_steps = fade_steps;
retval = 1;
}
Jan 29, 2016
Jan 29, 2016
922
Mix_UnlockAudio();
May 16, 2002
May 16, 2002
923
May 22, 2013
May 22, 2013
924
return(retval);
Oct 23, 1999
Oct 23, 1999
925
926
927
928
}
Mix_Fading Mix_FadingMusic(void)
{
May 22, 2013
May 22, 2013
929
Mix_Fading fading = MIX_NO_FADING;
May 16, 2002
May 16, 2002
930
Jan 29, 2016
Jan 29, 2016
931
Mix_LockAudio();
Oct 17, 2017
Oct 17, 2017
932
if (music_playing) {
May 22, 2013
May 22, 2013
933
934
fading = music_playing->fading;
}
Jan 29, 2016
Jan 29, 2016
935
Mix_UnlockAudio();
May 16, 2002
May 16, 2002
936
May 22, 2013
May 22, 2013
937
return(fading);
Oct 23, 1999
Oct 23, 1999
938
939
}
Oct 21, 1999
Oct 21, 1999
940
941
942
/* Pause/Resume the music stream */
void Mix_PauseMusic(void)
{
Oct 17, 2017
Oct 17, 2017
943
Mix_LockAudio();
Oct 21, 2017
Oct 21, 2017
944
945
946
947
if (music_playing) {
if (music_playing->interface->Pause) {
music_playing->interface->Pause(music_playing->context);
}
Oct 17, 2017
Oct 17, 2017
948
}
Oct 21, 2017
Oct 21, 2017
949
music_active = SDL_FALSE;
Oct 17, 2017
Oct 17, 2017
950
Mix_UnlockAudio();
Oct 21, 1999
Oct 21, 1999
951
}
Oct 23, 1999
Oct 23, 1999
952
Oct 21, 1999
Oct 21, 1999
953
954
void Mix_ResumeMusic(void)
{
Oct 17, 2017
Oct 17, 2017
955
Mix_LockAudio();
Oct 21, 2017
Oct 21, 2017
956
957
958
959
if (music_playing) {
if (music_playing->interface->Resume) {
music_playing->interface->Resume(music_playing->context);
}
Oct 17, 2017
Oct 17, 2017
960
}
Oct 21, 2017
Oct 21, 2017
961
music_active = SDL_TRUE;
Oct 17, 2017
Oct 17, 2017
962
Mix_UnlockAudio();
Oct 21, 1999
Oct 21, 1999
963
964
965
966
}
void Mix_RewindMusic(void)
{
May 22, 2013
May 22, 2013
967
Mix_SetMusicPosition(0.0);
Oct 21, 1999
Oct 21, 1999
968
969
}
Nov 1, 1999
Nov 1, 1999
970
971
int Mix_PausedMusic(void)
{
Oct 21, 2017
Oct 21, 2017
972
return (music_active == SDL_FALSE);
Nov 1, 1999
Nov 1, 1999
973
974
}
Oct 21, 1999
Oct 21, 1999
975
/* Check the status of the music */
Oct 17, 2017
Oct 17, 2017
976
static SDL_bool music_internal_playing(void)
Oct 21, 1999
Oct 21, 1999
977
{
Oct 21, 2017
Oct 21, 2017
978
if (!music_playing) {
Oct 17, 2017
Oct 17, 2017
979
return SDL_FALSE;
May 22, 2013
May 22, 2013
980
}
Jul 14, 2011
Jul 14, 2011
981
Oct 17, 2017
Oct 17, 2017
982
if (music_playing->interface->IsPlaying) {
Oct 21, 2017
Oct 21, 2017
983
music_playing->playing = music_playing->interface->IsPlaying(music_playing->context);
May 22, 2013
May 22, 2013
984
}
Oct 17, 2017
Oct 17, 2017
985
return music_playing->playing;
May 16, 2002
May 16, 2002
986
987
988
}
int Mix_PlayingMusic(void)
{
Oct 21, 2017
Oct 21, 2017
989
SDL_bool playing;
May 16, 2002
May 16, 2002
990
Jan 29, 2016
Jan 29, 2016
991
Mix_LockAudio();
Oct 21, 2017
Oct 21, 2017
992
playing = music_internal_playing();
Jan 29, 2016
Jan 29, 2016
993
Mix_UnlockAudio();
May 16, 2002
May 16, 2002
994
Oct 21, 2017
Oct 21, 2017
995
return playing ? 1 : 0;
Oct 21, 1999
Oct 21, 1999
996
997
998
999
1000
}
/* Set the external music playback command */
int Mix_SetMusicCMD(const char *command)
{