summaryrefslogtreecommitdiff
path: root/media-libs/libmodplug/files/libmodplug-0.8.8.5-psm-omf2097-fixes.patch
diff options
context:
space:
mode:
Diffstat (limited to 'media-libs/libmodplug/files/libmodplug-0.8.8.5-psm-omf2097-fixes.patch')
-rw-r--r--media-libs/libmodplug/files/libmodplug-0.8.8.5-psm-omf2097-fixes.patch134
1 files changed, 134 insertions, 0 deletions
diff --git a/media-libs/libmodplug/files/libmodplug-0.8.8.5-psm-omf2097-fixes.patch b/media-libs/libmodplug/files/libmodplug-0.8.8.5-psm-omf2097-fixes.patch
new file mode 100644
index 000000000000..1badfb46af5b
--- /dev/null
+++ b/media-libs/libmodplug/files/libmodplug-0.8.8.5-psm-omf2097-fixes.patch
@@ -0,0 +1,134 @@
+diff -uNr libmodplug-0.8.8.5.ORIG/src/load_psm.cpp libmodplug-0.8.8.5/src/load_psm.cpp
+--- libmodplug-0.8.8.5.ORIG/src/load_psm.cpp 2014-08-04 22:25:14.743262000 +0100
++++ libmodplug-0.8.8.5/src/load_psm.cpp 2014-08-04 22:26:56.907267088 +0100
+@@ -286,66 +286,49 @@
+ if ((Patterns[nPat] = AllocatePattern(nRows, m_nChannels)) == NULL) break;
+ MODCOMMAND *m = Patterns[nPat];
+ BYTE *p = pPsmPat->data;
++ MODCOMMAND *sp, dummy;
+ UINT pos = 0;
+ UINT row = 0;
+- UINT oldch = 0;
+- BOOL bNewRow = FALSE;
++ UINT rowlim;
+ #ifdef PSM_LOG
+ Log("Pattern %d at offset 0x%04X\n", nPat, (DWORD)(p - (BYTE *)lpStream));
+ #endif
++ UINT flags, ch;
++ rowlim = bswapLE16(pPsmPat->reserved1)-2;
+ while ((row < nRows) && (pos+1 < len))
+ {
+- UINT flags = p[pos++];
+- UINT ch = p[pos++];
+-
+- #ifdef PSM_LOG
+- //Log("flags+ch: %02X.%02X\n", flags, ch);
+- #endif
+- if (((flags & 0xf0) == 0x10) && (ch <= oldch) /*&& (!bNewRow)*/)
+- {
+- if ((pos+1<len) && (!(p[pos] & 0x0f)) && (p[pos+1] < m_nChannels))
+- {
+- #ifdef PSM_LOG
+- //if (!nPat) Log("Continuing on new row\n");
+- #endif
+- row++;
+- m += m_nChannels;
+- oldch = ch;
+- continue;
+- }
+- }
+- if ((pos >= len) || (row >= nRows)) break;
+- if (!(flags & 0xf0))
+- {
+- #ifdef PSM_LOG
+- //if (!nPat) Log("EOR(%d): %02X.%02X\n", row, p[pos], p[pos+1]);
+- #endif
+- row++;
++ if ((pos+1) >= rowlim) {
++ pos = rowlim;
++ rowlim = (((int)p[pos+1])<<8)
++ | ((int)p[pos+0]);
+ m += m_nChannels;
+- bNewRow = TRUE;
+- oldch = ch;
+- continue;
+- }
+- bNewRow = FALSE;
+- if (ch >= m_nChannels)
+- {
+- #ifdef PSM_LOG
+- if (!nPat) Log("Invalid channel row=%d (0x%02X.0x%02X)\n", row, flags, ch);
+- #endif
+- ch = 0;
++ row++;
++ rowlim += pos;
++ pos += 2;
+ }
++ flags = p[pos++];
++ ch = p[pos++];
++ if (ch >= m_nChannels) {
++ sp = &dummy;
++ } else {
++ sp = &m[ch];
++ }
+ // Note + Instr
++ if ((flags & 0x80) && (pos+1 < len))
++ {
++ UINT note = p[pos++];
++ note = (note>>4)*12+(note&0x0f)+12+1;
++ if (note > 0x80) note = 0;
++ m[ch].note = note;
++ }
+ if ((flags & 0x40) && (pos+1 < len))
+ {
+- UINT note = p[pos++];
+ UINT nins = p[pos++];
+ #ifdef PSM_LOG
+ //if (!nPat) Log("note+ins: %02X.%02X\n", note, nins);
+ if ((!nPat) && (nins >= m_nSamples)) Log("WARNING: invalid instrument number (%d)\n", nins);
+ #endif
+- if ((note) && (note < 0x80)) note = (note>>4)*12+(note&0x0f)+12+1;
+ m[ch].instr = samplemap[nins];
+- m[ch].note = note;
+ }
+ // Volume
+ if ((flags & 0x20) && (pos < len))
+@@ -362,13 +345,29 @@
+ switch(command)
+ {
+ // 01: fine volslide up
+- case 0x01: command = CMD_VOLUMESLIDE; param |= 0x0f; break;
++ case 0x01: command = CMD_VOLUMESLIDE; param |= 0x0f;
++ if (param == 15) param=31;
++ break;
++ // 02: volslide up
++ case 0x02: command = CMD_VOLUMESLIDE; param>>=1; param<<=4; break;
++ // 03: fine volslide down
++ case 0x03: command = CMD_VOLUMESLIDE; param>>=4; param |= 0xf0;
++ if (param == 240) param=241;
++ break;
+ // 04: fine volslide down
+ case 0x04: command = CMD_VOLUMESLIDE; param>>=4; param |= 0xf0; break;
+ // 0C: portamento up
+ case 0x0C: command = CMD_PORTAMENTOUP; param = (param+1)/2; break;
+ // 0E: portamento down
+ case 0x0E: command = CMD_PORTAMENTODOWN; param = (param+1)/2; break;
++ // 0F: tone portamento
++ case 0x0F: command = CMD_TONEPORTAMENTO; param = param/4; break;
++ // 15: vibrato
++ case 0x15: command = CMD_VIBRATO; break;
++ // 29: sample offset
++ case 0x29: pos += 2; break;
++ // 2A: retrigger note
++ case 0x2A: command = CMD_RETRIG; break;
+ // 33: Position Jump
+ case 0x33: command = CMD_POSITIONJUMP; break;
+ // 34: Pattern break
+@@ -387,7 +386,6 @@
+ m[ch].command = (BYTE)command;
+ m[ch].param = (BYTE)param;
+ }
+- oldch = ch;
+ }
+ #ifdef PSM_LOG
+ if (pos < len)