gosu 1.1.1.1 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/dependencies/SDL/include/SDL.h +108 -14
- data/dependencies/SDL/include/SDL_assert.h +81 -50
- data/dependencies/SDL/include/SDL_atomic.h +135 -35
- data/dependencies/SDL/include/SDL_audio.h +960 -355
- data/dependencies/SDL/include/SDL_bits.h +11 -6
- data/dependencies/SDL/include/SDL_blendmode.h +91 -14
- data/dependencies/SDL/include/SDL_clipboard.h +30 -7
- data/dependencies/SDL/include/SDL_config.h +277 -27
- data/dependencies/SDL/include/SDL_config_android.h +13 -38
- data/dependencies/SDL/include/SDL_config_iphoneos.h +21 -62
- data/dependencies/SDL/include/SDL_config_macosx.h +23 -92
- data/dependencies/SDL/include/SDL_config_minimal.h +1 -4
- data/dependencies/SDL/include/SDL_config_pandora.h +15 -22
- data/dependencies/SDL/include/SDL_config_psp.h +16 -37
- data/dependencies/SDL/include/SDL_config_windows.h +28 -91
- data/dependencies/SDL/include/SDL_config_winrt.h +33 -61
- data/dependencies/SDL/include/SDL_config_wiz.h +28 -56
- data/dependencies/SDL/include/SDL_copying.h +1 -1
- data/dependencies/SDL/include/SDL_cpuinfo.h +331 -71
- data/dependencies/SDL/include/SDL_egl.h +906 -280
- data/dependencies/SDL/include/SDL_endian.h +101 -47
- data/dependencies/SDL/include/SDL_error.h +70 -19
- data/dependencies/SDL/include/SDL_events.h +387 -79
- data/dependencies/SDL/include/SDL_filesystem.h +73 -64
- data/dependencies/SDL/include/SDL_gamecontroller.h +585 -125
- data/dependencies/SDL/include/SDL_gesture.h +36 -6
- data/dependencies/SDL/include/SDL_haptic.h +304 -210
- data/dependencies/SDL/include/SDL_hidapi.h +451 -0
- data/dependencies/SDL/include/SDL_hints.h +1286 -897
- data/dependencies/SDL/include/SDL_joystick.h +577 -130
- data/dependencies/SDL/include/SDL_keyboard.h +162 -63
- data/dependencies/SDL/include/SDL_keycode.h +7 -5
- data/dependencies/SDL/include/SDL_loadso.h +42 -8
- data/dependencies/SDL/include/SDL_locale.h +34 -32
- data/dependencies/SDL/include/SDL_log.h +212 -19
- data/dependencies/SDL/include/SDL_main.h +72 -17
- data/dependencies/SDL/include/SDL_messagebox.h +70 -23
- data/dependencies/SDL/include/SDL_metal.h +27 -32
- data/dependencies/SDL/include/SDL_misc.h +19 -15
- data/dependencies/SDL/include/SDL_mouse.h +262 -110
- data/dependencies/SDL/include/SDL_mutex.h +286 -66
- data/dependencies/SDL/include/SDL_name.h +1 -1
- data/dependencies/SDL/include/SDL_opengl.h +1 -1
- data/dependencies/SDL/include/SDL_opengles.h +1 -1
- data/dependencies/SDL/include/SDL_opengles2.h +2 -2
- data/dependencies/SDL/include/SDL_pixels.h +199 -34
- data/dependencies/SDL/include/SDL_platform.h +39 -2
- data/dependencies/SDL/include/SDL_power.h +23 -10
- data/dependencies/SDL/include/SDL_quit.h +1 -1
- data/dependencies/SDL/include/SDL_rect.h +78 -28
- data/dependencies/SDL/include/SDL_render.h +1204 -472
- data/dependencies/SDL/include/SDL_revision.h +2 -2
- data/dependencies/SDL/include/SDL_rwops.h +605 -33
- data/dependencies/SDL/include/SDL_scancode.h +1 -1
- data/dependencies/SDL/include/SDL_sensor.h +76 -42
- data/dependencies/SDL/include/SDL_shape.h +38 -27
- data/dependencies/SDL/include/SDL_stdinc.h +96 -24
- data/dependencies/SDL/include/SDL_surface.h +571 -139
- data/dependencies/SDL/include/SDL_system.h +339 -101
- data/dependencies/SDL/include/SDL_syswm.h +50 -20
- data/dependencies/SDL/include/SDL_test.h +1 -1
- data/dependencies/SDL/include/SDL_test_assert.h +2 -2
- data/dependencies/SDL/include/SDL_test_common.h +23 -6
- data/dependencies/SDL/include/SDL_test_compare.h +1 -1
- data/dependencies/SDL/include/SDL_test_crc32.h +1 -1
- data/dependencies/SDL/include/SDL_test_font.h +3 -3
- data/dependencies/SDL/include/SDL_test_fuzzer.h +28 -26
- data/dependencies/SDL/include/SDL_test_harness.h +6 -6
- data/dependencies/SDL/include/SDL_test_images.h +1 -1
- data/dependencies/SDL/include/SDL_test_log.h +1 -1
- data/dependencies/SDL/include/SDL_test_md5.h +1 -1
- data/dependencies/SDL/include/SDL_test_memory.h +1 -1
- data/dependencies/SDL/include/SDL_test_random.h +2 -2
- data/dependencies/SDL/include/SDL_thread.h +226 -128
- data/dependencies/SDL/include/SDL_timer.h +129 -22
- data/dependencies/SDL/include/SDL_touch.h +48 -8
- data/dependencies/SDL/include/SDL_types.h +1 -1
- data/dependencies/SDL/include/SDL_version.h +72 -46
- data/dependencies/SDL/include/SDL_video.h +1266 -460
- data/dependencies/SDL/include/SDL_vulkan.h +100 -161
- data/dependencies/SDL/include/begin_code.h +22 -1
- data/dependencies/SDL/include/close_code.h +1 -1
- data/dependencies/SDL/lib/x64/libSDL2.dll.a +0 -0
- data/dependencies/SDL/lib/x86/libSDL2.dll.a +0 -0
- data/dependencies/SDL_sound/SDL_sound.c +83 -7
- data/dependencies/SDL_sound/SDL_sound.h +4 -4
- data/dependencies/SDL_sound/SDL_sound_aiff.c +9 -12
- data/dependencies/SDL_sound/SDL_sound_au.c +7 -7
- data/dependencies/SDL_sound/SDL_sound_coreaudio.c +3 -3
- data/dependencies/SDL_sound/SDL_sound_flac.c +1 -1
- data/dependencies/SDL_sound/SDL_sound_internal.h +17 -10
- data/dependencies/SDL_sound/SDL_sound_modplug.c +25 -27
- data/dependencies/SDL_sound/SDL_sound_mp3.c +5 -17
- data/dependencies/SDL_sound/SDL_sound_raw.c +11 -11
- data/dependencies/SDL_sound/SDL_sound_shn.c +8 -7
- data/dependencies/SDL_sound/SDL_sound_voc.c +6 -4
- data/dependencies/SDL_sound/SDL_sound_vorbis.c +6 -11
- data/dependencies/SDL_sound/SDL_sound_wav.c +35 -29
- data/dependencies/SDL_sound/dr_flac.h +618 -220
- data/dependencies/SDL_sound/dr_mp3.h +263 -94
- data/dependencies/SDL_sound/libmodplug/fastmix.c +58 -64
- data/dependencies/SDL_sound/libmodplug/libmodplug.h +25 -103
- data/dependencies/SDL_sound/libmodplug/load_669.c +14 -17
- data/dependencies/SDL_sound/libmodplug/load_amf.c +11 -7
- data/dependencies/SDL_sound/libmodplug/load_ams.c +65 -22
- data/dependencies/SDL_sound/libmodplug/load_dbm.c +8 -4
- data/dependencies/SDL_sound/libmodplug/load_dmf.c +55 -25
- data/dependencies/SDL_sound/libmodplug/load_far.c +9 -13
- data/dependencies/SDL_sound/libmodplug/load_gdm.c +448 -0
- data/dependencies/SDL_sound/libmodplug/load_it.c +45 -49
- data/dependencies/SDL_sound/libmodplug/load_mdl.c +80 -53
- data/dependencies/SDL_sound/libmodplug/load_med.c +20 -12
- data/dependencies/SDL_sound/libmodplug/load_mod.c +40 -15
- data/dependencies/SDL_sound/libmodplug/load_mt2.c +29 -17
- data/dependencies/SDL_sound/libmodplug/load_okt.c +12 -8
- data/dependencies/SDL_sound/libmodplug/load_psm.c +101 -78
- data/dependencies/SDL_sound/libmodplug/load_ptm.c +18 -17
- data/dependencies/SDL_sound/libmodplug/load_s3m.c +9 -7
- data/dependencies/SDL_sound/libmodplug/load_stm.c +3 -2
- data/dependencies/SDL_sound/libmodplug/load_ult.c +2 -2
- data/dependencies/SDL_sound/libmodplug/load_umx.c +315 -35
- data/dependencies/SDL_sound/libmodplug/load_xm.c +25 -21
- data/dependencies/SDL_sound/libmodplug/mmcmp.c +295 -149
- data/dependencies/SDL_sound/libmodplug/modplug.c +7 -123
- data/dependencies/SDL_sound/libmodplug/modplug.h +32 -29
- data/dependencies/SDL_sound/libmodplug/snd_dsp.c +0 -1
- data/dependencies/SDL_sound/libmodplug/snd_flt.c +2 -2
- data/dependencies/SDL_sound/libmodplug/snd_fx.c +24 -18
- data/dependencies/SDL_sound/libmodplug/sndfile.c +55 -156
- data/dependencies/SDL_sound/libmodplug/sndmix.c +7 -12
- data/dependencies/SDL_sound/libmodplug/tables.h +10 -15
- data/dependencies/SDL_sound/stb_vorbis.h +508 -325
- data/dependencies/{al_soft → mojoAL}/AL/al.h +38 -30
- data/dependencies/{al_soft → mojoAL}/AL/alc.h +27 -56
- data/dependencies/mojoAL/mojoal.c +4594 -0
- data/ext/gosu/extconf.rb +29 -30
- data/include/Gosu/Audio.hpp +70 -85
- data/include/Gosu/Color.hpp +63 -107
- data/include/Gosu/Font.hpp +44 -48
- data/include/Gosu/Fwd.hpp +1 -1
- data/include/Gosu/Graphics.hpp +64 -75
- data/include/Gosu/GraphicsBase.hpp +32 -39
- data/include/Gosu/Image.hpp +56 -62
- data/include/Gosu/ImageData.hpp +23 -27
- data/include/Gosu/Inspection.hpp +1 -4
- data/include/Gosu/Math.hpp +4 -16
- data/include/Gosu/Platform.hpp +1 -51
- data/include/Gosu/Text.hpp +37 -40
- data/include/Gosu/TextInput.hpp +34 -40
- data/include/Gosu/Utility.hpp +10 -8
- data/include/Gosu/Version.hpp +1 -1
- data/include/Gosu/Window.hpp +73 -70
- data/lib/SDL2.dll +0 -0
- data/lib/gosu/compat.rb +28 -37
- data/lib/gosu/swig_patches.rb +31 -3
- data/lib/gosu.rb +2 -2
- data/lib64/SDL2.dll +0 -0
- data/rdoc/gosu.rb +9 -1
- data/src/Audio.cpp +88 -86
- data/src/AudioFile.hpp +6 -6
- data/src/AudioFileAudioToolbox.cpp +1 -1
- data/src/AudioFileSDLSound.cpp +1 -1
- data/src/AudioImpl.hpp +5 -5
- data/src/Bitmap.cpp +13 -13
- data/src/BitmapIO.cpp +0 -20
- data/src/BlockAllocator.cpp +2 -1
- data/src/Channel.cpp +22 -20
- data/src/Color.cpp +62 -55
- data/src/EmptyImageData.hpp +16 -18
- data/src/FileUnix.cpp +1 -1
- data/src/FileWin.cpp +1 -1
- data/src/Font.cpp +52 -57
- data/src/GosuViewController.cpp +2 -0
- data/src/Graphics.cpp +135 -143
- data/src/Image.cpp +42 -42
- data/src/Input.cpp +1 -1
- data/src/InputUIKit.cpp +1 -1
- data/src/LargeImageData.cpp +120 -113
- data/src/LargeImageData.hpp +18 -16
- data/src/Log.hpp +6 -6
- data/src/Macro.cpp +35 -37
- data/src/Macro.hpp +11 -11
- data/src/Math.cpp +8 -1
- data/src/RenderState.hpp +5 -5
- data/src/Resolution.cpp +12 -7
- data/src/RubyGosu.cxx +471 -502
- data/src/RubyGosu.h +3 -2
- data/src/TexChunk.cpp +50 -41
- data/src/TexChunk.hpp +22 -22
- data/src/Text.cpp +58 -59
- data/src/TextBuilder.cpp +60 -57
- data/src/TextBuilder.hpp +20 -20
- data/src/TextInput.cpp +127 -135
- data/src/TrueTypeFont.cpp +108 -108
- data/src/TrueTypeFont.hpp +39 -38
- data/src/TrueTypeFontApple.cpp +27 -23
- data/src/TrueTypeFontUnix.cpp +21 -26
- data/src/TrueTypeFontWin.cpp +30 -30
- data/src/Utility.cpp +82 -23
- data/src/WinUtility.hpp +2 -1
- data/src/Window.cpp +103 -86
- data/src/WindowUIKit.cpp +48 -51
- metadata +8 -20
- data/dependencies/SDL/include/SDL_config_os2.h +0 -188
- data/dependencies/SDL_sound/libmodplug/load_abc.c +0 -4725
- data/dependencies/SDL_sound/libmodplug/load_mid.c +0 -1405
- data/dependencies/SDL_sound/libmodplug/load_pat.c +0 -1143
- data/dependencies/SDL_sound/libmodplug/load_pat.h +0 -25
- data/dependencies/al_soft/AL/alext.h +0 -585
- data/dependencies/al_soft/AL/efx-creative.h +0 -3
- data/dependencies/al_soft/AL/efx-presets.h +0 -402
- data/dependencies/al_soft/AL/efx.h +0 -762
- data/dependencies/al_soft/x64/libOpenAL32.dll.a +0 -0
- data/dependencies/al_soft/x86/libOpenAL32.dll.a +0 -0
- data/lib/OpenAL32.dll +0 -0
- data/lib64/OpenAL32.dll +0 -0
- data/src/UtilityApple.cpp +0 -16
- data/src/UtilityWin.cpp +0 -17
@@ -9,27 +9,14 @@
|
|
9
9
|
|
10
10
|
#include "libmodplug.h"
|
11
11
|
|
12
|
+
static const
|
12
13
|
BYTE autovibit2xm[8] =
|
13
14
|
{ 0, 3, 1, 4, 2, 0, 0, 0 };
|
14
15
|
|
15
|
-
BYTE autovibxm2it[8] =
|
16
|
-
{ 0, 2, 4, 1, 3, 0, 0, 0 };
|
17
|
-
|
18
16
|
//////////////////////////////////////////////////////////
|
19
17
|
// Impulse Tracker IT file support
|
20
18
|
|
21
|
-
|
22
|
-
extern WORD XMPeriodTable[96+8];
|
23
|
-
extern UINT XMLinearTable[768];
|
24
|
-
|
25
|
-
static inline UINT ConvertVolParam(UINT value)
|
26
|
-
//--------------------------------------------
|
27
|
-
{
|
28
|
-
return (value > 9) ? 9 : value;
|
29
|
-
}
|
30
|
-
|
31
|
-
|
32
|
-
BOOL CSoundFile_ITInstrToMPT(const void *p, INSTRUMENTHEADER *penv, UINT trkvers)
|
19
|
+
static BOOL ITInstrToMPT(const void *p, INSTRUMENTHEADER *penv, UINT trkvers)
|
33
20
|
//--------------------------------------------------------------------------------
|
34
21
|
{
|
35
22
|
if (trkvers < 0x0200)
|
@@ -155,12 +142,13 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
155
142
|
DWORD inspos[MAX_INSTRUMENTS];
|
156
143
|
DWORD smppos[MAX_SAMPLES];
|
157
144
|
DWORD patpos[MAX_PATTERNS];
|
158
|
-
BYTE chnmask[64]
|
145
|
+
BYTE chnmask[64];//, channels_used[64]
|
159
146
|
MODCOMMAND lastvalue[64];
|
147
|
+
UINT j;
|
160
148
|
|
161
149
|
if ((!lpStream) || (dwMemLength < sizeof(ITFILEHEADER))) return FALSE;
|
162
150
|
ITFILEHEADER pifh;
|
163
|
-
|
151
|
+
SDL_memcpy(&pifh, lpStream, sizeof(pifh));
|
164
152
|
|
165
153
|
pifh.id = bswapLE32(pifh.id);
|
166
154
|
pifh.reserved1 = bswapLE16(pifh.reserved1);
|
@@ -218,9 +206,8 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
218
206
|
if (inspossize > MAX_INSTRUMENTS) inspossize = MAX_INSTRUMENTS;
|
219
207
|
inspossize <<= 2;
|
220
208
|
SDL_memcpy(inspos, lpStream+dwMemPos, inspossize);
|
221
|
-
for (
|
222
|
-
|
223
|
-
inspos[j] = bswapLE32(inspos[j]);
|
209
|
+
for (j=0; j < (inspossize>>2); j++) {
|
210
|
+
inspos[j] = bswapLE32(inspos[j]);
|
224
211
|
}
|
225
212
|
dwMemPos += pifh.insnum * 4;
|
226
213
|
// Reading Samples Offsets
|
@@ -229,9 +216,8 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
229
216
|
if (smppossize > MAX_SAMPLES) smppossize = MAX_SAMPLES;
|
230
217
|
smppossize <<= 2;
|
231
218
|
SDL_memcpy(smppos, lpStream+dwMemPos, smppossize);
|
232
|
-
for (
|
233
|
-
|
234
|
-
smppos[j] = bswapLE32(smppos[j]);
|
219
|
+
for (j=0; j < (smppossize>>2); j++) {
|
220
|
+
smppos[j] = bswapLE32(smppos[j]);
|
235
221
|
}
|
236
222
|
dwMemPos += pifh.smpnum * 4;
|
237
223
|
// Reading Patterns Offsets
|
@@ -240,9 +226,8 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
240
226
|
if (patpossize > MAX_PATTERNS) patpossize = MAX_PATTERNS;
|
241
227
|
patpossize <<= 2;
|
242
228
|
SDL_memcpy(patpos, lpStream+dwMemPos, patpossize);
|
243
|
-
for (
|
244
|
-
|
245
|
-
patpos[j] = bswapLE32(patpos[j]);
|
229
|
+
for (j=0; j < (patpossize>>2); j++) {
|
230
|
+
patpos[j] = bswapLE32(patpos[j]);
|
246
231
|
}
|
247
232
|
dwMemPos += pifh.patnum * 4;
|
248
233
|
// Reading IT Extra Info
|
@@ -286,6 +271,8 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
286
271
|
dwMemPos += 8;
|
287
272
|
if ((dwMemPos + len <= dwMemLength) && (len <= 64*MAX_CHANNELNAME))
|
288
273
|
{
|
274
|
+
const UINT n = len / MAX_CHANNELNAME;
|
275
|
+
if (n > _this->m_nChannels) _this->m_nChannels = n;
|
289
276
|
dwMemPos += len;
|
290
277
|
}
|
291
278
|
}
|
@@ -346,13 +333,13 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
346
333
|
if (_this->m_nInstruments >= MAX_INSTRUMENTS) _this->m_nInstruments = MAX_INSTRUMENTS-1;
|
347
334
|
for (UINT nins=0; nins<_this->m_nInstruments; nins++)
|
348
335
|
{
|
349
|
-
if ((inspos[nins] > 0) &&
|
336
|
+
if ((inspos[nins] > 0) && dwMemLength > sizeof(ITOLDINSTRUMENT) &&
|
337
|
+
(inspos[nins] < dwMemLength - sizeof(ITOLDINSTRUMENT)))
|
350
338
|
{
|
351
|
-
INSTRUMENTHEADER *penv = (INSTRUMENTHEADER *)
|
339
|
+
INSTRUMENTHEADER *penv = (INSTRUMENTHEADER *) SDL_calloc(1, sizeof (INSTRUMENTHEADER));
|
352
340
|
if (!penv) continue;
|
353
341
|
_this->Headers[nins+1] = penv;
|
354
|
-
|
355
|
-
CSoundFile_ITInstrToMPT(lpStream + inspos[nins], penv, pifh.cmwt);
|
342
|
+
ITInstrToMPT(lpStream + inspos[nins], penv, pifh.cmwt);
|
356
343
|
}
|
357
344
|
}
|
358
345
|
// Reading Samples
|
@@ -361,7 +348,7 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
361
348
|
for (UINT nsmp=0; nsmp<pifh.smpnum; nsmp++) if ((smppos[nsmp]) && (smppos[nsmp] <= dwMemLength - sizeof(ITSAMPLESTRUCT)))
|
362
349
|
{
|
363
350
|
ITSAMPLESTRUCT pis;
|
364
|
-
|
351
|
+
SDL_memcpy(&pis, lpStream+smppos[nsmp], sizeof (pis));
|
365
352
|
pis.id = bswapLE32(pis.id);
|
366
353
|
pis.length = bswapLE32(pis.length);
|
367
354
|
pis.loopbegin = bswapLE32(pis.loopbegin);
|
@@ -487,7 +474,7 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
487
474
|
if (note < 0x80) note++;
|
488
475
|
m[ch].note = note;
|
489
476
|
lastvalue[ch].note = note;
|
490
|
-
|
477
|
+
// channels_used[ch] = TRUE;
|
491
478
|
}
|
492
479
|
}
|
493
480
|
if (chnmask[ch] & 2)
|
@@ -567,19 +554,28 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
567
554
|
//////////////////////////////////////////////////////////////////////////////
|
568
555
|
// IT 2.14 compression
|
569
556
|
|
570
|
-
static DWORD ITReadBits(DWORD *bitbuf, UINT *bitnum, LPBYTE *_ibuf, CHAR n)
|
557
|
+
static DWORD ITReadBits(DWORD *bitbuf, UINT *bitnum, LPBYTE *_ibuf, LPBYTE ibufend, CHAR n)
|
571
558
|
//-----------------------------------------------------------------
|
572
559
|
{
|
573
|
-
|
560
|
+
LPBYTE ibuf = *_ibuf;
|
574
561
|
DWORD retval = 0;
|
575
562
|
UINT i = n;
|
576
563
|
|
564
|
+
// explicit if read 0 bits, then return 0
|
565
|
+
if (i == 0)
|
566
|
+
return(0);
|
567
|
+
|
577
568
|
if (n > 0)
|
578
569
|
{
|
579
570
|
do
|
580
571
|
{
|
581
572
|
if (!*bitnum)
|
582
573
|
{
|
574
|
+
if (ibuf >= ibufend)
|
575
|
+
{
|
576
|
+
*_ibuf = ibuf;
|
577
|
+
return 0;
|
578
|
+
}
|
583
579
|
*bitbuf = *ibuf++;
|
584
580
|
*bitnum = 8;
|
585
581
|
}
|
@@ -591,7 +587,7 @@ static DWORD ITReadBits(DWORD *bitbuf, UINT *bitnum, LPBYTE *_ibuf, CHAR n)
|
|
591
587
|
} while (i);
|
592
588
|
i = n;
|
593
589
|
}
|
594
|
-
|
590
|
+
*_ibuf = ibuf;
|
595
591
|
return (retval >> (32-i));
|
596
592
|
}
|
597
593
|
|
@@ -601,7 +597,8 @@ void ITUnpack8Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dwM
|
|
601
597
|
{
|
602
598
|
signed char *pDst = pSample;
|
603
599
|
LPBYTE pSrc = lpMemFile;
|
604
|
-
|
600
|
+
LPBYTE pStop = lpMemFile + dwMemLength;
|
601
|
+
// DWORD wHdr = 0;
|
605
602
|
DWORD wCount = 0;
|
606
603
|
DWORD bitbuf = 0;
|
607
604
|
UINT bitnum = 0;
|
@@ -612,7 +609,7 @@ void ITUnpack8Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dwM
|
|
612
609
|
if (!wCount)
|
613
610
|
{
|
614
611
|
wCount = 0x8000;
|
615
|
-
|
612
|
+
// wHdr = bswapLE16(*((LPWORD)pSrc));
|
616
613
|
pSrc += 2;
|
617
614
|
bLeft = 9;
|
618
615
|
bTemp = bTemp2 = 0;
|
@@ -624,13 +621,13 @@ void ITUnpack8Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dwM
|
|
624
621
|
DWORD dwPos = 0;
|
625
622
|
do
|
626
623
|
{
|
627
|
-
WORD wBits = (WORD)ITReadBits(&bitbuf, &bitnum, &pSrc, bLeft);
|
624
|
+
WORD wBits = (WORD)ITReadBits(&bitbuf, &bitnum, &pSrc, pStop, bLeft);
|
628
625
|
if (bLeft < 7)
|
629
626
|
{
|
630
627
|
DWORD i = 1 << (bLeft-1);
|
631
628
|
DWORD j = wBits & 0xFFFF;
|
632
629
|
if (i != j) goto UnpackByte;
|
633
|
-
wBits = (WORD)(ITReadBits(&bitbuf, &bitnum, &pSrc, 3) + 1) & 0xFF;
|
630
|
+
wBits = (WORD)(ITReadBits(&bitbuf, &bitnum, &pSrc, pStop, 3) + 1) & 0xFF;
|
634
631
|
bLeft = ((BYTE)wBits < bLeft) ? (BYTE)wBits : (BYTE)((wBits+1) & 0xFF);
|
635
632
|
goto Next;
|
636
633
|
}
|
@@ -668,7 +665,7 @@ void ITUnpack8Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dwM
|
|
668
665
|
SkipByte:
|
669
666
|
dwPos++;
|
670
667
|
Next:
|
671
|
-
if (pSrc >=
|
668
|
+
if (pSrc >= pStop + 1) return;
|
672
669
|
} while (dwPos < d);
|
673
670
|
// Move On
|
674
671
|
wCount -= d;
|
@@ -683,7 +680,8 @@ void ITUnpack16Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dw
|
|
683
680
|
{
|
684
681
|
signed short *pDst = (signed short *)pSample;
|
685
682
|
LPBYTE pSrc = lpMemFile;
|
686
|
-
|
683
|
+
LPBYTE pStop = lpMemFile + dwMemLength;
|
684
|
+
// DWORD wHdr = 0;
|
687
685
|
DWORD wCount = 0;
|
688
686
|
DWORD bitbuf = 0;
|
689
687
|
UINT bitnum = 0;
|
@@ -695,7 +693,7 @@ void ITUnpack16Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dw
|
|
695
693
|
if (!wCount)
|
696
694
|
{
|
697
695
|
wCount = 0x4000;
|
698
|
-
|
696
|
+
// wHdr = bswapLE16(*((LPWORD)pSrc));
|
699
697
|
pSrc += 2;
|
700
698
|
bLeft = 17;
|
701
699
|
wTemp = wTemp2 = 0;
|
@@ -707,13 +705,13 @@ void ITUnpack16Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dw
|
|
707
705
|
DWORD dwPos = 0;
|
708
706
|
do
|
709
707
|
{
|
710
|
-
DWORD dwBits = ITReadBits(&bitbuf, &bitnum, &pSrc, bLeft);
|
708
|
+
DWORD dwBits = ITReadBits(&bitbuf, &bitnum, &pSrc, pStop, bLeft);
|
711
709
|
if (bLeft < 7)
|
712
710
|
{
|
713
711
|
DWORD i = 1 << (bLeft-1);
|
714
712
|
DWORD j = dwBits;
|
715
713
|
if (i != j) goto UnpackByte;
|
716
|
-
dwBits = ITReadBits(&bitbuf, &bitnum, &pSrc, 4) + 1;
|
714
|
+
dwBits = ITReadBits(&bitbuf, &bitnum, &pSrc, pStop, 4) + 1;
|
717
715
|
bLeft = ((BYTE)(dwBits & 0xFF) < bLeft) ? (BYTE)(dwBits & 0xFF) : (BYTE)((dwBits+1) & 0xFF);
|
718
716
|
goto Next;
|
719
717
|
}
|
@@ -751,13 +749,13 @@ void ITUnpack16Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dw
|
|
751
749
|
SkipByte:
|
752
750
|
dwPos++;
|
753
751
|
Next:
|
754
|
-
if (pSrc >=
|
752
|
+
if (pSrc >= pStop + 1) return;
|
755
753
|
} while (dwPos < d);
|
756
754
|
// Move On
|
757
755
|
wCount -= d;
|
758
756
|
dwLen -= d;
|
759
757
|
pDst += d;
|
760
|
-
if (pSrc >=
|
758
|
+
if (pSrc >= pStop) break;
|
761
759
|
}
|
762
760
|
}
|
763
761
|
|
@@ -770,7 +768,6 @@ UINT CSoundFile_LoadMixPlugins(CSoundFile *_this, const void *pData, UINT nLen)
|
|
770
768
|
while (nPos+8 < nLen)
|
771
769
|
{
|
772
770
|
DWORD nPluginSize;
|
773
|
-
UINT nPlugin;
|
774
771
|
|
775
772
|
nPluginSize = bswapLE32(*(DWORD *)(p+nPos+4));
|
776
773
|
if (nPluginSize > nLen-nPos-8) break;;
|
@@ -787,10 +784,9 @@ UINT CSoundFile_LoadMixPlugins(CSoundFile *_this, const void *pData, UINT nLen)
|
|
787
784
|
{
|
788
785
|
break;
|
789
786
|
}
|
790
|
-
|
787
|
+
// took out the (otherwise unused) plugin loading code here. --ryan.
|
791
788
|
}
|
792
789
|
nPos += nPluginSize + 8;
|
793
790
|
}
|
794
791
|
return nPos;
|
795
792
|
}
|
796
|
-
|
@@ -39,7 +39,7 @@ typedef struct MDLPATTERNDATA
|
|
39
39
|
} MDLPATTERNDATA;
|
40
40
|
|
41
41
|
|
42
|
-
void ConvertMDLCommand(MODCOMMAND *m, UINT eff, UINT data)
|
42
|
+
static void ConvertMDLCommand(MODCOMMAND *m, UINT eff, UINT data)
|
43
43
|
//--------------------------------------------------------
|
44
44
|
{
|
45
45
|
UINT command = 0, param = data;
|
@@ -88,19 +88,12 @@ void ConvertMDLCommand(MODCOMMAND *m, UINT eff, UINT data)
|
|
88
88
|
}
|
89
89
|
|
90
90
|
|
91
|
-
void UnpackMDLTrack(MODCOMMAND *pat, UINT nChannels, UINT nRows, UINT nTrack, const BYTE *lpTracks)
|
91
|
+
static void UnpackMDLTrack(MODCOMMAND *pat, UINT nChannels, UINT nRows, UINT nTrack, const BYTE *lpTracks, UINT len)
|
92
92
|
//-------------------------------------------------------------------------------------------------
|
93
93
|
{
|
94
94
|
MODCOMMAND cmd, *m = pat;
|
95
|
-
UINT len = *((WORD *)lpTracks);
|
96
95
|
UINT pos = 0, row = 0, i;
|
97
|
-
|
98
|
-
for (UINT ntrk=1; ntrk<nTrack; ntrk++)
|
99
|
-
{
|
100
|
-
lpTracks += len;
|
101
|
-
len = *((WORD *)lpTracks);
|
102
|
-
lpTracks += 2;
|
103
|
-
}
|
96
|
+
|
104
97
|
cmd.note = cmd.instr = 0;
|
105
98
|
cmd.volcmd = cmd.vol = 0;
|
106
99
|
cmd.command = cmd.param = 0;
|
@@ -172,14 +165,12 @@ void UnpackMDLTrack(MODCOMMAND *pat, UINT nChannels, UINT nRows, UINT nTrack, co
|
|
172
165
|
}
|
173
166
|
|
174
167
|
|
175
|
-
|
176
168
|
BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLength)
|
177
169
|
//---------------------------------------------------------------
|
178
170
|
{
|
179
171
|
DWORD dwMemPos, dwPos, blocklen, dwTrackPos;
|
180
172
|
const MDLSONGHEADER *pmsh = (const MDLSONGHEADER *)lpStream;
|
181
173
|
const MDLINFOBLOCK *pmib;
|
182
|
-
const MDLPATTERNDATA *pmpd;
|
183
174
|
UINT i,j, norders = 0, npatterns = 0, ntracks = 0;
|
184
175
|
UINT ninstruments = 0, nsamples = 0;
|
185
176
|
WORD block;
|
@@ -192,6 +183,7 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
192
183
|
|
193
184
|
if ((!lpStream) || (dwMemLength < 1024)) return FALSE;
|
194
185
|
if ((pmsh->id != 0x4C444D44) || ((pmsh->version & 0xF0) > 0x10)) return FALSE;
|
186
|
+
const UINT hdrLen = (pmsh->version>0)? 59 : 57;
|
195
187
|
SDL_memset(patterntracks, 0, sizeof(patterntracks));
|
196
188
|
SDL_memset(smpinfo, 0, sizeof(smpinfo));
|
197
189
|
SDL_memset(insvolenv, 0, sizeof(insvolenv));
|
@@ -203,10 +195,11 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
203
195
|
_this->m_nSamples = _this->m_nInstruments = 0;
|
204
196
|
while (dwMemPos+6 < dwMemLength)
|
205
197
|
{
|
206
|
-
|
207
|
-
|
198
|
+
const BYTE *pp = lpStream + dwMemPos;
|
199
|
+
block = pp[0] | (pp[1] << 8);
|
200
|
+
blocklen = pp[2] | (pp[3] << 8) | (pp[4] << 16) | (pp[5] << 24);
|
208
201
|
dwMemPos += 6;
|
209
|
-
if (
|
202
|
+
if (blocklen > dwMemLength - dwMemPos)
|
210
203
|
{
|
211
204
|
if (dwMemPos == 11) return FALSE;
|
212
205
|
break;
|
@@ -215,9 +208,10 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
215
208
|
{
|
216
209
|
// IN: infoblock
|
217
210
|
case 0x4E49:
|
218
|
-
pmib = (MDLINFOBLOCK *)(lpStream+dwMemPos);
|
211
|
+
pmib = (const MDLINFOBLOCK *)(lpStream+dwMemPos);
|
219
212
|
norders = pmib->norders;
|
220
213
|
if (norders > MAX_ORDERS) norders = MAX_ORDERS;
|
214
|
+
if (blocklen < sizeof(MDLINFOBLOCK) + norders - sizeof(pmib->seq)) return FALSE;
|
221
215
|
_this->m_nRestartPos = pmib->repeatpos;
|
222
216
|
_this->m_nDefaultGlobalVolume = pmib->globalvol;
|
223
217
|
_this->m_nDefaultTempo = pmib->tempo;
|
@@ -244,29 +238,41 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
244
238
|
dwPos = dwMemPos + 1;
|
245
239
|
for (i=0; i<npatterns; i++)
|
246
240
|
{
|
247
|
-
|
248
|
-
|
249
|
-
if (
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
241
|
+
const BYTE *data;
|
242
|
+
UINT ch;
|
243
|
+
if (pmsh->version == 0) {
|
244
|
+
if (_this->m_nChannels < 32) _this->m_nChannels = 32;
|
245
|
+
ch = 32;
|
246
|
+
} else {
|
247
|
+
if (dwPos+18 >= dwMemLength) break;
|
248
|
+
const MDLPATTERNDATA *pmpd = (const MDLPATTERNDATA *)(lpStream + dwPos);
|
249
|
+
if (pmpd->channels > 32) break;
|
250
|
+
_this->PatternSize[i] = pmpd->lastrow+1;
|
251
|
+
if (_this->m_nChannels < pmpd->channels) _this->m_nChannels = pmpd->channels;
|
252
|
+
ch = pmpd->channels;
|
253
|
+
}
|
254
|
+
|
255
|
+
if (2 * ch >= dwMemLength - dwPos) break;
|
256
|
+
data = lpStream + dwPos;
|
257
|
+
dwPos += 2 * ch;
|
258
|
+
for (j=0; j<ch && j<_this->m_nChannels; j++, data+=2)
|
254
259
|
{
|
255
|
-
patterntracks[i*32+j] =
|
260
|
+
patterntracks[i*32+j] = data[0] | (data[1] << 8);
|
256
261
|
}
|
257
262
|
}
|
258
263
|
break;
|
259
264
|
// TR: Track Data
|
260
265
|
case 0x5254:
|
261
266
|
if (dwTrackPos) break;
|
262
|
-
|
267
|
+
pp = lpStream + dwMemPos;
|
268
|
+
ntracks = pp[0] | (pp[1] << 8);
|
263
269
|
dwTrackPos = dwMemPos+2;
|
264
270
|
break;
|
265
271
|
// II: Instruments
|
266
272
|
case 0x4949:
|
267
273
|
ninstruments = lpStream[dwMemPos];
|
268
274
|
dwPos = dwMemPos+1;
|
269
|
-
for (i=0; i<ninstruments; i++)
|
275
|
+
for (i=0; dwPos+34<dwMemLength && i<ninstruments; i++)
|
270
276
|
{
|
271
277
|
UINT nins = lpStream[dwPos];
|
272
278
|
if ((nins >= MAX_INSTRUMENTS) || (!nins)) break;
|
@@ -274,11 +280,11 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
274
280
|
if (!_this->Headers[nins])
|
275
281
|
{
|
276
282
|
UINT note = 12;
|
277
|
-
if ((_this->Headers[nins] = (INSTRUMENTHEADER *)
|
283
|
+
if ((_this->Headers[nins] = (INSTRUMENTHEADER *) SDL_calloc(1, sizeof (INSTRUMENTHEADER))) == NULL) break;
|
278
284
|
INSTRUMENTHEADER *penv = _this->Headers[nins];
|
279
|
-
SDL_memset(penv, 0, sizeof(INSTRUMENTHEADER));
|
280
285
|
penv->nGlobalVol = 64;
|
281
286
|
penv->nPPC = 5*12;
|
287
|
+
if (34 + 14u*lpStream[dwPos+1] > dwMemLength - dwPos) break;
|
282
288
|
for (j=0; j<lpStream[dwPos+1]; j++)
|
283
289
|
{
|
284
290
|
const BYTE *ps = lpStream+dwPos+34+14*j;
|
@@ -318,50 +324,56 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
318
324
|
}
|
319
325
|
for (j=1; j<=_this->m_nInstruments; j++) if (!_this->Headers[j])
|
320
326
|
{
|
321
|
-
_this->Headers[j] = (INSTRUMENTHEADER *)
|
322
|
-
if (_this->Headers[j]) SDL_memset(_this->Headers[j], 0, sizeof(INSTRUMENTHEADER));
|
327
|
+
_this->Headers[j] = (INSTRUMENTHEADER *) SDL_calloc(1, sizeof (INSTRUMENTHEADER));
|
323
328
|
}
|
324
329
|
break;
|
325
330
|
// VE: Volume Envelope
|
326
331
|
case 0x4556:
|
327
|
-
if ((nvolenv = lpStream[dwMemPos]) == 0) break;
|
328
|
-
if (dwMemPos + nvolenv*
|
332
|
+
if (nvolenv || (nvolenv = lpStream[dwMemPos]) == 0) break;
|
333
|
+
if (dwMemPos + nvolenv*33 + 1 <= dwMemLength) pvolenv = lpStream + dwMemPos + 1;
|
329
334
|
break;
|
330
335
|
// PE: Panning Envelope
|
331
336
|
case 0x4550:
|
332
|
-
if ((npanenv = lpStream[dwMemPos]) == 0) break;
|
333
|
-
if (dwMemPos + npanenv*
|
337
|
+
if (npanenv || (npanenv = lpStream[dwMemPos]) == 0) break;
|
338
|
+
if (dwMemPos + npanenv*33 + 1 <= dwMemLength) ppanenv = lpStream + dwMemPos + 1;
|
334
339
|
break;
|
335
340
|
// FE: Pitch Envelope
|
336
341
|
case 0x4546:
|
337
|
-
if ((npitchenv = lpStream[dwMemPos]) == 0) break;
|
338
|
-
if (dwMemPos + npitchenv*
|
342
|
+
if (npitchenv || (npitchenv = lpStream[dwMemPos]) == 0) break;
|
343
|
+
if (dwMemPos + npitchenv*33 + 1 <= dwMemLength) ppitchenv = lpStream + dwMemPos + 1;
|
339
344
|
break;
|
340
345
|
// IS: Sample Infoblock
|
341
346
|
case 0x5349:
|
342
347
|
nsamples = lpStream[dwMemPos];
|
348
|
+
i = blocklen / hdrLen;
|
349
|
+
if (i< nsamples) nsamples = i;
|
343
350
|
dwPos = dwMemPos+1;
|
344
|
-
for (i=0; i<nsamples; i++, dwPos +=
|
351
|
+
for (i=0; i<nsamples; i++, dwPos += hdrLen)
|
345
352
|
{
|
346
353
|
UINT nins = lpStream[dwPos];
|
347
354
|
if ((nins >= MAX_SAMPLES) || (!nins)) continue;
|
348
355
|
if (_this->m_nSamples < nins) _this->m_nSamples = nins;
|
349
356
|
MODINSTRUMENT *pins = &_this->Ins[nins];
|
350
|
-
|
351
|
-
pins->
|
352
|
-
|
353
|
-
|
357
|
+
pp = lpStream + dwPos + 41;
|
358
|
+
pins->nC4Speed = pp[0] | (pp[1] << 8); pp += 2;
|
359
|
+
if (pmsh->version > 0) {
|
360
|
+
pins->nC4Speed |= (pp[0] << 16) | (pp[1] << 24); pp += 2;
|
361
|
+
}
|
362
|
+
pins->nLength = pp[0] | (pp[1] << 8) | (pp[2] << 16) | (pp[3] << 24); pp += 4;
|
363
|
+
pins->nLoopStart = pp[0] | (pp[1] << 8) | (pp[2] << 16) | (pp[3] << 24); pp += 4;
|
364
|
+
pins->nLoopEnd = pins->nLoopStart + (pp[0] | (pp[1] << 8) | (pp[2] << 16) | (pp[3] << 24));
|
354
365
|
if (pins->nLoopEnd > pins->nLoopStart) pins->uFlags |= CHN_LOOP;
|
355
366
|
pins->nGlobalVol = 64;
|
356
|
-
if (
|
367
|
+
if (pmsh->version == 0) pins->nVolume = pp[4];
|
368
|
+
if (lpStream[dwPos+hdrLen-1] & 0x01)
|
357
369
|
{
|
358
370
|
pins->uFlags |= CHN_16BIT;
|
359
371
|
pins->nLength >>= 1;
|
360
372
|
pins->nLoopStart >>= 1;
|
361
373
|
pins->nLoopEnd >>= 1;
|
362
374
|
}
|
363
|
-
if (lpStream[dwPos+
|
364
|
-
smpinfo[nins] = (lpStream[dwPos+
|
375
|
+
if (lpStream[dwPos+hdrLen-1] & 0x02) pins->uFlags |= CHN_PINGPONGLOOP;
|
376
|
+
smpinfo[nins] = (lpStream[dwPos+hdrLen-1] >> 2) & 3;
|
365
377
|
}
|
366
378
|
break;
|
367
379
|
// SA: Sample Data
|
@@ -371,17 +383,18 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
371
383
|
{
|
372
384
|
MODINSTRUMENT *pins = &_this->Ins[i];
|
373
385
|
UINT flags = (pins->uFlags & CHN_16BIT) ? RS_PCM16S : RS_PCM8S;
|
386
|
+
pp = lpStream + dwPos;
|
374
387
|
if (!smpinfo[i])
|
375
388
|
{
|
376
|
-
dwPos += CSoundFile_ReadSample(_this, pins, flags, (
|
389
|
+
dwPos += CSoundFile_ReadSample(_this, pins, flags, (LPCSTR)pp, dwMemLength - dwPos);
|
377
390
|
} else
|
378
391
|
{
|
379
|
-
DWORD dwLen =
|
392
|
+
DWORD dwLen = pp[0] | (pp[1] << 8) | (pp[2] << 16) | (pp[3] << 24); pp += 4;
|
380
393
|
dwPos += 4;
|
381
|
-
if ((dwLen
|
394
|
+
if ((dwLen <= dwMemLength) && (dwPos <= dwMemLength - dwLen) && (dwLen > 4))
|
382
395
|
{
|
383
396
|
flags = (pins->uFlags & CHN_16BIT) ? RS_MDL16 : RS_MDL8;
|
384
|
-
CSoundFile_ReadSample(_this, pins, flags, (
|
397
|
+
CSoundFile_ReadSample(_this, pins, flags, (LPCSTR)pp, dwLen);
|
385
398
|
}
|
386
399
|
dwPos += dwLen;
|
387
400
|
}
|
@@ -398,8 +411,24 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
398
411
|
if ((_this->Patterns[ipat] = CSoundFile_AllocatePattern(_this->PatternSize[ipat], _this->m_nChannels)) == NULL) break;
|
399
412
|
for (UINT chn=0; chn<_this->m_nChannels; chn++) if ((patterntracks[ipat*32+chn]) && (patterntracks[ipat*32+chn] <= ntracks))
|
400
413
|
{
|
414
|
+
const BYTE *lpTracks = lpStream + dwTrackPos;
|
415
|
+
UINT len = lpTracks[0] | (lpTracks[1] << 8);
|
416
|
+
if (len < dwMemLength-dwTrackPos) {
|
401
417
|
MODCOMMAND *m = _this->Patterns[ipat] + chn;
|
402
|
-
|
418
|
+
UINT nTrack = patterntracks[ipat*32+chn];
|
419
|
+
|
420
|
+
lpTracks += 2;
|
421
|
+
for (UINT ntrk=1; ntrk<nTrack && lpTracks + 1 < (dwMemLength + lpStream - len); ntrk++)
|
422
|
+
{
|
423
|
+
lpTracks += len;
|
424
|
+
len = lpTracks[0] | (lpTracks[1] << 8);
|
425
|
+
lpTracks += 2;
|
426
|
+
}
|
427
|
+
|
428
|
+
if ( len > dwMemLength - (lpTracks - lpStream) ) len = 0;
|
429
|
+
|
430
|
+
UnpackMDLTrack(m, _this->m_nChannels, _this->PatternSize[ipat], nTrack, lpTracks, len);
|
431
|
+
}
|
403
432
|
}
|
404
433
|
}
|
405
434
|
}
|
@@ -472,7 +501,7 @@ BOOL CSoundFile_ReadMDL(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
472
501
|
WORD MDLReadBits(DWORD *bitbuf, UINT *bitnum, LPBYTE *_ibuf, CHAR n)
|
473
502
|
//-----------------------------------------------------------------
|
474
503
|
{
|
475
|
-
|
504
|
+
LPBYTE ibuf = *_ibuf;
|
476
505
|
const WORD v = (WORD)(*bitbuf & ((1 << n) - 1) );
|
477
506
|
*bitbuf >>= n;
|
478
507
|
*bitnum -= n;
|
@@ -481,8 +510,6 @@ WORD MDLReadBits(DWORD *bitbuf, UINT *bitnum, LPBYTE *_ibuf, CHAR n)
|
|
481
510
|
*bitbuf |= (((DWORD)(*ibuf++)) << *bitnum);
|
482
511
|
*bitnum += 8;
|
483
512
|
}
|
484
|
-
|
513
|
+
*_ibuf = ibuf;
|
485
514
|
return v;
|
486
515
|
}
|
487
|
-
|
488
|
-
|
@@ -93,7 +93,7 @@ typedef struct tagMMD0SAMPLE
|
|
93
93
|
typedef struct tagMMDSAMPLEHEADER
|
94
94
|
{
|
95
95
|
DWORD length; // length of *one* *unpacked* channel in *bytes*
|
96
|
-
WORD type;
|
96
|
+
WORD type;
|
97
97
|
// if non-negative
|
98
98
|
// bits 0-3 reserved for multi-octave instruments, not supported on the PC
|
99
99
|
// 0x10: 16 bit (otherwise 8 bit)
|
@@ -165,7 +165,7 @@ typedef struct tagMMD2SONGHEADER
|
|
165
165
|
BYTE numsamples; // # of samples (max 63)
|
166
166
|
} MMD2SONGHEADER;
|
167
167
|
|
168
|
-
// For MMD0 the note information is held in 3 bytes, byte0, byte1, byte2. For reference we
|
168
|
+
// For MMD0 the note information is held in 3 bytes, byte0, byte1, byte2. For reference we
|
169
169
|
// number the bits in each byte 0..7, where 0 is the low bit.
|
170
170
|
// The note is held as bits 5..0 of byte0
|
171
171
|
// The instrument is encoded in 6 bits, bits 7 and 6 of byte0 and bits 7,6,5,4 of byte1
|
@@ -238,7 +238,7 @@ typedef struct tagMMD0EXP
|
|
238
238
|
DWORD annotxt;
|
239
239
|
DWORD annolen;
|
240
240
|
DWORD iinfo; // Instrument names
|
241
|
-
WORD i_ext_entries;
|
241
|
+
WORD i_ext_entries;
|
242
242
|
WORD i_ext_entrsz;
|
243
243
|
DWORD jumpmask;
|
244
244
|
DWORD rgbtable;
|
@@ -576,11 +576,12 @@ BOOL CSoundFile_ReadMed(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
576
576
|
}
|
577
577
|
UINT pseq = 0;
|
578
578
|
|
579
|
-
if ((playseqtable) && (playseqtable < dwMemLength) && (nplayseq*4 < dwMemLength - playseqtable))
|
579
|
+
if ((playseqtable) && (playseqtable < dwMemLength) && (nplayseq*4 + 4 < dwMemLength - playseqtable))
|
580
580
|
{
|
581
581
|
pseq = bswapBE32(((LPDWORD)(lpStream+playseqtable))[nplayseq]);
|
582
582
|
}
|
583
|
-
if ((pseq) &&
|
583
|
+
if ((pseq) && dwMemLength > sizeof(MMD2PLAYSEQ) &&
|
584
|
+
(pseq < dwMemLength - sizeof(MMD2PLAYSEQ)))
|
584
585
|
{
|
585
586
|
const MMD2PLAYSEQ *pmps = (MMD2PLAYSEQ *)(lpStream + pseq);
|
586
587
|
UINT n = bswapBE16(pmps->length);
|
@@ -623,10 +624,11 @@ BOOL CSoundFile_ReadMed(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
623
624
|
UINT len = bswapBE32(psdh->length);
|
624
625
|
if ((len > MAX_SAMPLE_LENGTH) || (dwPos + len + 6 > dwMemLength)) len = 0;
|
625
626
|
UINT flags = RS_PCM8S, stype = bswapBE16(psdh->type);
|
626
|
-
|
627
|
+
dwPos += 6;
|
627
628
|
if (stype & 0x80)
|
628
629
|
{
|
629
|
-
|
630
|
+
dwPos += (stype & 0x20) ? 14 : 6;
|
631
|
+
if (dwPos >= dwMemLength) continue;
|
630
632
|
} else
|
631
633
|
{
|
632
634
|
if (stype & 0x10)
|
@@ -641,11 +643,12 @@ BOOL CSoundFile_ReadMed(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
641
643
|
if (stype & 0x20) len /= 2;
|
642
644
|
}
|
643
645
|
_this->Ins[iSmp+1].nLength = len;
|
644
|
-
CSoundFile_ReadSample(_this, &_this->Ins[iSmp+1], flags,
|
646
|
+
CSoundFile_ReadSample(_this, &_this->Ins[iSmp+1], flags, (const char *)(lpStream + dwPos), dwMemLength - dwPos);
|
645
647
|
}
|
646
648
|
// Reading patterns (blocks)
|
647
649
|
if (wNumBlocks > MAX_PATTERNS) wNumBlocks = MAX_PATTERNS;
|
648
|
-
if ((!dwBlockArr) || (
|
650
|
+
if ((!dwBlockArr) || (dwMemLength < 4*wNumBlocks) ||
|
651
|
+
(dwBlockArr > dwMemLength - 4*wNumBlocks)) return TRUE;
|
649
652
|
pdwTable = (LPDWORD)(lpStream + dwBlockArr);
|
650
653
|
playtransp += (version == '3') ? 24 : 48;
|
651
654
|
for (UINT iBlk=0; iBlk<wNumBlocks; iBlk++)
|
@@ -701,9 +704,15 @@ BOOL CSoundFile_ReadMed(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
701
704
|
{
|
702
705
|
DWORD nameofs = bswapBE32(pbi->blockname);
|
703
706
|
UINT namelen = bswapBE32(pbi->blocknamelen);
|
704
|
-
if ((
|
707
|
+
if ((namelen < dwMemLength) && (nameofs < dwMemLength - namelen))
|
705
708
|
{
|
706
|
-
|
709
|
+
// SetPatternName expects a nul-terminated string.
|
710
|
+
char blockname[MAX_PATTERNNAME];
|
711
|
+
if (namelen >= MAX_PATTERNNAME) namelen = MAX_PATTERNNAME - 1;
|
712
|
+
SDL_memcpy(blockname, lpStream + nameofs, namelen);
|
713
|
+
blockname[namelen] = '\0';
|
714
|
+
|
715
|
+
CSoundFile_SetPatternName(_this, iBlk, blockname);
|
707
716
|
}
|
708
717
|
}
|
709
718
|
if (pbi->cmdexttable)
|
@@ -754,4 +763,3 @@ BOOL CSoundFile_ReadMed(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
754
763
|
}
|
755
764
|
return TRUE;
|
756
765
|
}
|
757
|
-
|