From: <sag...@us...> - 2010-03-23 17:44:51
|
Revision: 546 http://modplug.svn.sourceforge.net/modplug/?rev=546&view=rev Author: saga-games Date: 2010-03-23 17:44:41 +0000 (Tue, 23 Mar 2010) Log Message: ----------- [Fix] Loaders: Some mod formats were erroneously converted to IT instead of XM since revision 532. [Fix] Multi window edit: When (un)muting a channel from the general tab in window 1, it was instantly shown in the pattern editor of window 2, but not vice versa. [Fix] XM Compatibility: Improved handling of the situation when a 3xx effect was used, but previously no note was playing. [Fix] Channel Manager: When removing channels using the channel manager, their names were not cleared properly. [Imp] S3M Loader: Display a message if an S3M file contains Adlib instruments (rare). [Imp] Effect vis: Make use of song's own row highlighting variables instead of fixed global ones. [Ref] Some more small internal changes. Revision Links: -------------- http://modplug.svn.sourceforge.net/modplug/?rev=532&view=rev Modified Paths: -------------- trunk/OpenMPT/mptrack/EffectVis.cpp trunk/OpenMPT/mptrack/InputHandler.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/mptrack/EffectVis.cpp =================================================================== --- trunk/OpenMPT/mptrack/EffectVis.cpp 2010-03-22 21:03:07 UTC (rev 545) +++ trunk/OpenMPT/mptrack/EffectVis.cpp 2010-03-23 17:44:41 UTC (rev 546) @@ -268,9 +268,9 @@ // Draw vertical grid lines for (UINT row=m_startRow; row<=m_endRow; row++) { - if (row % CMainFrame::m_nRowSpacing == 0) + if (row % m_pSndFile->m_nRowsPerMeasure == 0) CMainFrame::penScratch = CMainFrame::penGrayff; - else if (row % CMainFrame::m_nRowSpacing2 == 0) + else if (row % m_pSndFile->m_nRowsPerBeat == 0) CMainFrame::penScratch = CMainFrame::penGray99; else CMainFrame::penScratch = CMainFrame::penGray55; Modified: trunk/OpenMPT/mptrack/InputHandler.cpp =================================================================== --- trunk/OpenMPT/mptrack/InputHandler.cpp 2010-03-22 21:03:07 UTC (rev 545) +++ trunk/OpenMPT/mptrack/InputHandler.cpp 2010-03-23 17:44:41 UTC (rev 546) @@ -189,10 +189,10 @@ void CInputHandler::SetupSpecialKeyInterception() { m_bInterceptWindowsKeys = m_bInterceptNumLock = m_bInterceptCapsLock = m_bInterceptScrollLock = false; - for( int context=0; context<sizeof(keyMap)/sizeof(keyMap[0]); context++ ) - for( int mod=0; mod<sizeof(keyMap[0])/sizeof(keyMap[0][0]); mod++ ) - for( int key=0; key<sizeof(keyMap[0][0])/sizeof(keyMap[0][0][0]); key++ ) - for( int kevent=0; kevent<sizeof(keyMap[0][0][0])/sizeof(keyMap[0][0][0][0]); kevent++ ) { + for( int context=0; context < ARRAYELEMCOUNT(keyMap); context++ ) + for( int mod=0; mod < ARRAYELEMCOUNT(keyMap[0]); mod++ ) + for( int key=0; key < ARRAYELEMCOUNT(keyMap[0][0]); key++ ) + for( int kevent=0; kevent < ARRAYELEMCOUNT(keyMap[0][0][0]); kevent++ ) { if( keyMap[context][mod][key][kevent] == kcNull ) continue; if( mod == HOTKEYF_EXT ) m_bInterceptWindowsKeys = true; if( key == VK_NUMLOCK ) m_bInterceptNumLock = true; Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2010-03-22 21:03:07 UTC (rev 545) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2010-03-23 17:44:41 UTC (rev 546) @@ -337,17 +337,18 @@ case MOD_TYPE_MED: case MOD_TYPE_OKT: case MOD_TYPE_AMS: - case MOD_TYPE_MT2: - m_SndFile.ChangeModTypeTo(MOD_TYPE_IT); - /*m_SndFile.ChangeModTypeTo(MOD_TYPE_XM); + m_SndFile.ChangeModTypeTo(MOD_TYPE_XM); if ((m_SndFile.m_nDefaultTempo == 125) && (m_SndFile.m_nDefaultSpeed == 6) && (!m_SndFile.m_nInstruments)) { m_SndFile.m_nType = MOD_TYPE_MOD; for (UINT i=0; i<m_SndFile.Patterns.Size(); i++) if ((m_SndFile.Patterns[i]) && (m_SndFile.PatternSize[i] != 64)) m_SndFile.m_nType = MOD_TYPE_XM; - }*/ + } break; + case MOD_TYPE_MT2: + m_SndFile.ChangeModTypeTo(MOD_TYPE_IT); + break; case MOD_TYPE_FAR: case MOD_TYPE_PTM: case MOD_TYPE_STM: Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2010-03-22 21:03:07 UTC (rev 545) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2010-03-23 17:44:41 UTC (rev 546) @@ -592,8 +592,8 @@ tmpchn++; if (i >= nRemainingChannels) { + m_SndFile.InitChannel(i); m_SndFile.Chn[i].dwFlags |= CHN_MUTE; - m_SndFile.InitChannel(i); } } } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2010-03-22 21:03:07 UTC (rev 545) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2010-03-23 17:44:41 UTC (rev 546) @@ -13,8 +13,9 @@ #include "OpenGLEditor.h" //rewbs.fxvis #include "PatternGotoDialog.h" #include "PatternRandomizer.h" -#include ".\arrayutils.h" -#include ".\view_pat.h" +#include "arrayutils.h" +#include "view_pat.h" +#include "View_gen.h" #include "misc_util.h" #include "midi.h" #include <cmath> @@ -1106,8 +1107,10 @@ InvalidateChannelsHeaders(); } } - else if (!(nFlags&MK_CONTROL)) { - pModDoc->MuteChannel(nItemNo, (pSndFile->ChnSettings[nItemNo].dwFlags & CHN_MUTE) ? FALSE : TRUE); + else if (!(nFlags&MK_CONTROL)) + { + pModDoc->MuteChannel(nItemNo, (pSndFile->ChnSettings[nItemNo].dwFlags & CHN_MUTE) ? false : true); + pModDoc->UpdateAllViews(this, HINT_MODCHANNELS | ((nItemNo / CHANNELS_IN_TAB) << HINT_SHIFT_CHNTAB)); } break; case DRAGITEM_PATTERNHEADER: @@ -2482,7 +2485,7 @@ // If a note or an instr is present on the row, do the change, if required. // Do not set instr if note and instr are both blank. // Do set instr if note is a PC note and instr is blank. - if ( ((p->note > 0 && p->note < NOTE_MIN_SPECIAL) || MODCOMMAND::IsPcNote(p->note) || p->instr) && (p->instr!=nIns) ) { + if ( ((p->note > 0 && p->note < NOTE_MIN_SPECIAL) || p->IsPcNote() || p->instr) && (p->instr!=nIns) ) { p->instr = nIns; bModified = TRUE; } Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2010-03-22 21:03:07 UTC (rev 545) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2010-03-23 17:44:41 UTC (rev 546) @@ -68,6 +68,12 @@ BYTE channels[32]; } S3MFILEHEADER; +enum +{ + S3I_TYPE_NONE = 0, + S3I_TYPE_PCM = 1, + S3I_TYPE_ADMEL = 2, +}; void CSoundFile::S3MConvert(MODCOMMAND *m, BOOL bIT) const //-------------------------------------------------------- @@ -227,7 +233,7 @@ DWORD dwMemPos; BYTE insflags[128], inspack[128]; S3MFILEHEADER psfh = *(S3MFILEHEADER *)lpStream; - bool bKeepMidiMacros = false; + bool bKeepMidiMacros = false, bHasAdlibPatches = false; psfh.reserved1 = LittleEndianW(psfh.reserved1); psfh.ordnum = LittleEndianW(psfh.ordnum); @@ -355,7 +361,7 @@ lstrcpy(m_szNames[iSmp], (LPCSTR)&s[0x30]); SpaceToNullStringFixed(m_szNames[iSmp], 28); - if ((s[0]==1) && (s[0x4E]=='R') && (s[0x4F]=='S')) + if ((s[0] == S3I_TYPE_PCM) && (s[0x4E] == 'R') && (s[0x4F] == 'S')) { Samples[iSmp].nLength = CLAMP(LittleEndian(*((LPDWORD)(s + 0x10))), 4, MAX_SAMPLE_LENGTH); Samples[iSmp].nLoopStart = CLAMP(LittleEndian(*((LPDWORD)(s + 0x14))), 0, Samples[iSmp].nLength - 1); @@ -381,6 +387,9 @@ Samples[iSmp].nLoopStart = Samples[iSmp].nLoopEnd = 0; Samples[iSmp].nPan = 0x80; //ASSERT(iLooplength == 0 || iLooplength > 4); + } else if(s[0] == S3I_TYPE_ADMEL) + { + bHasAdlibPatches = true; } } @@ -489,7 +498,7 @@ } // Reading samples - for (UINT iRaw=1; iRaw<=insnum; iRaw++) if ((Samples[iRaw].nLength) && (insfile[iRaw])) + for (UINT iRaw = 1; iRaw <= insnum; iRaw++) if ((Samples[iRaw].nLength) && (insfile[iRaw])) { UINT flags = (psfh.version == 1) ? RS_PCM8S : RS_PCM8U; if (insflags[iRaw-1] & 4) flags += 5; @@ -502,6 +511,13 @@ m_nMaxPeriod = 32767; if (psfh.flags & 0x10) m_dwSongFlags |= SONG_AMIGALIMITS; +#ifdef MODPLUG_TRACKER + if(bHasAdlibPatches) + { + ::MessageBox(0, "This track uses Adlib instruments, which are not supported by OpenMPT.", "OpenMPT S3M Import", MB_OK|MB_ICONEXCLAMATION); + } +#endif + return true; } Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-03-22 21:03:07 UTC (rev 545) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2010-03-23 17:44:41 UTC (rev 546) @@ -693,8 +693,10 @@ } } - if ((!bPorta) && (m_nType & (MOD_TYPE_XM|MOD_TYPE_MED|MOD_TYPE_MT2))) { - if (pSmp) { + if ((!bPorta) && (m_nType & (MOD_TYPE_XM|MOD_TYPE_MED|MOD_TYPE_MT2))) + { + if (pSmp) + { pChn->nTranspose = pSmp->RelativeTone; pChn->nFineTune = pSmp->nFineTune; } @@ -702,9 +704,12 @@ // IT Compatibility: Update multisample instruments frequency even if instrument is not specified if(!bPorta && pSmp && IsCompatibleMode(TRK_IMPULSETRACKER)) pChn->nC5Speed = pSmp->nC5Speed; - // XM Compatibility: Ignore notes with portamento if there was no note - if(bPorta && (pChn->nPeriod == 0) && IsCompatibleMode(TRK_FASTTRACKER2)) + // XM Compatibility: Ignore notes with portamento if there was no note playing. + if(bPorta && (pChn->pCurrentSample == nullptr) && IsCompatibleMode(TRK_FASTTRACKER2)) + { + pChn->nPeriod = 0; return; + } if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MT2|MOD_TYPE_MED)) note += pChn->nTranspose; note = CLAMP(note, 1, 132); Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2010-03-22 21:03:07 UTC (rev 545) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2010-03-23 17:44:41 UTC (rev 546) @@ -1494,7 +1494,7 @@ } void CSoundFile::ResetChannelState(CHANNELINDEX i, BYTE resetMask) -//------------------------------------------------------- +//---------------------------------------------------------------- { if(i >= MAX_CHANNELS) return; @@ -1571,7 +1571,7 @@ CHANNELINDEX CSoundFile::ReArrangeChannels(const vector<CHANNELINDEX>& newOrder) -//------------------------------------------------------------------- +//------------------------------------------------------------------------------ { //newOrder[i] tells which current channel should be placed to i:th position in //the new order, or if i is not an index of current channels, then new channel is @@ -1639,14 +1639,14 @@ { if(newOrder[nChn] < m_nChannels) { - ChnSettings[nChn] = settings[newOrder[nChn]]; - Chn[nChn] = chns[newOrder[nChn]]; - if(m_pModDoc) - { - if(recordStates[newOrder[nChn]] == 1) m_pModDoc->Record1Channel(nChn, true); - if(recordStates[newOrder[nChn]] == 2) m_pModDoc->Record2Channel(nChn, true); - } - m_bChannelMuteTogglePending[nChn] = chnMutePendings[newOrder[nChn]]; + ChnSettings[nChn] = settings[newOrder[nChn]]; + Chn[nChn] = chns[newOrder[nChn]]; + if(m_pModDoc) + { + if(recordStates[newOrder[nChn]] == 1) m_pModDoc->Record1Channel(nChn, true); + if(recordStates[newOrder[nChn]] == 2) m_pModDoc->Record2Channel(nChn, true); + } + m_bChannelMuteTogglePending[nChn] = chnMutePendings[newOrder[nChn]]; } else { @@ -1657,6 +1657,14 @@ SetupMODPanning(); m_nChannels = nRemainingChannels; + + // Reset removed channels. Most notably, clear the channel name. + for(CHANNELINDEX nChn = m_nChannels; nChn < MAX_BASECHANNELS; nChn++) + { + InitChannel(nChn); + Chn[nChn].dwFlags |= CHN_MUTE; + } + END_CRITICAL(); return static_cast<CHANNELINDEX>(m_nChannels); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |