From: <sag...@us...> - 2009-10-04 18:13:42
|
Revision: 386 http://modplug.svn.sourceforge.net/modplug/?rev=386&view=rev Author: saga-games Date: 2009-10-04 18:13:30 +0000 (Sun, 04 Oct 2009) Log Message: ----------- [Fix] Mod Creation: MOD Panning scheme is set up correctly now. [Fix] Treeview: Removing orders works correctly now. [Imp] Treeview: Show whole sequence (don't stop on first "---" item) [Imp] Pattern editor: If "record note off" is enabled and Note Off commands are not supported by the current format, try Note Cut and volume commands [Ref] Fixed various compiler warnings Modified Paths: -------------- trunk/OpenMPT/mptrack/Ctrl_seq.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/mptrack/Modedit.cpp trunk/OpenMPT/mptrack/View_pat.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/View_tre.h trunk/OpenMPT/soundlib/Load_med.cpp trunk/OpenMPT/soundlib/Load_mod.cpp trunk/OpenMPT/soundlib/Sndfile.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/mptrack/Ctrl_seq.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-10-04 12:50:16 UTC (rev 385) +++ trunk/OpenMPT/mptrack/Ctrl_seq.cpp 2009-10-04 18:13:30 UTC (rev 386) @@ -266,7 +266,7 @@ InvalidateSelection(); if ((m_pParent) && (m_pModDoc) && (bEdit)) { - UINT n = pSndFile->Order[m_nScrollPos]; + PATTERNINDEX n = pSndFile->Order[m_nScrollPos]; if ((n < pSndFile->Patterns.Size()) && (pSndFile->Patterns[n]) && !bShiftClick) { BOOL bIsPlaying = (pMainFrm->GetModPlaying() == m_pModDoc); @@ -1000,7 +1000,7 @@ for(int i = 0; i <= (selection.nOrdHi - selection.nOrdLo); i++) { - m_pModDoc->RemoveOrder(selection.nOrdLo); + m_pModDoc->RemoveOrder(pSndFile->Order.GetCurrentSequenceIndex(), selection.nOrdLo); } InvalidateRect(NULL, FALSE); m_pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, this); Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-10-04 12:50:16 UTC (rev 385) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-10-04 18:13:30 UTC (rev 386) @@ -657,16 +657,15 @@ m_SndFile.m_nSamplePreAmp = m_SndFile.m_nVSTiVolume = 128; } - for (UINT init=0; init<MAX_BASECHANNELS; init++) + for (CHANNELINDEX nChn=0; nChn < MAX_BASECHANNELS; nChn++) { - m_SndFile.ChnSettings[init].dwFlags = 0; - m_SndFile.ChnSettings[init].nVolume = 64; - if (m_SndFile.m_nType & (MOD_TYPE_XM|MOD_TYPE_IT | MOD_TYPE_MPT)) - m_SndFile.ChnSettings[init].nPan = 128; - else - m_SndFile.ChnSettings[init].nPan = (init & 0x01) ? 64 : 192; - m_SndFile.Chn[init].nGlobalVol = 64; + m_SndFile.ChnSettings[nChn].dwFlags = 0; + m_SndFile.ChnSettings[nChn].nVolume = 64; + m_SndFile.ChnSettings[nChn].nPan = 128; + m_SndFile.Chn[nChn].nGlobalVol = 64; } + // Setup LRRL panning scheme for MODs + m_SndFile.SetupMODPanning(); } if (!m_SndFile.m_nSamples) { Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2009-10-04 12:50:16 UTC (rev 385) +++ trunk/OpenMPT/mptrack/Moddoc.h 2009-10-04 18:13:30 UTC (rev 386) @@ -203,10 +203,10 @@ SAMPLEINDEX InsertSample(bool bLimit = false); INSTRUMENTINDEX InsertInstrument(LONG lSample = 0, LONG lDuplicate = 0); void InitializeInstrument(MODINSTRUMENT *pIns, UINT nsample=0); - bool RemoveOrder(ORDERINDEX n); - bool RemovePattern(PATTERNINDEX n); - bool RemoveSample(SAMPLEINDEX n); - bool RemoveInstrument(INSTRUMENTINDEX n); + bool RemoveOrder(SEQUENCEINDEX nSeq, ORDERINDEX nOrd); + bool RemovePattern(PATTERNINDEX nPat); + bool RemoveSample(SAMPLEINDEX nSmp); + bool RemoveInstrument(INSTRUMENTINDEX nIns); UINT PlayNote(UINT note, UINT nins, UINT nsmp, BOOL bpause, LONG nVol=-1, LONG loopstart=0, LONG loopend=0, int nCurrentChn=-1, const uint32 nStartPos = uint32_max); //rewbs.vstiLive: added current chan param BOOL NoteOff(UINT note, BOOL bFade=FALSE, UINT nins=-1, UINT nCurrentChn=-1); //rewbs.vstiLive: add params Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2009-10-04 12:50:16 UTC (rev 385) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2009-10-04 18:13:30 UTC (rev 386) @@ -152,7 +152,7 @@ MODCOMMAND *pDest = m_SndFile.Patterns[nNewPat]; memcpy(pDest, pSrc, m_SndFile.PatternSize[nPat] * m_SndFile.m_nChannels * sizeof(MODCOMMAND)); m = pDest + len; - patternsFixed.resize(max(nNewPat + 1, patternsFixed.size()), SEQUENCEINDEX_INVALID); + patternsFixed.resize(max(nNewPat + 1, (PATTERNINDEX)patternsFixed.size()), SEQUENCEINDEX_INVALID); nPat = nNewPat; } else { @@ -923,6 +923,7 @@ } m_SndFile.m_nChannels = nNewChannels; + m_SndFile.SetupMODPanning(); END_CRITICAL(); EndWaitCursor(); } @@ -1939,34 +1940,37 @@ } -bool CModDoc::RemoveOrder(ORDERINDEX n) -//------------------------------- +bool CModDoc::RemoveOrder(SEQUENCEINDEX nSeq, ORDERINDEX nOrd) +//------------------------------------------------------------ { - if (n < m_SndFile.Order.size()) + if (nSeq >= m_SndFile.Order.GetNumSequences() || nOrd >= m_SndFile.Order.GetSequence(nSeq).size()) + return false; + + BEGIN_CRITICAL(); + SEQUENCEINDEX nOldSeq = m_SndFile.Order.GetCurrentSequenceIndex(); + m_SndFile.Order.SetSequence(nSeq); + for (ORDERINDEX i = nOrd; i < m_SndFile.Order.GetSequence(nSeq).size() - 1; i++) { - BEGIN_CRITICAL(); - for (ORDERINDEX i=n; i<m_SndFile.Order.size()-1; i++) - { - m_SndFile.Order[i] = m_SndFile.Order[i+1]; - } - m_SndFile.Order[m_SndFile.Order.size()-1] = m_SndFile.Order.GetInvalidPatIndex(); - END_CRITICAL(); - SetModified(); - return true; + m_SndFile.Order[i] = m_SndFile.Order[i + 1]; } - return false; + m_SndFile.Order[m_SndFile.Order.GetLastIndex()] = m_SndFile.Order.GetInvalidPatIndex(); + m_SndFile.Order.SetSequence(nOldSeq); + END_CRITICAL(); + SetModified(); + return true; } -bool CModDoc::RemovePattern(PATTERNINDEX n) -//--------------------------------- + +bool CModDoc::RemovePattern(PATTERNINDEX nPat) +//-------------------------------------------- { - if ((n < m_SndFile.Patterns.Size()) && (m_SndFile.Patterns[n])) + if ((nPat < m_SndFile.Patterns.Size()) && (m_SndFile.Patterns[nPat])) { BEGIN_CRITICAL(); - LPVOID p = m_SndFile.Patterns[n]; - m_SndFile.Patterns[n] = nullptr; - m_SndFile.SetPatternName(n, ""); + LPVOID p = m_SndFile.Patterns[nPat]; + m_SndFile.Patterns[nPat] = nullptr; + m_SndFile.SetPatternName(nPat, ""); CSoundFile::FreePattern(p); END_CRITICAL(); SetModified(); @@ -1976,14 +1980,14 @@ } -bool CModDoc::RemoveSample(SAMPLEINDEX n) -//-------------------------------- +bool CModDoc::RemoveSample(SAMPLEINDEX nSmp) +//------------------------------------------ { - if ((n) && (n <= m_SndFile.m_nSamples)) + if ((nSmp) && (nSmp <= m_SndFile.m_nSamples)) { BEGIN_CRITICAL(); - m_SndFile.DestroySample(n); - m_SndFile.m_szNames[n][0] = 0; + m_SndFile.DestroySample(nSmp); + m_SndFile.m_szNames[nSmp][0] = 0; while ((m_SndFile.m_nSamples > 1) && (!m_SndFile.m_szNames[m_SndFile.m_nSamples][0]) && (!m_SndFile.Samples[m_SndFile.m_nSamples].pSample)) m_SndFile.m_nSamples--; @@ -1995,15 +1999,15 @@ } -bool CModDoc::RemoveInstrument(INSTRUMENTINDEX n) -//------------------------------------ +bool CModDoc::RemoveInstrument(INSTRUMENTINDEX nIns) +//-------------------------------------------------- { - if ((n) && (n <= m_SndFile.m_nInstruments) && (m_SndFile.Instruments[n])) + if ((nIns) && (nIns <= m_SndFile.m_nInstruments) && (m_SndFile.Instruments[nIns])) { BOOL bIns = FALSE; BEGIN_CRITICAL(); - m_SndFile.DestroyInstrument(n); - if (n == m_SndFile.m_nInstruments) m_SndFile.m_nInstruments--; + m_SndFile.DestroyInstrument(nIns); + if (nIns == m_SndFile.m_nInstruments) m_SndFile.m_nInstruments--; for (UINT i=1; i<MAX_INSTRUMENTS; i++) if (m_SndFile.Instruments[i]) bIns = TRUE; if (!bIns) m_SndFile.m_nInstruments = 0; END_CRITICAL(); Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2009-10-04 12:50:16 UTC (rev 385) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2009-10-04 18:13:30 UTC (rev 386) @@ -3999,12 +3999,27 @@ if (usePlaybackPosition && nTick) { // avoid SD0 which will be mis-interpreted if (p->command == 0) { //make sure we don't overwrite any existing commands. p->command = (pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; - p->param = 0xD0 + min(0xF, nTick); + p->param = 0xD0 | min(0xF, nTick); } } //Enter note off - p->note = NOTE_KEYOFF; + if(pModDoc->GetSoundFile()->GetModSpecifications().hasNoteOff) // === + p->note = NOTE_KEYOFF; + else if(pModDoc->GetSoundFile()->GetModSpecifications().hasNoteCut) // ^^^ + p->note = NOTE_NOTECUT; + else { // we don't have anything to cut (MOD format) - use volume or ECx + if(usePlaybackPosition && nTick) // ECx + { + p->command = (pSndFile->TypeIsS3M_IT_MPT()) ? CMD_S3MCMDEX : CMD_MODCMDEX; + p->param = 0xC0 | min(0xF, nTick); + } else // C00 + { + p->note = NOTE_NONE; + p->command = CMD_VOLUME; + p->param = 0; + } + } p->instr = (bChordMode) ? 0 : ins; //p->instr = 0; //Writing the instrument as well - probably someone finds this annoying :) p->volcmd = 0; Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2009-10-04 12:50:16 UTC (rev 385) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2009-10-04 18:13:30 UTC (rev 386) @@ -742,65 +742,52 @@ } // If there are items past the new sequence length, delete them. - for(size_t nOrd = pSndFile->Order.GetSequence(nSeq).GetLength(); nOrd < pInfo->tiOrders[nSeq].size(); nOrd++) if (pInfo->tiOrders[nSeq][nOrd]) + for(size_t nOrd = pSndFile->Order.GetSequence(nSeq).GetLengthTailTrimmed(); nOrd < pInfo->tiOrders[nSeq].size(); nOrd++) if (pInfo->tiOrders[nSeq][nOrd]) { DeleteItem(pInfo->tiOrders[nSeq][nOrd]); pInfo->tiOrders[nSeq][nOrd] = NULL; } - if (pInfo->tiOrders[nSeq].size() < pSndFile->Order.GetSequence(nSeq).GetLength()) // Resize tiOrders if needed. - pInfo->tiOrders[nSeq].resize(pSndFile->Order.GetSequence(nSeq).GetLength(), NULL); - UINT imin = 0, imax = pSndFile->Order.GetSequence(nSeq).GetLastIndex(); + if (pInfo->tiOrders[nSeq].size() < pSndFile->Order.GetSequence(nSeq).GetLengthTailTrimmed()) // Resize tiOrders if needed. + pInfo->tiOrders[nSeq].resize(pSndFile->Order.GetSequence(nSeq).GetLengthTailTrimmed(), NULL); const bool patNamesOnly = (hintFlagPart == HINT_PATNAMES); //if (hintFlagPart == HINT_PATNAMES) && (dwHintParam < pSndFile->Order.size())) imin = imax = dwHintParam; - bool bEnded = false; - for (UINT iOrd=imin; iOrd<=imax; iOrd++) + for (ORDERINDEX iOrd = 0; iOrd < pSndFile->Order.GetSequence(nSeq).GetLengthTailTrimmed(); iOrd++) { - if (pSndFile->Order.GetSequence(nSeq)[iOrd] == pSndFile->Order.GetInvalidPatIndex()) bEnded = true; - if (bEnded) + if(patNamesOnly && pSndFile->Order.GetSequence(nSeq)[iOrd] != nPat) + continue; + UINT state = (iOrd == pInfo->nOrdSel && nSeq == pInfo->nSeqSel) ? TVIS_BOLD : 0; + if (pSndFile->Order.GetSequence(nSeq)[iOrd] < pSndFile->Patterns.Size()) { - if (pInfo->tiOrders[nSeq][iOrd]) + stmp[0] = 0; + pSndFile->GetPatternName(pSndFile->Order.GetSequence(nSeq)[iOrd], stmp, sizeof(stmp)); + if (stmp[0]) { - DeleteItem(pInfo->tiOrders[nSeq][iOrd]); - pInfo->tiOrders[nSeq][iOrd] = NULL; - } - } else - { - if(patNamesOnly && pSndFile->Order.GetSequence(nSeq)[iOrd] != nPat) - continue; - UINT state = (iOrd == pInfo->nOrdSel && nSeq == pInfo->nSeqSel) ? TVIS_BOLD : 0; - if (pSndFile->Order.GetSequence(nSeq)[iOrd] < pSndFile->Patterns.Size()) - { - stmp[0] = 0; - pSndFile->GetPatternName(pSndFile->Order.GetSequence(nSeq)[iOrd], stmp, sizeof(stmp)); - if (stmp[0]) - { - wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "[%02Xh] %d: %s" : "[%02d] %d: %s", - iOrd, pSndFile->Order.GetSequence(nSeq)[iOrd], stmp); - } else - { - wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "[%02Xh] Pattern %d" : "[%02d] Pattern %d", - iOrd, pSndFile->Order.GetSequence(nSeq)[iOrd]); - } + wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "[%02Xh] %d: %s" : "[%02d] %d: %s", + iOrd, pSndFile->Order.GetSequence(nSeq)[iOrd], stmp); } else { - wsprintf(s, "[%02d] Skip", iOrd); + wsprintf(s, (CMainFrame::m_dwPatternSetup & PATTERN_HEXDISPLAY) ? "[%02Xh] Pattern %d" : "[%02d] Pattern %d", + iOrd, pSndFile->Order.GetSequence(nSeq)[iOrd]); } - if (pInfo->tiOrders[nSeq][iOrd]) - { - tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_STATE; - tvi.state = 0; - tvi.stateMask = TVIS_BOLD; - tvi.hItem = pInfo->tiOrders[nSeq][iOrd]; - tvi.pszText = stmp; - tvi.cchTextMax = sizeof(stmp); - GetItem(&tvi); - if ((strcmp(s, stmp)) || (tvi.state != state)) - SetItem(pInfo->tiOrders[nSeq][iOrd], TVIF_TEXT | TVIF_STATE, s, 0, 0, state, TVIS_BOLD, 0); - } else - { - pInfo->tiOrders[nSeq][iOrd] = InsertItem(s, IMAGE_PARTITION, IMAGE_PARTITION, hAncestorNode, TVI_LAST); - } + } else + { + wsprintf(s, "[%02d] Skip", iOrd); } + if (pInfo->tiOrders[nSeq][iOrd]) + { + tvi.mask = TVIF_TEXT | TVIF_HANDLE | TVIF_STATE; + tvi.state = 0; + tvi.stateMask = TVIS_BOLD; + tvi.hItem = pInfo->tiOrders[nSeq][iOrd]; + tvi.pszText = stmp; + tvi.cchTextMax = sizeof(stmp); + GetItem(&tvi); + if ((strcmp(s, stmp)) || (tvi.state != state)) + SetItem(pInfo->tiOrders[nSeq][iOrd], TVIF_TEXT | TVIF_STATE, s, 0, 0, state, TVIS_BOLD, 0); + } else + { + pInfo->tiOrders[nSeq][iOrd] = InsertItem(s, IMAGE_PARTITION, IMAGE_PARTITION, hAncestorNode, TVI_LAST); + } } } } @@ -1035,7 +1022,6 @@ // find sequence this item belongs to for(SEQUENCEINDEX nSeq = 0; nSeq < pSong->tiOrders.size(); nSeq++) { - ASSERT(pSong->tiOrders[nSeq].size() == pSndFile->Order.size()); for(ORDERINDEX nOrd = 0; nOrd < pSong->tiOrders[nSeq].size(); nOrd++) { if (hItem == pSong->tiOrders[nSeq][nOrd]) @@ -1338,7 +1324,7 @@ switch(qwItemType & 0xFFFF) { case MODITEM_ORDER: - if ((pModDoc) && (pModDoc->RemoveOrder((ORDERINDEX)dwItem))) + if ((pModDoc) && (pModDoc->RemoveOrder((SEQUENCEINDEX)(dwItem >> 16), (ORDERINDEX)(dwItem & 0xFFFF)))) { pModDoc->UpdateAllViews(NULL, HINT_MODSEQUENCE, NULL); } Modified: trunk/OpenMPT/mptrack/View_tre.h =================================================================== --- trunk/OpenMPT/mptrack/View_tre.h 2009-10-04 12:50:16 UTC (rev 385) +++ trunk/OpenMPT/mptrack/View_tre.h 2009-10-04 18:13:30 UTC (rev 386) @@ -45,8 +45,10 @@ struct MODTREEDOCINFO { CModDoc *pModDoc; + // Module information SEQUENCEINDEX nSeqSel; ORDERINDEX nOrdSel; + // Tree state variables HTREEITEM hSong, hPatterns, hSamples, hInstruments, hComments, hOrders, hEffects; vector<HTREEITEM> tiPatterns; HTREEITEM tiSamples[MAX_SAMPLES]; Modified: trunk/OpenMPT/soundlib/Load_med.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_med.cpp 2009-10-04 12:50:16 UTC (rev 385) +++ trunk/OpenMPT/soundlib/Load_med.cpp 2009-10-04 18:13:30 UTC (rev 386) @@ -912,12 +912,8 @@ } } } - // Setup channel pan positions - for (UINT iCh=0; iCh<m_nChannels; iCh++) - { - ChnSettings[iCh].nPan = (((iCh&3) == 1) || ((iCh&3) == 2)) ? 0xC0 : 0x40; - ChnSettings[iCh].nVolume = 64; - } + // Setup channel pan positions and volume + SetupMODPanning(true); return true; } Modified: trunk/OpenMPT/soundlib/Load_mod.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mod.cpp 2009-10-04 12:50:16 UTC (rev 385) +++ trunk/OpenMPT/soundlib/Load_mod.cpp 2009-10-04 18:13:30 UTC (rev 386) @@ -348,15 +348,9 @@ m_nMinPeriod = 14 << 2; m_nMaxPeriod = 3424 << 2; memcpy(m_szNames, lpStream, 20); - // Setting channels pan - for (UINT ich=0; ich<m_nChannels; ich++) - { - ChnSettings[ich].nVolume = 64; - if (gdwSoundSetup & SNDMIX_MAXDEFAULTPAN) - ChnSettings[ich].nPan = (((ich&3)==1) || ((ich&3)==2)) ? 256 : 0; - else - ChnSettings[ich].nPan = (((ich&3)==1) || ((ich&3)==2)) ? 0xC0 : 0x40; // this should be inverted for Amiga playback - } + // Setup channel pan positions and volume + SetupMODPanning(); + // Reading channels for (UINT ipat=0; ipat<nbp; ipat++) { Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-10-04 12:50:16 UTC (rev 385) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-10-04 18:13:30 UTC (rev 386) @@ -516,12 +516,9 @@ memset(&m_SongEQ, 0, sizeof(m_SongEQ)); ResetMidiCfg(); //for (UINT npt=0; npt<Patterns.Size(); npt++) PatternSize[npt] = 64; - for (UINT nch=0; nch<MAX_BASECHANNELS; nch++) + for (CHANNELINDEX nChn = 0; nChn < MAX_BASECHANNELS; nChn++) { - ChnSettings[nch].nPan = 128; - ChnSettings[nch].nVolume = 64; - ChnSettings[nch].dwFlags = 0; - ChnSettings[nch].szName[0] = 0; + InitChannel(nChn); } if (lpStream) { @@ -1337,19 +1334,21 @@ //m_nSeqOverride = 0; } -ORDERINDEX CSoundFile::FindOrder(PATTERNINDEX pat, UINT startFromOrder, bool direction) +ORDERINDEX CSoundFile::FindOrder(PATTERNINDEX nPat, UINT startFromOrder, bool direction) //------------------------------------------------------------------------------------- { - int foundAtOrder = ORDERINDEX_INVALID; - int candidateOrder = 0; + ORDERINDEX foundAtOrder = ORDERINDEX_INVALID; + ORDERINDEX candidateOrder = 0; - for (UINT p=0; p<Order.size(); p++) { - if (direction) { - candidateOrder = (startFromOrder+p)%Order.size(); //wrap around MAX_ORDERS + for (ORDERINDEX p = 0; p < Order.size(); p++) + { + if (direction) + { + candidateOrder = (startFromOrder + p) % Order.size(); //wrap around MAX_ORDERS } else { - candidateOrder = (startFromOrder-p+Order.size())%Order.size(); //wrap around 0 and MAX_ORDERS + candidateOrder = (startFromOrder - p + Order.size()) % Order.size(); //wrap around 0 and MAX_ORDERS } - if (Order[candidateOrder] == pat) { + if (Order[candidateOrder] == nPat) { foundAtOrder = candidateOrder; break; } @@ -1418,25 +1417,25 @@ } -bool CSoundFile::InitChannel(UINT nch) -//------------------------------------- +bool CSoundFile::InitChannel(CHANNELINDEX nChn) +//--------------------------------------------- { - if(nch >= MAX_BASECHANNELS) return true; + if(nChn >= MAX_BASECHANNELS) return true; - ChnSettings[nch].nPan = 128; - ChnSettings[nch].nVolume = 64; - ChnSettings[nch].dwFlags = 0; - ChnSettings[nch].nMixPlugin = 0; - ChnSettings[nch].szName[0] = 0; + ChnSettings[nChn].nPan = 128; + ChnSettings[nChn].nVolume = 64; + ChnSettings[nChn].dwFlags = 0; + ChnSettings[nChn].nMixPlugin = 0; + ChnSettings[nChn].szName[0] = 0; - ResetChannelState(nch, CHNRESET_TOTAL); + ResetChannelState(nChn, CHNRESET_TOTAL); if(m_pModDoc) { - m_pModDoc->Record1Channel(nch,FALSE); - m_pModDoc->Record2Channel(nch,FALSE); + m_pModDoc->Record1Channel(nChn, false); + m_pModDoc->Record2Channel(nChn, false); } - m_bChannelMuteTogglePending[nch] = false; + m_bChannelMuteTogglePending[nChn] = false; return false; } @@ -1525,7 +1524,7 @@ //added to position i. If index of some current channel is missing from the //newOrder-vector, then the channel gets removed. - UINT nRemainingChannels = newOrder.size(); + CHANNELINDEX nRemainingChannels = newOrder.size(); if(nRemainingChannels > GetModSpecifications().channelsMax || nRemainingChannels < GetModSpecifications().channelsMin) { @@ -1536,13 +1535,12 @@ } BEGIN_CRITICAL(); - UINT i = 0; - for (i=0; i<Patterns.Size(); i++) + for (PATTERNINDEX nPat = 0; nPat < Patterns.Size(); nPat++) { - if (Patterns[i]) + if (Patterns[nPat]) { - MODCOMMAND *p = Patterns[i]; - MODCOMMAND *newp = CSoundFile::AllocatePattern(PatternSize[i], nRemainingChannels); + MODCOMMAND *p = Patterns[nPat]; + MODCOMMAND *newp = CSoundFile::AllocatePattern(PatternSize[nPat], nRemainingChannels); if (!newp) { END_CRITICAL(); @@ -1550,18 +1548,18 @@ return 0; } MODCOMMAND *tmpsrc = p, *tmpdest = newp; - for (UINT j=0; j<PatternSize[i]; j++) //Scrolling rows + for (ROWINDEX nRow = 0; nRow<PatternSize[nPat]; nRow++) //Scrolling rows { - for (UINT k=0; k<nRemainingChannels; k++, tmpdest++) //Scrolling channels. + for (CHANNELINDEX nChn = 0; nChn < nRemainingChannels; nChn++, tmpdest++) //Scrolling channels. { - if(newOrder[k] < m_nChannels) //Case: getting old channel to the new channel order. - *tmpdest = tmpsrc[j*m_nChannels+newOrder[k]]; + if(newOrder[nChn] < m_nChannels) //Case: getting old channel to the new channel order. + *tmpdest = tmpsrc[nRow*m_nChannels+newOrder[nChn]]; else //Case: figure newOrder[k] is not the index of any current channel, so adding a new channel. *tmpdest = MODCOMMAND::Empty(); } } - Patterns[i] = newp; + Patterns[nPat] = newp; CSoundFile::FreePattern(p); } } @@ -1571,36 +1569,38 @@ UINT recordStates[MAX_BASECHANNELS]; bool chnMutePendings[MAX_BASECHANNELS]; - for(i = 0 ; i < m_nChannels ; i++) + for(CHANNELINDEX nChn = 0; nChn < m_nChannels; nChn++) { - settings[i] = ChnSettings[i]; - chns[i] = Chn[i]; + settings[nChn] = ChnSettings[nChn]; + chns[nChn] = Chn[nChn]; if(m_pModDoc) - recordStates[i] = m_pModDoc->IsChannelRecord(i); - chnMutePendings[i] = m_bChannelMuteTogglePending[i]; + recordStates[nChn] = m_pModDoc->IsChannelRecord(nChn); + chnMutePendings[nChn] = m_bChannelMuteTogglePending[nChn]; } if(m_pModDoc) m_pModDoc->ReinitRecordState(); - for (UINT i=0; i<nRemainingChannels; i++) + for (CHANNELINDEX nChn = 0; nChn < nRemainingChannels; nChn++) { - if(newOrder[i] < m_nChannels) + if(newOrder[nChn] < m_nChannels) { - ChnSettings[i] = settings[newOrder[i]]; - Chn[i] = chns[newOrder[i]]; + ChnSettings[nChn] = settings[newOrder[nChn]]; + Chn[nChn] = chns[newOrder[nChn]]; if(m_pModDoc) { - if(recordStates[newOrder[i]] == 1) m_pModDoc->Record1Channel(i,TRUE); - if(recordStates[newOrder[i]] == 2) m_pModDoc->Record2Channel(i,TRUE); + if(recordStates[newOrder[nChn]] == 1) m_pModDoc->Record1Channel(nChn, true); + if(recordStates[newOrder[nChn]] == 2) m_pModDoc->Record2Channel(nChn, true); } - m_bChannelMuteTogglePending[i] = chnMutePendings[newOrder[i]]; + m_bChannelMuteTogglePending[nChn] = chnMutePendings[newOrder[nChn]]; } else { - InitChannel(i); + InitChannel(nChn); } } + // Reset MOD panning (won't affect other module formats) + SetupMODPanning(); m_nChannels = nRemainingChannels; END_CRITICAL(); @@ -2747,12 +2747,12 @@ //------------------------------------------------- { if (!pbIns) return false; - for (UINT j=1; j<MAX_SAMPLES; j++) + for (SAMPLEINDEX nSmp=1; nSmp<MAX_SAMPLES; nSmp++) { - if ((!pbIns[j]) && (Samples[j].pSample)) + if ((!pbIns[nSmp]) && (Samples[nSmp].pSample)) { - DestroySample(j); - if ((j == m_nSamples) && (j > 1)) m_nSamples--; + DestroySample(nSmp); + if ((nSmp == m_nSamples) && (nSmp > 1)) m_nSamples--; } } return true; @@ -3004,6 +3004,7 @@ const MODTYPE oldtype = m_nType; m_nType = newType; SetModSpecsPointer(m_pModSpecs, m_nType); + SetupMODPanning(); // Setup LRRL panning scheme if needed m_ModFlags = m_ModFlags & GetModFlagMask(oldtype, newType); @@ -3191,3 +3192,19 @@ return false; } + +void CSoundFile::SetupMODPanning(bool bForceSetup) +//------------------------------------------------ +{ + // Setup LRRL panning, max channel volume + if((m_nType & MOD_TYPE_MOD) == 0 && bForceSetup == false) return; + + for (CHANNELINDEX nChn = 0; nChn < MAX_BASECHANNELS; nChn++) + { + ChnSettings[nChn].nVolume = 64; + if (gdwSoundSetup & SNDMIX_MAXDEFAULTPAN) + ChnSettings[nChn].nPan = (((nChn & 3) == 1) || ((nChn & 3) == 2)) ? 256 : 0; + else + ChnSettings[nChn].nPan = (((nChn & 3) == 1) || ((nChn & 3) == 2)) ? 0xC0 : 0x40; + } +} Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2009-10-04 12:50:16 UTC (rev 385) +++ trunk/OpenMPT/soundlib/Sndfile.h 2009-10-04 18:13:30 UTC (rev 386) @@ -638,7 +638,7 @@ static const CModSpecifications& GetModSpecifications(const MODTYPE type); double GetCurrentBPM() const; - ORDERINDEX FindOrder(PATTERNINDEX pat, UINT startFromOrder=0, bool direction=true); //rewbs.playSongFromCursor + ORDERINDEX FindOrder(PATTERNINDEX nPat, UINT startFromOrder=0, bool direction = true); //rewbs.playSongFromCursor void DontLoopPattern(int nPat, int nRow=0); //rewbs.playSongFromCursor void SetCurrentPos(UINT nPos); void SetCurrentOrder(UINT nOrder); @@ -670,7 +670,7 @@ CHANNELINDEX ReArrangeChannels(const vector<CHANNELINDEX>& fromToArray); bool MoveChannel(UINT chn_from, UINT chn_to); - bool InitChannel(UINT nch); + bool InitChannel(CHANNELINDEX nChn); void ResetChannelState(CHANNELINDEX chn, BYTE resetStyle); // Module Loaders @@ -705,6 +705,9 @@ bool ReadGDM(const LPCBYTE lpStream, const DWORD dwMemLength); bool ReadIMF(const LPCBYTE lpStream, const DWORD dwMemLength); bool ReadMID(LPCBYTE lpStream, DWORD dwMemLength); + + void SetupMODPanning(bool bForceSetup = false); // Setup LRRL panning, max channel volume + // Save Functions #ifndef MODPLUG_NO_FILESAVE UINT WriteSample(FILE *f, MODSAMPLE *pSmp, UINT nFlags, UINT nMaxLen=0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |