Skip to content

Latest commit

 

History

History
1141 lines (1003 loc) · 30.7 KB

music.c

File metadata and controls

1141 lines (1003 loc) · 30.7 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"
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
412
413
}
Mix_MusicType detect_music_type_from_magic(const Uint8 *magic)
{
May 22, 2013
May 22, 2013
414
/* Ogg Vorbis files have the magic four bytes "OggS" */
Oct 17, 2017
Oct 17, 2017
415
if (SDL_memcmp(magic, "OggS", 4) == 0) {
May 22, 2013
May 22, 2013
416
417
418
419
return MUS_OGG;
}
/* FLAC files have the magic four bytes "fLaC" */
Oct 17, 2017
Oct 17, 2017
420
if (SDL_memcmp(magic, "fLaC", 4) == 0) {
May 22, 2013
May 22, 2013
421
422
423
424
return MUS_FLAC;
}
/* MIDI files have the magic four bytes "MThd" */
Oct 17, 2017
Oct 17, 2017
425
if (SDL_memcmp(magic, "MThd", 4) == 0) {
May 22, 2013
May 22, 2013
426
427
428
return MUS_MID;
}
Oct 17, 2017
Oct 17, 2017
429
430
if (SDL_memcmp(magic, "ID3", 3) == 0 ||
(magic[0] == 0xFF && (magic[1] & 0xFE) == 0xFA)) {
May 22, 2013
May 22, 2013
431
432
433
434
435
436
437
438
439
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
440
441
}
Oct 17, 2017
Oct 17, 2017
442
443
static Mix_MusicType detect_music_type(SDL_RWops *src)
{
Oct 17, 2017
Oct 17, 2017
444
Uint8 magic[12];
Jun 15, 2018
Jun 15, 2018
445
Mix_MusicType t;
Oct 17, 2017
Oct 17, 2017
446
447
448
449
450
451
452
453
454
455
456
457
458
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
459
460
461
462
463
464
465
466
467
468
469
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
470
471
}
Oct 21, 1999
Oct 21, 1999
472
473
474
/* Load a music file */
Mix_Music *Mix_LoadMUS(const char *file)
{
Oct 17, 2017
Oct 17, 2017
475
476
477
int i;
void *context;
char *ext;
May 22, 2013
May 22, 2013
478
Mix_MusicType type;
Oct 17, 2017
Oct 17, 2017
479
480
481
482
483
484
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
485
}
Oct 17, 2017
Oct 17, 2017
486
487
488
489
490
491
492
493
494
495
496
497
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
498
499
500
}
}
Jun 2, 2013
Jun 2, 2013
501
src = SDL_RWFromFile(file, "rb");
Oct 17, 2017
Oct 17, 2017
502
if (src == NULL) {
May 22, 2013
May 22, 2013
503
504
505
506
507
508
509
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
510
if (ext) {
May 22, 2013
May 22, 2013
511
++ext; /* skip the dot in the extension */
Oct 17, 2017
Oct 17, 2017
512
if (SDL_strcasecmp(ext, "WAV") == 0) {
May 22, 2013
May 22, 2013
513
type = MUS_WAV;
Oct 17, 2017
Oct 17, 2017
514
515
516
} else if (SDL_strcasecmp(ext, "MID") == 0 ||
SDL_strcasecmp(ext, "MIDI") == 0 ||
SDL_strcasecmp(ext, "KAR") == 0) {
May 22, 2013
May 22, 2013
517
type = MUS_MID;
Oct 17, 2017
Oct 17, 2017
518
} else if (SDL_strcasecmp(ext, "OGG") == 0) {
May 22, 2013
May 22, 2013
519
type = MUS_OGG;
Jun 15, 2018
Jun 15, 2018
520
521
} else if (SDL_strcasecmp(ext, "OPUS") == 0) {
type = MUS_OPUS;
Oct 17, 2017
Oct 17, 2017
522
} else if (SDL_strcasecmp(ext, "FLAC") == 0) {
May 22, 2013
May 22, 2013
523
type = MUS_FLAC;
Oct 17, 2017
Oct 17, 2017
524
525
526
527
} 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
528
type = MUS_MP3;
Oct 17, 2017
Oct 17, 2017
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
} 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
551
552
}
}
Oct 17, 2017
Oct 17, 2017
553
return Mix_LoadMUSType_RW(src, type, SDL_TRUE);
Jan 4, 2012
Jan 4, 2012
554
555
}
Jun 2, 2013
Jun 2, 2013
556
Mix_Music *Mix_LoadMUS_RW(SDL_RWops *src, int freesrc)
Jan 4, 2012
Jan 4, 2012
557
{
Jun 2, 2013
Jun 2, 2013
558
return Mix_LoadMUSType_RW(src, MUS_NONE, freesrc);
Jan 4, 2012
Jan 4, 2012
559
560
}
Jun 2, 2013
Jun 2, 2013
561
Mix_Music *Mix_LoadMUSType_RW(SDL_RWops *src, Mix_MusicType type, int freesrc)
Jan 4, 2012
Jan 4, 2012
562
{
Oct 17, 2017
Oct 17, 2017
563
564
int i;
void *context;
Jun 2, 2013
Jun 2, 2013
565
Sint64 start;
May 22, 2013
May 22, 2013
566
Jun 2, 2013
Jun 2, 2013
567
if (!src) {
May 22, 2013
May 22, 2013
568
569
570
Mix_SetError("RWops pointer is NULL");
return NULL;
}
Jun 2, 2013
Jun 2, 2013
571
start = SDL_RWtell(src);
May 22, 2013
May 22, 2013
572
573
574
575
/* If the caller wants auto-detection, figure out what kind of file
* this is. */
if (type == MUS_NONE) {
Jun 2, 2013
Jun 2, 2013
576
if ((type = detect_music_type(src)) == MUS_NONE) {
Oct 17, 2017
Oct 17, 2017
577
/* Don't call Mix_SetError() since detect_music_type() does that. */
Jun 2, 2013
Jun 2, 2013
578
579
580
if (freesrc) {
SDL_RWclose(src);
}
May 22, 2013
May 22, 2013
581
582
583
584
return NULL;
}
}
Oct 17, 2017
Oct 17, 2017
585
Mix_ClearError();
May 22, 2013
May 22, 2013
586
Oct 25, 2017
Oct 25, 2017
587
588
589
590
591
592
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
593
Oct 25, 2017
Oct 25, 2017
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
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
610
}
Oct 17, 2017
Oct 17, 2017
611
Oct 25, 2017
Oct 25, 2017
612
613
614
/* Reset the stream for the next decoder */
SDL_RWseek(src, start, RW_SEEK_SET);
}
Oct 17, 2017
Oct 17, 2017
615
}
Mar 20, 2011
Mar 20, 2011
616
Oct 17, 2017
Oct 17, 2017
617
618
if (!*Mix_GetError()) {
Mix_SetError("Unrecognized audio format");
May 22, 2013
May 22, 2013
619
}
Oct 17, 2017
Oct 17, 2017
620
621
622
623
624
625
if (freesrc) {
SDL_RWclose(src);
} else {
SDL_RWseek(src, start, RW_SEEK_SET);
}
return NULL;
Oct 21, 1999
Oct 21, 1999
626
627
628
629
630
}
/* Free a music chunk previously loaded */
void Mix_FreeMusic(Mix_Music *music)
{
Oct 17, 2017
Oct 17, 2017
631
if (music) {
May 22, 2013
May 22, 2013
632
/* Stop the music if it's currently playing */
Jan 29, 2016
Jan 29, 2016
633
Mix_LockAudio();
Oct 17, 2017
Oct 17, 2017
634
if (music == music_playing) {
May 22, 2013
May 22, 2013
635
/* Wait for any fade out to finish */
Oct 17, 2017
Oct 17, 2017
636
while (music->fading == MIX_FADING_OUT) {
Jan 29, 2016
Jan 29, 2016
637
Mix_UnlockAudio();
May 22, 2013
May 22, 2013
638
SDL_Delay(100);
Jan 29, 2016
Jan 29, 2016
639
Mix_LockAudio();
May 22, 2013
May 22, 2013
640
}
Oct 17, 2017
Oct 17, 2017
641
if (music == music_playing) {
May 22, 2013
May 22, 2013
642
643
644
music_internal_halt();
}
}
Jan 29, 2016
Jan 29, 2016
645
Mix_UnlockAudio();
Mar 20, 2011
Mar 20, 2011
646
Oct 17, 2017
Oct 17, 2017
647
music->interface->Delete(music->context);
May 22, 2013
May 22, 2013
648
649
SDL_free(music);
}
Oct 21, 1999
Oct 21, 1999
650
651
}
May 19, 2002
May 19, 2002
652
653
654
655
656
/* 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
657
658
Mix_MusicType type = MUS_NONE;
Oct 17, 2017
Oct 17, 2017
659
660
if (music) {
type = music->interface->type;
May 22, 2013
May 22, 2013
661
} else {
Jan 29, 2016
Jan 29, 2016
662
Mix_LockAudio();
Oct 17, 2017
Oct 17, 2017
663
664
if (music_playing) {
type = music_playing->interface->type;
May 22, 2013
May 22, 2013
665
}
Jan 29, 2016
Jan 29, 2016
666
Mix_UnlockAudio();
May 22, 2013
May 22, 2013
667
668
}
return(type);
May 19, 2002
May 19, 2002
669
670
}
May 16, 2002
May 16, 2002
671
672
/* Play a music chunk. Returns 0, or -1 if there was an error.
*/
Oct 21, 2017
Oct 21, 2017
673
static int music_internal_play(Mix_Music *music, int play_count, double position)
Oct 21, 1999
Oct 21, 1999
674
{
May 22, 2013
May 22, 2013
675
int retval = 0;
May 16, 2002
May 16, 2002
676
Oct 17, 2017
Oct 17, 2017
677
#if defined(__MACOSX__) && defined(MID_MUSIC_NATIVE)
May 22, 2013
May 22, 2013
678
679
680
/* 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
681
if (music == music_playing && music->api == MIX_MUSIC_NATIVEMIDI) {
May 22, 2013
May 22, 2013
682
683
684
685
686
687
688
/* 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
689
if (music_playing) {
May 22, 2013
May 22, 2013
690
691
692
music_internal_halt();
}
music_playing = music;
Oct 17, 2017
Oct 17, 2017
693
music_playing->playing = SDL_TRUE;
May 22, 2013
May 22, 2013
694
695
/* Set the initial volume */
Oct 17, 2017
Oct 17, 2017
696
music_internal_initialize_volume();
May 22, 2013
May 22, 2013
697
698
/* Set up for playback */
Oct 21, 2017
Oct 21, 2017
699
retval = music->interface->Play(music->context, play_count);
Oct 30, 1999
Oct 30, 1999
700
May 22, 2013
May 22, 2013
701
/* Set the playback position, note any errors if an offset is used */
Oct 17, 2017
Oct 17, 2017
702
703
704
if (retval == 0) {
if (position > 0.0) {
if (music_internal_position(position) < 0) {
May 22, 2013
May 22, 2013
705
706
707
708
709
710
711
712
713
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
714
if (retval < 0) {
Oct 21, 2017
Oct 21, 2017
715
music->playing = SDL_FALSE;
May 22, 2013
May 22, 2013
716
717
718
music_playing = NULL;
}
return(retval);
May 16, 2002
May 16, 2002
719
}
Oct 17, 2017
Oct 17, 2017
720
May 16, 2002
May 16, 2002
721
int Mix_FadeInMusicPos(Mix_Music *music, int loops, int ms, double position)
Oct 30, 1999
Oct 30, 1999
722
{
May 22, 2013
May 22, 2013
723
724
int retval;
Oct 17, 2017
Oct 17, 2017
725
if (ms_per_step == 0) {
May 22, 2013
May 22, 2013
726
727
728
729
730
SDL_SetError("Audio device hasn't been opened");
return(-1);
}
/* Don't play null pointers :-) */
Oct 17, 2017
Oct 17, 2017
731
if (music == NULL) {
May 22, 2013
May 22, 2013
732
733
734
735
736
Mix_SetError("music parameter was NULL");
return(-1);
}
/* Setup the data */
Oct 17, 2017
Oct 17, 2017
737
if (ms) {
May 22, 2013
May 22, 2013
738
739
740
741
742
743
744
745
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
746
Mix_LockAudio();
May 22, 2013
May 22, 2013
747
/* If the current music is fading out, wait for the fade to complete */
Oct 17, 2017
Oct 17, 2017
748
while (music_playing && (music_playing->fading == MIX_FADING_OUT)) {
Jan 29, 2016
Jan 29, 2016
749
Mix_UnlockAudio();
May 22, 2013
May 22, 2013
750
SDL_Delay(100);
Jan 29, 2016
Jan 29, 2016
751
Mix_LockAudio();
May 22, 2013
May 22, 2013
752
}
Oct 21, 2017
Oct 21, 2017
753
if (loops == 0) {
May 22, 2013
May 22, 2013
754
/* Loop is the number of times to play the audio */
Oct 21, 2017
Oct 21, 2017
755
loops = 1;
May 22, 2013
May 22, 2013
756
}
Oct 21, 2017
Oct 21, 2017
757
retval = music_internal_play(music, loops, position);
Aug 7, 2018
Aug 7, 2018
758
music_active = (retval == 0);
Jan 29, 2016
Jan 29, 2016
759
Mix_UnlockAudio();
May 22, 2013
May 22, 2013
760
761
return(retval);
May 16, 2002
May 16, 2002
762
763
764
}
int Mix_FadeInMusic(Mix_Music *music, int loops, int ms)
{
May 22, 2013
May 22, 2013
765
return Mix_FadeInMusicPos(music, loops, ms, 0.0);
May 16, 2002
May 16, 2002
766
767
768
}
int Mix_PlayMusic(Mix_Music *music, int loops)
{
May 22, 2013
May 22, 2013
769
return Mix_FadeInMusicPos(music, loops, 0, 0.0);
Oct 23, 1999
Oct 23, 1999
770
771
}
May 16, 2002
May 16, 2002
772
773
/* Set the playing music position */
int music_internal_position(double position)
Dec 19, 2001
Dec 19, 2001
774
{
Oct 17, 2017
Oct 17, 2017
775
776
if (music_playing->interface->Seek) {
return music_playing->interface->Seek(music_playing->context, position);
May 22, 2013
May 22, 2013
777
}
Oct 17, 2017
Oct 17, 2017
778
return -1;
Dec 19, 2001
Dec 19, 2001
779
}
May 16, 2002
May 16, 2002
780
int Mix_SetMusicPosition(double position)
Oct 23, 1999
Oct 23, 1999
781
{
May 22, 2013
May 22, 2013
782
783
int retval;
Jan 29, 2016
Jan 29, 2016
784
Mix_LockAudio();
Oct 17, 2017
Oct 17, 2017
785
if (music_playing) {
May 22, 2013
May 22, 2013
786
retval = music_internal_position(position);
Oct 17, 2017
Oct 17, 2017
787
if (retval < 0) {
May 22, 2013
May 22, 2013
788
789
790
791
792
793
Mix_SetError("Position not implemented for music type");
}
} else {
Mix_SetError("Music isn't playing");
retval = -1;
}
Jan 29, 2016
Jan 29, 2016
794
Mix_UnlockAudio();
May 22, 2013
May 22, 2013
795
796
return(retval);
Dec 19, 2001
Dec 19, 2001
797
798
}
Nov 9, 2003
Nov 9, 2003
799
800
801
/* Set the music's initial volume */
static void music_internal_initialize_volume(void)
{
Oct 17, 2017
Oct 17, 2017
802
if (music_playing->fading == MIX_FADING_IN) {
May 22, 2013
May 22, 2013
803
804
805
806
music_internal_volume(0);
} else {
music_internal_volume(music_volume);
}
Nov 9, 2003
Nov 9, 2003
807
808
}
Oct 21, 1999
Oct 21, 1999
809
/* Set the music volume */
May 16, 2002
May 16, 2002
810
static void music_internal_volume(int volume)
Oct 21, 1999
Oct 21, 1999
811
{
Oct 17, 2017
Oct 17, 2017
812
813
if (music_playing->interface->SetVolume) {
music_playing->interface->SetVolume(music_playing->context, volume);
May 22, 2013
May 22, 2013
814
}
May 16, 2002
May 16, 2002
815
816
817
}
int Mix_VolumeMusic(int volume)
{
May 22, 2013
May 22, 2013
818
819
820
int prev_volume;
prev_volume = music_volume;
Oct 17, 2017
Oct 17, 2017
821
if (volume < 0) {
May 22, 2013
May 22, 2013
822
823
return prev_volume;
}
Oct 17, 2017
Oct 17, 2017
824
if (volume > SDL_MIX_MAXVOLUME) {
May 22, 2013
May 22, 2013
825
826
827
volume = SDL_MIX_MAXVOLUME;
}
music_volume = volume;
Jan 29, 2016
Jan 29, 2016
828
Mix_LockAudio();
Oct 17, 2017
Oct 17, 2017
829
if (music_playing) {
May 22, 2013
May 22, 2013
830
831
music_internal_volume(music_volume);
}
Jan 29, 2016
Jan 29, 2016
832
Mix_UnlockAudio();
May 22, 2013
May 22, 2013
833
return(prev_volume);
Oct 21, 1999
Oct 21, 1999
834
835
}
May 16, 2002
May 16, 2002
836
837
/* Halt playing of music */
static void music_internal_halt(void)
Oct 21, 1999
Oct 21, 1999
838
{
Oct 17, 2017
Oct 17, 2017
839
840
if (music_playing->interface->Stop) {
music_playing->interface->Stop(music_playing->context);
May 22, 2013
May 22, 2013
841
}
Mar 20, 2011
Mar 20, 2011
842
Oct 17, 2017
Oct 17, 2017
843
music_playing->playing = SDL_FALSE;
May 22, 2013
May 22, 2013
844
845
music_playing->fading = MIX_NO_FADING;
music_playing = NULL;
Oct 26, 1999
Oct 26, 1999
846
847
848
}
int Mix_HaltMusic(void)
{
Jan 29, 2016
Jan 29, 2016
849
Mix_LockAudio();
Oct 17, 2017
Oct 17, 2017
850
if (music_playing) {
May 22, 2013
May 22, 2013
851
music_internal_halt();
Oct 17, 2017
Oct 17, 2017
852
if (music_finished_hook) {
May 22, 2013
May 22, 2013
853
854
855
music_finished_hook();
}
}
Jan 29, 2016
Jan 29, 2016
856
Mix_UnlockAudio();
May 22, 2013
May 22, 2013
857
858
return(0);
Oct 21, 1999
Oct 21, 1999
859
860
}
Oct 23, 1999
Oct 23, 1999
861
862
863
/* Progressively stop the music */
int Mix_FadeOutMusic(int ms)
{
May 22, 2013
May 22, 2013
864
int retval = 0;
May 16, 2002
May 16, 2002
865
Oct 17, 2017
Oct 17, 2017
866
if (ms_per_step == 0) {
May 22, 2013
May 22, 2013
867
868
869
SDL_SetError("Audio device hasn't been opened");
return 0;
}
Jan 24, 2011
Jan 24, 2011
870
May 22, 2013
May 22, 2013
871
872
873
874
if (ms <= 0) { /* just halt immediately. */
Mix_HaltMusic();
return 1;
}
Nov 19, 2005
Nov 19, 2005
875
Jan 29, 2016
Jan 29, 2016
876
Mix_LockAudio();
Oct 17, 2017
Oct 17, 2017
877
878
879
880
881
882
883
884
885
886
887
888
889
890
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
891
892
893
894
music_playing->fading = MIX_FADING_OUT;
music_playing->fade_steps = fade_steps;
retval = 1;
}
Jan 29, 2016
Jan 29, 2016
895
Mix_UnlockAudio();
May 16, 2002
May 16, 2002
896
May 22, 2013
May 22, 2013
897
return(retval);
Oct 23, 1999
Oct 23, 1999
898
899
900
901
}
Mix_Fading Mix_FadingMusic(void)
{
May 22, 2013
May 22, 2013
902
Mix_Fading fading = MIX_NO_FADING;
May 16, 2002
May 16, 2002
903
Jan 29, 2016
Jan 29, 2016
904
Mix_LockAudio();
Oct 17, 2017
Oct 17, 2017
905
if (music_playing) {
May 22, 2013
May 22, 2013
906
907
fading = music_playing->fading;
}
Jan 29, 2016
Jan 29, 2016
908
Mix_UnlockAudio();
May 16, 2002
May 16, 2002
909
May 22, 2013
May 22, 2013
910
return(fading);
Oct 23, 1999
Oct 23, 1999
911
912
}
Oct 21, 1999
Oct 21, 1999
913
914
915
/* Pause/Resume the music stream */
void Mix_PauseMusic(void)
{
Oct 17, 2017
Oct 17, 2017
916
Mix_LockAudio();
Oct 21, 2017
Oct 21, 2017
917
918
919
920
if (music_playing) {
if (music_playing->interface->Pause) {
music_playing->interface->Pause(music_playing->context);
}
Oct 17, 2017
Oct 17, 2017
921
}
Oct 21, 2017
Oct 21, 2017
922
music_active = SDL_FALSE;
Oct 17, 2017
Oct 17, 2017
923
Mix_UnlockAudio();
Oct 21, 1999
Oct 21, 1999
924
}
Oct 23, 1999
Oct 23, 1999
925
Oct 21, 1999
Oct 21, 1999
926
927
void Mix_ResumeMusic(void)
{
Oct 17, 2017
Oct 17, 2017
928
Mix_LockAudio();
Oct 21, 2017
Oct 21, 2017
929
930
931
932
if (music_playing) {
if (music_playing->interface->Resume) {
music_playing->interface->Resume(music_playing->context);
}
Oct 17, 2017
Oct 17, 2017
933
}
Oct 21, 2017
Oct 21, 2017
934
music_active = SDL_TRUE;
Oct 17, 2017
Oct 17, 2017
935
Mix_UnlockAudio();
Oct 21, 1999
Oct 21, 1999
936
937
938
939
}
void Mix_RewindMusic(void)
{
May 22, 2013
May 22, 2013
940
Mix_SetMusicPosition(0.0);
Oct 21, 1999
Oct 21, 1999
941
942
}
Nov 1, 1999
Nov 1, 1999
943
944
int Mix_PausedMusic(void)
{
Oct 21, 2017
Oct 21, 2017
945
return (music_active == SDL_FALSE);
Nov 1, 1999
Nov 1, 1999
946
947
}
Oct 21, 1999
Oct 21, 1999
948
/* Check the status of the music */
Oct 17, 2017
Oct 17, 2017
949
static SDL_bool music_internal_playing(void)
Oct 21, 1999
Oct 21, 1999
950
{
Oct 21, 2017
Oct 21, 2017
951
if (!music_playing) {
Oct 17, 2017
Oct 17, 2017
952
return SDL_FALSE;
May 22, 2013
May 22, 2013
953
}
Jul 14, 2011
Jul 14, 2011
954
Oct 17, 2017
Oct 17, 2017
955
if (music_playing->interface->IsPlaying) {
Oct 21, 2017
Oct 21, 2017
956
music_playing->playing = music_playing->interface->IsPlaying(music_playing->context);
May 22, 2013
May 22, 2013
957
}
Oct 17, 2017
Oct 17, 2017
958
return music_playing->playing;
May 16, 2002
May 16, 2002
959
960
961
}
int Mix_PlayingMusic(void)
{
Oct 21, 2017
Oct 21, 2017
962
SDL_bool playing;
May 16, 2002
May 16, 2002
963
Jan 29, 2016
Jan 29, 2016
964
Mix_LockAudio();
Oct 21, 2017
Oct 21, 2017
965
playing = music_internal_playing();
Jan 29, 2016
Jan 29, 2016
966
Mix_UnlockAudio();
May 16, 2002
May 16, 2002
967
Oct 21, 2017
Oct 21, 2017
968
return playing ? 1 : 0;
Oct 21, 1999
Oct 21, 1999
969
970
971
972
973
}
/* Set the external music playback command */
int Mix_SetMusicCMD(const char *command)
{
May 22, 2013
May 22, 2013
974
Mix_HaltMusic();
Oct 17, 2017
Oct 17, 2017
975
if (music_cmd) {
May 22, 2013
May 22, 2013
976
977
978
SDL_free(music_cmd);
music_cmd = NULL;
}
Oct 17, 2017
Oct 17, 2017
979
980
981
982
983
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
984
}
Oct 17, 2017
Oct 17, 2017
985
SDL_memcpy(music_cmd, command, length);
May 22, 2013
May 22, 2013
986
}
Oct 17, 2017
Oct 17, 2017
987
return 0;
Oct 21, 1999
Oct 21, 1999
988
989
}
Dec 19, 2001
Dec 19, 2001
990
991
int Mix_SetSynchroValue(int i)
{
May 22, 2013
May 22, 2013
992
993
/* Not supported by any players at this time */
return(-1);
Dec 19, 2001
Dec 19, 2001
994
995
996
997
}
int Mix_GetSynchroValue(void)
{
May 22, 2013
May 22, 2013
998
999
/* Not supported by any players at this time */
return(-1);
Dec 19, 2001
Dec 19, 2001
1000
}