gosu 1.4.5.pre1 → 1.4.5
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 +1 -0
- data/dependencies/SDL/include/SDL_assert.h +4 -2
- data/dependencies/SDL/include/SDL_atomic.h +20 -0
- data/dependencies/SDL/include/SDL_audio.h +40 -4
- data/dependencies/SDL/include/SDL_blendmode.h +4 -6
- data/dependencies/SDL/include/SDL_clipboard.h +47 -0
- data/dependencies/SDL/include/SDL_config.h +71 -45
- data/dependencies/SDL/include/SDL_cpuinfo.h +39 -4
- data/dependencies/SDL/include/SDL_egl.h +59 -9
- data/dependencies/SDL/include/SDL_endian.h +34 -3
- data/dependencies/SDL/include/SDL_events.h +32 -1
- data/dependencies/SDL/include/SDL_filesystem.h +5 -1
- data/dependencies/SDL/include/SDL_gamecontroller.h +78 -5
- data/dependencies/SDL/include/SDL_guid.h +100 -0
- data/dependencies/SDL/include/SDL_hints.h +645 -43
- data/dependencies/SDL/include/SDL_joystick.h +127 -7
- data/dependencies/SDL/include/SDL_keyboard.h +38 -1
- data/dependencies/SDL/include/SDL_keycode.h +6 -1
- data/dependencies/SDL/include/SDL_log.h +2 -2
- data/dependencies/SDL/include/SDL_main.h +42 -2
- data/dependencies/SDL/include/SDL_metal.h +2 -1
- data/dependencies/SDL/include/SDL_mouse.h +12 -1
- data/dependencies/SDL/include/SDL_opengl.h +0 -51
- data/dependencies/SDL/include/SDL_opengl_glext.h +2260 -231
- data/dependencies/SDL/include/SDL_opengles2_gl2.h +374 -339
- data/dependencies/SDL/include/SDL_opengles2_gl2ext.h +3479 -1496
- data/dependencies/SDL/include/SDL_opengles2_gl2platform.h +6 -9
- data/dependencies/SDL/include/SDL_opengles2_khrplatform.h +43 -14
- data/dependencies/SDL/include/SDL_platform.h +32 -6
- data/dependencies/SDL/include/SDL_rect.h +154 -2
- data/dependencies/SDL/include/SDL_render.h +46 -17
- data/dependencies/SDL/include/SDL_revision.h +6 -1
- data/dependencies/SDL/include/SDL_rwops.h +1 -15
- data/dependencies/SDL/include/SDL_scancode.h +46 -21
- data/dependencies/SDL/include/SDL_sensor.h +24 -3
- data/dependencies/SDL/include/SDL_stdinc.h +119 -8
- data/dependencies/SDL/include/SDL_surface.h +3 -1
- data/dependencies/SDL/include/SDL_system.h +66 -6
- data/dependencies/SDL/include/SDL_syswm.h +2 -0
- data/dependencies/SDL/include/SDL_test_common.h +1 -0
- data/dependencies/SDL/include/SDL_test_font.h +90 -3
- data/dependencies/SDL/include/SDL_thread.h +3 -3
- data/dependencies/SDL/include/SDL_touch.h +8 -0
- data/dependencies/SDL/include/SDL_version.h +19 -3
- data/dependencies/SDL/include/SDL_video.h +71 -9
- data/dependencies/SDL/include/begin_code.h +4 -4
- 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 +210 -71
- data/dependencies/SDL_sound/SDL_sound.h +1 -1
- data/dependencies/SDL_sound/SDL_sound_coreaudio.c +111 -168
- data/dependencies/SDL_sound/SDL_sound_flac.c +0 -6
- data/dependencies/SDL_sound/SDL_sound_internal.h +27 -5
- data/dependencies/SDL_sound/SDL_sound_modplug.c +20 -8
- data/dependencies/SDL_sound/SDL_sound_mp3.c +11 -7
- data/dependencies/SDL_sound/SDL_sound_raw.c +1 -1
- data/dependencies/SDL_sound/SDL_sound_shn.c +1 -5
- data/dependencies/SDL_sound/SDL_sound_voc.c +1 -1
- data/dependencies/SDL_sound/SDL_sound_vorbis.c +2 -4
- data/dependencies/SDL_sound/SDL_sound_wav.c +44 -20
- data/dependencies/SDL_sound/dr_flac.h +237 -95
- data/dependencies/SDL_sound/dr_mp3.h +46 -33
- data/dependencies/SDL_sound/libmodplug/fastmix.c +53 -39
- data/dependencies/SDL_sound/libmodplug/libmodplug.h +0 -12
- data/dependencies/SDL_sound/libmodplug/load_669.c +37 -32
- data/dependencies/SDL_sound/libmodplug/load_amf.c +57 -44
- data/dependencies/SDL_sound/libmodplug/load_ams.c +127 -100
- data/dependencies/SDL_sound/libmodplug/load_dbm.c +40 -37
- data/dependencies/SDL_sound/libmodplug/load_dmf.c +61 -49
- data/dependencies/SDL_sound/libmodplug/load_dsm.c +18 -13
- data/dependencies/SDL_sound/libmodplug/load_far.c +31 -24
- data/dependencies/SDL_sound/libmodplug/load_gdm.c +27 -21
- data/dependencies/SDL_sound/libmodplug/load_it.c +106 -91
- data/dependencies/SDL_sound/libmodplug/load_mdl.c +43 -35
- data/dependencies/SDL_sound/libmodplug/load_med.c +66 -52
- data/dependencies/SDL_sound/libmodplug/load_mod.c +30 -26
- data/dependencies/SDL_sound/libmodplug/load_mt2.c +61 -50
- data/dependencies/SDL_sound/libmodplug/load_mtm.c +23 -17
- data/dependencies/SDL_sound/libmodplug/load_okt.c +18 -16
- data/dependencies/SDL_sound/libmodplug/load_psm.c +44 -32
- data/dependencies/SDL_sound/libmodplug/load_ptm.c +18 -14
- data/dependencies/SDL_sound/libmodplug/load_s3m.c +59 -53
- data/dependencies/SDL_sound/libmodplug/load_stm.c +23 -18
- data/dependencies/SDL_sound/libmodplug/load_ult.c +33 -29
- data/dependencies/SDL_sound/libmodplug/load_xm.c +64 -57
- data/dependencies/SDL_sound/libmodplug/mmcmp.c +2 -1
- data/dependencies/SDL_sound/libmodplug/snd_dsp.c +30 -20
- data/dependencies/SDL_sound/libmodplug/snd_flt.c +6 -4
- data/dependencies/SDL_sound/libmodplug/snd_fx.c +91 -65
- data/dependencies/SDL_sound/libmodplug/sndfile.c +91 -66
- data/dependencies/SDL_sound/libmodplug/sndmix.c +58 -35
- data/dependencies/SDL_sound/stb_vorbis.h +14 -9
- data/dependencies/mojoAL/mojoal.c +41 -24
- data/dependencies/utf8proc/utf8proc.c +1 -1
- data/dependencies/utf8proc/utf8proc.h +1 -1
- data/dependencies/utf8proc/utf8proc_data.h +3366 -3184
- data/lib/SDL2.dll +0 -0
- data/lib64/SDL2.dll +0 -0
- data/src/Window.cpp +3 -0
- metadata +5 -4
@@ -229,18 +229,20 @@ BOOL CSoundFile_ReadGDM(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
229
229
|
const SAMPLEGDM *psmp;
|
230
230
|
BYTE sflags[256];
|
231
231
|
DWORD pos;
|
232
|
-
UINT npat;
|
232
|
+
UINT npat, i;
|
233
|
+
DWORD ordersPos, patternsPos, samplesPos, sampleDataPos;
|
234
|
+
UINT nPatterns, nOrders, nSamples;
|
233
235
|
|
234
236
|
if ((!lpStream) || (dwMemLength < sizeof(FILEHEADERGDM))) return FALSE;
|
235
237
|
if ((fixu32(pfh->sig) != GDM_SIG) || (fixu32(pfh->sig2) != GMFS_SIG)) return FALSE;
|
236
238
|
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
239
|
+
ordersPos = fixu32(pfh->ordersPos);
|
240
|
+
patternsPos = fixu32(pfh->patternsPos);
|
241
|
+
samplesPos = fixu32(pfh->samplesPos);
|
242
|
+
sampleDataPos = fixu32(pfh->sampleDataPos);
|
243
|
+
nPatterns = pfh->nPatterns + 1;
|
244
|
+
nOrders = pfh->nOrders + 1;
|
245
|
+
nSamples = pfh->nSamples + 1;
|
244
246
|
|
245
247
|
if (nPatterns > MAX_PATTERNS) nPatterns = MAX_PATTERNS;
|
246
248
|
if (nOrders > MAX_ORDERS) nOrders = MAX_ORDERS;
|
@@ -265,7 +267,7 @@ BOOL CSoundFile_ReadGDM(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
265
267
|
_this->m_nSamples = nSamples;
|
266
268
|
|
267
269
|
// Get initial panning.
|
268
|
-
for (
|
270
|
+
for (i = 0; i < 32; i++)
|
269
271
|
{
|
270
272
|
if (pfh->panning[i] < 16)
|
271
273
|
{
|
@@ -276,10 +278,10 @@ BOOL CSoundFile_ReadGDM(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
276
278
|
|
277
279
|
// Samples.
|
278
280
|
psmp = (const SAMPLEGDM *)(lpStream + samplesPos);
|
279
|
-
for (
|
281
|
+
for (i = 0; i < nSamples; i++)
|
280
282
|
{
|
281
|
-
const SAMPLEGDM *smp = &psmp[
|
282
|
-
MODINSTRUMENT *ins = &_this->Ins[
|
283
|
+
const SAMPLEGDM *smp = &psmp[i];
|
284
|
+
MODINSTRUMENT *ins = &_this->Ins[i + 1];
|
283
285
|
|
284
286
|
DWORD len = fixu32(smp->length);
|
285
287
|
DWORD loopstart = fixu32(smp->loopstart);
|
@@ -290,7 +292,7 @@ BOOL CSoundFile_ReadGDM(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
290
292
|
// Note: BWSB and 2GDM don't support LZW, stereo samples, sample panning.
|
291
293
|
if (flags & S_16BIT)
|
292
294
|
{
|
293
|
-
sflags[
|
295
|
+
sflags[i] = RS_PCM16U;
|
294
296
|
// Due to a 2GDM bug, the sample size is halved.
|
295
297
|
// (Note BWSB doesn't even check for these anyway.)
|
296
298
|
len /= 2;
|
@@ -298,7 +300,7 @@ BOOL CSoundFile_ReadGDM(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLeng
|
|
298
300
|
loopend /= 2;
|
299
301
|
}
|
300
302
|
else
|
301
|
-
sflags[
|
303
|
+
sflags[i] = RS_PCM8U;
|
302
304
|
|
303
305
|
if (len > MAX_SAMPLE_LENGTH) len = MAX_SAMPLE_LENGTH;
|
304
306
|
if (loopend > len) loopend = len;
|
@@ -379,23 +381,27 @@ BadPattern:
|
|
379
381
|
UINT patLen = fixu16(lpStream + pos);
|
380
382
|
DWORD patEnd = pos + patLen;
|
381
383
|
UINT row = 0;
|
384
|
+
MODCOMMAND *m;
|
382
385
|
|
383
386
|
pos += 2;
|
384
387
|
|
385
388
|
_this->Patterns[npat] = CSoundFile_AllocatePattern(_this->PatternSize[npat], _this->m_nChannels);
|
386
389
|
if (!_this->Patterns[npat]) break;
|
387
390
|
|
388
|
-
|
391
|
+
m = _this->Patterns[npat];
|
389
392
|
while (pos < patEnd)
|
390
393
|
{
|
391
394
|
while (pos < patEnd)
|
392
395
|
{
|
393
|
-
|
396
|
+
MODCOMMAND *ev;
|
397
|
+
BYTE channel, dat;
|
398
|
+
|
399
|
+
dat = lpStream[pos++];
|
394
400
|
if (!dat)
|
395
401
|
break;
|
396
402
|
|
397
|
-
|
398
|
-
|
403
|
+
channel = dat & 0x1f;
|
404
|
+
ev = &m[row * _this->m_nChannels + channel];
|
399
405
|
|
400
406
|
if (dat & 0x20)
|
401
407
|
{
|
@@ -431,15 +437,15 @@ BadPattern:
|
|
431
437
|
|
432
438
|
// Reading Samples
|
433
439
|
pos = sampleDataPos;
|
434
|
-
for (
|
440
|
+
for (i = 0; i < nSamples; i++)
|
435
441
|
{
|
436
|
-
MODINSTRUMENT *ins = &_this->Ins[
|
442
|
+
MODINSTRUMENT *ins = &_this->Ins[i + 1];
|
437
443
|
UINT len = ins->nLength;
|
438
444
|
|
439
445
|
if (pos >= dwMemLength) break;
|
440
446
|
if (len)
|
441
447
|
{
|
442
|
-
len = CSoundFile_ReadSample(_this, ins, sflags[
|
448
|
+
len = CSoundFile_ReadSample(_this, ins, sflags[i], (LPSTR)(lpStream + pos), dwMemLength - pos);
|
443
449
|
pos += len;
|
444
450
|
}
|
445
451
|
}
|
@@ -19,13 +19,14 @@ BYTE autovibit2xm[8] =
|
|
19
19
|
static BOOL ITInstrToMPT(const void *p, INSTRUMENTHEADER *penv, UINT trkvers)
|
20
20
|
//--------------------------------------------------------------------------------
|
21
21
|
{
|
22
|
+
UINT j;
|
22
23
|
if (trkvers < 0x0200)
|
23
24
|
{
|
24
25
|
const ITOLDINSTRUMENT *pis = (const ITOLDINSTRUMENT *)p;
|
25
26
|
SDL_memcpy(penv->filename, pis->filename, 12);
|
26
27
|
penv->nFadeOut = bswapLE16(pis->fadeout) << 6;
|
27
28
|
penv->nGlobalVol = 64;
|
28
|
-
for (
|
29
|
+
for (j=0; j<NOTE_MAX; j++)
|
29
30
|
{
|
30
31
|
UINT note = pis->keyboard[j*2];
|
31
32
|
UINT ins = pis->keyboard[j*2+1];
|
@@ -41,14 +42,14 @@ static BOOL ITInstrToMPT(const void *p, INSTRUMENTHEADER *penv, UINT trkvers)
|
|
41
42
|
penv->nVolSustainBegin = pis->sls;
|
42
43
|
penv->nVolSustainEnd = pis->sle;
|
43
44
|
penv->nVolEnv = 25;
|
44
|
-
for (
|
45
|
+
for (j=0; j<25; j++)
|
45
46
|
{
|
46
|
-
if ((penv->VolPoints[
|
47
|
+
if ((penv->VolPoints[j] = pis->nodes[j*2]) == 0xFF)
|
47
48
|
{
|
48
|
-
penv->nVolEnv =
|
49
|
+
penv->nVolEnv = j;
|
49
50
|
break;
|
50
51
|
}
|
51
|
-
penv->VolEnv[
|
52
|
+
penv->VolEnv[j] = pis->nodes[j*2+1];
|
52
53
|
}
|
53
54
|
penv->nNNA = pis->nna;
|
54
55
|
penv->nDCT = pis->dnc;
|
@@ -63,7 +64,7 @@ static BOOL ITInstrToMPT(const void *p, INSTRUMENTHEADER *penv, UINT trkvers)
|
|
63
64
|
penv->nFadeOut = bswapLE16(pis->fadeout) << 5;
|
64
65
|
penv->nGlobalVol = pis->gbv >> 1;
|
65
66
|
if (penv->nGlobalVol > 64) penv->nGlobalVol = 64;
|
66
|
-
for (
|
67
|
+
for (j=0; j<NOTE_MAX; j++)
|
67
68
|
{
|
68
69
|
UINT note = pis->keyboard[j*2];
|
69
70
|
UINT ins = pis->keyboard[j*2+1];
|
@@ -107,14 +108,14 @@ static BOOL ITInstrToMPT(const void *p, INSTRUMENTHEADER *penv, UINT trkvers)
|
|
107
108
|
penv->nPitchSustainBegin = pis->pitchenv.slb;
|
108
109
|
penv->nPitchSustainEnd = pis->pitchenv.sle;
|
109
110
|
// Envelopes Data
|
110
|
-
for (
|
111
|
+
for (j=0; j<25; j++)
|
111
112
|
{
|
112
|
-
penv->VolEnv[
|
113
|
-
penv->VolPoints[
|
114
|
-
penv->PanEnv[
|
115
|
-
penv->PanPoints[
|
116
|
-
penv->PitchEnv[
|
117
|
-
penv->PitchPoints[
|
113
|
+
penv->VolEnv[j] = pis->volenv.data[j*3];
|
114
|
+
penv->VolPoints[j] = (pis->volenv.data[j*3+2] << 8) | (pis->volenv.data[j*3+1]);
|
115
|
+
penv->PanEnv[j] = pis->panenv.data[j*3] + 32;
|
116
|
+
penv->PanPoints[j] = (pis->panenv.data[j*3+2] << 8) | (pis->panenv.data[j*3+1]);
|
117
|
+
penv->PitchEnv[j] = pis->pitchenv.data[j*3] + 32;
|
118
|
+
penv->PitchPoints[j] = (pis->pitchenv.data[j*3+2] << 8) | (pis->pitchenv.data[j*3+1]);
|
118
119
|
}
|
119
120
|
penv->nNNA = pis->nna;
|
120
121
|
penv->nDCT = pis->dct;
|
@@ -144,10 +145,10 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
144
145
|
DWORD patpos[MAX_PATTERNS];
|
145
146
|
BYTE chnmask[64];//, channels_used[64]
|
146
147
|
MODCOMMAND lastvalue[64];
|
147
|
-
|
148
|
+
ITFILEHEADER pifh;
|
149
|
+
UINT j, npatterns, siz;
|
148
150
|
|
149
151
|
if ((!lpStream) || (dwMemLength < sizeof(ITFILEHEADER))) return FALSE;
|
150
|
-
ITFILEHEADER pifh;
|
151
152
|
SDL_memcpy(&pifh, lpStream, sizeof(pifh));
|
152
153
|
|
153
154
|
pifh.id = bswapLE32(pifh.id);
|
@@ -185,48 +186,49 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
185
186
|
if (pifh.tempo) _this->m_nDefaultTempo = pifh.tempo;
|
186
187
|
_this->m_nSongPreAmp = pifh.mv & 0x7F;
|
187
188
|
// Reading Channels Pan Positions
|
188
|
-
for (
|
189
|
+
for (j=0; j<64; j++) if (pifh.chnpan[j] != 0xFF)
|
189
190
|
{
|
190
|
-
|
191
|
-
_this->ChnSettings[
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
if (n
|
191
|
+
UINT n;
|
192
|
+
_this->ChnSettings[j].nVolume = pifh.chnvol[j];
|
193
|
+
_this->ChnSettings[j].nPan = 128;
|
194
|
+
if (pifh.chnpan[j] & 0x80) _this->ChnSettings[j].dwFlags |= CHN_MUTE;
|
195
|
+
n = pifh.chnpan[j] & 0x7F;
|
196
|
+
if (n <= 64) _this->ChnSettings[j].nPan = n << 2;
|
197
|
+
if (n == 100) _this->ChnSettings[j].dwFlags |= CHN_SURROUND;
|
196
198
|
}
|
197
199
|
if (_this->m_nChannels < 4) _this->m_nChannels = 4;
|
198
200
|
// Reading orders
|
199
|
-
|
200
|
-
if (
|
201
|
-
SDL_memcpy(_this->Order, lpStream+dwMemPos,
|
201
|
+
siz = pifh.ordnum;
|
202
|
+
if (siz > MAX_ORDERS) siz = MAX_ORDERS;
|
203
|
+
SDL_memcpy(_this->Order, lpStream+dwMemPos, siz);
|
202
204
|
dwMemPos += pifh.ordnum;
|
203
205
|
// Reading Instrument Offsets
|
204
206
|
SDL_memset(inspos, 0, sizeof(inspos));
|
205
|
-
|
206
|
-
if (
|
207
|
-
|
208
|
-
SDL_memcpy(inspos, lpStream+dwMemPos,
|
209
|
-
for (j=0; j < (
|
207
|
+
siz = pifh.insnum;
|
208
|
+
if (siz > MAX_INSTRUMENTS) siz = MAX_INSTRUMENTS;
|
209
|
+
siz <<= 2;
|
210
|
+
SDL_memcpy(inspos, lpStream+dwMemPos, siz);
|
211
|
+
for (j=0; j < (siz>>2); j++) {
|
210
212
|
inspos[j] = bswapLE32(inspos[j]);
|
211
213
|
}
|
212
214
|
dwMemPos += pifh.insnum * 4;
|
213
215
|
// Reading Samples Offsets
|
214
216
|
SDL_memset(smppos, 0, sizeof(smppos));
|
215
|
-
|
216
|
-
if (
|
217
|
-
|
218
|
-
SDL_memcpy(smppos, lpStream+dwMemPos,
|
219
|
-
for (j=0; j < (
|
217
|
+
siz = pifh.smpnum;
|
218
|
+
if (siz > MAX_SAMPLES) siz = MAX_SAMPLES;
|
219
|
+
siz <<= 2;
|
220
|
+
SDL_memcpy(smppos, lpStream+dwMemPos, siz);
|
221
|
+
for (j=0; j < (siz>>2); j++) {
|
220
222
|
smppos[j] = bswapLE32(smppos[j]);
|
221
223
|
}
|
222
224
|
dwMemPos += pifh.smpnum * 4;
|
223
225
|
// Reading Patterns Offsets
|
224
226
|
SDL_memset(patpos, 0, sizeof(patpos));
|
225
|
-
|
226
|
-
if (
|
227
|
-
|
228
|
-
SDL_memcpy(patpos, lpStream+dwMemPos,
|
229
|
-
for (j=0; j < (
|
227
|
+
siz = pifh.patnum;
|
228
|
+
if (siz > MAX_PATTERNS) siz = MAX_PATTERNS;
|
229
|
+
siz <<= 2;
|
230
|
+
SDL_memcpy(patpos, lpStream+dwMemPos, siz);
|
231
|
+
for (j=0; j < (siz>>2); j++) {
|
230
232
|
patpos[j] = bswapLE32(patpos[j]);
|
231
233
|
}
|
232
234
|
dwMemPos += pifh.patnum * 4;
|
@@ -282,29 +284,32 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
282
284
|
dwMemPos += CSoundFile_LoadMixPlugins(_this, lpStream+dwMemPos, dwMemLength-dwMemPos);
|
283
285
|
}
|
284
286
|
// Checking for unused channels
|
285
|
-
|
287
|
+
npatterns = pifh.patnum;
|
286
288
|
if (npatterns > MAX_PATTERNS) npatterns = MAX_PATTERNS;
|
287
|
-
for (
|
289
|
+
for (j=0; j<npatterns; j++)
|
288
290
|
{
|
291
|
+
UINT i, len, rows, nrow;
|
292
|
+
const BYTE *p;
|
289
293
|
SDL_memset(chnmask, 0, sizeof(chnmask));
|
290
|
-
if ((!patpos[
|
291
|
-
|
292
|
-
|
294
|
+
if ((!patpos[j]) || ((DWORD)patpos[j] >= dwMemLength - 4)) continue;
|
295
|
+
len = bswapLE16(*((WORD *)(lpStream+patpos[j])));
|
296
|
+
rows = bswapLE16(*((WORD *)(lpStream+patpos[j]+2)));
|
293
297
|
if ((rows < 4) || (rows > 256)) continue;
|
294
|
-
if (8+len > dwMemLength || patpos[
|
295
|
-
|
296
|
-
|
297
|
-
UINT nrow = 0;
|
298
|
+
if (8+len > dwMemLength || patpos[j] > dwMemLength - (8+len)) continue;
|
299
|
+
p = lpStream+patpos[j]+8;
|
300
|
+
i = nrow = 0;
|
298
301
|
while (nrow<rows)
|
299
302
|
{
|
303
|
+
UINT ch;
|
304
|
+
BYTE b;
|
300
305
|
if (i >= len) break;
|
301
|
-
|
306
|
+
b = p[i++];
|
302
307
|
if (!b)
|
303
308
|
{
|
304
309
|
nrow++;
|
305
310
|
continue;
|
306
311
|
}
|
307
|
-
|
312
|
+
ch = b & 0x7F;
|
308
313
|
if (ch) ch = (ch - 1) & 0x3F;
|
309
314
|
if (b & 0x80)
|
310
315
|
{
|
@@ -331,24 +336,24 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
331
336
|
_this->m_nInstruments = 0;
|
332
337
|
if (pifh.flags & 0x04) _this->m_nInstruments = pifh.insnum;
|
333
338
|
if (_this->m_nInstruments >= MAX_INSTRUMENTS) _this->m_nInstruments = MAX_INSTRUMENTS-1;
|
334
|
-
for (
|
339
|
+
for (j=0; j<_this->m_nInstruments; j++)
|
335
340
|
{
|
336
|
-
if ((inspos[
|
337
|
-
(inspos[
|
341
|
+
if ((inspos[j] > 0) && dwMemLength > sizeof(ITOLDINSTRUMENT) &&
|
342
|
+
(inspos[j] < dwMemLength - sizeof(ITOLDINSTRUMENT)))
|
338
343
|
{
|
339
344
|
INSTRUMENTHEADER *penv = (INSTRUMENTHEADER *) SDL_calloc(1, sizeof (INSTRUMENTHEADER));
|
340
345
|
if (!penv) continue;
|
341
|
-
_this->Headers[
|
342
|
-
ITInstrToMPT(lpStream + inspos[
|
346
|
+
_this->Headers[j+1] = penv;
|
347
|
+
ITInstrToMPT(lpStream + inspos[j], penv, pifh.cmwt);
|
343
348
|
}
|
344
349
|
}
|
345
350
|
// Reading Samples
|
346
351
|
_this->m_nSamples = pifh.smpnum;
|
347
352
|
if (_this->m_nSamples >= MAX_SAMPLES) _this->m_nSamples = MAX_SAMPLES-1;
|
348
|
-
for (
|
353
|
+
for (j=0; j<pifh.smpnum; j++) if ((smppos[j]) && (smppos[j] <= dwMemLength - sizeof(ITSAMPLESTRUCT)))
|
349
354
|
{
|
350
355
|
ITSAMPLESTRUCT pis;
|
351
|
-
SDL_memcpy(&pis, lpStream+smppos[
|
356
|
+
SDL_memcpy(&pis, lpStream+smppos[j], sizeof (pis));
|
352
357
|
pis.id = bswapLE32(pis.id);
|
353
358
|
pis.length = bswapLE32(pis.length);
|
354
359
|
pis.loopbegin = bswapLE32(pis.loopbegin);
|
@@ -360,7 +365,7 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
360
365
|
|
361
366
|
if (pis.id == 0x53504D49)
|
362
367
|
{
|
363
|
-
MODINSTRUMENT *pins = &_this->Ins[
|
368
|
+
MODINSTRUMENT *pins = &_this->Ins[j+1];
|
364
369
|
pins->uFlags = 0;
|
365
370
|
pins->nLength = 0;
|
366
371
|
pins->nLoopStart = pis.loopbegin;
|
@@ -387,9 +392,9 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
387
392
|
pins->nVibSweep = (pis.vir + 3) / 4;
|
388
393
|
if ((pis.samplepointer) && (pis.samplepointer < dwMemLength) && (pis.length))
|
389
394
|
{
|
395
|
+
UINT flags = (pis.cvt & 1) ? RS_PCM8S : RS_PCM8U;
|
390
396
|
pins->nLength = pis.length;
|
391
397
|
if (pins->nLength > MAX_SAMPLE_LENGTH) pins->nLength = MAX_SAMPLE_LENGTH;
|
392
|
-
UINT flags = (pis.cvt & 1) ? RS_PCM8S : RS_PCM8U;
|
393
398
|
if (pis.flags & 2)
|
394
399
|
{
|
395
400
|
flags += 5;
|
@@ -404,43 +409,47 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
404
409
|
if (pis.flags & 8) flags = ((pifh.cmwt >= 0x215) && (pis.cvt & 4)) ? RS_IT2158 : RS_IT2148;
|
405
410
|
if (pis.flags & 4) flags |= RSF_STEREO;
|
406
411
|
}
|
407
|
-
CSoundFile_ReadSample(_this, &_this->Ins[
|
412
|
+
CSoundFile_ReadSample(_this, &_this->Ins[j+1], flags, (LPSTR)(lpStream+pis.samplepointer), dwMemLength - pis.samplepointer);
|
408
413
|
}
|
409
414
|
}
|
410
415
|
}
|
411
416
|
// Reading Patterns
|
412
|
-
for (
|
417
|
+
for (j=0; j<npatterns; j++)
|
413
418
|
{
|
414
|
-
|
419
|
+
MODCOMMAND *m;
|
420
|
+
const BYTE *p;
|
421
|
+
UINT i, len, rows, nrow;
|
422
|
+
if ((!patpos[j]) || ((DWORD)patpos[j] >= dwMemLength - 4))
|
415
423
|
{
|
416
|
-
_this->PatternSize[
|
417
|
-
_this->Patterns[
|
424
|
+
_this->PatternSize[j] = 64;
|
425
|
+
_this->Patterns[j] = CSoundFile_AllocatePattern(64, _this->m_nChannels);
|
418
426
|
continue;
|
419
427
|
}
|
420
428
|
|
421
|
-
|
422
|
-
|
429
|
+
len = bswapLE16(*((WORD *)(lpStream+patpos[j])));
|
430
|
+
rows = bswapLE16(*((WORD *)(lpStream+patpos[j]+2)));
|
423
431
|
if ((rows < 4) || (rows > 256)) continue;
|
424
|
-
if (8+len > dwMemLength || patpos[
|
425
|
-
_this->PatternSize[
|
426
|
-
if ((_this->Patterns[
|
432
|
+
if (8+len > dwMemLength || patpos[j] > dwMemLength - (8+len)) continue;
|
433
|
+
_this->PatternSize[j] = rows;
|
434
|
+
if ((_this->Patterns[j] = CSoundFile_AllocatePattern(rows, _this->m_nChannels)) == NULL) continue;
|
427
435
|
SDL_memset(lastvalue, 0, sizeof(lastvalue));
|
428
436
|
SDL_memset(chnmask, 0, sizeof(chnmask));
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
UINT nrow = 0;
|
437
|
+
m = _this->Patterns[j];
|
438
|
+
p = lpStream+patpos[j]+8;
|
439
|
+
i = nrow = 0;
|
433
440
|
while (nrow<rows)
|
434
441
|
{
|
442
|
+
UINT ch;
|
443
|
+
BYTE b;
|
435
444
|
if (i >= len) break;
|
436
|
-
|
445
|
+
b = p[i++];
|
437
446
|
if (!b)
|
438
447
|
{
|
439
448
|
nrow++;
|
440
449
|
m+=_this->m_nChannels;
|
441
450
|
continue;
|
442
451
|
}
|
443
|
-
|
452
|
+
ch = b & 0x7F;
|
444
453
|
if (ch) ch = (ch - 1) & 0x3F;
|
445
454
|
if (b & 0x80)
|
446
455
|
{
|
@@ -467,8 +476,9 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
467
476
|
}
|
468
477
|
if (chnmask[ch] & 1) // Note
|
469
478
|
{
|
479
|
+
UINT note;
|
470
480
|
if (i >= len) break;
|
471
|
-
|
481
|
+
note = p[i++];
|
472
482
|
if (ch < _this->m_nChannels)
|
473
483
|
{
|
474
484
|
if (note < 0x80) note++;
|
@@ -479,8 +489,9 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
479
489
|
}
|
480
490
|
if (chnmask[ch] & 2)
|
481
491
|
{
|
492
|
+
UINT instr;
|
482
493
|
if (i >= len) break;
|
483
|
-
|
494
|
+
instr = p[i++];
|
484
495
|
if (ch < _this->m_nChannels)
|
485
496
|
{
|
486
497
|
m[ch].instr = instr;
|
@@ -489,8 +500,9 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
489
500
|
}
|
490
501
|
if (chnmask[ch] & 4)
|
491
502
|
{
|
503
|
+
UINT vol;
|
492
504
|
if (i >= len) break;
|
493
|
-
|
505
|
+
vol = p[i++];
|
494
506
|
if (ch < _this->m_nChannels)
|
495
507
|
{
|
496
508
|
// 0-64: Set Volume
|
@@ -520,9 +532,10 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
520
532
|
// Reading command/param
|
521
533
|
if (chnmask[ch] & 8)
|
522
534
|
{
|
535
|
+
UINT cmd, param;
|
523
536
|
if (i > len - 2) break;
|
524
|
-
|
525
|
-
|
537
|
+
cmd = p[i++];
|
538
|
+
param = p[i++];
|
526
539
|
if (ch < _this->m_nChannels)
|
527
540
|
{
|
528
541
|
if (cmd)
|
@@ -537,12 +550,12 @@ BOOL CSoundFile_ReadIT(CSoundFile *_this, const BYTE *lpStream, DWORD dwMemLengt
|
|
537
550
|
}
|
538
551
|
}
|
539
552
|
}
|
540
|
-
for (
|
553
|
+
for (j=0; j<MAX_BASECHANNELS; j++)
|
541
554
|
{
|
542
|
-
if (
|
555
|
+
if (j>=_this->m_nChannels)
|
543
556
|
{
|
544
|
-
_this->ChnSettings[
|
545
|
-
_this->ChnSettings[
|
557
|
+
_this->ChnSettings[j].nVolume = 64;
|
558
|
+
_this->ChnSettings[j].dwFlags &= ~CHN_MUTE;
|
546
559
|
}
|
547
560
|
}
|
548
561
|
_this->m_nMinPeriod = 8;
|
@@ -607,6 +620,7 @@ DWORD ITUnpack8Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dw
|
|
607
620
|
|
608
621
|
while (dwLen)
|
609
622
|
{
|
623
|
+
DWORD d, dwPos;
|
610
624
|
if (!wCount)
|
611
625
|
{
|
612
626
|
wCount = 0x8000;
|
@@ -616,10 +630,10 @@ DWORD ITUnpack8Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD dw
|
|
616
630
|
bTemp = bTemp2 = 0;
|
617
631
|
bitbuf = bitnum = 0;
|
618
632
|
}
|
619
|
-
|
633
|
+
d = wCount;
|
620
634
|
if (d > dwLen) d = dwLen;
|
621
635
|
// Unpacking
|
622
|
-
|
636
|
+
dwPos = 0;
|
623
637
|
do
|
624
638
|
{
|
625
639
|
WORD wBits = (WORD)ITReadBits(&bitbuf, &bitnum, &pSrc, pStop, bLeft);
|
@@ -693,6 +707,7 @@ DWORD ITUnpack16Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD d
|
|
693
707
|
|
694
708
|
while (dwLen)
|
695
709
|
{
|
710
|
+
DWORD d, dwPos;
|
696
711
|
if (!wCount)
|
697
712
|
{
|
698
713
|
wCount = 0x4000;
|
@@ -702,10 +717,10 @@ DWORD ITUnpack16Bit(signed char *pSample, DWORD dwLen, LPBYTE lpMemFile, DWORD d
|
|
702
717
|
wTemp = wTemp2 = 0;
|
703
718
|
bitbuf = bitnum = 0;
|
704
719
|
}
|
705
|
-
|
720
|
+
d = wCount;
|
706
721
|
if (d > dwLen) d = dwLen;
|
707
722
|
// Unpacking
|
708
|
-
|
723
|
+
dwPos = 0;
|
709
724
|
do
|
710
725
|
{
|
711
726
|
DWORD dwBits = ITReadBits(&bitbuf, &bitnum, &pSrc, pStop, bLeft);
|
@@ -767,7 +782,7 @@ UINT CSoundFile_LoadMixPlugins(CSoundFile *_this, const void *pData, UINT nLen)
|
|
767
782
|
//-----------------------------------------------------------
|
768
783
|
{
|
769
784
|
const BYTE *p = (const BYTE *)pData;
|
770
|
-
UINT nPos = 0;
|
785
|
+
UINT nPos = 0, ch;
|
771
786
|
|
772
787
|
while (nPos+8 < nLen)
|
773
788
|
{
|
@@ -777,7 +792,7 @@ UINT CSoundFile_LoadMixPlugins(CSoundFile *_this, const void *pData, UINT nLen)
|
|
777
792
|
if (nPluginSize > nLen-nPos-8) break;;
|
778
793
|
if ((bswapLE32(*(DWORD *)(p+nPos))) == 0x58464843)
|
779
794
|
{
|
780
|
-
for (
|
795
|
+
for (ch=0; ch<64; ch++) if (ch*4 < nPluginSize)
|
781
796
|
{
|
782
797
|
_this->ChnSettings[ch].nMixPlugin = bswapLE32(*(DWORD *)(p+nPos+8+ch*4));
|
783
798
|
}
|