@@ -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}
0 commit comments