From: <sag...@us...> - 2012-07-21 18:01:04
|
Revision: 1336 http://modplug.svn.sourceforge.net/modplug/?rev=1336&view=rev Author: saga-games Date: 2012-07-21 18:00:54 +0000 (Sat, 21 Jul 2012) Log Message: ----------- [Imp] Playback lock is now ignored when exporting to WAV. [Imp] Various other improvements to playback lock when navigating in the order list. [Ref] CSoundFile::m_nSeqOverride uses ORDERINDEX_INVALID instead of 0 as its "not set" value now. Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_pat.cpp trunk/OpenMPT/mptrack/Ctrl_pat.h trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/soundlib/ModSequence.cpp trunk/OpenMPT/soundlib/ModSequence.h trunk/OpenMPT/soundlib/Snd_fx.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h trunk/OpenMPT/soundlib/Sndmix.cpp Modified: trunk/OpenMPT/mptrack/Ctrl_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2012-07-21 00:21:58 UTC (rev 1335) +++ trunk/OpenMPT/mptrack/Ctrl_pat.cpp 2012-07-21 18:00:54 UTC (rev 1336) @@ -406,7 +406,7 @@ break; case CTRLMSG_GETCURRENTORDER: - return m_OrderList.GetCurSel(true).nOrdLo; + return m_OrderList.GetCurSel(true).firstOrd; case CTRLMSG_SETCURRENTINSTRUMENT: case CTRLMSG_PAT_SETINSTRUMENT: @@ -457,11 +457,11 @@ break; case CTRLMSG_PREVORDER: - m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).nOrdLo - 1, TRUE); + m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).firstOrd - 1, TRUE); break; case CTRLMSG_NEXTORDER: - m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).nOrdLo + 1, TRUE); + m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).firstOrd + 1, TRUE); break; //rewbs.customKeys @@ -664,7 +664,7 @@ void CCtrlPatterns::OnSequencePrev() //---------------------------------- { - m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).nOrdLo - 1); + m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).firstOrd - 1); m_OrderList.SetFocus(); } @@ -672,7 +672,7 @@ void CCtrlPatterns::OnSequenceNext() //---------------------------------- { - m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).nOrdLo + 1); + m_OrderList.SetCurSel(m_OrderList.GetCurSel(true).firstOrd + 1); m_OrderList.SetFocus(); } @@ -801,7 +801,7 @@ if (m_pModDoc) { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - ORDERINDEX nCurOrd = m_OrderList.GetCurSel(true).nOrdLo; + ORDERINDEX nCurOrd = m_OrderList.GetCurSel(true).firstOrd; PATTERNINDEX nCurPat = pSndFile->Order[nCurOrd]; ROWINDEX rows = 64; if(pSndFile->Patterns.IsValidPat(nCurPat)) @@ -838,9 +838,9 @@ { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - ORD_SELECTION selection = m_OrderList.GetCurSel(false); - ORDERINDEX nInsertCount = selection.nOrdHi - selection.nOrdLo; - ORDERINDEX nInsertWhere = selection.nOrdLo + nInsertCount + 1; + OrdSelection selection = m_OrderList.GetCurSel(false); + ORDERINDEX nInsertCount = selection.lastOrd - selection.firstOrd; + ORDERINDEX nInsertWhere = selection.firstOrd + nInsertCount + 1; if (nInsertWhere >= pSndFile->GetModSpecifications().ordersMax) return; bool bSuccess = false; @@ -849,7 +849,7 @@ for(ORDERINDEX i = 0; i <= nInsertCount; i++) { - PATTERNINDEX nCurPat = pSndFile->Order[selection.nOrdLo + i]; + PATTERNINDEX nCurPat = pSndFile->Order[selection.firstOrd + i]; if (pSndFile->Patterns.IsValidIndex(nCurPat) && patReplaceIndex[nCurPat] == PATTERNINDEX_INVALID) { ROWINDEX rows = pSndFile->Patterns[nCurPat].GetNumRows(); @@ -883,7 +883,7 @@ } else { // Invalid pattern, or it has been duplicated before (multiselect) - for (int j = pSndFile->Order.size() - 1; j > selection.nOrdLo + i + nInsertCount + 1; j--) pSndFile->Order[j] = pSndFile->Order[j - 1]; + for (int j = pSndFile->Order.size() - 1; j > selection.firstOrd + i + nInsertCount + 1; j--) pSndFile->Order[j] = pSndFile->Order[j - 1]; PATTERNINDEX nNewPat; if(nCurPat < pSndFile->Patterns.Size() && patReplaceIndex[nCurPat] != PATTERNINDEX_INVALID) @@ -892,12 +892,12 @@ nNewPat = patReplaceIndex[nCurPat]; } else { - nNewPat = pSndFile->Order[selection.nOrdLo + i]; + nNewPat = pSndFile->Order[selection.firstOrd + i]; } - if (selection.nOrdLo + i + nInsertCount + 1 < pSndFile->Order.GetLength()) + if (selection.firstOrd + i + nInsertCount + 1 < pSndFile->Order.GetLength()) { - pSndFile->Order[selection.nOrdLo + i + nInsertCount + 1] = nNewPat; + pSndFile->Order[selection.firstOrd + i + nInsertCount + 1] = nNewPat; } bSuccess = true; @@ -919,7 +919,7 @@ m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE | HINT_PATNAMES, this); - if(selection.nOrdHi != selection.nOrdLo) m_OrderList.m_nScrollPos2nd = nInsertWhere + nInsertCount; + if(selection.lastOrd != selection.firstOrd) m_OrderList.m_nScrollPos2nd = nInsertWhere + nInsertCount; } } SwitchToView(); Modified: trunk/OpenMPT/mptrack/Ctrl_pat.h =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_pat.h 2012-07-21 00:21:58 UTC (rev 1335) +++ trunk/OpenMPT/mptrack/Ctrl_pat.h 2012-07-21 18:00:54 UTC (rev 1336) @@ -17,11 +17,11 @@ class COrderList; class CCtrlPatterns; -struct ORD_SELECTION +struct OrdSelection { - ORDERINDEX nOrdLo; - ORDERINDEX nOrdHi; - ORDERINDEX GetSelCount() const {return nOrdHi - nOrdLo + 1;} + ORDERINDEX firstOrd; + ORDERINDEX lastOrd; + ORDERINDEX GetSelCount() const {return lastOrd - firstOrd + 1;} }; //=========================== @@ -69,7 +69,7 @@ // Get the currently selected pattern(s). // Set bIgnoreSelection to true if only the first selected point is important. - ORD_SELECTION GetCurSel(bool bIgnoreSelection) const; + OrdSelection GetCurSel(bool bIgnoreSelection) const; // Sets target margin value and returns the effective margin value. BYTE SetMargins(int); Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2012-07-21 00:21:58 UTC (rev 1335) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2012-07-21 18:00:54 UTC (rev 1336) @@ -252,22 +252,22 @@ } -ORD_SELECTION COrderList::GetCurSel(bool bIgnoreSelection) const +OrdSelection COrderList::GetCurSel(bool bIgnoreSelection) const //-------------------------------------------------------------- { // returns the currently selected order(s) - ORD_SELECTION result; - result.nOrdLo = result.nOrdHi = m_nScrollPos; + OrdSelection result; + result.firstOrd = result.lastOrd = m_nScrollPos; // bIgnoreSelection: true if only first selection marker is important. if(!bIgnoreSelection && m_nScrollPos2nd != ORDERINDEX_INVALID) { if(m_nScrollPos2nd < m_nScrollPos) // ord2 < ord1 - result.nOrdLo = m_nScrollPos2nd; + result.firstOrd = m_nScrollPos2nd; else - result.nOrdHi = m_nScrollPos2nd; + result.lastOrd = m_nScrollPos2nd; } - LimitMax(result.nOrdLo, m_pModDoc->GetSoundFile()->Order.GetLastIndex()); - LimitMax(result.nOrdHi, m_pModDoc->GetSoundFile()->Order.GetLastIndex()); + LimitMax(result.firstOrd, m_pModDoc->GetSoundFile()->Order.GetLastIndex()); + LimitMax(result.lastOrd, m_pModDoc->GetSoundFile()->Order.GetLastIndex()); return result; } @@ -289,7 +289,8 @@ { const BYTE nMargins = GetMargins(GetMarginsMax(nShownLength)); if ((*nOrder < m_nXScroll + nMargins) || (!m_cxFont) || (!m_cyFont)) - { // Must move first shown sequence item to left in order to show + { + // Must move first shown sequence item to left in order to show // the new active order. m_nXScroll = max(0, *nOrder - nMargins); SetScrollPos(SB_HORZ, m_nXScroll); @@ -299,7 +300,8 @@ ORDERINDEX maxsel = nShownLength; if (maxsel) maxsel--; if (*nOrder - m_nXScroll >= maxsel - nMargins) - { // Must move first shown sequence item to right in order to show + { + // Must move first shown sequence item to right in order to show // the new active order. m_nXScroll = *nOrder - (maxsel - nMargins); SetScrollPos(SB_HORZ, m_nXScroll); @@ -313,24 +315,24 @@ PATTERNINDEX n = pSndFile->Order[m_nScrollPos]; if ((n < pSndFile->Patterns.Size()) && (pSndFile->Patterns[n]) && !bShiftClick) { - bool bIsPlaying = (pMainFrm->GetModPlaying() == m_pModDoc); - if(bIsPlaying && pSndFile->m_SongFlags[SONG_PATTERNLOOP]) + CriticalSection cs; + + bool isPlaying = (pMainFrm->GetModPlaying() == m_pModDoc); + bool changedPos = false; + + if(isPlaying && pSndFile->m_SongFlags[SONG_PATTERNLOOP]) { - CriticalSection cs; // update channel parameters and play time m_pModDoc->SetElapsedTime(m_nScrollPos, 0); pSndFile->m_nPattern = n; pSndFile->m_nCurrentOrder = pSndFile->m_nNextOrder = m_nScrollPos; - pMainFrm->ResetNotificationBuffer(); //rewbs.toCheck + pMainFrm->ResetNotificationBuffer(); pSndFile->m_nNextRow = 0; - // Users wants to go somewhere else, so let him do that. - OnUnlockPlayback(); + changedPos = true; } else if(m_pParent->GetFollowSong()) { - CriticalSection cs; - SongFlags pausedFlags = pSndFile->m_SongFlags & (SONG_PAUSED | SONG_STEP | SONG_PATTERNLOOP); // update channel parameters and play time @@ -340,11 +342,16 @@ pSndFile->SetCurrentOrder(m_nScrollPos); pSndFile->m_SongFlags.set(pausedFlags); - if (bIsPlaying) pMainFrm->ResetNotificationBuffer(); + if(isPlaying) pMainFrm->ResetNotificationBuffer(); + changedPos = true; + } + if(changedPos && pSndFile->Order.IsPositionLocked(m_nScrollPos)) + { // Users wants to go somewhere else, so let him do that. OnUnlockPlayback(); } + m_pParent->SetCurrentPattern(n); } } @@ -660,7 +667,7 @@ CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); if ((!pMainFrm)) return; - const ORD_SELECTION ordsel = GetCurSel(false); + const OrdSelection ordsel = GetCurSel(false); DWORD dwMemSize; HGLOBAL hCpy; @@ -689,7 +696,7 @@ wsprintf(p, szClipboardOrdCountFieldHdr, ordsel.GetSelCount()); strcat(p, szClipboardOrdersFieldHdr); p += strlen(p); - for(ORDERINDEX i = ordsel.nOrdLo; i <= ordsel.nOrdHi; i++) + for(ORDERINDEX i = ordsel.firstOrd; i <= ordsel.lastOrd; i++) { std::string str; if (seq[i] == seq.GetInvalidPatIndex()) @@ -800,7 +807,7 @@ GetClientRect(&rcClient); rect = rcClient; ORDERINDEX nIndex = m_nXScroll; - ORD_SELECTION selection = GetCurSel(false); + OrdSelection selection = GetCurSel(false); ORDERINDEX maxEntries = pSndFile->GetModSpecifications().ordersMax; if(pSndFile->Order.GetLength() > maxEntries) @@ -812,7 +819,7 @@ // Scrolling the shown orders(the showns rectangles)? while (rect.left < rcClient.right) { - bool bHighLight = ((bFocus) && (nIndex >= selection.nOrdLo && nIndex <= selection.nOrdHi)); + bool bHighLight = ((bFocus) && (nIndex >= selection.firstOrd && nIndex <= selection.lastOrd)); const PATTERNINDEX nPat = (nIndex < pSndFile->Order.GetLength()) ? pSndFile->Order[nIndex] : PATTERNINDEX_INVALID; if ((rect.right = rect.left + m_cxFont) > rcClient.right) rect.right = rcClient.right; rect.right--; @@ -821,7 +828,7 @@ { // Currently selected order item FillRect(dc.m_hDC, &rect, CMainFrame::brushHighLight); - } else if(pSndFile->m_lockOrderStart != ORDERINDEX_INVALID && (nIndex < pSndFile->m_lockOrderStart || nIndex > pSndFile->m_lockOrderEnd)) + } else if(pSndFile->Order.IsPositionLocked(nIndex)) { // "Playback lock" indicator - grey out all order items which aren't played. FillRect(dc.m_hDC, &rect, CMainFrame::brushGray); @@ -842,7 +849,7 @@ LineTo(dc.m_hDC, rect.right, rect.bottom); // Drawing the 'ctrl-transition' indicator - if(nIndex == pSndFile->m_nSeqOverride - 1) + if(nIndex == pSndFile->m_nSeqOverride) { MoveToEx(dc.m_hDC, rect.left + 4, rect.bottom - 4, NULL); LineTo(dc.m_hDC, rect.right - 4, rect.bottom - 4); @@ -912,10 +919,10 @@ const int oldXScroll = m_nXScroll; ORDERINDEX nOrder = GetOrderFromPoint(rect, pt); - ORD_SELECTION selection = GetCurSel(false); + OrdSelection selection = GetCurSel(false); // check if cursor is in selection - if it is, only react on MouseUp as the user might want to drag those orders - if(m_nScrollPos2nd == ORDERINDEX_INVALID || nOrder < selection.nOrdLo || nOrder > selection.nOrdHi) + if(m_nScrollPos2nd == ORDERINDEX_INVALID || nOrder < selection.firstOrd || nOrder > selection.lastOrd) { m_nScrollPos2nd = ORDERINDEX_INVALID; SetCurSel(nOrder, true, IsSelectionKeyPressed()); @@ -924,7 +931,7 @@ if(m_bDragging == true) { - m_nDragOrder = GetCurSel(true).nOrdLo; + m_nDragOrder = GetCurSel(true).firstOrd; m_nDropPos = m_nDragOrder; SetCapture(); } @@ -955,15 +962,15 @@ if ((n != ORDERINDEX_INVALID) && (n == m_nDropPos) && (m_pModDoc)) { // drag multiple orders (not quite as easy...) - ORD_SELECTION selection = GetCurSel(false); + OrdSelection selection = GetCurSel(false); // move how many orders from where? - ORDERINDEX moveCount = (selection.nOrdHi - selection.nOrdLo), nMovePos = selection.nOrdLo; + ORDERINDEX moveCount = (selection.lastOrd - selection.firstOrd), nMovePos = selection.firstOrd; // drop before or after the selection bool moveBack = !(m_nDragOrder < m_nDropPos); // don't do anything if drop position is inside the selection - if((m_nDropPos >= selection.nOrdLo && m_nDropPos <= selection.nOrdHi) || m_nDragOrder == m_nDropPos) return; + if((m_nDropPos >= selection.firstOrd && m_nDropPos <= selection.lastOrd) || m_nDragOrder == m_nDropPos) return; // drag one order or multiple orders? - bool multiSelection = (selection.nOrdLo != selection.nOrdHi); + bool multiSelection = (selection.firstOrd != selection.lastOrd); for(int i = 0; i <= moveCount; i++) { @@ -994,10 +1001,10 @@ } else { ORDERINDEX nOrder = GetOrderFromPoint(rect, pt); - ORD_SELECTION selection = GetCurSel(false); + OrdSelection selection = GetCurSel(false); // this should actually have equal signs but that breaks multiselect: nOrder >= selection.nOrdLo && nOrder <= section.nOrdHi - if(pt.y < rect.bottom && m_nScrollPos2nd != ORDERINDEX_INVALID && nOrder > selection.nOrdLo && nOrder < selection.nOrdHi) + if(pt.y < rect.bottom && m_nScrollPos2nd != ORDERINDEX_INVALID && nOrder > selection.firstOrd && nOrder < selection.lastOrd) { // Remove selection if we didn't drag anything but multiselect was active m_nScrollPos2nd = ORDERINDEX_INVALID; @@ -1079,8 +1086,8 @@ // check if at least one pattern in the current selection exists bool bPatternExists = false; - ORD_SELECTION selection = GetCurSel(false); - for(ORDERINDEX nOrd = selection.nOrdLo; nOrd <= selection.nOrdHi; nOrd++) + OrdSelection selection = GetCurSel(false); + for(ORDERINDEX nOrd = selection.firstOrd; nOrd <= selection.lastOrd; nOrd++) { bPatternExists = ((pSndFile->Order[nOrd] < pSndFile->Patterns.Size()) && (pSndFile->Patterns[pSndFile->Order[nOrd]] != nullptr)); @@ -1151,7 +1158,7 @@ } } AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); - AppendMenu(hMenu, ((selection.nOrdLo == pSndFile->m_lockOrderStart && selection.nOrdHi == pSndFile->m_lockOrderEnd) ? (MF_STRING | MF_CHECKED) : MF_STRING), ID_ORDERLIST_LOCKPLAYBACK, "&Lock Playback to Selection\t" + ih->GetKeyTextFromCommand(kcOrderlistLockPlayback)); + AppendMenu(hMenu, ((selection.firstOrd == pSndFile->m_lockOrderStart && selection.lastOrd == pSndFile->m_lockOrderEnd) ? (MF_STRING | MF_CHECKED) : MF_STRING), ID_ORDERLIST_LOCKPLAYBACK, "&Lock Playback to Selection\t" + ih->GetKeyTextFromCommand(kcOrderlistLockPlayback)); AppendMenu(hMenu, (pSndFile->m_lockOrderStart == ORDERINDEX_INVALID ? (MF_STRING | MF_GRAYED) : MF_STRING), ID_ORDERLIST_UNLOCKPLAYBACK, "&Unlock Playback\t" + ih->GetKeyTextFromCommand(kcOrderlistUnlockPlayback)); AppendMenu(hMenu, MF_SEPARATOR, NULL, ""); @@ -1241,8 +1248,8 @@ { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - const ORD_SELECTION selection = GetCurSel(false); - const ORDERINDEX nInsertCount = selection.nOrdHi - selection.nOrdLo, nInsertEnd = selection.nOrdHi; + const OrdSelection selection = GetCurSel(false); + const ORDERINDEX nInsertCount = selection.lastOrd - selection.firstOrd, nInsertEnd = selection.lastOrd; for(ORDERINDEX i = 0; i <= nInsertCount; i++) { @@ -1289,10 +1296,10 @@ { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - const ORD_SELECTION selection = GetCurSel(true); - ORDERINDEX insertPos = selection.nOrdLo; + const OrdSelection selection = GetCurSel(true); + ORDERINDEX insertPos = selection.firstOrd; - if(pSndFile->Order[selection.nOrdLo] != pSndFile->Order.GetInvalidPatIndex()) + if(pSndFile->Order[selection.firstOrd] != pSndFile->Order.GetInvalidPatIndex()) { // If we're not inserting on a stop (---) index, we move on by one position. insertPos++; @@ -1302,7 +1309,7 @@ if(pSndFile->Order.GetLength() < pSndFile->GetModSpecifications().ordersMax) pSndFile->Order.Append(); } - for(int j = pSndFile->Order.GetLastIndex(); j > selection.nOrdLo; j--) + for(int j = pSndFile->Order.GetLastIndex(); j > selection.firstOrd; j--) pSndFile->Order[j] = pSndFile->Order[j - 1]; } @@ -1319,8 +1326,8 @@ void COrderList::OnRenderOrder() //------------------------------ { - ORD_SELECTION selection = GetCurSel(false); - m_pModDoc->OnFileWaveConvert(selection.nOrdLo, selection.nOrdHi); + OrdSelection selection = GetCurSel(false); + m_pModDoc->OnFileWaveConvert(selection.firstOrd, selection.lastOrd); } @@ -1331,18 +1338,18 @@ { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - ORD_SELECTION selection = GetCurSel(false); + OrdSelection selection = GetCurSel(false); // remove selection m_nScrollPos2nd = ORDERINDEX_INVALID; - pSndFile->Order.Remove(selection.nOrdLo, selection.nOrdHi); + pSndFile->Order.Remove(selection.firstOrd, selection.lastOrd); m_pModDoc->SetModified(); InvalidateRect(NULL, FALSE); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); - SetCurSel(selection.nOrdLo); - PATTERNINDEX nNewPat = pSndFile->Order[selection.nOrdLo]; + SetCurSel(selection.firstOrd); + PATTERNINDEX nNewPat = pSndFile->Order[selection.firstOrd]; if ((nNewPat < pSndFile->Patterns.Size()) && (pSndFile->Patterns[nNewPat] != nullptr) && (m_pParent)) { m_pParent->SetCurrentPattern(nNewPat); @@ -1421,27 +1428,27 @@ } -LRESULT COrderList::OnDragonDropping(WPARAM bDoDrop, LPARAM lParam) +LRESULT COrderList::OnDragonDropping(WPARAM doDrop, LPARAM lParam) //----------------------------------------------------------------- { LPDRAGONDROP pDropInfo = (LPDRAGONDROP)lParam; ORDERINDEX posdest; - BOOL bCanDrop; + BOOL canDrop; CSoundFile *pSndFile; CPoint pt; if ((!pDropInfo) || (!m_pModDoc) || (m_pModDoc != pDropInfo->pModDoc) || (!m_cxFont)) return FALSE; pSndFile = m_pModDoc->GetSoundFile(); - bCanDrop = FALSE; + canDrop = FALSE; switch(pDropInfo->dwDropType) { case DRAGONDROP_ORDER: if (pDropInfo->dwDropItem >= pSndFile->Order.size()) break; case DRAGONDROP_PATTERN: - bCanDrop = TRUE; + canDrop = TRUE; break; } - if ((!bCanDrop) || (!bDoDrop)) return bCanDrop; + if(!canDrop || !doDrop) return canDrop; GetCursorPos(&pt); ScreenToClient(&pt); if (pt.x < 0) pt.x = 0; @@ -1457,14 +1464,14 @@ pSndFile->Order[posdest] = pSndFile->Order[pDropInfo->dwDropItem]; break; } - if (bCanDrop) + if (canDrop) { InvalidateRect(NULL, FALSE); m_pModDoc->SetModified(); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); SetCurSel(posdest, true); } - return bCanDrop; + return canDrop; } @@ -1482,7 +1489,7 @@ CMainFrame::GetMainFrame()->ResetNotificationBuffer(); CSoundFile& rSf = *m_pModDoc->GetSoundFile(); - if (nSeq == MAX_SEQUENCES + 2) + if(nSeq == MAX_SEQUENCES + 2) { CString strParam; strParam.Format(TEXT("%u: %s"), rSf.Order.GetCurrentSequenceIndex(), (LPCTSTR)rSf.Order.m_sName); CString str; @@ -1494,9 +1501,9 @@ return; } } - else if (nSeq == MAX_SEQUENCES || nSeq == MAX_SEQUENCES + 1) + else if(nSeq == MAX_SEQUENCES || nSeq == MAX_SEQUENCES + 1) rSf.Order.AddSequence((nSeq == MAX_SEQUENCES)); - else if (nSeq < rSf.Order.GetNumSequences()) + else if(nSeq < rSf.Order.GetNumSequences()) rSf.Order.SetSequence(nSeq); ORDERINDEX nPosCandidate = rSf.Order.GetLengthTailTrimmed() - 1; SetCurSel(min(m_nScrollPos, nPosCandidate), true, false, true); @@ -1522,32 +1529,36 @@ GetClientRect(&rect); if(!rect.PtInRect(pt)) return; - if (m_pModDoc == nullptr) return; + if(m_pModDoc == nullptr) return; CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); if(pSndFile == nullptr) return; - const PATTERNINDEX nIgnore = pSndFile->Order.GetIgnoreIndex(); - const PATTERNINDEX nInvalid = pSndFile->Order.GetInvalidPatIndex(); - const ORDERINDEX nLength = pSndFile->Order.GetLength(); - ORDERINDEX nOrder = GetOrderFromPoint(rect, pt); + const PATTERNINDEX ignoreIndex = pSndFile->Order.GetIgnoreIndex(); + const PATTERNINDEX stopIndex = pSndFile->Order.GetInvalidPatIndex(); + const ORDERINDEX length = pSndFile->Order.GetLength(); + ORDERINDEX order = GetOrderFromPoint(rect, pt); // If this is not a playable order item, find the next valid item. - while(nOrder < nLength && (pSndFile->Order[nOrder] == nIgnore || pSndFile->Order[nOrder] == nInvalid)) + while(order < length && (pSndFile->Order[order] == ignoreIndex || pSndFile->Order[order] == stopIndex)) { - nOrder++; + order++; } - if (nOrder < nLength) + if(order < length) { - if (pSndFile->m_nSeqOverride == static_cast<UINT>(nOrder) + 1) + if(pSndFile->m_nSeqOverride == order) { - pSndFile->m_nSeqOverride = 0; + // This item is already queued: Dequeue it. + pSndFile->m_nSeqOverride = ORDERINDEX_INVALID; } else { - // Users wants to go somewhere else, so let him do that. - OnUnlockPlayback(); + if(pSndFile->Order.IsPositionLocked(order)) + { + // Users wants to go somewhere else, so let him do that. + OnUnlockPlayback(); + } - pSndFile->m_nSeqOverride = nOrder + 1; + pSndFile->m_nSeqOverride = order; } InvalidateRect(NULL, FALSE); } @@ -1559,14 +1570,14 @@ { CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); - ORD_SELECTION selection = GetCurSel(false); - if(selection.nOrdLo == pSndFile->m_lockOrderStart && selection.nOrdHi == pSndFile->m_lockOrderEnd) + OrdSelection selection = GetCurSel(false); + if(selection.firstOrd == pSndFile->m_lockOrderStart && selection.lastOrd == pSndFile->m_lockOrderEnd) { OnUnlockPlayback(); } else { - pSndFile->m_lockOrderStart = selection.nOrdLo; - pSndFile->m_lockOrderEnd = selection.nOrdHi; + pSndFile->m_lockOrderStart = selection.firstOrd; + pSndFile->m_lockOrderEnd = selection.lastOrd; InvalidateRect(NULL, FALSE); } } @@ -1578,4 +1589,4 @@ CSoundFile *pSndFile = m_pModDoc->GetSoundFile(); pSndFile->m_lockOrderStart = pSndFile->m_lockOrderEnd = ORDERINDEX_INVALID; InvalidateRect(NULL, FALSE); -} \ No newline at end of file +} Modified: trunk/OpenMPT/soundlib/ModSequence.cpp =================================================================== --- trunk/OpenMPT/soundlib/ModSequence.cpp 2012-07-21 00:21:58 UTC (rev 1335) +++ trunk/OpenMPT/soundlib/ModSequence.cpp 2012-07-21 18:00:54 UTC (rev 1336) @@ -590,13 +590,23 @@ } // Remove order name + fill up with empty patterns. m_sName = ""; - const ORDERINDEX nMinLength = (std::min)(ModSequenceSet::s_nCacheSize, m_pSndFile->GetModSpecifications().ordersMax); - if (GetLength() < nMinLength) + const ORDERINDEX nMinLength = Util::Min(ModSequenceSet::s_nCacheSize, m_pSndFile->GetModSpecifications().ordersMax); + if(GetLength() < nMinLength) resize(nMinLength); return true; } +#ifdef MODPLUG_TRACKER +// Check if a playback position is currently locked (inaccessible) +bool ModSequence::IsPositionLocked(ORDERINDEX position) +{ + return(m_pSndFile->m_lockOrderStart != ORDERINDEX_INVALID + && (position < m_pSndFile->m_lockOrderStart || position > m_pSndFile->m_lockOrderEnd)); +} +#endif // MODPLUG_TRACKER + + ///////////////////////////////////// // Read/Write ///////////////////////////////////// Modified: trunk/OpenMPT/soundlib/ModSequence.h =================================================================== --- trunk/OpenMPT/soundlib/ModSequence.h 2012-07-21 00:21:58 UTC (rev 1335) +++ trunk/OpenMPT/soundlib/ModSequence.h 2012-07-21 18:00:54 UTC (rev 1336) @@ -108,6 +108,13 @@ // Returns true if the IT orderlist datafield is not sufficient to store orderlist information. bool NeedsExtraDatafield() const; +#ifdef MODPLUG_TRACKER + // Check if a playback position is currently locked (inaccessible) + bool IsPositionLocked(ORDERINDEX position); +#endif // MODPLUG_TRACKER + + + protected: iterator begin() {return m_pArray;} const_iterator begin() const {return m_pArray;} Modified: trunk/OpenMPT/soundlib/Snd_fx.cpp =================================================================== --- trunk/OpenMPT/soundlib/Snd_fx.cpp 2012-07-21 00:21:58 UTC (rev 1335) +++ trunk/OpenMPT/soundlib/Snd_fx.cpp 2012-07-21 18:00:54 UTC (rev 1336) @@ -1742,7 +1742,9 @@ { // XM: Key-Off + Sample == Note Cut (BUT: Only if no instr number or volume effect is present!) - if ((note == NOTE_KEYOFF) && ((!instr && volcmd == VOLCMD_NONE && cmd != CMD_VOLUME) || !IsCompatibleMode(TRK_FASTTRACKER2)) && ((!pChn->pModInstrument) || (!(pChn->pModInstrument->VolEnv.dwFlags & ENV_ENABLED)))) + if(note == NOTE_KEYOFF + && ((!instr && volcmd == VOLCMD_NONE && cmd != CMD_VOLUME) || !IsCompatibleMode(TRK_FASTTRACKER2)) + && (pChn->pModInstrument == nullptr || !pChn->pModInstrument->VolEnv.dwFlags[ENV_ENABLED])) { pChn->dwFlags.set(CHN_FASTVOLRAMP); pChn->nVolume = 0; @@ -2417,9 +2419,9 @@ case CMD_POSITIONJUMP: m_nNextPatStartRow = 0; // FT2 E60 bug nPosJump = param; - if(m_SongFlags[SONG_PATTERNLOOP] && m_nSeqOverride == 0) + if(m_SongFlags[SONG_PATTERNLOOP] && m_nSeqOverride == ORDERINDEX_INVALID) { - m_nSeqOverride = param + 1; + m_nSeqOverride = param; //Releasing pattern loop after position jump could cause //instant jumps - modifying behavior so that now position jumps //occurs also when pattern loop is enabled. @@ -4678,14 +4680,14 @@ return; // MPT sequence override - if ((m_nSeqOverride > 0) && (m_nSeqOverride <= Order.size())) + if(m_nSeqOverride != ORDERINDEX_INVALID && m_nSeqOverride < Order.size()) { if(m_SongFlags[SONG_PATTERNLOOP]) { - m_nPattern = Order[m_nSeqOverride - 1]; + m_nPattern = Order[m_nSeqOverride]; } - m_nNextOrder = m_nSeqOverride - 1; - m_nSeqOverride = 0; + m_nNextOrder = m_nSeqOverride; + m_nSeqOverride = ORDERINDEX_INVALID; } // Channel mutes Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2012-07-21 00:21:58 UTC (rev 1335) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2012-07-21 18:00:54 UTC (rev 1336) @@ -436,7 +436,7 @@ m_nMinPeriod = MIN_PERIOD; m_nMaxPeriod = 0x7FFF; m_nRepeatCount = 0; - m_nSeqOverride = 0; + m_nSeqOverride = ORDERINDEX_INVALID; m_bPatternTransitionOccurred = false; m_nDefaultRowsPerBeat = m_nCurrentRowsPerBeat = (CMainFrame::GetSettings().m_nRowHighlightBeats) ? CMainFrame::GetSettings().m_nRowHighlightBeats : 4; m_nDefaultRowsPerMeasure = m_nCurrentRowsPerMeasure = (CMainFrame::GetSettings().m_nRowHighlightMeasures >= m_nDefaultRowsPerBeat) ? CMainFrame::GetSettings().m_nRowHighlightMeasures : m_nDefaultRowsPerBeat * 4; @@ -513,7 +513,7 @@ m_nCurrentOrder = 0; m_nNextOrder = 0; m_nNextPatStartRow = 0; - m_nSeqOverride = 0; + m_nSeqOverride = ORDERINDEX_INVALID; m_nRestartPos = 0; m_nMinPeriod = 16; m_nMaxPeriod = 32767; Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2012-07-21 00:21:58 UTC (rev 1335) +++ trunk/OpenMPT/soundlib/Sndfile.h 2012-07-21 18:00:54 UTC (rev 1336) @@ -263,7 +263,7 @@ ORDERINDEX m_nCurrentOrder, m_nNextOrder, m_nRestartPos, m_nSeqOverride; #ifdef MODPLUG_TRACKER - // Lock playback between two orders + // Lock playback between two orders. Lock is active if lock start != ORDERINDEX_INVALID). ORDERINDEX m_lockOrderStart, m_lockOrderEnd; #endif // MODPLUG_TRACKER Modified: trunk/OpenMPT/soundlib/Sndmix.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndmix.cpp 2012-07-21 00:21:58 UTC (rev 1335) +++ trunk/OpenMPT/soundlib/Sndmix.cpp 2012-07-21 18:00:54 UTC (rev 1336) @@ -688,7 +688,7 @@ #ifdef MODPLUG_TRACKER // "Lock order" editing feature - if(m_lockOrderStart != ORDERINDEX_INVALID && (m_nCurrentOrder < m_lockOrderStart || m_nCurrentOrder > m_lockOrderEnd)) + if(Order.IsPositionLocked(m_nCurrentOrder) && !(gdwSoundSetup & SNDMIX_DIRECTTODISK)) { m_nCurrentOrder = m_lockOrderStart; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |