|
From: <sag...@us...> - 2010-06-06 16:33:15
|
Revision: 618
http://modplug.svn.sourceforge.net/modplug/?rev=618&view=rev
Author: saga-games
Date: 2010-06-06 16:33:09 +0000 (Sun, 06 Jun 2010)
Log Message:
-----------
[Fix] XM Compatibility: Various fixes to the pattern loop command (E6x), including a crucial FT2 bug: When E60 is used on a pattern row x, the following pattern also starts from row x instead of the beginning of the pattern, unless there was a Dxx or Cxx effect.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Snd_fx.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
trunk/OpenMPT/soundlib/Sndfile.h
trunk/OpenMPT/soundlib/Sndmix.cpp
Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-06-06 12:40:17 UTC (rev 617)
+++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-06-06 16:33:09 UTC (rev 618)
@@ -236,16 +236,20 @@
patternBreakOnThisRow=true;
//Try to check next row for XPARAM
nextRow = nullptr;
- if (nRow < Patterns[nPattern].GetNumRows()-1) {
+ if (nRow < Patterns[nPattern].GetNumRows() - 1)
+ {
nextRow = Patterns[nPattern] + (nRow+1) * m_nChannels + nChn;
}
- if (nextRow && nextRow->command == CMD_XPARAM) {
+ if (nextRow && nextRow->command == CMD_XPARAM)
+ {
nNextRow = (param<<8) + nextRow->param;
- } else {
+ } else
+ {
nNextRow = param;
}
- if (!positionJumpOnThisRow) {
+ if (!positionJumpOnThisRow)
+ {
nNextPattern = nCurrentPattern + 1;
}
if (bAdjust)
@@ -1912,6 +1916,7 @@
// Position Jump
case CMD_POSITIONJUMP:
+ m_nNextPatStartRow = 0; // FT2 E60 bug
nPosJump = param;
if((m_dwSongFlags & SONG_PATTERNLOOP && m_nSeqOverride == 0))
{
@@ -1927,6 +1932,7 @@
// Pattern Break
case CMD_PATTERNBREAK:
+ m_nNextPatStartRow = 0; // FT2 E60 bug
m = NULL;
if (m_nRow < Patterns[m_nPattern].GetNumRows()-1)
{
@@ -1990,7 +1996,7 @@
// Pattern Break / Position Jump only if no loop running
if ((nBreakRow >= 0) || (nPosJump >= 0))
{
- BOOL bNoLoop = FALSE;
+ bool bNoLoop = false;
if (nPosJump < 0) nPosJump = m_nCurrentPattern+1;
if (nBreakRow < 0) nBreakRow = 0;
@@ -2011,7 +2017,7 @@
if (gdwSoundSetup & SNDMIX_NOBACKWARDJUMPS)
#endif
// Backward jump disabled
- bNoLoop = TRUE;
+ bNoLoop = true;
}
}
}
@@ -2032,7 +2038,7 @@
}
m_nNextPattern = nPosJump;
m_nNextRow = (UINT)nBreakRow;
- m_bPatternTransitionOccurred=true;
+ m_bPatternTransitionOccurred = true;
}
} //Ends condition (nBreakRow >= 0) || (nPosJump >= 0)
}
@@ -3640,8 +3646,8 @@
pChn->nPatternLoopCount--;
if(!pChn->nPatternLoopCount)
{
- //IT compatibility 10. Pattern loops (+ same fix for XM and MOD files)
- if(IsCompatibleMode(TRK_IMPULSETRACKER | TRK_FASTTRACKER2 | TRK_PROTRACKER))
+ //IT compatibility 10. Pattern loops (+ same fix for MOD files)
+ if(IsCompatibleMode(TRK_IMPULSETRACKER | TRK_PROTRACKER))
pChn->nPatternLoop = m_nRow + 1;
return -1;
@@ -3661,6 +3667,7 @@
}
pChn->nPatternLoopCount = param;
}
+ m_nNextPatStartRow = pChn->nPatternLoop; // Nasty FT2 E60 bug emulation!
return pChn->nPatternLoop;
} else
{
@@ -3990,12 +3997,12 @@
return nPlugin;
}
-UINT CSoundFile::GetBestMidiChan(MODCHANNEL *pChn) {
-//--------------------------------------------------
- if (pChn && pChn->pModInstrument) {
- if (pChn->pModInstrument->nMidiChannel) {
- return (pChn->pModInstrument->nMidiChannel-1)&0x0F;
- }
+UINT CSoundFile::GetBestMidiChan(MODCHANNEL *pChn)
+//------------------------------------------------
+{
+ if (pChn && pChn->pModInstrument && pChn->pModInstrument->nMidiChannel)
+ {
+ return (pChn->pModInstrument->nMidiChannel - 1) & 0x0F;
}
return 0;
}
@@ -4003,11 +4010,13 @@
void CSoundFile::HandlePatternTransitionEvents()
//----------------------------------------------
{
- if (m_bPatternTransitionOccurred) {
+ if (m_bPatternTransitionOccurred)
+ {
// MPT sequence override
if ((m_nSeqOverride > 0) && (m_nSeqOverride <= Order.size()))
{
- if (m_dwSongFlags & SONG_PATTERNLOOP) {
+ if (m_dwSongFlags & SONG_PATTERNLOOP)
+ {
m_nPattern = Order[m_nSeqOverride-1];
}
m_nNextPattern = m_nSeqOverride - 1;
@@ -4015,7 +4024,8 @@
}
// Channel mutes
- for (UINT chan=0; chan<m_nChannels; chan++) {
+ for (UINT chan=0; chan<m_nChannels; chan++)
+ {
if (m_bChannelMuteTogglePending[chan])
{
if(m_pModDoc)
@@ -4023,8 +4033,6 @@
m_bChannelMuteTogglePending[chan]=false;
}
}
-
-
m_bPatternTransitionOccurred=false;
}
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2010-06-06 12:40:17 UTC (rev 617)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2010-06-06 16:33:09 UTC (rev 618)
@@ -539,6 +539,7 @@
m_nPattern = 0;
m_nCurrentPattern = 0;
m_nNextPattern = 0;
+ m_nNextPatStartRow = 0;
m_nSeqOverride = 0;
m_nRestartPos = 0;
m_nMinPeriod = 16;
@@ -1226,6 +1227,7 @@
m_nBufferCount = 0;
m_nPatternDelay = 0;
m_nFrameDelay = 0;
+ m_nNextPatStartRow = 0;
//m_nSeqOverride = 0;
}
@@ -1272,6 +1274,7 @@
m_nTotalCount = 0;
m_nPatternDelay = 0;
m_nFrameDelay = 0;
+ m_nNextPatStartRow = 0;
}
//m_dwSongFlags &= ~(SONG_PATTERNLOOP|SONG_CPUVERYHIGH|SONG_FADINGSONG|SONG_ENDREACHED|SONG_GLOBALFADE);
m_dwSongFlags &= ~(SONG_CPUVERYHIGH|SONG_FADINGSONG|SONG_ENDREACHED|SONG_GLOBALFADE);
@@ -1381,6 +1384,7 @@
m_nPatternDelay = 0;
m_nFrameDelay = 0;
m_nBufferCount = 0;
+ m_nNextPatStartRow = 0;
m_dwSongFlags |= SONG_PATTERNLOOP;
// m_nSeqOverride = 0;
}
@@ -1397,6 +1401,7 @@
m_nPatternDelay = 0;
m_nFrameDelay = 0;
m_nBufferCount = 0;
+ m_nNextPatStartRow = 0;
m_dwSongFlags &= ~SONG_PATTERNLOOP;
//m_nSeqOverride = 0;
}
Modified: trunk/OpenMPT/soundlib/Sndfile.h
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.h 2010-06-06 12:40:17 UTC (rev 617)
+++ trunk/OpenMPT/soundlib/Sndfile.h 2010-06-06 16:33:09 UTC (rev 618)
@@ -566,6 +566,7 @@
BYTE m_nMixLevels;
UINT m_nMusicSpeed, m_nMusicTempo;
ROWINDEX m_nNextRow, m_nRow;
+ ROWINDEX m_nNextPatStartRow; // for FT2's E60 bug
PATTERNINDEX m_nPattern;
ORDERINDEX m_nCurrentPattern, m_nNextPattern, m_nRestartPos, m_nSeqOverride;
//NOTE: m_nCurrentPattern and m_nNextPattern refer to order index - not pattern index.
Modified: trunk/OpenMPT/soundlib/Sndmix.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndmix.cpp 2010-06-06 12:40:17 UTC (rev 617)
+++ trunk/OpenMPT/soundlib/Sndmix.cpp 2010-06-06 16:33:09 UTC (rev 618)
@@ -625,7 +625,7 @@
BOOL CSoundFile::ProcessRow()
//---------------------------
{
- if (++m_nTickCount >= m_nMusicSpeed * (m_nPatternDelay+1) + m_nFrameDelay)
+ if (++m_nTickCount >= m_nMusicSpeed * (m_nPatternDelay + 1) + m_nFrameDelay)
{
HandlePatternTransitionEvents();
m_nPatternDelay = 0;
@@ -758,8 +758,16 @@
if (m_nNextRow >= Patterns[m_nPattern].GetNumRows())
{
if (!(m_dwSongFlags & SONG_PATTERNLOOP)) m_nNextPattern = m_nCurrentPattern + 1;
+ m_bPatternTransitionOccurred = true;
m_nNextRow = 0;
- m_bPatternTransitionOccurred=true;
+
+ // FT2 idiosyncrasy: When E60 is used on a pattern row x, the following pattern also starts from row x
+ // instead of the beginning of the pattern, unless there was a Dxx or Cxx effect.
+ if(IsCompatibleMode(TRK_FASTTRACKER2))
+ {
+ m_nNextRow = m_nNextPatStartRow;
+ m_nNextPatStartRow = 0;
+ }
}
// Reset channel values
MODCHANNEL *pChn = Chn;
@@ -786,14 +794,16 @@
m_dwSongFlags |= SONG_FIRSTTICK;
//End of row? stop pattern step (aka "play row").
- if (m_nTickCount >= m_nMusicSpeed * (m_nPatternDelay+1) + m_nFrameDelay - 1) {
- #ifdef MODPLUG_TRACKER
- if (m_dwSongFlags & SONG_STEP) {
+#ifdef MODPLUG_TRACKER
+ if (m_nTickCount >= m_nMusicSpeed * (m_nPatternDelay + 1) + m_nFrameDelay - 1)
+ {
+ if (m_dwSongFlags & SONG_STEP)
+ {
m_dwSongFlags &= ~SONG_STEP;
m_dwSongFlags |= SONG_PAUSED;
}
- #endif // MODPLUG_TRACKER
}
+#endif // MODPLUG_TRACKER
if (m_nTickCount)
{
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|