Mercurial > SDL_sound_CoreAudio
annotate decoders/modplug.c @ 474:c66080364dff
Most decoders now report total sample play time, now. Technically, this
breaks binary compatibility with the 1.0 branch, since it extends the
Sound_Sample struct, but most (all?) programs are just passing pointers
allocated by SDL_sound around, and might be okay.
Source-level compatibility is not broken...yet! :)
--ryan.
-------- Original Message --------
Subject: SDL_sound patch: Finding total length of time of sound file.
Date: Sun, 26 Jan 2003 09:31:17 -0800 (PST)
Hi Ryan,
I am working with Eric Wing and helping him modify
SDL_sound. AS part of our efforts in improving and
enhancing SDL_sound, we like to submit this patch. We
modified the codecs to find the total time of a sound
file. Below is the explanation of the patch. The
patch is appended as an attachment to this email.
* MOTIVATION:
We needed the ability to get the total play time of a
sample (And we noticed that we're not the only ones).
Since SDL_sound blocks direct access to the specific
decoders, there is no way for a user to know this
information short of decoding the whole thing.
Because of this, we believe this will be a useful
addition, even though the accuracy may not be perfect
(subject to each decoder) or the information may not
always be available.
* CONTRIBUTORS:
Wesley Leong (modified the majority of the codecs and
verified the results)
Eric Wing (showed everyone how to do modify codec,
modified mikmod)
Wang Lam (modified a handful of codecs, researched
into specs and int overflow)
Ahilan Anantha (modified a few codecs and helped with
integer math)
* GENERAL ISSUES:
We chose the value to be milliseconds as an Sint32.
Milliseconds because that's what Sound_Seek takes as a
parameter and -1 to allow for instances/codecs where
the value could not be determined. We are
not sure if this is the final convention you want, so
we are willing to work with you on this.
We also expect the total_time field to be set on open
and never again modified by SDL_sound. Users may
access it directly much like the sample buffer and
buffer_size. We thought about recomputing the time
on DecodeAll, but since users may seek or decode small
chunks first, not all the data may be there. So this
is better done by the user. This may be good
information to document.
Currently, all the main codecs are implemented except
for QuickTime.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Sat, 08 May 2004 08:19:50 +0000 |
parents | 53ce18591f5d |
children | 3e705c9180e5 |
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 * |
208 | 29 * Please see the file COPYING in the source's root directory. |
30 * | |
31 * This file written by Torbjörn Andersson (d91tan@Update.UU.SE) | |
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 | |
49 #include "modplug.h" | |
50 | |
51 | |
52 static int MODPLUG_init(void); | |
53 static void MODPLUG_quit(void); | |
54 static int MODPLUG_open(Sound_Sample *sample, const char *ext); | |
55 static void MODPLUG_close(Sound_Sample *sample); | |
56 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
|
57 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
|
58 static int MODPLUG_seek(Sound_Sample *sample, Uint32 ms); |
208 | 59 |
60 static const char *extensions_modplug[] = | |
61 { | |
211
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
62 /* 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
|
63 * 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
|
64 */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
65 "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
|
66 "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
|
67 "AMS", /* AMS module */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
68 "DBM", /* DigiBooster Pro Module */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
69 "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
|
70 "DSM", /* DSIK Internal Format module */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
71 "FAR", /* Farandole module */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
72 "IT", /* Impulse Tracker IT file */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
73 "MDL", /* DigiTracker module */ |
208 | 74 #if 0 |
211
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
75 "J2B", /* Not implemented? What is it anyway? */ |
208 | 76 #endif |
211
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
77 "MED", /* OctaMed MED file */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
78 "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
|
79 "MT2", /* MadTracker 2.0 */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
80 "MTM", /* MTM file */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
81 "OKT", /* Oktalyzer module */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
82 "PTM", /* PTM PolyTracker module */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
83 "PSM", /* PSM module */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
84 "S3M", /* ScreamTracker file */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
85 "STM", /* ST 2.xx */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
86 "ULT", |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
87 "UMX", |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
88 "XM", /* FastTracker II */ |
208 | 89 NULL |
90 }; | |
91 | |
92 const Sound_DecoderFunctions __Sound_DecoderFunctions_MODPLUG = | |
93 { | |
94 { | |
95 extensions_modplug, | |
96 "Play modules through ModPlug", | |
97 "Torbjörn Andersson <d91tan@Update.UU.SE>", | |
98 "http://modplug-xmms.sourceforge.net/" | |
99 }, | |
100 | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
101 MODPLUG_init, /* init() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
102 MODPLUG_quit, /* quit() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
103 MODPLUG_open, /* open() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
104 MODPLUG_close, /* close() method */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
105 MODPLUG_read, /* read() method */ |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
231
diff
changeset
|
106 MODPLUG_rewind, /* rewind() method */ |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
231
diff
changeset
|
107 MODPLUG_seek /* seek() method */ |
208 | 108 }; |
109 | |
110 | |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
111 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
|
112 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
|
113 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
|
114 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
|
115 |
208 | 116 static int MODPLUG_init(void) |
117 { | |
395
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
118 assert(modplug_mutex == NULL); |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
119 |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
120 /* |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
121 * 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
|
122 * of them from the XMMS ModPlug plugin. |
208 | 123 */ |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
124 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
|
125 |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
126 #ifndef _WIN32_WCE |
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_NOISE_REDUCTION | |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
128 MODPLUG_ENABLE_REVERB | |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
129 MODPLUG_ENABLE_MEGABASS | |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
130 MODPLUG_ENABLE_SURROUND; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
131 |
208 | 132 settings.mReverbDepth = 30; |
133 settings.mReverbDelay = 100; | |
134 settings.mBassAmount = 40; | |
135 settings.mBassRange = 30; | |
136 settings.mSurroundDepth = 20; | |
137 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
|
138 #endif |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
139 |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
140 settings.mChannels = 2; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
141 settings.mBits = 16; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
142 settings.mFrequency = 44100; |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
143 settings.mResamplingMode = MODPLUG_RESAMPLE_FIR; |
208 | 144 settings.mLoopCount = 0; |
145 | |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
146 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
|
147 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
|
148 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
|
149 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
|
150 |
395
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
151 modplug_mutex = SDL_CreateMutex(); |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
152 |
208 | 153 ModPlug_SetSettings(&settings); |
154 return(1); /* success. */ | |
155 } /* MODPLUG_init */ | |
156 | |
157 | |
158 static void MODPLUG_quit(void) | |
159 { | |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
160 assert(total_mods_decoding == 0); |
395
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
161 |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
162 if (modplug_mutex != NULL) |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
163 { |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
164 SDL_DestroyMutex(modplug_mutex); |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
165 modplug_mutex = NULL; |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
166 } /* if */ |
208 | 167 } /* MODPLUG_quit */ |
168 | |
169 | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
170 /* |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
171 * Most MOD files I've seen have tended to be a few hundred KB, even if some |
208 | 172 * of them were much smaller than that. |
173 */ | |
174 #define CHUNK_SIZE 65536 | |
175 | |
176 static int MODPLUG_open(Sound_Sample *sample, const char *ext) | |
177 { | |
178 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; | |
179 ModPlugFile *module; | |
180 Uint8 *data; | |
181 size_t size; | |
182 Uint32 retval; | |
211
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
183 int has_extension = 0; |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
184 int i; |
208 | 185 |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
186 /* |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
187 * 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
|
188 * 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
|
189 */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
190 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
|
191 { |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
192 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
|
193 { |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
194 has_extension = 1; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
195 break; |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
196 } /* if */ |
211
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
197 } /* for */ |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
198 |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
199 if (!has_extension) |
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
200 { |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
201 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
|
202 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
|
203 } /* if */ |
211
b35c04e4691e
Patched to select streams to handle more carefully.
Ryan C. Gordon <icculus@icculus.org>
parents:
208
diff
changeset
|
204 |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
205 /* |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
206 * 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
|
207 * but I don't think there's any way around it. |
208 | 208 */ |
209 data = (Uint8 *) malloc(CHUNK_SIZE); | |
210 BAIL_IF_MACRO(data == NULL, ERR_OUT_OF_MEMORY, 0); | |
211 size = 0; | |
212 | |
213 do | |
214 { | |
215 retval = SDL_RWread(internal->rw, &data[size], 1, CHUNK_SIZE); | |
216 size += retval; | |
217 if (retval == CHUNK_SIZE) | |
218 { | |
219 data = (Uint8 *) realloc(data, size + CHUNK_SIZE); | |
220 BAIL_IF_MACRO(data == NULL, ERR_OUT_OF_MEMORY, 0); | |
221 } /* if */ | |
222 } while (retval > 0); | |
223 | |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
224 /* |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
225 * 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
|
226 * 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
|
227 */ |
395
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
228 if (modplug_mutex != NULL) |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
229 SDL_LockMutex(modplug_mutex); |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
230 |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
231 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
|
232 { |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
233 /* 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
|
234 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
|
235 } /* if */ |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
236 else |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
237 { |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
238 /* 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
|
239 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
|
240 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
|
241 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
|
242 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
|
243 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
|
244 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
|
245 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
|
246 |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
247 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
|
248 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
|
249 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
|
250 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
|
251 ModPlug_SetSettings(&settings); |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
252 } /* else */ |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
253 |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
254 /* |
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
255 * 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
|
256 * it's safe to free it as soon as ModPlug_Load() is finished anyway. |
208 | 257 */ |
258 module = ModPlug_Load((void *) data, size); | |
259 free(data); | |
395
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
260 if (module == NULL) |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
261 { |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
262 if (modplug_mutex != NULL) |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
263 SDL_UnlockMutex(modplug_mutex); |
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 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
|
266 } /* if */ |
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 total_mods_decoding++; |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
269 |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
270 if (modplug_mutex != NULL) |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
271 SDL_UnlockMutex(modplug_mutex); |
208 | 272 |
474
c66080364dff
Most decoders now report total sample play time, now. Technically, this
Ryan C. Gordon <icculus@icculus.org>
parents:
395
diff
changeset
|
273 sample->total_time = ModPlug_GetLength(module); |
208 | 274 SNDDBG(("MODPLUG: [%d ms] %s\n", |
275 ModPlug_GetLength(module), ModPlug_GetName(module))); | |
276 | |
277 internal->decoder_private = (void *) module; | |
312 | 278 sample->flags = SOUND_SAMPLEFLAG_CANSEEK; |
208 | 279 |
280 SNDDBG(("MODPLUG: Accepting data stream\n")); | |
281 return(1); /* we'll handle this data. */ | |
282 } /* MODPLUG_open */ | |
283 | |
284 | |
285 static void MODPLUG_close(Sound_Sample *sample) | |
286 { | |
287 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; | |
288 ModPlugFile *module = (ModPlugFile *) internal->decoder_private; | |
395
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
289 |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
290 if (modplug_mutex != NULL) |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
291 SDL_LockMutex(modplug_mutex); |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
292 |
376
51883cd1193e
WinCE (PocketPC) stuff from Tyler, ModPlug settings maintanance by me.
Ryan C. Gordon <icculus@icculus.org>
parents:
349
diff
changeset
|
293 total_mods_decoding--; |
208 | 294 |
395
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
295 if (modplug_mutex != NULL) |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
296 SDL_UnlockMutex(modplug_mutex); |
53ce18591f5d
Mutex'd a potential race condition.
Ryan C. Gordon <icculus@icculus.org>
parents:
387
diff
changeset
|
297 |
208 | 298 ModPlug_Unload(module); |
299 } /* MODPLUG_close */ | |
300 | |
301 | |
302 static Uint32 MODPLUG_read(Sound_Sample *sample) | |
303 { | |
304 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; | |
305 ModPlugFile *module = (ModPlugFile *) internal->decoder_private; | |
306 int retval; | |
307 | |
308 retval = ModPlug_Read(module, internal->buffer, internal->buffer_size); | |
309 if (retval == 0) | |
310 sample->flags |= SOUND_SAMPLEFLAG_EOF; | |
311 return(retval); | |
312 } /* MODPLUG_read */ | |
313 | |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
314 |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
315 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
|
316 { |
231
d3dc34315ac7
Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
317 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
d3dc34315ac7
Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
318 ModPlugFile *module = (ModPlugFile *) internal->decoder_private; |
d3dc34315ac7
Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
319 |
d3dc34315ac7
Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
320 ModPlug_Seek(module, 0); |
d3dc34315ac7
Rewind method implemented by Torbj�rn.
Ryan C. Gordon <icculus@icculus.org>
parents:
221
diff
changeset
|
321 return(1); |
221
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
322 } /* MODPLUG_rewind */ |
c9772a9f5271
Initial implementation or stubs for rewind method. Other cleanups.
Ryan C. Gordon <icculus@icculus.org>
parents:
211
diff
changeset
|
323 |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
231
diff
changeset
|
324 |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
231
diff
changeset
|
325 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
|
326 { |
312 | 327 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque; |
328 ModPlugFile *module = (ModPlugFile *) internal->decoder_private; | |
329 | |
330 /* Assume that this will work. */ | |
331 ModPlug_Seek(module, ms); | |
332 return(1); | |
306
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
231
diff
changeset
|
333 } /* MODPLUG_seek */ |
c97be6e1bd27
Added framework for Sound_Seek() support.
Ryan C. Gordon <icculus@icculus.org>
parents:
231
diff
changeset
|
334 |
208 | 335 #endif /* SOUND_SUPPORTS_MODPLUG */ |
336 | |
337 | |
338 /* end of modplug.c ... */ |