Mercurial > SDL_sound_CoreAudio
annotate decoders/modplug.c @ 562:7e08477b0fc1
MP3 decoder upgrade work.
Ripped out SMPEG and mpglib support, replaced it with "mpg123.c" and libmpg123.
libmpg123 is a much better version of mpglib, so it should solve all the
problems about MP3's not seeking, or most modern MP3's not playing at all,
etc. Since you no longer have to make a tradeoff with SMPEG for features, and
SMPEG is basically rotting, I removed it from the project.
There is still work to be done with libmpg123...there are MMX, 3DNow, SSE,
Altivec, etc decoders which we don't have enabled at the moment, and the
build system could use some work to make this compile more cleanly, etc.
Still: huge win.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Fri, 30 Jan 2009 02:44:47 -0500 |
parents | 2e8907ff98e9 |
children | fa857159dbdf |
rev | line source |
---|---|
208 | 1 /* |
2 * SDL_sound -- An abstract sound format decoding API. | |
3 * Copyright (C) 2001 Ryan C. Gordon. | |
4 * | |
5 * This library is free software; you can redistribute it and/or | |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2.1 of the License, or (at your option) any later version. | |
9 * | |
10 * This library is distributed in the hope that it will be useful, | |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 * Lesser General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU Lesser General Public | |
16 * License along with this library; if not, write to the Free Software | |
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 */ | |
19 | |
20 /* | |
21 * Module player for SDL_sound. This driver handles anything that ModPlug does. | |
22 * | |
349
f72fd79d6e76
Added URLs for official and unofficial versions of ModPlug.
Ryan C. Gordon <icculus@icculus.org>
parents:
312
diff
changeset
|
23 * ModPlug can be found at http://sourceforge.net/projects/modplug-xmms |
f72fd79d6e76
Added URLs for official and unofficial versions of ModPlug.
Ryan C. Gordon <icculus@icculus.org>
parents:
312
diff
changeset
|
24 * |
f72fd79d6e76
Added URLs for official and unofficial versions of ModPlug.
Ryan C. Gordon <icculus@icculus.org>
parents:
312
diff
changeset
|
25 * An unofficial version of modplug with all C++ dependencies removed is also |
f72fd79d6e76
Added URLs for official and unofficial versions of ModPlug.
Ryan C. Gordon <icculus@icculus.org>
parents:
312
diff
changeset
|
26 * available: http://freecraft.net/snapshots/ |
f72fd79d6e76
Added URLs for official and unofficial versions of ModPlug.
Ryan C. Gordon <icculus@icculus.org>
parents:
312
diff
changeset
|
27 * (Look for something like "libmodplug-johns-*.tar.gz") |
f72fd79d6e76
Added URLs for official and unofficial versions of ModPlug.
Ryan C. Gordon <icculus@icculus.org>
parents:
312
diff
changeset
|
28 * |
552
2e8907ff98e9
Replaced references to COPYING with references to LICENSE.txt ...
Ryan C. Gordon <icculus@icculus.org>
parents:
536
diff
changeset
|
29 * Please see the file LICENSE.txt in the source's root directory. |
208 | 30 * |
536
8a814bbbedfa
Merged r544:545 from branches/stable-1.0: converted to UTF-8 encoding.
Ryan C. Gordon <icculus@icculus.org>
parents:
496
diff
changeset
|
31 * This file written by Torbjörn Andersson (d91tan@Update.UU.SE) |
208 | 32 */ |
33 | |
34 #if HAVE_CONFIG_H | |
35 # include <config.h> | |
36 #endif | |
37 | |
38 #ifdef SOUND_SUPPORTS_MODPLUG | |
39 | |
40 #include <stdio.h> | |
41 #include <stdlib.h> | |
42 #include <string.h> | |
43 | |
44 #include "SDL_sound.h" | |
45 | |
46 #define __SDL_SOUND_INTERNAL__ | |
47 #include "SDL_sound_internal.h" | |
48 | |
496
67d785044411
Forward port from stable branch: fix modplug header detection.
Ryan C. Gordon <icculus@icculus.org>
parents:
477
diff
changeset
|
49 #if SOUND_MODPLUG_IN_OWN_PATH |
67d785044411
Forward port from stable branch: fix modplug header detection.
Ryan C. Gordon <icculus@icculus.org>
parents:
477
diff
changeset
|
50 #include "libmodplug/modplug.h" |
67d785044411
Forward port from stable branch: fix modplug header detection.
Ryan C. Gordon <icculus@icculus.org>
parents:
477
diff
changeset
|
51 #else |
208 | 52 #include "modplug.h" |
496
67d785044411
Forward port from stable branch: fix modplug header detection.
Ryan C. Gordon <icculus@icculus.org>
parents:
477
diff
changeset
|
53 #endif |
208 | 54 |
55 static int MODPLUG_init(void); | |
56 static void MODPLUG_quit(void); | |
57 static int MODPLUG_open(Sound_Sample *sample, const char *ext); | |
58 static void MODPLUG_close(Sound_Sample *sample); | |
59 static Uint32 MODPLUG_read(Sound_Sample *sample); | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
60 static int MODPLUG_rewind(Sound_Sample *sample); |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
231
diff
changeset
|
61 static int MODPLUG_seek(Sound_Sample *sample, Uint32 ms); |
208 | 62 |
63 static const char *extensions_modplug[] = | |
64 { | |
211
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
65 /* The XMMS plugin is apparently able to load compressed modules as |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
66 * well, but libmodplug does not handle this. |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
67 */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
68 "669", /* Composer 669 / UNIS 669 module */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
69 "AMF", /* ASYLUM Music Format / Advanced Music Format(DSM) */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
70 "AMS", /* AMS module */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
71 "DBM", /* DigiBooster Pro Module */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
72 "DMF", /* DMF DELUSION DIGITAL MUSIC FILEFORMAT (X-Tracker) */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
73 "DSM", /* DSIK Internal Format module */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
74 "FAR", /* Farandole module */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
75 "IT", /* Impulse Tracker IT file */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
76 "MDL", /* DigiTracker module */ |
208 | 77 #if 0 |
211
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
78 "J2B", /* Not implemented? What is it anyway? */ |
208 | 79 #endif |
211
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
80 "MED", /* OctaMed MED file */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
81 "MOD", /* ProTracker / NoiseTracker MOD/NST file */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
82 "MT2", /* MadTracker 2.0 */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
83 "MTM", /* MTM file */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
84 "OKT", /* Oktalyzer module */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
85 "PTM", /* PTM PolyTracker module */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
86 "PSM", /* PSM module */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
87 "S3M", /* ScreamTracker file */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
88 "STM", /* ST 2.xx */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
89 "ULT", |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
90 "UMX", |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
91 "XM", /* FastTracker II */ |
208 | 92 NULL |
93 }; | |
94 | |
95 const Sound_DecoderFunctions __Sound_DecoderFunctions_MODPLUG = | |
96 { | |
97 { | |
98 extensions_modplug, | |
99 "Play modules through ModPlug", | |
536
8a814bbbedfa
Merged r544:545 from branches/stable-1.0: converted to UTF-8 encoding.
Ryan C. Gordon <icculus@icculus.org>
parents:
496
diff
changeset
|
100 "Torbjörn Andersson <d91tan@Update.UU.SE>", |
208 | 101 "http://modplug-xmms.sourceforge.net/" |
102 }, | |
103 | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
104 MODPLUG_init, /* init() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
105 MODPLUG_quit, /* quit() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
106 MODPLUG_open, /* open() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
107 MODPLUG_close, /* close() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
108 MODPLUG_read, /* read() method */ |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
231
diff
changeset
|
109 MODPLUG_rewind, /* rewind() method */ |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
231
diff
changeset
|
110 MODPLUG_seek /* seek() method */ |
208 | 111 }; |
112 | |
113 | |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
114 static ModPlug_Settings settings; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
115 static Sound_AudioInfo current_audioinfo; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
116 static unsigned int total_mods_decoding = 0; |
395
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
117 static SDL_mutex *modplug_mutex = NULL; |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
118 |
208 | 119 static int MODPLUG_init(void) |
120 { | |
395
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
121 assert(modplug_mutex == NULL); |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
122 |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
123 /* |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
124 * The settings will require some experimenting. I've borrowed some |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
125 * of them from the XMMS ModPlug plugin. |
208 | 126 */ |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
127 settings.mFlags = MODPLUG_ENABLE_OVERSAMPLING; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
128 |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
129 #ifndef _WIN32_WCE |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
130 settings.mFlags |= MODPLUG_ENABLE_NOISE_REDUCTION | |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
131 MODPLUG_ENABLE_REVERB | |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
132 MODPLUG_ENABLE_MEGABASS | |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
133 MODPLUG_ENABLE_SURROUND; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
134 |
208 | 135 settings.mReverbDepth = 30; |
136 settings.mReverbDelay = 100; | |
137 settings.mBassAmount = 40; | |
138 settings.mBassRange = 30; | |
139 settings.mSurroundDepth = 20; | |
140 settings.mSurroundDelay = 20; | |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
141 #endif |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
142 |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
143 settings.mChannels = 2; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
144 settings.mBits = 16; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
145 settings.mFrequency = 44100; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
146 settings.mResamplingMode = MODPLUG_RESAMPLE_FIR; |
208 | 147 settings.mLoopCount = 0; |
148 | |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
149 current_audioinfo.channels = 2; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
150 current_audioinfo.rate = 44100; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
151 current_audioinfo.format = AUDIO_S16SYS; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
152 total_mods_decoding = 0; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
153 |
395
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
154 modplug_mutex = SDL_CreateMutex(); |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
155 |
208 | 156 ModPlug_SetSettings(&settings); |
157 return(1); /* success. */ | |
158 } /* MODPLUG_init */ | |
159 | |
160 | |
161 static void MODPLUG_quit(void) | |
162 { | |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
163 assert(total_mods_decoding == 0); |
395
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
164 |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
165 if (modplug_mutex != NULL) |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
166 { |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
167 SDL_DestroyMutex(modplug_mutex); |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
168 modplug_mutex = NULL; |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
169 } /* if */ |
208 | 170 } /* MODPLUG_quit */ |
171 | |
172 | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
173 /* |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
174 * Most MOD files I've seen have tended to be a few hundred KB, even if some |
208 | 175 * of them were much smaller than that. |
176 */ | |
177 #define CHUNK_SIZE 65536 | |
178 | |
179 static int MODPLUG_open(Sound_Sample *sample, const char *ext) | |
180 { | |
181 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; | |
182 ModPlugFile *module; | |
183 Uint8 *data; | |
184 size_t size; | |
185 Uint32 retval; | |
211
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
186 int has_extension = 0; |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
187 int i; |
208 | 188 |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
189 /* |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
190 * Apparently ModPlug's loaders are too forgiving. They gladly accept |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
191 * streams that they shouldn't. For now, rely on file extension instead. |
211
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
192 */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
193 for (i = 0; extensions_modplug[i] != NULL; i++) |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
194 { |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
195 if (__Sound_strcasecmp(ext, extensions_modplug[i]) == 0) |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
196 { |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
197 has_extension = 1; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
198 break; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
199 } /* if */ |
211
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
200 } /* for */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
201 |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
202 if (!has_extension) |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
203 { |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
204 SNDDBG(("MODPLUG: Unrecognized file type: %s\n", ext)); |
387
fb519e6028e3
Changed all the Sound_SetError() calls to __Sound_SetError (or BAIL*_MACRO)
Ryan C. Gordon <icculus@icculus.org>
parents:
376
diff
changeset
|
205 BAIL_MACRO("MODPLUG: Not a module file.", 0); |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
206 } /* if */ |
211
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
207 |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
208 /* |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
209 * ModPlug needs the entire stream in one big chunk. I don't like it, |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
210 * but I don't think there's any way around it. |
208 | 211 */ |
212 data = (Uint8 *) malloc(CHUNK_SIZE); | |
213 BAIL_IF_MACRO(data == NULL, ERR_OUT_OF_MEMORY, 0); | |
214 size = 0; | |
215 | |
216 do | |
217 { | |
218 retval = SDL_RWread(internal->rw, &data[size], 1, CHUNK_SIZE); | |
219 size += retval; | |
220 if (retval == CHUNK_SIZE) | |
221 { | |
222 data = (Uint8 *) realloc(data, size + CHUNK_SIZE); | |
223 BAIL_IF_MACRO(data == NULL, ERR_OUT_OF_MEMORY, 0); | |
224 } /* if */ | |
225 } while (retval > 0); | |
226 | |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
227 /* |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
228 * It's only safe to change these settings when there're |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
229 * no other mods being decoded... |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
230 */ |
395
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
231 if (modplug_mutex != NULL) |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
232 SDL_LockMutex(modplug_mutex); |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
233 |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
234 if (total_mods_decoding > 0) |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
235 { |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
236 /* other mods decoding: use the same settings they are. */ |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
237 memcpy(&sample->actual, ¤t_audioinfo, sizeof (Sound_AudioInfo)); |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
238 } /* if */ |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
239 else |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
240 { |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
241 /* no other mods decoding: define the new ModPlug output settings. */ |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
242 memcpy(&sample->actual, &sample->desired, sizeof (Sound_AudioInfo)); |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
243 if (sample->actual.rate == 0) |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
244 sample->actual.rate = 44100; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
245 if (sample->actual.channels == 0) |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
246 sample->actual.channels = 2; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
247 if (sample->actual.format == 0) |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
248 sample->actual.format = AUDIO_S16SYS; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
249 |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
250 memcpy(¤t_audioinfo, &sample->actual, sizeof (Sound_AudioInfo)); |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
251 settings.mChannels=sample->actual.channels; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
252 settings.mFrequency=sample->actual.rate; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
253 settings.mBits = sample->actual.format & 0xFF; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
254 ModPlug_SetSettings(&settings); |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
255 } /* else */ |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
256 |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
257 /* |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
258 * The buffer may be a bit too large, but that doesn't matter. I think |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
259 * it's safe to free it as soon as ModPlug_Load() is finished anyway. |
208 | 260 */ |
261 module = ModPlug_Load((void *) data, size); | |
262 free(data); | |
395
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
263 if (module == NULL) |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
264 { |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
265 if (modplug_mutex != NULL) |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
266 SDL_UnlockMutex(modplug_mutex); |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
267 |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
268 BAIL_MACRO("MODPLUG: Not a module file.", 0); |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
269 } /* if */ |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
270 |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
271 total_mods_decoding++; |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
272 |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
273 if (modplug_mutex != NULL) |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
274 SDL_UnlockMutex(modplug_mutex); |
208 | 275 |
477
3e705c9180e5
Fixed binary compatibility, added Sound_GetDuration().
Ryan C. Gordon <icculus@icculus.org>
parents:
474
diff
changeset
|
276 internal->total_time = ModPlug_GetLength(module); |
208 | 277 SNDDBG(("MODPLUG: [%d ms] %s\n", |
278 ModPlug_GetLength(module), ModPlug_GetName(module))); | |
279 | |
280 internal->decoder_private = (void *) module; | |
312 | 281 sample->flags = SOUND_SAMPLEFLAG_CANSEEK; |
208 | 282 |
283 SNDDBG(("MODPLUG: Accepting data stream\n")); | |
284 return(1); /* we'll handle this data. */ | |
285 } /* MODPLUG_open */ | |
286 | |
287 | |
288 static void MODPLUG_close(Sound_Sample *sample) | |
289 { | |
290 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; | |
291 ModPlugFile *module = (ModPlugFile *) internal->decoder_private; | |
395
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
292 |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
293 if (modplug_mutex != NULL) |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
294 SDL_LockMutex(modplug_mutex); |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
295 |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
296 total_mods_decoding--; |
208 | 297 |
395
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
298 if (modplug_mutex != NULL) |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
299 SDL_UnlockMutex(modplug_mutex); |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
300 |
208 | 301 ModPlug_Unload(module); |
302 } /* MODPLUG_close */ | |
303 | |
304 | |
305 static Uint32 MODPLUG_read(Sound_Sample *sample) | |
306 { | |
307 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; | |
308 ModPlugFile *module = (ModPlugFile *) internal->decoder_private; | |
309 int retval; | |
310 | |
311 retval = ModPlug_Read(module, internal->buffer, internal->buffer_size); | |
312 if (retval == 0) | |
313 sample->flags |= SOUND_SAMPLEFLAG_EOF; | |
314 return(retval); | |
315 } /* MODPLUG_read */ | |
316 | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
317 |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
318 static int MODPLUG_rewind(Sound_Sample *sample) |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
319 { |
231
d3dc34315ac7
Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
320 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
d3dc34315ac7
Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
321 ModPlugFile *module = (ModPlugFile *) internal->decoder_private; |
d3dc34315ac7
Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
322 |
d3dc34315ac7
Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
323 ModPlug_Seek(module, 0); |
d3dc34315ac7
Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
324 return(1); |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
325 } /* MODPLUG_rewind */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
326 |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
231
diff
changeset
|
327 |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
231
diff
changeset
|
328 static int MODPLUG_seek(Sound_Sample *sample, Uint32 ms) |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
231
diff
changeset
|
329 { |
312 | 330 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
331 ModPlugFile *module = (ModPlugFile *) internal->decoder_private; | |
332 | |
333 /* Assume that this will work. */ | |
334 ModPlug_Seek(module, ms); | |
335 return(1); | |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
231
diff
changeset
|
336 } /* MODPLUG_seek */ |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
231
diff
changeset
|
337 |
208 | 338 #endif /* SOUND_SUPPORTS_MODPLUG */ |
339 | |
340 | |
341 /* end of modplug.c ... */ |