From: <sag...@us...> - 2010-05-22 15:27:42
|
Revision: 604 http://modplug.svn.sourceforge.net/modplug/?rev=604&view=rev Author: saga-games Date: 2010-05-22 15:27:35 +0000 (Sat, 22 May 2010) Log Message: ----------- [Fix] Autosaver: Added a CSoundFile verification, so that it would not complain that autosaving failed in *extremely* rare situations (for example when trying to load a non-existing file. A "file not found" messagebox would be shown and the autosaver could kick in while this box is still shown. Yep, very rare, but I actually managed to trigger this. [Imp] Wave Export: In channel mode, unused channels are not exported anymore. [Fix] Wave Export: Small fixes with related refactoring. Modified Paths: -------------- trunk/OpenMPT/mptrack/AutoSaver.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/dlg_misc.cpp trunk/OpenMPT/mptrack/dlg_misc.h trunk/OpenMPT/packageTemplate/History.txt Modified: trunk/OpenMPT/mptrack/AutoSaver.cpp =================================================================== --- trunk/OpenMPT/mptrack/AutoSaver.cpp 2010-05-22 13:45:17 UTC (rev 603) +++ trunk/OpenMPT/mptrack/AutoSaver.cpp 2010-05-22 15:27:35 UTC (rev 604) @@ -72,11 +72,14 @@ while (posDocument) { //for all open documents pModDoc = (CModDoc*)(pDocTemplate->GetNextDoc(posDocument)); - if (pModDoc && pModDoc->ModifiedSinceLastAutosave()) { - if (SaveSingleFile(pModDoc)) { + if (pModDoc && pModDoc->ModifiedSinceLastAutosave() && pModDoc->GetSoundFile()) + { + if (SaveSingleFile(pModDoc)) + { CleanUpBackups(pModDoc); - } else { - m_bEnabled=false; + } else + { + m_bEnabled = false; AfxMessageBox("Warning: Autosave failed and has been disabled. Please:\n- Review your autosave paths\n- Check available diskspace & filesystem access rights\n- If you are using the ITP format, ensure all instruments exist as independant .iti files"); success = false; } Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2010-05-22 13:45:17 UTC (rev 603) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2010-05-22 15:27:35 UTC (rev 604) @@ -1451,17 +1451,27 @@ TCHAR sFilenameAdd[_MAX_PATH] = _T(""); int nRenderPasses = 1; - DWORD flags[MAX_BASECHANNELS]; + // Channel mode + bool unusedChannels[MAX_BASECHANNELS]; + vector<DWORD> channelFlags; + // Instrument mode vector<bool> instrMuteState; - // Channel mode : save song in multiple wav files (one for each enabled channels) + // Channel mode: save song in multiple wav files (one for each enabled channels) if(wsdlg.m_bChannelMode) { - nRenderPasses = m_SndFile.m_nChannels; - for(int i = 0; i < nRenderPasses ; i++) + // Don't save empty channels + memset(unusedChannels, false, sizeof(unusedChannels)); + CheckUnusedChannels(unusedChannels); + + nRenderPasses = m_SndFile.GetNumChannels(); + channelFlags.resize(nRenderPasses, 0); + for(CHANNELINDEX i = 0; i < m_SndFile.GetNumChannels(); i++) { // Save channels' flags - flags[i] = m_SndFile.ChnSettings[i].dwFlags; + channelFlags[i] = m_SndFile.ChnSettings[i].dwFlags; + // Ignore muted channels + if(channelFlags[i] & CHN_MUTE) unusedChannels[i] = true; // Mute each channel m_SndFile.ChnSettings[i].dwFlags |= CHN_MUTE; } @@ -1472,7 +1482,7 @@ if(m_SndFile.GetNumInstruments() == 0) { nRenderPasses = m_SndFile.GetNumSamples(); - instrMuteState.resize(nRenderPasses); + instrMuteState.resize(nRenderPasses, false); for(SAMPLEINDEX i = 0; i < m_SndFile.GetNumSamples(); i++) { instrMuteState[i] = IsSampleMuted(i + 1); @@ -1481,7 +1491,7 @@ } else { nRenderPasses = m_SndFile.GetNumInstruments(); - instrMuteState.resize(nRenderPasses); + instrMuteState.resize(nRenderPasses, false); for(INSTRUMENTINDEX i = 0; i < m_SndFile.GetNumInstruments(); i++) { instrMuteState[i] = IsInstrumentMuted(i + 1); @@ -1509,6 +1519,9 @@ // Re-mute previously processed channel if(i > 0) m_SndFile.ChnSettings[i - 1].dwFlags |= CHN_MUTE; + // Was this channel actually muted? Don't process it then. + if(unusedChannels[i] == true) + continue; // Add channel number & name (if available) to path string if(strlen(m_SndFile.ChnSettings[i].szName) > 0) wsprintf(sFilenameAdd, "-%03d_%s.wav", i + 1, m_SndFile.ChnSettings[i].szName); @@ -1557,29 +1570,24 @@ _tcscpy(sFilenameAdd, _T("")); } - // Render song (or current channel if channel mode and channel not initially disabled) - if(!(wsdlg.m_bChannelMode || wsdlg.m_bInstrumentMode) || !(flags[i] & CHN_MUTE)) + // Render song (or current channel, or current sample/instrument) + m_SndFile.SetCurrentPos(0); + m_SndFile.m_dwSongFlags &= ~SONG_PATTERNLOOP; + if (wsdlg.m_bSelectPlay) { - // rewbs.fix3239 - m_SndFile.SetCurrentPos(0); - m_SndFile.m_dwSongFlags &= ~SONG_PATTERNLOOP; - if (wsdlg.m_bSelectPlay) - { - m_SndFile.SetCurrentOrder(wsdlg.m_nMinOrder); - m_SndFile.m_nCurrentPattern = wsdlg.m_nMinOrder; - m_SndFile.GetLength(TRUE, FALSE); - m_SndFile.m_nMaxOrderPosition = wsdlg.m_nMaxOrder + 1; - } - //end rewbs.fix3239 - if( dwcdlg.DoModal() != IDOK ) break; // UPDATE#03 + m_SndFile.SetCurrentOrder(wsdlg.m_nMinOrder); + m_SndFile.m_nCurrentPattern = wsdlg.m_nMinOrder; + m_SndFile.GetLength(TRUE, FALSE); + m_SndFile.m_nMaxOrderPosition = wsdlg.m_nMaxOrder + 1; } + if(dwcdlg.DoModal() != IDOK) break; } // Restore channels' flags if(wsdlg.m_bChannelMode) { for(int i = 0 ; i < nRenderPasses ; i++) - m_SndFile.ChnSettings[i].dwFlags = flags[i]; + m_SndFile.ChnSettings[i].dwFlags = channelFlags[i]; } // Restore instruments' / samples' flags if(wsdlg.m_bInstrumentMode) Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2010-05-22 13:45:17 UTC (rev 603) +++ trunk/OpenMPT/mptrack/Moddoc.h 2010-05-22 15:27:35 UTC (rev 604) @@ -287,7 +287,7 @@ void LearnMacro(int macro, long param); void SetElapsedTime(ORDERINDEX nOrd, ROWINDEX nRow, bool bReset = false); - BOOL RemoveChannels(BOOL bChnMask[MAX_CHANNELS]); + bool RemoveChannels(bool bChnMask[MAX_BASECHANNELS]); bool HasMPTHacks(bool autofix = false); @@ -311,7 +311,7 @@ BOOL InitializeMod(); void* GetChildFrame(); //rewbs.customKeys - void CheckUnusedChannels(BOOL mask[MAX_CHANNELS], CHANNELINDEX maxRemoveCount); + void CheckUnusedChannels(bool mask[MAX_BASECHANNELS], CHANNELINDEX maxRemoveCount = MAX_BASECHANNELS); // Overrides // ClassWizard generated virtual function overrides Modified: trunk/OpenMPT/mptrack/Modedit.cpp =================================================================== --- trunk/OpenMPT/mptrack/Modedit.cpp 2010-05-22 13:45:17 UTC (rev 603) +++ trunk/OpenMPT/mptrack/Modedit.cpp 2010-05-22 15:27:35 UTC (rev 604) @@ -499,7 +499,7 @@ } -BOOL CModDoc::RemoveChannels(BOOL m_bChnMask[MAX_CHANNELS]) +bool CModDoc::RemoveChannels(bool m_bChnMask[MAX_BASECHANNELS]) //--------------------------------------------------------- //To remove all channels whose index corresponds to true value at m_bChnMask[] array. Code is almost non-modified copy of //the code which was in CModDoc::ChangeNumChannels(UINT nNewChannels) - the only differences are the lines before @@ -518,7 +518,7 @@ if(nRemainingChannels == m_SndFile.m_nChannels) str.Format("No channels chosen to be removed."); else str.Format("No removal done - channel number is already at minimum."); CMainFrame::GetMainFrame()->MessageBox(str , "Remove channel", MB_OK | MB_ICONINFORMATION); - return FALSE; + return false; } BeginWaitCursor(); @@ -531,7 +531,7 @@ { END_CRITICAL(); AddToLog("ERROR: Not enough memory to resize patterns!\nPattern Data is corrupted!"); - return TRUE; + return true; } MODCOMMAND *tmpsrc = p, *tmpdest = newp; for (UINT j=0; j<m_SndFile.PatternSize[i]; j++) @@ -568,7 +568,7 @@ SetModified(); GetPatternUndo()->ClearUndo(); UpdateAllViews(NULL, HINT_MODTYPE); - return FALSE; + return false; } @@ -1607,22 +1607,23 @@ } -void CModDoc::CheckUnusedChannels(BOOL mask[MAX_CHANNELS], CHANNELINDEX maxRemoveCount) +void CModDoc::CheckUnusedChannels(bool mask[MAX_BASECHANNELS], CHANNELINDEX maxRemoveCount) //------------------------------------------------------------------------------------- { // Checking for unused channels - for (int iRst=m_SndFile.m_nChannels-1; iRst>=0; iRst--) //rewbs.removeChanWindowCleanup + const int nChannels = m_SndFile.GetNumChannels(); + for(int iRst = nChannels - 1; iRst >= 0; iRst--) { - mask[iRst] = TRUE; - for (UINT ipat=0; ipat<m_SndFile.Patterns.Size(); ipat++) if (m_SndFile.Patterns[ipat]) + mask[iRst] = true; + for (PATTERNINDEX ipat = 0; ipat < m_SndFile.Patterns.Size(); ipat++) if (m_SndFile.Patterns.IsValidPat(ipat)) { MODCOMMAND *p = m_SndFile.Patterns[ipat] + iRst; UINT len = m_SndFile.PatternSize[ipat]; - for (UINT idata=0; idata<len; idata++, p+=m_SndFile.m_nChannels) + for (UINT idata = 0; idata < len; idata++, p += m_SndFile.m_nChannels) { - if (*((LPDWORD)p)) + if (!p->IsEmpty()) { - mask[iRst] = FALSE; + mask[iRst] = false; break; } } Modified: trunk/OpenMPT/mptrack/View_pat.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_pat.cpp 2010-05-22 13:45:17 UTC (rev 603) +++ trunk/OpenMPT/mptrack/View_pat.cpp 2010-05-22 15:27:35 UTC (rev 604) @@ -2529,8 +2529,8 @@ str.Format("Remove channel %d?\nNote: Affects all patterns and no undo", nChn+1); if(CMainFrame::GetMainFrame()->MessageBox(str , "Remove channel", MB_YESNO | MB_ICONQUESTION) == IDYES) { - BOOL chnMask[MAX_CHANNELS]; - for(CHANNELINDEX i = 0; i < MAX_CHANNELS; chnMask[i] = FALSE, i++) {} + bool chnMask[MAX_BASECHANNELS]; + for(CHANNELINDEX i = 0; i < MAX_BASECHANNELS; i++) {chnMask[i] = false;} chnMask[nChn] = TRUE; pModDoc->RemoveChannels(chnMask); SetCurrentPattern(m_nPattern); //Updating the screen. Modified: trunk/OpenMPT/mptrack/dlg_misc.cpp =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-05-22 13:45:17 UTC (rev 603) +++ trunk/OpenMPT/mptrack/dlg_misc.cpp 2010-05-22 15:27:35 UTC (rev 604) @@ -674,7 +674,7 @@ void CRemoveChannelsDlg::OnOK() //----------------------------- { - memset(m_bChnMask, 0, sizeof(m_bChnMask)); + memset(m_bChnMask, false, sizeof(m_bChnMask)); int nCount = m_RemChansList.GetSelCount(); CArray<int,int> aryListBoxSel; aryListBoxSel.SetSize(nCount); @@ -682,7 +682,7 @@ for (int n=0; n<nCount; n++) { - m_bChnMask[aryListBoxSel[n]]++; + m_bChnMask[aryListBoxSel[n]] = true; } if ((static_cast<UINT>(nCount) == m_nRemove && nCount > 0) || (m_nRemove == 0 && (m_pSndFile->GetNumChannels() >= nCount + m_pSndFile->GetModSpecifications().channelsMin))) CDialog::OnOK(); Modified: trunk/OpenMPT/mptrack/dlg_misc.h =================================================================== --- trunk/OpenMPT/mptrack/dlg_misc.h 2010-05-22 13:45:17 UTC (rev 603) +++ trunk/OpenMPT/mptrack/dlg_misc.h 2010-05-22 15:27:35 UTC (rev 604) @@ -87,7 +87,7 @@ { public: CSoundFile *m_pSndFile; - BOOL m_bChnMask[MAX_CHANNELS]; + bool m_bChnMask[MAX_BASECHANNELS]; UINT m_nChannels, m_nRemove; CListBox m_RemChansList; //rewbs.removeChansDlgCleanup bool m_ShowCancel; @@ -97,7 +97,7 @@ { m_pSndFile = pSndFile; m_nChannels = m_pSndFile->m_nChannels; m_nRemove = nChns; - memset(m_bChnMask, 0, sizeof(m_bChnMask)); + memset(m_bChnMask, false, sizeof(m_bChnMask)); m_ShowCancel = showCancel; } Modified: trunk/OpenMPT/packageTemplate/History.txt =================================================================== --- trunk/OpenMPT/packageTemplate/History.txt 2010-05-22 13:45:17 UTC (rev 603) +++ trunk/OpenMPT/packageTemplate/History.txt 2010-05-22 15:27:35 UTC (rev 604) @@ -9,7 +9,7 @@ [Var]: other (tx XYZ): thanks to XYZ for telling us about the bug -Changes from revisions [476, 602] +Changes from revisions [476, 604] --------------------------------- General tab @@ -176,6 +176,7 @@ [New] <Jojo> INI Settings: When portable mode is enabled, the most common paths in mptrack.ini are now translated to relative paths (if possible). Plugin paths are not translated to relative paths (yet). [New] <Jojo> Modules in gzip archives (single-file .gz archives) can now be imported, just to satisfy my laziness when downloading gzipped modules from Amiga Music Preservation. :-P [New] <Jojo> Wave export can now also render by instrument (i.e. one wave file per instrument). + [Imp] <Jojo> The wave export "render by channel" mode ignores empty channels now. [Imp] <Jojo> Mod Loaders: Instead of creating messageboxes in various places, errors are now written to the log and one messagebox is shown for each file. [Imp] <Jojo> Binary files are now less often falsely recognized as early MOD files (15 samples without header): If the orderlist contains orderlist items > 128, loading is cancelled. [Imp] <Jojo> Song Properties: Tooltips are shown for various controls. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |