Skip to content

Latest commit

 

History

History
496 lines (428 loc) · 14.6 KB

music_mpg123.c

File metadata and controls

496 lines (428 loc) · 14.6 KB
 
Jul 20, 2017
Jul 20, 2017
1
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>
Jul 20, 2017
Jul 20, 2017
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 17, 2017
Oct 17, 2017
22
/* This file supports playing MP3 files with mpg123 */
Jul 20, 2017
Jul 20, 2017
23
Oct 17, 2017
Oct 17, 2017
24
25
#ifdef MUSIC_MP3_MPG123
Nov 17, 2019
Nov 17, 2019
26
#include <stdio.h> /* For SEEK_SET */
Oct 18, 2017
Oct 18, 2017
27
Oct 21, 2017
Oct 21, 2017
28
#include "SDL_assert.h"
Oct 18, 2017
Oct 18, 2017
29
30
#include "SDL_loadso.h"
Oct 17, 2017
Oct 17, 2017
31
#include "music_mpg123.h"
Dec 10, 2019
Dec 10, 2019
32
#include "mp3utils.h"
Oct 17, 2017
Oct 17, 2017
33
34
35
#include <mpg123.h>
Oct 18, 2017
Oct 18, 2017
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
typedef struct {
int loaded;
void *handle;
int (*mpg123_close)(mpg123_handle *mh);
void (*mpg123_delete)(mpg123_handle *mh);
void (*mpg123_exit)(void);
int (*mpg123_format)( mpg123_handle *mh, long rate, int channels, int encodings );
int (*mpg123_format_none)(mpg123_handle *mh);
int (*mpg123_getformat)( mpg123_handle *mh, long *rate, int *channels, int *encoding );
int (*mpg123_init)(void);
mpg123_handle *(*mpg123_new)(const char* decoder, int *error);
int (*mpg123_open_handle)(mpg123_handle *mh, void *iohandle);
const char* (*mpg123_plain_strerror)(int errcode);
Oct 21, 2017
Oct 21, 2017
51
void (*mpg123_rates)(const long **list, size_t *number);
Oct 18, 2017
Oct 18, 2017
52
53
54
int (*mpg123_read)(mpg123_handle *mh, unsigned char *outmemory, size_t outmemsize, size_t *done );
int (*mpg123_replace_reader_handle)( mpg123_handle *mh, ssize_t (*r_read) (void *, void *, size_t), off_t (*r_lseek)(void *, off_t, int), void (*cleanup)(void*) );
off_t (*mpg123_seek)( mpg123_handle *mh, off_t sampleoff, int whence );
Dec 17, 2019
Dec 17, 2019
55
off_t (*mpg123_length)(mpg123_handle *mh);
Oct 18, 2017
Oct 18, 2017
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
const char* (*mpg123_strerror)(mpg123_handle *mh);
} mpg123_loader;
static mpg123_loader mpg123 = {
0, NULL
};
#ifdef MPG123_DYNAMIC
#define FUNCTION_LOADER(FUNC, SIG) \
mpg123.FUNC = (SIG) SDL_LoadFunction(mpg123.handle, #FUNC); \
if (mpg123.FUNC == NULL) { SDL_UnloadObject(mpg123.handle); return -1; }
#else
#define FUNCTION_LOADER(FUNC, SIG) \
mpg123.FUNC = FUNC;
#endif
Oct 18, 2017
Oct 18, 2017
72
static int MPG123_Load(void)
Oct 18, 2017
Oct 18, 2017
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
{
if (mpg123.loaded == 0) {
#ifdef MPG123_DYNAMIC
mpg123.handle = SDL_LoadObject(MPG123_DYNAMIC);
if (mpg123.handle == NULL) {
return -1;
}
#elif defined(__MACOSX__)
extern int mpg123_init(void) __attribute__((weak_import));
if (mpg123_init == NULL)
{
/* Missing weakly linked framework */
Mix_SetError("Missing mpg123.framework");
return -1;
}
#endif
FUNCTION_LOADER(mpg123_close, int (*)(mpg123_handle *mh))
FUNCTION_LOADER(mpg123_delete, void (*)(mpg123_handle *mh))
FUNCTION_LOADER(mpg123_exit, void (*)(void))
FUNCTION_LOADER(mpg123_format, int (*)( mpg123_handle *mh, long rate, int channels, int encodings ))
FUNCTION_LOADER(mpg123_format_none, int (*)(mpg123_handle *mh))
FUNCTION_LOADER(mpg123_getformat, int (*)( mpg123_handle *mh, long *rate, int *channels, int *encoding ))
FUNCTION_LOADER(mpg123_init, int (*)(void))
FUNCTION_LOADER(mpg123_new, mpg123_handle *(*)(const char* decoder, int *error))
FUNCTION_LOADER(mpg123_open_handle, int (*)(mpg123_handle *mh, void *iohandle))
FUNCTION_LOADER(mpg123_plain_strerror, const char* (*)(int errcode))
Dec 10, 2019
Dec 10, 2019
99
FUNCTION_LOADER(mpg123_rates, void (*)(const long **list, size_t *number))
Oct 18, 2017
Oct 18, 2017
100
101
102
FUNCTION_LOADER(mpg123_read, int (*)(mpg123_handle *mh, unsigned char *outmemory, size_t outmemsize, size_t *done ))
FUNCTION_LOADER(mpg123_replace_reader_handle, int (*)( mpg123_handle *mh, ssize_t (*r_read) (void *, void *, size_t), off_t (*r_lseek)(void *, off_t, int), void (*cleanup)(void*) ))
FUNCTION_LOADER(mpg123_seek, off_t (*)( mpg123_handle *mh, off_t sampleoff, int whence ))
Dec 17, 2019
Dec 17, 2019
103
FUNCTION_LOADER(mpg123_length, off_t (*)(mpg123_handle *mh))
Oct 18, 2017
Oct 18, 2017
104
105
106
107
108
109
110
FUNCTION_LOADER(mpg123_strerror, const char* (*)(mpg123_handle *mh))
}
++mpg123.loaded;
return 0;
}
Oct 18, 2017
Oct 18, 2017
111
static void MPG123_Unload(void)
Oct 18, 2017
Oct 18, 2017
112
113
114
115
116
117
118
119
120
121
122
123
124
{
if (mpg123.loaded == 0) {
return;
}
if (mpg123.loaded == 1) {
#ifdef MPG123_DYNAMIC
SDL_UnloadObject(mpg123.handle);
#endif
}
--mpg123.loaded;
}
Oct 17, 2017
Oct 17, 2017
125
126
typedef struct
{
Dec 10, 2019
Dec 10, 2019
127
struct mp3file_t mp3file;
Oct 21, 2017
Oct 21, 2017
128
int play_count;
Oct 17, 2017
Oct 17, 2017
129
130
131
132
int freesrc;
int volume;
mpg123_handle* handle;
Oct 21, 2017
Oct 21, 2017
133
134
135
SDL_AudioStream *stream;
unsigned char *buffer;
size_t buffer_size;
Dec 17, 2019
Dec 17, 2019
136
long sample_rate;
Dec 17, 2019
Dec 17, 2019
137
off_t total_length;
Oct 21, 2017
Oct 21, 2017
138
} MPG123_Music;
Oct 17, 2017
Oct 17, 2017
139
Jul 20, 2017
Jul 20, 2017
140
Oct 21, 2017
Oct 21, 2017
141
142
static int MPG123_Seek(void *context, double secs);
static void MPG123_Delete(void *context);
Jul 20, 2017
Jul 20, 2017
143
Dec 17, 2019
Dec 17, 2019
144
Oct 21, 2017
Oct 21, 2017
145
static int mpg123_format_to_sdl(int fmt)
Jul 20, 2017
Jul 20, 2017
146
147
148
{
switch (fmt)
{
Oct 21, 2017
Oct 21, 2017
149
150
151
152
153
154
155
case MPG123_ENC_SIGNED_8: return AUDIO_S8;
case MPG123_ENC_UNSIGNED_8: return AUDIO_U8;
case MPG123_ENC_SIGNED_16: return AUDIO_S16SYS;
case MPG123_ENC_UNSIGNED_16: return AUDIO_U16SYS;
case MPG123_ENC_SIGNED_32: return AUDIO_S32SYS;
case MPG123_ENC_FLOAT_32: return AUDIO_F32SYS;
default: return -1;
Jul 20, 2017
Jul 20, 2017
156
157
158
}
}
Dec 17, 2019
Dec 17, 2019
159
160
/*#define DEBUG_MPG123*/
#ifdef DEBUG_MPG123
Oct 21, 2017
Oct 21, 2017
161
static const char *mpg123_format_str(int fmt)
Jul 20, 2017
Jul 20, 2017
162
163
164
165
166
167
168
169
170
{
switch (fmt)
{
#define f(x) case x: return #x;
f(MPG123_ENC_UNSIGNED_8)
f(MPG123_ENC_UNSIGNED_16)
f(MPG123_ENC_SIGNED_8)
f(MPG123_ENC_SIGNED_16)
f(MPG123_ENC_SIGNED_32)
Oct 21, 2017
Oct 21, 2017
171
f(MPG123_ENC_FLOAT_32)
Jul 20, 2017
Jul 20, 2017
172
173
174
175
#undef f
}
return "unknown";
}
Dec 17, 2019
Dec 17, 2019
176
#endif
Jul 20, 2017
Jul 20, 2017
177
Oct 21, 2017
Oct 21, 2017
178
static char const* mpg_err(mpg123_handle* mpg, int result)
Jul 20, 2017
Jul 20, 2017
179
180
181
{
char const* err = "unknown error";
Oct 21, 2017
Oct 21, 2017
182
if (mpg && result == MPG123_ERR) {
Oct 18, 2017
Oct 18, 2017
183
err = mpg123.mpg123_strerror(mpg);
Jul 20, 2017
Jul 20, 2017
184
} else {
Oct 21, 2017
Oct 21, 2017
185
err = mpg123.mpg123_plain_strerror(result);
Jul 20, 2017
Jul 20, 2017
186
187
188
189
190
}
return err;
}
/* we're gonna override mpg123's I/O with these wrappers for RWops */
Oct 21, 2017
Oct 21, 2017
191
192
static ssize_t rwops_read(void* p, void* dst, size_t n)
{
Dec 10, 2019
Dec 10, 2019
193
return (ssize_t)MP3_RWread((struct mp3file_t *)p, dst, 1, n);
Jul 20, 2017
Jul 20, 2017
194
195
}
Oct 21, 2017
Oct 21, 2017
196
197
static off_t rwops_seek(void* p, off_t offset, int whence)
{
Dec 10, 2019
Dec 10, 2019
198
return (off_t)MP3_RWseek((struct mp3file_t *)p, (Sint64)offset, whence);
Jul 20, 2017
Jul 20, 2017
199
200
}
Oct 21, 2017
Oct 21, 2017
201
202
static void rwops_cleanup(void* p)
{
Jul 20, 2017
Jul 20, 2017
203
204
205
206
(void)p;
/* do nothing, we will free the file later */
}
Oct 17, 2017
Oct 17, 2017
207
208
209
static int MPG123_Open(const SDL_AudioSpec *spec)
{
Nov 17, 2019
Nov 17, 2019
210
(void)spec;
Oct 18, 2017
Oct 18, 2017
211
if (mpg123.mpg123_init() != MPG123_OK) {
Oct 17, 2017
Oct 17, 2017
212
213
214
215
216
217
218
Mix_SetError("mpg123_init() failed");
return -1;
}
return 0;
}
static void *MPG123_CreateFromRW(SDL_RWops *src, int freesrc)
Jul 20, 2017
Jul 20, 2017
219
{
Oct 21, 2017
Oct 21, 2017
220
MPG123_Music *music;
Dec 17, 2019
Dec 17, 2019
221
222
int result, format, channels, encoding;
long rate;
Oct 21, 2017
Oct 21, 2017
223
224
const long *rates;
size_t i, num_rates;
Jul 20, 2017
Jul 20, 2017
225
Oct 21, 2017
Oct 21, 2017
226
227
228
229
music = (MPG123_Music*)SDL_calloc(1, sizeof(*music));
if (!music) {
return NULL;
}
Dec 10, 2019
Dec 10, 2019
230
music->mp3file.src = src;
Oct 21, 2017
Oct 21, 2017
231
232
music->volume = MIX_MAX_VOLUME;
Dec 10, 2019
Dec 10, 2019
233
music->mp3file.length = SDL_RWsize(src);
Dec 20, 2019
Dec 20, 2019
234
if (mp3_skiptags(&music->mp3file, SDL_TRUE) < 0) {
Dec 10, 2019
Dec 10, 2019
235
236
237
238
239
SDL_free(music);
Mix_SetError("music_mpg123: corrupt mp3 file (bad tags.)");
return NULL;
}
Oct 21, 2017
Oct 21, 2017
240
241
242
243
244
245
246
/* Just assume 16-bit 2 channel audio for now */
music->buffer_size = music_spec.samples * sizeof(Sint16) * 2;
music->buffer = (unsigned char *)SDL_malloc(music->buffer_size);
if (!music->buffer) {
MPG123_Delete(music);
SDL_OutOfMemory();
return NULL;
Jul 20, 2017
Jul 20, 2017
247
248
}
Oct 21, 2017
Oct 21, 2017
249
music->handle = mpg123.mpg123_new(0, &result);
Jul 20, 2017
Jul 20, 2017
250
if (result != MPG123_OK) {
Oct 21, 2017
Oct 21, 2017
251
252
253
MPG123_Delete(music);
Mix_SetError("mpg123_new failed");
return NULL;
Jul 20, 2017
Jul 20, 2017
254
255
}
Oct 18, 2017
Oct 18, 2017
256
result = mpg123.mpg123_replace_reader_handle(
Oct 21, 2017
Oct 21, 2017
257
music->handle,
Jul 20, 2017
Jul 20, 2017
258
rwops_read, rwops_seek, rwops_cleanup
Oct 21, 2017
Oct 21, 2017
259
);
Jul 20, 2017
Jul 20, 2017
260
if (result != MPG123_OK) {
Oct 21, 2017
Oct 21, 2017
261
262
263
MPG123_Delete(music);
Mix_SetError("mpg123_replace_reader_handle: %s", mpg_err(music->handle, result));
return NULL;
Jul 20, 2017
Jul 20, 2017
264
265
}
Oct 21, 2017
Oct 21, 2017
266
result = mpg123.mpg123_format_none(music->handle);
Jul 20, 2017
Jul 20, 2017
267
if (result != MPG123_OK) {
Oct 21, 2017
Oct 21, 2017
268
269
270
MPG123_Delete(music);
Mix_SetError("mpg123_format_none: %s", mpg_err(music->handle, result));
return NULL;
Jul 20, 2017
Jul 20, 2017
271
272
}
Oct 21, 2017
Oct 21, 2017
273
274
275
276
277
278
279
280
281
282
283
mpg123.mpg123_rates(&rates, &num_rates);
for (i = 0; i < num_rates; ++i) {
const int channels = (MPG123_MONO|MPG123_STEREO);
const int formats = (MPG123_ENC_SIGNED_8 |
MPG123_ENC_UNSIGNED_8 |
MPG123_ENC_SIGNED_16 |
MPG123_ENC_UNSIGNED_16 |
MPG123_ENC_SIGNED_32 |
MPG123_ENC_FLOAT_32);
mpg123.mpg123_format(music->handle, rates[i], channels, formats);
Jul 20, 2017
Jul 20, 2017
284
285
}
Dec 10, 2019
Dec 10, 2019
286
result = mpg123.mpg123_open_handle(music->handle, &music->mp3file);
Jul 20, 2017
Jul 20, 2017
287
if (result != MPG123_OK) {
Oct 21, 2017
Oct 21, 2017
288
289
290
MPG123_Delete(music);
Mix_SetError("mpg123_open_handle: %s", mpg_err(music->handle, result));
return NULL;
Jul 20, 2017
Jul 20, 2017
291
292
}
Dec 17, 2019
Dec 17, 2019
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
result = mpg123.mpg123_getformat(music->handle, &rate, &channels, &encoding);
if (result != MPG123_OK) {
MPG123_Delete(music);
Mix_SetError("mpg123_getformat: %s", mpg_err(music->handle, result));
return NULL;
}
#ifdef DEBUG_MPG123
printf("MPG123 format: %s, channels: %d, rate: %ld\n",
mpg123_format_str(encoding), channels, rate);
#endif
format = mpg123_format_to_sdl(encoding);
SDL_assert(format != -1);
music->sample_rate = rate;
music->stream = SDL_NewAudioStream((SDL_AudioFormat)format, (Uint8)channels, (int)rate,
music_spec.format, music_spec.channels, music_spec.freq);
if (!music->stream) {
MPG123_Delete(music);
return NULL;
}
Dec 17, 2019
Dec 17, 2019
315
316
music->total_length = mpg123.mpg123_length(music->handle);
Oct 21, 2017
Oct 21, 2017
317
318
music->freesrc = freesrc;
return music;
Jul 20, 2017
Jul 20, 2017
319
320
}
Oct 21, 2017
Oct 21, 2017
321
static void MPG123_SetVolume(void *context, int volume)
Oct 17, 2017
Oct 17, 2017
322
{
Oct 21, 2017
Oct 21, 2017
323
324
MPG123_Music *music = (MPG123_Music *)context;
music->volume = volume;
Jul 20, 2017
Jul 20, 2017
325
326
}
Dec 23, 2019
Dec 23, 2019
327
328
329
330
331
332
static int MPG123_GetVolume(void *context)
{
MPG123_Music *music = (MPG123_Music *)context;
return music->volume;
}
Oct 21, 2017
Oct 21, 2017
333
static int MPG123_Play(void *context, int play_count)
Oct 17, 2017
Oct 17, 2017
334
{
Oct 21, 2017
Oct 21, 2017
335
336
337
MPG123_Music *music = (MPG123_Music *)context;
music->play_count = play_count;
return MPG123_Seek(music, 0.0);
Jul 20, 2017
Jul 20, 2017
338
339
}
Oct 21, 2017
Oct 21, 2017
340
341
/* read some mp3 stream data and convert it for output */
static int MPG123_GetSome(void *context, void *data, int bytes, SDL_bool *done)
Jul 20, 2017
Jul 20, 2017
342
{
Oct 21, 2017
Oct 21, 2017
343
344
345
MPG123_Music *music = (MPG123_Music *)context;
int filled, result;
size_t amount;
Jul 20, 2017
Jul 20, 2017
346
long rate;
Oct 21, 2017
Oct 21, 2017
347
int channels, encoding, format;
Jul 20, 2017
Jul 20, 2017
348
Oct 21, 2017
Oct 21, 2017
349
350
351
352
353
if (music->stream) {
filled = SDL_AudioStreamGet(music->stream, data, bytes);
if (filled != 0) {
return filled;
}
Jul 20, 2017
Jul 20, 2017
354
355
}
Oct 21, 2017
Oct 21, 2017
356
357
358
if (!music->play_count) {
/* All done */
*done = SDL_TRUE;
Jul 20, 2017
Jul 20, 2017
359
360
361
return 0;
}
Oct 21, 2017
Oct 21, 2017
362
363
364
365
366
result = mpg123.mpg123_read(music->handle, music->buffer, music->buffer_size, &amount);
switch (result) {
case MPG123_OK:
if (SDL_AudioStreamPut(music->stream, music->buffer, (int)amount) < 0) {
return -1;
Jul 20, 2017
Jul 20, 2017
367
}
Oct 21, 2017
Oct 21, 2017
368
break;
Jul 20, 2017
Jul 20, 2017
369
Oct 21, 2017
Oct 21, 2017
370
371
372
373
374
case MPG123_NEW_FORMAT:
result = mpg123.mpg123_getformat(music->handle, &rate, &channels, &encoding);
if (result != MPG123_OK) {
Mix_SetError("mpg123_getformat: %s", mpg_err(music->handle, result));
return -1;
Jul 20, 2017
Jul 20, 2017
375
}
Dec 17, 2019
Dec 17, 2019
376
377
378
379
#ifdef DEBUG_MPG123
printf("MPG123 format: %s, channels: %d, rate: %ld\n",
mpg123_format_str(encoding), channels, rate);
#endif
Jul 20, 2017
Jul 20, 2017
380
Oct 21, 2017
Oct 21, 2017
381
382
format = mpg123_format_to_sdl(encoding);
SDL_assert(format != -1);
Jul 20, 2017
Jul 20, 2017
383
Dec 22, 2019
Dec 22, 2019
384
385
386
if (music->stream) {
SDL_FreeAudioStream(music->stream);
}
Nov 17, 2019
Nov 17, 2019
387
music->stream = SDL_NewAudioStream((SDL_AudioFormat)format, (Uint8)channels, (int)rate,
Oct 21, 2017
Oct 21, 2017
388
389
390
music_spec.format, music_spec.channels, music_spec.freq);
if (!music->stream) {
return -1;
Jul 20, 2017
Jul 20, 2017
391
}
Dec 17, 2019
Dec 17, 2019
392
music->sample_rate = rate;
Oct 21, 2017
Oct 21, 2017
393
394
395
396
397
398
399
400
401
402
403
404
405
406
break;
case MPG123_DONE:
if (music->play_count == 1) {
music->play_count = 0;
SDL_AudioStreamFlush(music->stream);
} else {
int play_count = -1;
if (music->play_count > 0) {
play_count = (music->play_count - 1);
}
if (MPG123_Play(music, play_count) < 0) {
return -1;
}
Jul 20, 2017
Jul 20, 2017
407
}
Oct 21, 2017
Oct 21, 2017
408
409
410
411
break;
default:
Mix_SetError("mpg123_read: %s", mpg_err(music->handle, result));
return -1;
Jul 20, 2017
Jul 20, 2017
412
}
Oct 21, 2017
Oct 21, 2017
413
414
415
416
417
418
return 0;
}
static int MPG123_GetAudio(void *context, void *data, int bytes)
{
MPG123_Music *music = (MPG123_Music *)context;
return music_pcm_getaudio(context, data, bytes, music->volume, MPG123_GetSome);
Jul 20, 2017
Jul 20, 2017
419
420
}
Oct 17, 2017
Oct 17, 2017
421
static int MPG123_Seek(void *context, double secs)
Jul 20, 2017
Jul 20, 2017
422
{
Oct 21, 2017
Oct 21, 2017
423
MPG123_Music *music = (MPG123_Music *)context;
Dec 17, 2019
Dec 17, 2019
424
off_t offset = (off_t)(music->sample_rate * secs);
Jul 20, 2017
Jul 20, 2017
425
Oct 21, 2017
Oct 21, 2017
426
427
if ((offset = mpg123.mpg123_seek(music->handle, offset, SEEK_SET)) < 0) {
return Mix_SetError("mpg123_seek: %s", mpg_err(music->handle, (int)-offset));
Jul 20, 2017
Jul 20, 2017
428
}
Oct 17, 2017
Oct 17, 2017
429
return 0;
Jul 20, 2017
Jul 20, 2017
430
431
}
Dec 17, 2019
Dec 17, 2019
432
433
434
435
436
437
438
439
440
441
/* Return music duration in seconds */
static double MPG123_Duration(void *context)
{
MPG123_Music *music = (MPG123_Music *)context;
if (music->total_length < 0) {
return -1.0;
}
return (double)music->total_length / music->sample_rate;
}
Oct 17, 2017
Oct 17, 2017
442
443
static void MPG123_Delete(void *context)
{
Oct 21, 2017
Oct 21, 2017
444
MPG123_Music *music = (MPG123_Music *)context;
Jul 20, 2017
Jul 20, 2017
445
Oct 21, 2017
Oct 21, 2017
446
447
448
if (music->handle) {
mpg123.mpg123_close(music->handle);
mpg123.mpg123_delete(music->handle);
Oct 17, 2017
Oct 17, 2017
449
}
Oct 21, 2017
Oct 21, 2017
450
451
if (music->stream) {
SDL_FreeAudioStream(music->stream);
Oct 17, 2017
Oct 17, 2017
452
}
Oct 21, 2017
Oct 21, 2017
453
454
455
456
if (music->buffer) {
SDL_free(music->buffer);
}
if (music->freesrc) {
Dec 10, 2019
Dec 10, 2019
457
SDL_RWclose(music->mp3file.src);
Oct 21, 2017
Oct 21, 2017
458
459
}
SDL_free(music);
Oct 17, 2017
Oct 17, 2017
460
461
462
463
}
static void MPG123_Close(void)
{
Oct 18, 2017
Oct 18, 2017
464
mpg123.mpg123_exit();
Oct 17, 2017
Oct 17, 2017
465
466
467
468
469
470
471
472
473
474
}
Mix_MusicInterface Mix_MusicInterface_MPG123 =
{
"MPG123",
MIX_MUSIC_MPG123,
MUS_MP3,
SDL_FALSE,
SDL_FALSE,
Oct 18, 2017
Oct 18, 2017
475
MPG123_Load,
Oct 17, 2017
Oct 17, 2017
476
477
478
479
MPG123_Open,
MPG123_CreateFromRW,
NULL, /* CreateFromFile */
MPG123_SetVolume,
Dec 23, 2019
Dec 23, 2019
480
MPG123_GetVolume,
Oct 17, 2017
Oct 17, 2017
481
MPG123_Play,
Oct 21, 2017
Oct 21, 2017
482
NULL, /* IsPlaying */
Oct 17, 2017
Oct 17, 2017
483
484
MPG123_GetAudio,
MPG123_Seek,
Dec 17, 2019
Dec 17, 2019
485
MPG123_Duration,
Oct 17, 2017
Oct 17, 2017
486
487
NULL, /* Pause */
NULL, /* Resume */
Oct 21, 2017
Oct 21, 2017
488
NULL, /* Stop */
Oct 17, 2017
Oct 17, 2017
489
490
MPG123_Delete,
MPG123_Close,
Oct 18, 2017
Oct 18, 2017
491
MPG123_Unload
Oct 17, 2017
Oct 17, 2017
492
493
494
495
496
};
#endif /* MUSIC_MP3_MPG123 */
/* vi: set ts=4 sw=4 expandtab: */