From: <rel...@us...> - 2008-07-06 12:24:37
|
Revision: 214 http://modplug.svn.sourceforge.net/modplug/?rev=214&view=rev Author: relabsoluness Date: 2008-07-06 05:24:33 -0700 (Sun, 06 Jul 2008) Log Message: ----------- [Fix] Autosave should now behave properly even when it gets called while previous autosave is in progress. [Fix/Mod] Changes/fixes to pattern data writing when dealing with lots of pattern data for S3M, XM, IT and MPTM. It was possible that not all pattern data was written but the user wasn't informed about this. Modified so that write buffers are made larger if needed, and note is shown if some pattern data is not written due to file format limits. Modified Paths: -------------- trunk/OpenMPT/mptrack/AutoSaver.cpp trunk/OpenMPT/mptrack/AutoSaver.h trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_xm.cpp Modified: trunk/OpenMPT/mptrack/AutoSaver.cpp =================================================================== --- trunk/OpenMPT/mptrack/AutoSaver.cpp 2008-07-05 12:59:07 UTC (rev 213) +++ trunk/OpenMPT/mptrack/AutoSaver.cpp 2008-07-06 12:24:33 UTC (rev 214) @@ -21,12 +21,13 @@ // Construction/Destruction /////////////////////////// -CAutoSaver::CAutoSaver() +CAutoSaver::CAutoSaver() : m_bSaveInProgress(false) { } CAutoSaver::CAutoSaver(bool enabled, int saveInterval, int backupHistory, - bool useOriginalPath, CString path, CString fileNameTemplate) + bool useOriginalPath, CString path, CString fileNameTemplate) : + m_bSaveInProgress(false) { m_nLastSave = timeGetTime(); m_bEnabled = enabled; @@ -49,13 +50,18 @@ { bool success = true; - if (CheckTimer(curTime)) { //if time to save - + //If time to save and not already having save in progress. + if (CheckTimer(curTime) && !m_bSaveInProgress) { + m_bSaveInProgress = true; CDocTemplate *pDocTemplate; CModDoc *pModDoc; POSITION posTemplate,posDocument; CTrackApp *pTrackApp=(CTrackApp*)::AfxGetApp(); - if (!pTrackApp) return false; + if (!pTrackApp) + { + m_bSaveInProgress = false; + return false; + } pTrackApp->BeginWaitCursor(); //display hour glass @@ -80,6 +86,7 @@ } //end pointless template loop (we have just 1 template) m_nLastSave = timeGetTime(); pTrackApp->EndWaitCursor(); //end display hour glass + m_bSaveInProgress = false; } return success; Modified: trunk/OpenMPT/mptrack/AutoSaver.h =================================================================== --- trunk/OpenMPT/mptrack/AutoSaver.h 2008-07-05 12:59:07 UTC (rev 213) +++ trunk/OpenMPT/mptrack/AutoSaver.h 2008-07-06 12:24:33 UTC (rev 214) @@ -39,6 +39,10 @@ //internal implementation members private: + + //Flag to prevent autosave from starting new saving if previous is still in progress. + bool m_bSaveInProgress; + bool m_bEnabled; DWORD m_nLastSave; DWORD m_nSaveInterval; Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2008-07-05 12:59:07 UTC (rev 213) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2008-07-06 12:24:33 UTC (rev 214) @@ -30,6 +30,10 @@ using std::istrstream; using namespace srlztn; //SeRiaLiZaTioN +#define str_MBtitle (GetStrI18N((_TEXT("Saving IT")))) +#define str_tooMuchPatternData (GetStrI18N((_TEXT("Warning: File format limit was reached. Some pattern data may not get written to file.")))) +#define str_pattern (GetStrI18N((_TEXT("pattern")))) + static bool AreNonDefaultTuningsUsed(CSoundFile& sf) //-------------------------------------------------- { @@ -2322,9 +2326,18 @@ } } buf[len++] = 0; - dwPos += len; - patinfo[0] += len; - fwrite(buf, 1, len, f); + if(patinfo[0] > uint16_max - len) + { + CString str; str.Format("%s (%s %u)", str_tooMuchPatternData, str_pattern, npat); + MessageBox(0, str, str_MBtitle, MB_ICONWARNING); + break; + } + else + { + dwPos += len; + patinfo[0] += len; + fwrite(buf, 1, len, f); + } } fseek(f, dwPatPos, SEEK_SET); fwrite(patinfo, 8, 1, f); Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2008-07-05 12:59:07 UTC (rev 213) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2008-07-06 12:24:33 UTC (rev 214) @@ -10,7 +10,7 @@ #include "stdafx.h" #include "sndfile.h" -#pragma warning(disable:4244) +#pragma warning(disable:4244) //conversion from 'type1' to 'type2', possible loss of data extern WORD S3MFineTuneTable[16]; @@ -400,9 +400,9 @@ #ifndef MODPLUG_NO_FILESAVE -#pragma warning(disable:4100) +#pragma warning(disable:4100) //unreferenced formal parameter -static BYTE S3MFiller[16] = +static const BYTE S3MFiller[16] = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 @@ -417,7 +417,6 @@ UINT nbo,nbi,nbp,i; WORD patptr[128]; WORD insptr[128]; - BYTE buffer[5*1024]; S3MSAMPLESTRUCT insex[128]; if ((!m_nChannels) || (!lpszFileName)) return FALSE; @@ -498,7 +497,7 @@ for (i=0; i<nbp; i++) { WORD len = 64; - memset(buffer, 0, sizeof(buffer)); + vector<BYTE> buffer(5*1024, 0); patptr[i] = ofs / 16; if (Patterns[i]) { @@ -552,17 +551,23 @@ buffer[len++] = command; buffer[len++] = param; } - if (len > sizeof(buffer) - 20) break; + if (len > buffer.size() - 20) + { //Buffer running out? Make it larger. + buffer.resize(buffer.size() + 1024, 0); + } } } buffer[len++] = 0; - if (len > sizeof(buffer) - 20) break; + if (len > buffer.size() - 20) + { //Buffer running out? Make it larger. + buffer.resize(buffer.size() + 1024, 0); + } } } buffer[0] = (len - 2) & 0xFF; buffer[1] = (len - 2) >> 8; len = (len+15) & (~0x0F); - fwrite(buffer, len, 1, f); + fwrite(&buffer[0], len, 1, f); ofs += len; } // Writing samples Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2008-07-05 12:59:07 UTC (rev 213) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2008-07-06 12:24:33 UTC (rev 214) @@ -14,8 +14,13 @@ //////////////////////////////////////////////////////// // FastTracker II XM file support -#pragma warning(disable:4244) +#pragma warning(disable:4244) //conversion from 'type1' to 'type2', possible loss of data +#define str_MBtitle (GetStrI18N((_TEXT("Saving XM")))) +#define str_tooMuchPatternData (GetStrI18N((_TEXT("Warning: File format limit was reached. Some pattern data may not get written to file.")))) +#define str_pattern (GetStrI18N((_TEXT("pattern")))) + + #pragma pack(1) typedef struct tagXMFILEHEADER { @@ -651,7 +656,8 @@ BOOL CSoundFile::SaveXM(LPCSTR lpszFileName, UINT nPacking) //--------------------------------------------------------- { - BYTE s[64*64*5]; + //BYTE s[64*64*5]; + vector<BYTE> s(64*64*5, 0); XMFILEHEADER header; XMINSTRUMENTHEADER xmih; XMSAMPLEHEADER xmsh; @@ -668,7 +674,7 @@ lstrcpy((LPSTR)&s[1], (nPacking) ? "MOD Plugin packed " : "FastTracker v2.00 "); s[21] = 0x04; s[22] = 0x01; - fwrite(s, 23, 1, f); + fwrite(&s[0], 23, 1, f); // Writing song header memset(&header, 0, sizeof(header)); header.size = sizeof(XMFILEHEADER); @@ -761,12 +767,20 @@ if (b & 8) s[len++] = command; if (b & 16) s[len++] = param; } - if (len > sizeof(s) - 5) break; + if(len > s.size() - 5) //Buffer running out? Make it larger. + s.resize(s.size() + 10*1024, 0); + + if(len > uint16_max - 5u) //Reaching the limits of file format? + { + CString str; str.Format("%s (%s %u)", str_tooMuchPatternData, str_pattern, i); + MessageBox(0, str, str_MBtitle, MB_ICONWARNING); + break; + } } xmph[7] = (BYTE)(len & 0xFF); xmph[8] = (BYTE)(len >> 8); fwrite(xmph, 1, 9, f); - fwrite(s, 1, len, f); + fwrite(&s[0], 1, len, f); } else { memset(&xmph, 0, sizeof(xmph)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |