From: <sag...@us...> - 2011-10-10 22:13:58
|
Revision: 1102 http://modplug.svn.sourceforge.net/modplug/?rev=1102&view=rev Author: saga-games Date: 2011-10-10 22:13:51 +0000 (Mon, 10 Oct 2011) Log Message: ----------- [Mod] Channel Manager: Changed update messages sent to other views to only contain sensible update messages. [Fix] Pattern loops in S3M files (tx Greasemonkey) - pattern loops have no per-channel memory in ST3. [Fix] In FT2 compatible mode, volume column tone portamento still had an effect memory. Modified Paths: -------------- trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp =================================================================== --- trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp 2011-10-10 15:08:27 UTC (rev 1101) +++ trunk/OpenMPT/mptrack/ChannelManagerDlg.cpp 2011-10-10 22:13:51 UTC (rev 1102) @@ -188,7 +188,7 @@ CriticalSection cs; //Creating new order-vector for ReArrangeChannels. - vector<CHANNELINDEX> newChnOrder; newChnOrder.reserve(nChannels); + vector<CHANNELINDEX> newChnOrder(nChannels); for(CHANNELINDEX nChn = 0; nChn < nChannels; nChn++) { newChnOrder.push_back(newpat[nChn]); @@ -227,8 +227,7 @@ // Update document & player pModDoc->SetModified(); - pModDoc->UpdateAllViews(NULL,0xff,NULL); - pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS ); //refresh channel headers + pModDoc->UpdateAllViews(NULL, HINT_MODTYPE | HINT_MODCHANNELS, NULL); //refresh channel headers // Redraw channel manager window InvalidateRect(NULL,TRUE); @@ -288,16 +287,19 @@ CModDoc *pModDoc = pMainFrm ? pMainFrm->GetActiveDoc() : NULL; CSoundFile * m_pSndFile = pModDoc ? pModDoc->GetSoundFile() : NULL; - if(pModDoc && m_pSndFile){ + if(pModDoc && m_pSndFile) + { int nbOk = 0, nbSelect = 0; - switch(currentTab){ + switch(currentTab) + { case 0: for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) { CHANNELINDEX nThisChn = pattern[nChn]; - if(!removed[nThisChn]){ + if(!removed[nThisChn]) + { if(select[nThisChn]) nbSelect++; if(select[nThisChn] && pModDoc->IsChannelSolo(nThisChn)) nbOk++; } @@ -317,7 +319,8 @@ for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) { CHANNELINDEX nThisChn = pattern[nChn]; - if(!removed[nThisChn]){ + if(!removed[nThisChn]) + { if(select[nThisChn]) nbSelect++; BYTE rec = pModDoc->IsChannelRecord(nThisChn); if(select[nThisChn] && rec == 1) nbOk++; @@ -326,7 +329,8 @@ for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) { CHANNELINDEX nThisChn = pattern[nChn]; - if(!removed[nThisChn] && select[nThisChn]){ + if(!removed[nThisChn] && select[nThisChn]) + { if(select[nThisChn] && nbSelect != nbOk && pModDoc->IsChannelRecord(nThisChn) != 1) pModDoc->Record1Channel(nThisChn); else if(nbSelect == nbOk) pModDoc->Record1Channel(nThisChn, false); } @@ -354,7 +358,7 @@ ResetState(); LeaveCriticalSection(&applying); - pModDoc->UpdateAllViews(NULL,0xff,NULL); + pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS, NULL); InvalidateRect(NULL,FALSE); } else LeaveCriticalSection(&applying); @@ -377,7 +381,8 @@ for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) { CHANNELINDEX nThisChn = pattern[nChn]; - if(!removed[nThisChn]){ + if(!removed[nThisChn]) + { if(select[nThisChn]) nbSelect++; if(select[nThisChn] && pModDoc->IsChannelMuted(nThisChn)) nbOk++; } @@ -385,7 +390,8 @@ for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) { CHANNELINDEX nThisChn = pattern[nChn]; - if(select[nThisChn] && !removed[nThisChn]){ + if(select[nThisChn] && !removed[nThisChn]) + { if(pModDoc->IsChannelSolo(nThisChn)) pModDoc->SoloChannel(nThisChn, false); if(nbSelect == nbOk) pModDoc->MuteChannel(nThisChn, !pModDoc->IsChannelMuted(nThisChn)); else pModDoc->MuteChannel(nThisChn, true); @@ -396,7 +402,8 @@ for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) { CHANNELINDEX nThisChn = pattern[nChn]; - if(!removed[nThisChn]){ + if(!removed[nThisChn]) + { if(select[nThisChn]) nbSelect++; BYTE rec = pModDoc->IsChannelRecord(nThisChn); if(select[nThisChn] && rec == 2) nbOk++; @@ -405,7 +412,8 @@ for(CHANNELINDEX nChn = 0; nChn < m_pSndFile->m_nChannels; nChn++) { CHANNELINDEX nThisChn = pattern[nChn]; - if(!removed[nThisChn] && select[nThisChn]){ + if(!removed[nThisChn] && select[nThisChn]) + { if(select[nThisChn] && nbSelect != nbOk && pModDoc->IsChannelRecord(nThisChn) != 2) pModDoc->Record2Channel(nThisChn); else if(nbSelect == nbOk) pModDoc->Record2Channel(nThisChn, false); } @@ -428,7 +436,7 @@ if(currentTab != 3) ResetState(); LeaveCriticalSection(&applying); - pModDoc->UpdateAllViews(NULL,0xff,NULL); + pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS, NULL); InvalidateRect(NULL,FALSE); } else LeaveCriticalSection(&applying); @@ -512,7 +520,7 @@ if(currentTab != 3) ResetState(); LeaveCriticalSection(&applying); - pModDoc->UpdateAllViews(NULL,0xff,NULL); + pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS, NULL); InvalidateRect(NULL,FALSE); } @@ -1028,7 +1036,7 @@ for(CHANNELINDEX nChn = 0; nChn < MAX_BASECHANNELS ; nChn++) state[pattern[nChn]] = false; - if(pModDoc) pModDoc->UpdateAllViews(NULL,0xff,NULL); + if(pModDoc) pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS, NULL); LeaveCriticalSection(&applying); } @@ -1060,7 +1068,7 @@ rightButton = false; CMainFrame * pMainFrm = CMainFrame::GetMainFrame(); CModDoc *pModDoc = pMainFrm->GetActiveDoc(); - if(pModDoc) pModDoc->UpdateAllViews(NULL,0xff,NULL); + if(pModDoc) pModDoc->UpdateAllViews(NULL, HINT_MODCHANNELS, NULL); LeaveCriticalSection(&applying); } Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-10 15:08:27 UTC (rev 1101) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2011-10-10 22:13:51 UTC (rev 1102) @@ -1425,8 +1425,18 @@ if ((((param & 0xF0) == 0x60) && (cmd == CMD_MODCMDEX)) || (((param & 0xF0) == 0xB0) && (cmd == CMD_S3MCMDEX))) { - int nloop = PatternLoop(pChn, param & 0x0F); - if (nloop >= 0) nPatLoopRow = nloop; + ROWINDEX nloop = PatternLoop(pChn, param & 0x0F); + if (nloop != ROWINDEX_INVALID) nPatLoopRow = nloop; + + if(GetType() == MOD_TYPE_S3M) + { + // ST3 doesn't have per-channel pattern loop memory, so spam all changes to other channels as well. + for (CHANNELINDEX i = 0; i < GetNumChannels(); i++) + { + Chn[i].nPatternLoop = pChn->nPatternLoop; + Chn[i].nPatternLoopCount = pChn->nPatternLoopCount; + } + } } else // Pattern Delay if ((param & 0xF0) == 0xE0) @@ -1661,7 +1671,7 @@ { if (m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) TonePortamento(pChn, ImpulseTrackerPortaVolCmd[vol & 0x0F]); - else + else if(vol != 0 || !IsCompatibleMode(TRK_FASTTRACKER2)) TonePortamento(pChn, vol * 16); } else { @@ -1673,7 +1683,6 @@ case VOLCMD_VOLUME: case VOLCMD_PANNING: case VOLCMD_VIBRATODEPTH: - case VOLCMD_TONEPORTAMENTO: break; default: // no memory here. @@ -1743,7 +1752,7 @@ case VOLCMD_OFFSET: //rewbs.volOff if (m_nTickCount == nStartTick) - SampleOffset(nChn, vol << 3, bPorta); + SampleOffset(nChn, vol << 3); break; } } @@ -1840,8 +1849,12 @@ // Set Offset case CMD_OFFSET: if (m_nTickCount) break; - //rewbs.volOffset: moved sample offset code to own method - SampleOffset(nChn, param, bPorta); + // XM compatibility: Portamento + Offset = Ignore offset + if(bPorta && GetType() == MOD_TYPE_XM) + { + break; + } + SampleOffset(nChn, param); break; // Arpeggio @@ -3073,8 +3086,8 @@ } -inline void CSoundFile::InvertLoop(MODCHANNEL *pChn) -//-------------------------------------------------- +void CSoundFile::InvertLoop(MODCHANNEL *pChn) +//------------------------------------------- { // EFx implementation for MOD files (PT 1.1A and up: Invert Loop) // This effect trashes samples. Thanks to 8bitbubsy for making this work. :) @@ -3453,8 +3466,8 @@ //rewbs.volOffset: moved offset code to own method as it will be used in several places now -void CSoundFile::SampleOffset(CHANNELINDEX nChn, UINT param, bool bPorta) -//----------------------------------------------------------------------- +void CSoundFile::SampleOffset(CHANNELINDEX nChn, UINT param) +//---------------------------------------------------------- { MODCHANNEL *pChn = &Chn[nChn]; @@ -3489,11 +3502,6 @@ if ((pChn->rowCommand.note >= NOTE_MIN) && (pChn->rowCommand.note <= NOTE_MAX)) { - // XM compatibility: Portamento + Offset = Ignore offset - if(bPorta && GetType() == MOD_TYPE_XM) - { - return; - } pChn->nPos = param; if (pChn->nPos >= pChn->nLength) @@ -3648,7 +3656,7 @@ { if (pChn->pModSample) pChn->nLength = pChn->pModSample->nLength; - SampleOffset(nChn, offset, false); + SampleOffset(nChn, offset); } } @@ -3869,33 +3877,39 @@ } -int CSoundFile::PatternLoop(MODCHANNEL *pChn, UINT param) -//------------------------------------------------------- +ROWINDEX CSoundFile::PatternLoop(MODCHANNEL *pChn, UINT param) +//------------------------------------------------------------ { if (param) { + // Loop Repeat if (pChn->nPatternLoopCount) { + // There's a loop left pChn->nPatternLoopCount--; if(!pChn->nPatternLoopCount) { - //IT compatibility 10. Pattern loops (+ same fix for MOD files) - if(IsCompatibleMode(TRK_IMPULSETRACKER | TRK_PROTRACKER)) + // IT compatibility 10. Pattern loops (+ same fix for MOD / S3M files) + // When finishing a pattern loop, the next loop without a dedicated SB0 starts on the first row after the previous loop. + if(IsCompatibleMode(TRK_IMPULSETRACKER | TRK_PROTRACKER | TRK_SCREAMTRACKER)) + { pChn->nPatternLoop = m_nRow + 1; + } - return -1; + return ROWINDEX_INVALID; } } else { - MODCHANNEL *p = Chn; + // This was the last loop - //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 XM and MOD files) + if(!IsCompatibleMode(TRK_IMPULSETRACKER | TRK_FASTTRACKER2 | TRK_PROTRACKER | TRK_SCREAMTRACKER)) { - for (UINT i=0; i<m_nChannels; i++, p++) if (p != pChn) + MODCHANNEL *p = Chn; + for (CHANNELINDEX i = 0; i < GetNumChannels(); i++, p++) if (p != pChn) { // Loop already done - if (p->nPatternLoopCount) return -1; + if (p->nPatternLoopCount) return ROWINDEX_INVALID; } } pChn->nPatternLoopCount = param; @@ -3904,9 +3918,10 @@ return pChn->nPatternLoop; } else { + // Loop Start pChn->nPatternLoop = m_nRow; } - return -1; + return ROWINDEX_INVALID; } Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2011-10-10 15:08:27 UTC (rev 1101) +++ trunk/OpenMPT/soundlib/Sndfile.h 2011-10-10 22:13:51 UTC (rev 1102) @@ -1006,13 +1006,14 @@ void Tremolo(MODCHANNEL *pChn, UINT param); void Panbrello(MODCHANNEL *pChn, UINT param); void RetrigNote(CHANNELINDEX nChn, int param, UINT offset=0); //rewbs.volOffset: added last param - void SampleOffset(CHANNELINDEX nChn, UINT param, bool bPorta); //rewbs.volOffset: moved offset code to own method + void SampleOffset(CHANNELINDEX nChn, UINT param); void NoteCut(CHANNELINDEX nChn, UINT nTick); - int PatternLoop(MODCHANNEL *, UINT param); + ROWINDEX PatternLoop(MODCHANNEL *, UINT param); void ExtendedMODCommands(CHANNELINDEX nChn, UINT param); void ExtendedS3MCommands(CHANNELINDEX nChn, UINT param); void ExtendedChannelEffect(MODCHANNEL *, UINT param); - inline void InvertLoop(MODCHANNEL* pChn); + void InvertLoop(MODCHANNEL* pChn); + void ProcessMacroOnChannel(CHANNELINDEX nChn); void ProcessMIDIMacro(CHANNELINDEX nChn, bool isSmooth, char *macro, uint8 param = 0, PLUGINDEX plugin = 0); float CalculateSmoothParamChange(float currentValue, float param) const; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |