Skip to content

Latest commit

 

History

History
1145 lines (1007 loc) · 30.8 KB

music.c

File metadata and controls

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