From: <sag...@us...> - 2011-11-12 17:27:05
|
Revision: 1134 http://modplug.svn.sourceforge.net/modplug/?rev=1134&view=rev Author: saga-games Date: 2011-11-12 17:26:58 +0000 (Sat, 12 Nov 2011) Log Message: ----------- [Fix] IT Compatibility: No pan swing, panbrello, panning envelopes, etc. is applied on surround channels anymore. [Ref] MODTYPE is now an enum. [Ref] Moved FindOrder to class ModSequence. Modified Paths: -------------- trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Mptrack.cpp trunk/OpenMPT/mptrack/Mptrack.h trunk/OpenMPT/mptrack/PatternGotoDialog.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/dlg_misc.cpp trunk/OpenMPT/mptrack/version.h trunk/OpenMPT/soundlib/ModSequence.cpp trunk/OpenMPT/soundlib/ModSequence.h trunk/OpenMPT/soundlib/Snd_defs.h trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2011-11-06 15:05:09 UTC (rev 1133) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2011-11-12 17:26:58 UTC (rev 1134) @@ -367,7 +367,7 @@ EndWaitCursor(); } // Convert to MOD/S3M/XM/IT - switch(m_SndFile.m_nType) + switch(m_SndFile.GetType()) { case MOD_TYPE_MOD: case MOD_TYPE_S3M: @@ -914,13 +914,8 @@ MODCHANNEL *pChn = &m_SndFile.Chn[nChn]; - //stop channel, just in case. - if (pChn->nLength) - { - pChn->nPos = pChn->nPosLo = pChn->nLength = 0; - } - // reset channel properties; in theory the chan is completely unused anyway. + pChn->nPos = pChn->nPosLo = pChn->nLength = 0; pChn->dwFlags &= CHN_SAMPLEFLAGS; pChn->dwFlags &= ~(CHN_MUTE); pChn->nGlobalVol = 64; @@ -964,7 +959,7 @@ // Handle sample looping. // Changed line to fix http://forum.openmpt.org/index.php?topic=1700.0 - //if ((loopstart + 16 < loopend) && (loopstart >= 0) && (loopend <= (LONG)pChn->nLength)) { + //if ((loopstart + 16 < loopend) && (loopstart >= 0) && (loopend <= (LONG)pChn->nLength)) if ((loopstart + 16 < loopend) && (loopstart >= 0) && (pChn->pModSample != nullptr)) { pChn->nPos = loopstart; @@ -993,23 +988,9 @@ pChn->nLength = pChn->nLoopEnd = pChn->pModSample->nLength; } - /* - if (bpause) { - if ((loopstart + 16 < loopend) && (loopstart >= 0) && (loopend <= (LONG)pChn->nLength)) { - pChn->nPos = loopstart; - pChn->nPosLo = 0; - pChn->nLoopStart = loopstart; - pChn->nLoopEnd = loopend; - pChn->nLength = loopend; - } - m_SndFile.m_nBufferCount = 0; - m_SndFile.m_dwSongFlags |= SONG_PAUSED; - if ((!(CMainFrame::GetSettings().m_dwPatternSetup & PATTERN_NOEXTRALOUD)) && (nsmp)) pChn->dwFlags |= CHN_EXTRALOUD; - } else pChn->dwFlags &= ~CHN_EXTRALOUD; - */ //rewbs.vstiLive - if (nins <= m_SndFile.m_nInstruments) + if (nins <= m_SndFile.GetNumInstruments()) { const MODINSTRUMENT *pIns = m_SndFile.Instruments[nins]; if (pIns && pIns->HasValidMIDIChannel()) // instro sends to a midi chan @@ -1024,9 +1005,8 @@ if ((nPlugin) && (nPlugin <= MAX_MIXPLUGINS)) { - IMixPlugin *pPlugin = m_SndFile.m_MixPlugins[nPlugin-1].pMixPlugin; + IMixPlugin *pPlugin = m_SndFile.m_MixPlugins[nPlugin - 1].pMixPlugin; if (pPlugin) pPlugin->MidiCommand(pIns->nMidiChannel, pIns->nMidiProgram, pIns->wMidiBank, pIns->NoteMap[note - 1], pChn->nVolume, MAX_BASECHANNELS); - //if (pPlugin) pPlugin->MidiCommand(pIns->nMidiChannel, pIns->nMidiProgram, pIns->wMidiBank, note, pChn->GetVSTVolume(), MAX_BASECHANNELS); } } } @@ -3206,9 +3186,9 @@ //end rewbs.fix3185 //ensure order correlates with pattern. - if (pSndFile->Order[ord]!=pat) + if (pSndFile->Order[ord] != pat) { - ORDERINDEX tentativeOrder = pSndFile->FindOrder(pat); + ORDERINDEX tentativeOrder = pSndFile->Order.FindOrder(pat); if (tentativeOrder != ORDERINDEX_INVALID) //ensure a valid order exists. { ord = tentativeOrder; Modified: trunk/OpenMPT/mptrack/Mptrack.cpp =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.cpp 2011-11-06 15:05:09 UTC (rev 1133) +++ trunk/OpenMPT/mptrack/Mptrack.cpp 2011-11-12 17:26:58 UTC (rev 1134) @@ -542,7 +542,7 @@ ///////////////////////////////////////////////////////////////////////////// // CTrackApp -UINT CTrackApp::m_nDefaultDocType = MOD_TYPE_IT; +MODTYPE CTrackApp::m_nDefaultDocType = MOD_TYPE_IT; MEMORYSTATUS CTrackApp::gMemStatus; // -> CODE#0023 Modified: trunk/OpenMPT/mptrack/Mptrack.h =================================================================== --- trunk/OpenMPT/mptrack/Mptrack.h 2011-11-06 15:05:09 UTC (rev 1133) +++ trunk/OpenMPT/mptrack/Mptrack.h 2011-11-12 17:26:58 UTC (rev 1134) @@ -105,7 +105,7 @@ friend class CMainFrame; // static data protected: - static UINT m_nDefaultDocType; + static MODTYPE m_nDefaultDocType; static LPMIDILIBSTRUCT glpMidiLibrary; static BOOL m_nProject; @@ -152,8 +152,8 @@ // -! NEW_FEATURE#0023 static LPCTSTR GetAppDirPath() {return m_szExePath;} // Returns '\'-ended executable directory path. - static UINT GetDefaultDocType() { return m_nDefaultDocType; } - static VOID SetDefaultDocType(UINT n) { m_nDefaultDocType = n; } + static MODTYPE GetDefaultDocType() { return m_nDefaultDocType; } + static void SetDefaultDocType(MODTYPE n) { m_nDefaultDocType = n; } static LPMIDILIBSTRUCT GetMidiLibrary() { return glpMidiLibrary; } static BOOL ImportMidiConfig(LPCSTR lpszFileName, BOOL bNoWarning=FALSE); static BOOL ExportMidiConfig(LPCSTR lpszFileName); Modified: trunk/OpenMPT/mptrack/PatternGotoDialog.cpp =================================================================== --- trunk/OpenMPT/mptrack/PatternGotoDialog.cpp 2011-11-06 15:05:09 UTC (rev 1133) +++ trunk/OpenMPT/mptrack/PatternGotoDialog.cpp 2011-11-12 17:26:58 UTC (rev 1134) @@ -103,7 +103,7 @@ } UpdateData(); - m_nOrder = m_pSndFile->FindOrder(static_cast<PATTERNINDEX>(m_nPattern), m_nActiveOrder); + m_nOrder = m_pSndFile->Order.FindOrder(static_cast<PATTERNINDEX>(m_nPattern), m_nActiveOrder); if (m_nOrder >= m_pSndFile->Order.size()) { m_nOrder=0; Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2011-11-06 15:05:09 UTC (rev 1133) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2011-11-12 17:26:58 UTC (rev 1134) @@ -3788,7 +3788,7 @@ SetCurrentColumn(CreateCursor(0, (GetChanFromCursor(m_dwCursor) - 1) % pSndFile->GetNumChannels(), GetColTypeFromCursor(m_dwCursor))); else SetCurrentColumn(CreateCursor(0, (pSndFile->GetNumChannels() - 1), GetColTypeFromCursor(m_dwCursor))); - UINT n = CreateCursor(m_nRow) | m_dwCursor; + DWORD n = CreateCursor(m_nRow) | m_dwCursor; SetCurSel(n, n); return wParam;} case kcHomeHorizontalSelect: @@ -3815,20 +3815,22 @@ if (m_nRow < pModDoc->GetPatternSize(m_nPattern) - 1) SetCurrentRow(pModDoc->GetPatternSize(m_nPattern) - 1); return wParam; - case kcNextPattern: { UINT n = m_nPattern + 1; + case kcNextPattern: { PATTERNINDEX n = m_nPattern + 1; while ((n < pSndFile->Patterns.Size()) && (!pSndFile->Patterns[n])) n++; SetCurrentPattern((n < pSndFile->Patterns.Size()) ? n : 0); ORDERINDEX currentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); - ORDERINDEX newOrder = pSndFile->FindOrder(m_nPattern, currentOrder, true); + ORDERINDEX newOrder = pSndFile->Order.FindOrder(m_nPattern, currentOrder, true); SendCtrlMessage(CTRLMSG_SETCURRENTORDER, newOrder); - return wParam; } - case kcPrevPattern: { UINT n = (m_nPattern) ? m_nPattern - 1 : pSndFile->Patterns.Size()-1; + return wParam; + } + case kcPrevPattern: { PATTERNINDEX n = (m_nPattern) ? m_nPattern - 1 : pSndFile->Patterns.Size() - 1; while ((n > 0) && (!pSndFile->Patterns[n])) n--; SetCurrentPattern(n); ORDERINDEX currentOrder = SendCtrlMessage(CTRLMSG_GETCURRENTORDER); - ORDERINDEX newOrder = pSndFile->FindOrder(m_nPattern, currentOrder, false); + ORDERINDEX newOrder = pSndFile->Order.FindOrder(m_nPattern, currentOrder, false); SendCtrlMessage(CTRLMSG_SETCURRENTORDER, newOrder); - return wParam; } + return wParam; + } case kcSelectWithCopySelect: case kcSelectWithNav: case kcSelect: if (!(m_dwStatus & (PATSTATUS_DRAGNDROPEDIT|PATSTATUS_SELECTROW))) m_dwStartSel = CreateCursor(m_nRow) | m_dwCursor; Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2011-11-06 15:05:09 UTC (rev 1133) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2011-11-12 17:26:58 UTC (rev 1134) @@ -170,7 +170,7 @@ void CModTypeDlg::UpdateChannelCBox() //----------------------------------- { - const MODTYPE type = m_TypeBox.GetItemData(m_TypeBox.GetCurSel()); + const MODTYPE type = static_cast<MODTYPE>(m_TypeBox.GetItemData(m_TypeBox.GetCurSel())); CHANNELINDEX currChanSel = m_ChannelsBox.GetItemData(m_ChannelsBox.GetCurSel()); const CHANNELINDEX minChans = CSoundFile::GetModSpecifications(type).channelsMin; const CHANNELINDEX maxChans = CSoundFile::GetModSpecifications(type).channelsMax; @@ -200,7 +200,7 @@ void CModTypeDlg::UpdateDialog() //------------------------------ { - const MODTYPE type = m_TypeBox.GetItemData(m_TypeBox.GetCurSel()); + const MODTYPE type = static_cast<MODTYPE>(m_TypeBox.GetItemData(m_TypeBox.GetCurSel())); UpdateChannelCBox(); @@ -365,7 +365,7 @@ } int sel = m_ChannelsBox.GetItemData(m_ChannelsBox.GetCurSel()); - int type = m_TypeBox.GetItemData(m_TypeBox.GetCurSel()); + MODTYPE type = static_cast<MODTYPE>(m_TypeBox.GetItemData(m_TypeBox.GetCurSel())); CHANNELINDEX maxChans = CSoundFile::GetModSpecifications(type).channelsMax; @@ -395,7 +395,7 @@ int sel = m_TypeBox.GetCurSel(); if (sel >= 0) { - m_nType = m_TypeBox.GetItemData(sel); + m_nType = static_cast<MODTYPE>(m_TypeBox.GetItemData(sel)); // -> CODE#0023 // -> DESC="IT project files (.itp)" if(m_pSndFile->m_dwSongFlags & SONG_ITPROJECT && sel != 4) Modified: trunk/OpenMPT/mptrack/version.h =================================================================== --- trunk/OpenMPT/mptrack/version.h 2011-11-06 15:05:09 UTC (rev 1133) +++ trunk/OpenMPT/mptrack/version.h 2011-11-12 17:26:58 UTC (rev 1134) @@ -15,7 +15,7 @@ #define VER_MAJORMAJOR 1 #define VER_MAJOR 20 #define VER_MINOR 00 -#define VER_MINORMINOR 52 +#define VER_MINORMINOR 53 //Creates version number from version parts that appears in version string. //For example MAKE_VERSION_NUMERIC(1,17,02,28) gives version number of Modified: trunk/OpenMPT/soundlib/ModSequence.cpp =================================================================== --- trunk/OpenMPT/soundlib/ModSequence.cpp 2011-11-06 15:05:09 UTC (rev 1133) +++ trunk/OpenMPT/soundlib/ModSequence.cpp 2011-11-12 17:26:58 UTC (rev 1134) @@ -264,7 +264,33 @@ } +ORDERINDEX ModSequence::FindOrder(PATTERNINDEX nPat, ORDERINDEX startFromOrder, bool searchForward) const +//------------------------------------------------------------------------------------------------------- +{ + const ORDERINDEX maxOrder = GetLength(); + ORDERINDEX foundAtOrder = ORDERINDEX_INVALID; + ORDERINDEX candidateOrder = 0; + for (ORDERINDEX p = 0; p < maxOrder; p++) + { + if (searchForward) + { + candidateOrder = (startFromOrder + p) % maxOrder; // wrap around MAX_ORDERS + } else + { + candidateOrder = (startFromOrder - p + maxOrder) % maxOrder; // wrap around 0 and MAX_ORDERS + } + if ((*this)[candidateOrder] == nPat) + { + foundAtOrder = candidateOrder; + break; + } + } + + return foundAtOrder; +} + + ///////////////////////////////////// // ModSequenceSet ///////////////////////////////////// Modified: trunk/OpenMPT/soundlib/ModSequence.h =================================================================== --- trunk/OpenMPT/soundlib/ModSequence.h 2011-11-06 15:05:09 UTC (rev 1133) +++ trunk/OpenMPT/soundlib/ModSequence.h 2011-11-12 17:26:58 UTC (rev 1134) @@ -67,17 +67,20 @@ // Returns length of sequence stopping counting on first '---' (or at the end of sequence). ORDERINDEX GetLengthFirstEmpty() const; - PATTERNINDEX GetInvalidPatIndex() const {return m_nInvalidIndex;} //To correspond 0xFF + PATTERNINDEX GetInvalidPatIndex() const {return m_nInvalidIndex;} // To correspond 0xFF static PATTERNINDEX GetInvalidPatIndex(const MODTYPE type); - PATTERNINDEX GetIgnoreIndex() const {return m_nIgnoreIndex;} //To correspond 0xFE + PATTERNINDEX GetIgnoreIndex() const {return m_nIgnoreIndex;} // To correspond 0xFE static PATTERNINDEX GetIgnoreIndex(const MODTYPE type); - // Returns the previous/next order ignoring skip indeces(+++). + // Returns the previous/next order ignoring skip indices(+++). // If no previous/next order exists, return first/last order, and zero // when orderlist is empty. ORDERINDEX GetPreviousOrderIgnoringSkips(const ORDERINDEX start) const; ORDERINDEX GetNextOrderIgnoringSkips(const ORDERINDEX start) const; + + // Find an order item that contains a given pattern number. + ORDERINDEX FindOrder(PATTERNINDEX nPat, ORDERINDEX startFromOrder = 0, bool searchForward = true) const; ModSequence& operator=(const ModSequence& seq); @@ -86,10 +89,10 @@ size_t WriteToByteArray(BYTE* dest, const UINT numOfBytes, const UINT destSize) const; bool ReadAsByte(const BYTE* pFrom, const int howMany, const int memLength); - // Deprecated function used for MPTm's created in 1.17.02.46 - 1.17.02.48. + // Deprecated function used for MPTm files created with OpenMPT 1.17.02.46 - 1.17.02.48. DWORD Deserialize(const BYTE* const src, const DWORD memLength); - //Returns true if the IT orderlist datafield is not sufficient to store orderlist information. + // Returns true if the IT orderlist datafield is not sufficient to store orderlist information. bool NeedsExtraDatafield() const; protected: Modified: trunk/OpenMPT/soundlib/Snd_defs.h =================================================================== --- trunk/OpenMPT/soundlib/Snd_defs.h 2011-11-06 15:05:09 UTC (rev 1133) +++ trunk/OpenMPT/soundlib/Snd_defs.h 2011-11-12 17:26:58 UTC (rev 1134) @@ -39,7 +39,6 @@ typedef uint8 SEQUENCEINDEX; const SEQUENCEINDEX SEQUENCEINDEX_MAX = uint8_max; const SEQUENCEINDEX SEQUENCEINDEX_INVALID = SEQUENCEINDEX_MAX; -typedef uint32 MODTYPE; typedef uintptr_t SmpLength; @@ -56,6 +55,7 @@ const PATTERNINDEX MAX_PATTERNS = 240; const SAMPLEINDEX MAX_SAMPLES = 4000; const INSTRUMENTINDEX MAX_INSTRUMENTS = 256; //200 +const PLUGINDEX MAX_MIXPLUGINS = 100; //50 const SEQUENCEINDEX MAX_SEQUENCES = 50; @@ -75,38 +75,51 @@ #define MAX_EQ_BANDS 6 -#define MAX_MIXPLUGINS 100 //50 #define MAX_PLUGPRESETS 1000 //rewbs.plugPresets -#define MOD_TYPE_NONE 0x00 -#define MOD_TYPE_MOD 0x01 -#define MOD_TYPE_S3M 0x02 -#define MOD_TYPE_XM 0x04 -#define MOD_TYPE_MED 0x08 -#define MOD_TYPE_MTM 0x10 -#define MOD_TYPE_IT 0x20 -#define MOD_TYPE_669 0x40 -#define MOD_TYPE_ULT 0x80 -#define MOD_TYPE_STM 0x100 -#define MOD_TYPE_FAR 0x200 -#define MOD_TYPE_WAV 0x400 -#define MOD_TYPE_AMF 0x800 -#define MOD_TYPE_AMS 0x1000 -#define MOD_TYPE_DSM 0x2000 -#define MOD_TYPE_MDL 0x4000 -#define MOD_TYPE_OKT 0x8000 -#define MOD_TYPE_MID 0x10000 -#define MOD_TYPE_DMF 0x20000 -#define MOD_TYPE_PTM 0x40000 -#define MOD_TYPE_DBM 0x80000 -#define MOD_TYPE_MT2 0x100000 -#define MOD_TYPE_AMF0 0x200000 -#define MOD_TYPE_PSM 0x400000 -#define MOD_TYPE_J2B 0x800000 -#define MOD_TYPE_MPT 0x1000000 -#define MOD_TYPE_IMF 0x2000000 -#define MOD_TYPE_UMX 0x80000000 // Fake type +enum MODTYPE +{ + MOD_TYPE_NONE = 0x00, + MOD_TYPE_MOD = 0x01, + MOD_TYPE_S3M = 0x02, + MOD_TYPE_XM = 0x04, + MOD_TYPE_MED = 0x08, + MOD_TYPE_MTM = 0x10, + MOD_TYPE_IT = 0x20, + MOD_TYPE_669 = 0x40, + MOD_TYPE_ULT = 0x80, + MOD_TYPE_STM = 0x100, + MOD_TYPE_FAR = 0x200, + MOD_TYPE_WAV = 0x400, + MOD_TYPE_AMF = 0x800, + MOD_TYPE_AMS = 0x1000, + MOD_TYPE_DSM = 0x2000, + MOD_TYPE_MDL = 0x4000, + MOD_TYPE_OKT = 0x8000, + MOD_TYPE_MID = 0x10000, + MOD_TYPE_DMF = 0x20000, + MOD_TYPE_PTM = 0x40000, + MOD_TYPE_DBM = 0x80000, + MOD_TYPE_MT2 = 0x100000, + MOD_TYPE_AMF0 = 0x200000, + MOD_TYPE_PSM = 0x400000, + MOD_TYPE_J2B = 0x800000, + MOD_TYPE_MPT = 0x1000000, + MOD_TYPE_IMF = 0x2000000, + MOD_TYPE_UMX = 0x80000000, // Fake type +}; +// Allow for type safe combinations of MODTYPEs. +inline MODTYPE operator | (MODTYPE a, MODTYPE b) +{ + return static_cast<MODTYPE>(+a | +b); +}; + +inline MODTYPE operator & (MODTYPE a, MODTYPE b) +{ + return static_cast<MODTYPE>(+a & +b); +}; + // For compatibility mode #define TRK_IMPULSETRACKER (MOD_TYPE_IT | MOD_TYPE_MPT) #define TRK_FASTTRACKER2 (MOD_TYPE_XM) Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2011-11-06 15:05:09 UTC (rev 1133) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2011-11-12 17:26:58 UTC (rev 1134) @@ -668,7 +668,7 @@ m_dwCreatedWithVersion = MptVersion::num; } - // Adjust song names + // Adjust song / sample names for (UINT iSmp=0; iSmp<MAX_SAMPLES; iSmp++) { LPSTR p = m_szNames[iSmp]; @@ -698,9 +698,9 @@ Chn[ich].nRetrigParam = Chn[ich].nRetrigCount = 1; } } - // Checking instruments + // Checking samples MODSAMPLE *pSmp = Samples; - for (UINT iIns=0; iIns<MAX_INSTRUMENTS; iIns++, pSmp++) + for (SAMPLEINDEX nSmp = 0; nSmp < MAX_SAMPLES; nSmp++, pSmp++) { if (pSmp->pSample) { @@ -773,8 +773,8 @@ string sNotFound; std::list<PLUGINDEX> notFoundIDs; - // Load plugins only when m_pModDoc != 0. (can be == 0 for example when examining module samples in treeview. - if (gpMixPluginCreateProc && GetpModDoc()) + // Load plugins only when m_pModDoc is valid. (can be invalid for example when examining module samples in treeview. + if (gpMixPluginCreateProc && GetpModDoc() != nullptr) { for (PLUGINDEX iPlug = 0; iPlug < MAX_MIXPLUGINS; iPlug++) { @@ -1187,7 +1187,7 @@ void CSoundFile::SuspendPlugins() //------------------------------- { - for (UINT iPlug=0; iPlug<MAX_MIXPLUGINS; iPlug++) + for (PLUGINDEX iPlug=0; iPlug<MAX_MIXPLUGINS; iPlug++) { if (!m_MixPlugins[iPlug].pMixPlugin) continue; //most common branch @@ -1206,7 +1206,7 @@ void CSoundFile::ResumePlugins() //------------------------------ { - for (UINT iPlug=0; iPlug<MAX_MIXPLUGINS; iPlug++) + for (PLUGINDEX iPlug=0; iPlug<MAX_MIXPLUGINS; iPlug++) { if (!m_MixPlugins[iPlug].pMixPlugin) continue; //most common branch @@ -1309,71 +1309,26 @@ //m_nSeqOverride = 0; } -ORDERINDEX CSoundFile::FindOrder(PATTERNINDEX nPat, ORDERINDEX startFromOrder, bool direction) -//-------------------------------------------------------------------------------------------- -{ - const ORDERINDEX maxOrder = Order.GetLength(); - ORDERINDEX foundAtOrder = ORDERINDEX_INVALID; - ORDERINDEX candidateOrder = 0; - for (ORDERINDEX p = 0; p < maxOrder; p++) - { - if (direction) - { - candidateOrder = (startFromOrder + p) % maxOrder; //wrap around MAX_ORDERS - } else - { - candidateOrder = (startFromOrder - p + maxOrder) % maxOrder; //wrap around 0 and MAX_ORDERS - } - if (Order[candidateOrder] == nPat) - { - foundAtOrder = candidateOrder; - break; - } - } - - return foundAtOrder; -} //end rewbs.playSongFromCursor MODTYPE CSoundFile::GetBestSaveFormat() const //------------------------------------------- { - if ((!m_nSamples) || (!m_nChannels)) return MOD_TYPE_NONE; - if (!m_nType) return MOD_TYPE_NONE; - if (m_nType & (MOD_TYPE_MOD/*|MOD_TYPE_OKT*/)) + if ((!m_nSamples) || (!m_nChannels) || GetType() == MOD_TYPE_NONE) return MOD_TYPE_NONE; + if (GetType() & (MOD_TYPE_MOD/*|MOD_TYPE_OKT*/)) return MOD_TYPE_MOD; - if (m_nType & (MOD_TYPE_S3M|MOD_TYPE_STM|MOD_TYPE_ULT|MOD_TYPE_FAR|MOD_TYPE_PTM|MOD_TYPE_MTM)) + if (GetType() & (MOD_TYPE_S3M|MOD_TYPE_STM|MOD_TYPE_ULT|MOD_TYPE_FAR|MOD_TYPE_PTM|MOD_TYPE_MTM)) return MOD_TYPE_S3M; - if (m_nType & (MOD_TYPE_XM|MOD_TYPE_MED/*|MOD_TYPE_MT2*/)) + if (GetType() & (MOD_TYPE_XM|MOD_TYPE_MED/*|MOD_TYPE_MT2*/)) return MOD_TYPE_XM; - if(m_nType & MOD_TYPE_MPT) + if(GetType() & MOD_TYPE_MPT) return MOD_TYPE_MPT; return MOD_TYPE_IT; } -MODTYPE CSoundFile::GetSaveFormats() const -//---------------------------------------- -{ - UINT n = 0; - if ((!m_nSamples) || (!m_nChannels) || (m_nType == MOD_TYPE_NONE)) return 0; - switch(m_nType) - { - case MOD_TYPE_MOD: n = MOD_TYPE_MOD; - case MOD_TYPE_S3M: n = MOD_TYPE_S3M; - } - n |= MOD_TYPE_XM | MOD_TYPE_IT | MOD_TYPE_MPT; - if (!m_nInstruments) - { - if (m_nSamples < 32) n |= MOD_TYPE_MOD; - n |= MOD_TYPE_S3M; - } - return n; -} - - LPCTSTR CSoundFile::GetSampleName(UINT nSample) const //--------------------------------------------------- { Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2011-11-06 15:05:09 UTC (rev 1133) +++ trunk/OpenMPT/soundlib/Sndfile.h 2011-11-12 17:26:58 UTC (rev 1134) @@ -249,10 +249,11 @@ { // First 32-bytes: Most used mixing information: don't change it // These fields are accessed directly by the MMX mixing code (look out for CHNOFS_PCURRENTSAMPLE), so the order is crucial + // In the meantime, MMX mixing has been removed because it interfered with the new resonant filter code, and the byte offsets are also no longer hardcoded... LPSTR pCurrentSample; DWORD nPos; - DWORD nPosLo; // actually 16-bit - LONG nInc; // 16.16 + DWORD nPosLo; // actually 16-bit (fractional part) + LONG nInc; // 16.16 fixed point LONG nRightVol; LONG nLeftVol; LONG nRightRamp; @@ -796,7 +797,6 @@ static const CModSpecifications& GetModSpecifications(const MODTYPE type); double GetCurrentBPM() const; - ORDERINDEX FindOrder(PATTERNINDEX nPat, ORDERINDEX startFromOrder = 0, bool direction = true); //rewbs.playSongFromCursor void DontLoopPattern(PATTERNINDEX nPat, ROWINDEX nRow = 0); //rewbs.playSongFromCursor void SetCurrentPos(UINT nPos); void SetCurrentOrder(ORDERINDEX nOrder); @@ -886,7 +886,6 @@ // MOD Convert function MODTYPE GetBestSaveFormat() const; - MODTYPE GetSaveFormats() const; void ConvertModCommand(MODCOMMAND *) const; void S3MConvert(MODCOMMAND *m, bool bIT) const; void S3MSaveConvert(UINT *pcmd, UINT *pprm, bool bIT, bool bCompatibilityExport = false) const; Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2011-11-06 15:05:09 UTC (rev 1133) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2011-11-12 17:26:58 UTC (rev 1134) @@ -1825,7 +1825,7 @@ { rampLength = (1 << (VOLUMERAMPPRECISION-1)); } - if(rampLength < (LONG)globalRampLength) + if(rampLength < globalRampLength) { rampLength = globalRampLength; } @@ -2094,6 +2094,13 @@ } + // IT Compatibility: Ensure that there is no pan swing, panbrello, panning envelopes, etc. applied on surround channels. + // Test case: surround-pan.it + if((pChn->dwFlags & CHN_SURROUND) && !(m_dwSongFlags & SONG_SURROUNDPAN) && IsCompatibleMode(TRK_IMPULSETRACKER)) + { + pChn->nRealPan = 128; + } + // Now that all relevant envelopes etc. have been processed, we can parse the MIDI macro data. ProcessMacroOnChannel(nChn); @@ -2109,7 +2116,7 @@ // Final Period if (period <= m_nMinPeriod) { - if (m_nType & MOD_TYPE_S3M) pChn->nLength = 0; + if (GetType() & MOD_TYPE_S3M) pChn->nLength = 0; period = m_nMinPeriod; } //rewbs: temporarily commenting out block to allow notes below A-0. @@ -2126,12 +2133,12 @@ }*/ UINT freq = 0; - if(m_nType != MOD_TYPE_MPT || !pIns || pIns->pTuning == nullptr) + if(GetType() != MOD_TYPE_MPT || pIns == nullptr || pIns->pTuning == nullptr) { freq = GetFreqFromPeriod(period, pChn->nC5Speed, nPeriodFrac); - } - else //In this case: m_nType == MOD_TYPE_MPT and using custom tunings. + } else { + // In this case: GetType() == MOD_TYPE_MPT and using custom tunings. if(pChn->m_CalculateFreq || (pChn->m_ReCalculateFreqOnFirstTick && m_nTickCount == 0)) { pChn->m_Freq = Util::Round<UINT>(pChn->nC5Speed * vibratoFactor * pIns->pTuning->GetRatio(pChn->nNote - NOTE_MIDDLEC + arpeggioSteps, pChn->nFineTune+pChn->m_PortamentoFineSteps)); @@ -2145,11 +2152,12 @@ } // Applying Pitch/Tempo lock. - if(m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT) && pIns && pIns->wPitchToTempoLock) + if(GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT) && pIns && pIns->wPitchToTempoLock) + { freq = _muldivr(freq, m_nMusicTempo, pIns->wPitchToTempoLock); + } - - if ((m_nType & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (freq < 256)) + if ((GetType() & (MOD_TYPE_IT | MOD_TYPE_MPT)) && (freq < 256)) { pChn->nFadeOutVol = 0; pChn->dwFlags |= CHN_NOTEFADE; @@ -2161,7 +2169,7 @@ if ((ninc >= 0xFFB0) && (ninc <= 0x10090)) ninc = 0x10000; if (m_nFreqFactor != 128) ninc = (ninc * m_nFreqFactor) >> 7; if (ninc > 0xFF0000) ninc = 0xFF0000; - pChn->nInc = (ninc+1) & ~3; + pChn->nInc = (ninc + 1) & ~3; } else { // Avoid nasty noises... @@ -2179,7 +2187,6 @@ IncrementPitchFilterEnvelopePosition(pChn); } - #ifdef MODPLUG_PLAYER // Limit CPU -> > 80% -> don't ramp if ((gnCPUUsage >= 80) && (!pChn->nRealVolume)) @@ -2187,18 +2194,22 @@ pChn->nLeftVol = pChn->nRightVol = 0; } #endif // MODPLUG_PLAYER + // Volume ramping pChn->dwFlags &= ~CHN_VOLUMERAMP; if ((pChn->nRealVolume) || (pChn->nLeftVol) || (pChn->nRightVol)) pChn->dwFlags |= CHN_VOLUMERAMP; + #ifdef MODPLUG_PLAYER // Decrease VU-Meter if (pChn->nVUMeter > VUMETER_DECAY) pChn->nVUMeter -= VUMETER_DECAY; else pChn->nVUMeter = 0; #endif // MODPLUG_PLAYER + #ifdef ENABLE_STEREOVU if (pChn->nLeftVU > VUMETER_DECAY) pChn->nLeftVU -= VUMETER_DECAY; else pChn->nLeftVU = 0; if (pChn->nRightVU > VUMETER_DECAY) pChn->nRightVU -= VUMETER_DECAY; else pChn->nRightVU = 0; #endif + // Check for too big nInc if (((pChn->nInc >> 16) + 1) >= (LONG)(pChn->nLoopEnd - pChn->nLoopStart)) pChn->dwFlags &= ~CHN_LOOP; pChn->nNewRightVol = pChn->nNewLeftVol = 0; @@ -2213,6 +2224,7 @@ vutmp >>= 1; if (pChn->nVUMeter < vutmp) pChn->nVUMeter = vutmp; #endif // MODPLUG_PLAYER + #ifdef ENABLE_STEREOVU UINT vul = (pChn->nRealVolume * pChn->nRealPan) >> 14; if (vul > 127) vul = 127; @@ -2225,11 +2237,13 @@ vur >>= 1; if (pChn->nRightVU < vur) pChn->nRightVU = (BYTE)vur; #endif + #ifdef MODPLUG_TRACKER - UINT kChnMasterVol = (pChn->dwFlags & CHN_EXTRALOUD) ? 0x100 : nMasterVol; + const UINT kChnMasterVol = (pChn->dwFlags & CHN_EXTRALOUD) ? 0x100 : nMasterVol; #else #define kChnMasterVol nMasterVol #endif // MODPLUG_TRACKER + // Adjusting volumes if (gnChannels >= 2) { @@ -2237,7 +2251,7 @@ pan *= (int)m_nStereoSeparation; pan /= 128; pan += 128; - pan = CLAMP(pan, 0, 256); + Limit(pan, 0, 256); #ifndef FASTSOUNDLIB if (gdwSoundSetup & SNDMIX_REVERSESTEREO) pan = 256 - pan; #endif @@ -2248,7 +2262,7 @@ realvol = (pChn->nRealVolume * kChnMasterVol) >> 7; } else { - //Extra attenuation required here if we're bypassing pre-amp. + // Extra attenuation required here if we're bypassing pre-amp. realvol = (pChn->nRealVolume * kChnMasterVol) >> 8; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |