Skip to content

Latest commit

 

History

History
1132 lines (994 loc) · 30.5 KB

music.c

File metadata and controls

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