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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
1 /*
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
2 * SDL_sound -- An abstract sound format decoding API.
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
3 * Copyright (C) 2001 Ryan C. Gordon.
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
4 *
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
8 * version 2.1 of the License, or (at your option) any later version.
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
9 *
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
13 * Lesser General Public License for more details.
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
14 *
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
18 */
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
19
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
20 /*
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
21 * Module player for SDL_sound. This driver handles anything that ModPlug does.
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
29 * Please see the file COPYING in the source's root directory.
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
30 *
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
31 * This file written by Torbjörn Andersson (d91tan@Update.UU.SE)
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
32 */
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
33
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
34 #if HAVE_CONFIG_H
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
35 # include <config.h>
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
36 #endif
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
37
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
38 #ifdef SOUND_SUPPORTS_MODPLUG
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
39
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
40 #include <stdio.h>
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
41 #include <stdlib.h>
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
42 #include <string.h>
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
43
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
44 #include "SDL_sound.h"
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
45
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
46 #define __SDL_SOUND_INTERNAL__
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
47 #include "SDL_sound_internal.h"
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
48
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
49 #include "modplug.h"
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
50
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
51
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
52 static int MODPLUG_init(void);
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
53 static void MODPLUG_quit(void);
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
54 static int MODPLUG_open(Sound_Sample *sample, const char *ext);
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
55 static void MODPLUG_close(Sound_Sample *sample);
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
59
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
60 static const char *extensions_modplug[] =
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
89 NULL
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
90 };
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
91
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
92 const Sound_DecoderFunctions __Sound_DecoderFunctions_MODPLUG =
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
93 {
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
94 {
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
95 extensions_modplug,
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
96 "Play modules through ModPlug",
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
97 "Torbjörn Andersson <d91tan@Update.UU.SE>",
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
98 "http://modplug-xmms.sourceforge.net/"
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
99 },
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
108 };
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
109
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
116 static int MODPLUG_init(void)
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
132 settings.mReverbDepth = 30;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
133 settings.mReverbDelay = 100;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
134 settings.mBassAmount = 40;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
135 settings.mBassRange = 30;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
136 settings.mSurroundDepth = 20;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
144 settings.mLoopCount = 0;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
153 ModPlug_SetSettings(&settings);
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
154 return(1); /* success. */
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
155 } /* MODPLUG_init */
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
156
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
157
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
158 static void MODPLUG_quit(void)
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
167 } /* MODPLUG_quit */
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
168
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
172 * of them were much smaller than that.
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
173 */
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
174 #define CHUNK_SIZE 65536
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
175
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
176 static int MODPLUG_open(Sound_Sample *sample, const char *ext)
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
177 {
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
178 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
179 ModPlugFile *module;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
180 Uint8 *data;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
181 size_t size;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
208 */
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
209 data = (Uint8 *) malloc(CHUNK_SIZE);
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
210 BAIL_IF_MACRO(data == NULL, ERR_OUT_OF_MEMORY, 0);
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
211 size = 0;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
212
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
213 do
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
214 {
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
215 retval = SDL_RWread(internal->rw, &data[size], 1, CHUNK_SIZE);
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
216 size += retval;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
217 if (retval == CHUNK_SIZE)
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
218 {
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
219 data = (Uint8 *) realloc(data, size + CHUNK_SIZE);
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
220 BAIL_IF_MACRO(data == NULL, ERR_OUT_OF_MEMORY, 0);
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
221 } /* if */
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
222 } while (retval > 0);
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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, &current_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(&current_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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
257 */
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
258 module = ModPlug_Load((void *) data, size);
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
274 SNDDBG(("MODPLUG: [%d ms] %s\n",
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
275 ModPlug_GetLength(module), ModPlug_GetName(module)));
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
276
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
277 internal->decoder_private = (void *) module;
312
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
278 sample->flags = SOUND_SAMPLEFLAG_CANSEEK;
208
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
279
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
280 SNDDBG(("MODPLUG: Accepting data stream\n"));
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
281 return(1); /* we'll handle this data. */
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
282 } /* MODPLUG_open */
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
283
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
284
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
285 static void MODPLUG_close(Sound_Sample *sample)
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
286 {
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
287 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
298 ModPlug_Unload(module);
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
299 } /* MODPLUG_close */
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
300
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
301
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
302 static Uint32 MODPLUG_read(Sound_Sample *sample)
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
303 {
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
304 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
305 ModPlugFile *module = (ModPlugFile *) internal->decoder_private;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
306 int retval;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
307
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
308 retval = ModPlug_Read(module, internal->buffer, internal->buffer_size);
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
309 if (retval == 0)
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
310 sample->flags |= SOUND_SAMPLEFLAG_EOF;
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
311 return(retval);
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
312 } /* MODPLUG_read */
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
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
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
327 Sound_SampleInternal *internal = (Sound_SampleInternal *) sample->opaque;
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
328 ModPlugFile *module = (ModPlugFile *) internal->decoder_private;
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
329
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
330 /* Assume that this will work. */
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
331 ModPlug_Seek(module, ms);
498240aa76f1 Seek implementations.
Ryan C. Gordon <icculus@icculus.org>
parents: 306
diff changeset
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
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
335 #endif /* SOUND_SUPPORTS_MODPLUG */
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
336
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
337
32376317eedb Initial adds.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
338 /* end of modplug.c ... */