Skip to content

Commit 0a6c8bd

Browse files
committed
Merge pull request #21 from eltoder/ft2-pattern-loop-bug
Add emulation of the FT2 pattern loop bug.
2 parents 0a9280c + afe790a commit 0a6c8bd

File tree

4 files changed

+19
-6
lines changed

4 files changed

+19
-6
lines changed

src/libmodplug/sndfile.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,7 @@ class MODPLUG_EXPORT CSoundFile
578578
UINT m_nType, m_nSamples, m_nInstruments;
579579
UINT m_nTickCount, m_nTotalCount, m_nPatternDelay, m_nFrameDelay;
580580
UINT m_nMusicSpeed, m_nMusicTempo;
581-
UINT m_nNextRow, m_nRow;
581+
UINT m_nNextRow, m_nRow, m_nNextStartRow;
582582
UINT m_nPattern,m_nCurrentPattern,m_nNextPattern,m_nRestartPos;
583583
UINT m_nMasterVolume, m_nGlobalVolume, m_nSongPreAmp;
584584
UINT m_nFreqFactor, m_nTempoFactor, m_nOldGlbVolSlide;

src/snd_fx.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ DWORD CSoundFile::GetLength(BOOL bAdjust, BOOL bTotal)
2121
{
2222
UINT dwElapsedTime=0, nRow=0, nCurrentPattern=0, nNextPattern=0, nPattern=0;
2323
UINT nMusicSpeed=m_nDefaultSpeed, nMusicTempo=m_nDefaultTempo, nNextRow=0;
24-
UINT nMaxRow = 0, nMaxPattern = 0;
24+
UINT nMaxRow = 0, nMaxPattern = 0, nNextStartRow = 0;
2525
LONG nGlbVol = m_nDefaultGlobalVolume, nOldGlbVolSlide = 0;
2626
BYTE samples[MAX_CHANNELS];
2727
BYTE instr[MAX_CHANNELS];
@@ -71,7 +71,8 @@ DWORD CSoundFile::GetLength(BOOL bAdjust, BOOL bTotal)
7171
if (nNextRow >= PatternSize[nPattern])
7272
{
7373
nNextPattern = nCurrentPattern + 1;
74-
nNextRow = 0;
74+
nNextRow = nNextStartRow;
75+
nNextStartRow = 0;
7576
}
7677
if (!nRow)
7778
{
@@ -106,6 +107,7 @@ DWORD CSoundFile::GetLength(BOOL bAdjust, BOOL bTotal)
106107
if (param <= nCurrentPattern) goto EndMod;
107108
nNextPattern = param;
108109
nNextRow = 0;
110+
nNextStartRow = 0;
109111
if (bAdjust)
110112
{
111113
pChn->nPatternLoopCount = 0;
@@ -116,6 +118,7 @@ DWORD CSoundFile::GetLength(BOOL bAdjust, BOOL bTotal)
116118
case CMD_PATTERNBREAK:
117119
nNextRow = param;
118120
nNextPattern = nCurrentPattern + 1;
121+
nNextStartRow = 0;
119122
if (bAdjust)
120123
{
121124
pChn->nPatternLoopCount = 0;
@@ -157,7 +160,10 @@ DWORD CSoundFile::GetLength(BOOL bAdjust, BOOL bTotal)
157160
if ((param & 0xF0) == 0x60)
158161
{
159162
if (param & 0x0F) dwElapsedTime += (dwElapsedTime - patloop[nChn]) * (param & 0x0F);
160-
else patloop[nChn] = dwElapsedTime;
163+
else {
164+
patloop[nChn] = dwElapsedTime;
165+
if (m_nType & MOD_TYPE_XM) nNextStartRow = nRow;
166+
}
161167
}
162168
break;
163169
}
@@ -1169,11 +1175,13 @@ BOOL CSoundFile::ProcessEffects()
11691175
// Position Jump
11701176
case CMD_POSITIONJUMP:
11711177
nPosJump = param;
1178+
m_nNextStartRow = 0;
11721179
break;
11731180

11741181
// Pattern Break
11751182
case CMD_PATTERNBREAK:
11761183
nBreakRow = param;
1184+
m_nNextStartRow = 0;
11771185
break;
11781186

11791187
// Midi Controller
@@ -2127,6 +2135,7 @@ int CSoundFile::PatternLoop(MODCHANNEL *pChn, UINT param)
21272135
} else
21282136
{
21292137
pChn->nPatternLoop = m_nRow;
2138+
if (m_nType & MOD_TYPE_XM) m_nNextStartRow = m_nRow;
21302139
}
21312140
return -1;
21322141
}

src/sndfile.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ BOOL CSoundFile::Create(LPCBYTE lpStream, DWORD dwMemLength)
103103
m_nFrameDelay = 0;
104104
m_nNextRow = 0;
105105
m_nRow = 0;
106+
m_nNextStartRow = 0;
106107
m_nPattern = 0;
107108
m_nCurrentPattern = 0;
108109
m_nNextPattern = 0;
@@ -244,6 +245,7 @@ BOOL CSoundFile::Create(LPCBYTE lpStream, DWORD dwMemLength)
244245
m_nTickCount = m_nMusicSpeed;
245246
m_nNextRow = 0;
246247
m_nRow = 0;
248+
m_nNextStartRow = 0;
247249
if ((m_nRestartPos >= MAX_ORDERS) || (Order[m_nRestartPos] >= MAX_PATTERNS)) m_nRestartPos = 0;
248250
// Load plugins
249251
if (gpMixPluginCreateProc)
@@ -678,6 +680,7 @@ void CSoundFile::SetCurrentPos(UINT nPos)
678680
}
679681
m_nNextPattern = nPattern;
680682
m_nNextRow = nRow;
683+
m_nNextStartRow = 0;
681684
m_nTickCount = m_nMusicSpeed;
682685
m_nBufferCount = 0;
683686
m_nPatternDelay = 0;
@@ -706,7 +709,7 @@ void CSoundFile::SetCurrentOrder(UINT nPos)
706709
} else
707710
{
708711
m_nNextPattern = nPos;
709-
m_nRow = m_nNextRow = 0;
712+
m_nRow = m_nNextRow = m_nNextStartRow = 0;
710713
m_nPattern = 0;
711714
m_nTickCount = m_nMusicSpeed;
712715
m_nBufferCount = 0;

src/sndmix.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,8 @@ BOOL CSoundFile::ProcessRow()
419419
if (m_nNextRow >= PatternSize[m_nPattern])
420420
{
421421
if (!(m_dwSongFlags & SONG_PATTERNLOOP)) m_nNextPattern = m_nCurrentPattern + 1;
422-
m_nNextRow = 0;
422+
m_nNextRow = m_nNextStartRow;
423+
m_nNextStartRow = 0;
423424
}
424425
// Reset channel values
425426
MODCHANNEL *pChn = Chn;

0 commit comments

Comments
 (0)