From: <sag...@us...> - 2009-07-27 17:28:07
|
Revision: 306 http://modplug.svn.sourceforge.net/modplug/?rev=306&view=rev Author: saga-games Date: 2009-07-27 17:27:59 +0000 (Mon, 27 Jul 2009) Log Message: ----------- [Imp] Autosave: If a module has not been changed since the last autosave, it will not be autosaved. [Imp] Directory handling: Setting the default directory won't update the working directory now ONLY if it has not changed. [Fix] MP3 / Wav export: Default directories should now *really* work [Fix] XM loader: Various changes to make XMs that have been compressed with BoobieSqueezer load correctly. Should not break anything, but I call it "experimental". Modified Paths: -------------- trunk/OpenMPT/mptrack/AutoSaver.cpp trunk/OpenMPT/mptrack/Ctrl_gen.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/Moddoc.h trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/mptrack/AutoSaver.cpp =================================================================== --- trunk/OpenMPT/mptrack/AutoSaver.cpp 2009-07-26 23:50:13 UTC (rev 305) +++ trunk/OpenMPT/mptrack/AutoSaver.cpp 2009-07-27 17:27:59 UTC (rev 306) @@ -72,12 +72,12 @@ while (posDocument) { //for all open documents pModDoc = (CModDoc*)(pDocTemplate->GetNextDoc(posDocument)); - if (pModDoc && pModDoc->IsModified()) { + if (pModDoc && pModDoc->ModifiedSinceLastAutosave()) { if (SaveSingleFile(pModDoc)) { CleanUpBackups(pModDoc); } else { m_bEnabled=false; - AfxMessageBox("Warning: autosave failed and has been disabled. Please:\r\n\r\n- Review your autosave paths\r\n- Check available diskspace & filesystem access rights\r\n- If you are using the ITP format, ensure all instruments exist as independant .iti files"); + 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/Ctrl_gen.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2009-07-26 23:50:13 UTC (rev 305) +++ trunk/OpenMPT/mptrack/Ctrl_gen.cpp 2009-07-27 17:27:59 UTC (rev 306) @@ -341,7 +341,8 @@ m_EditTempo.GetWindowText(s, sizeof(s)); if (s[0]) { - UINT n = CLAMP(atoi(s), m_pSndFile->GetModSpecifications().tempoMin, m_pSndFile->GetModSpecifications().tempoMax); + UINT n = atoi(s); + n = CLAMP(n, m_pSndFile->GetModSpecifications().tempoMin, m_pSndFile->GetModSpecifications().tempoMax); if (n != m_pSndFile->m_nDefaultTempo) { m_bEditsLocked=true; @@ -367,7 +368,8 @@ m_EditSpeed.GetWindowText(s, sizeof(s)); if (s[0]) { - UINT n = CLAMP(atoi(s), m_pSndFile->GetModSpecifications().speedMin, m_pSndFile->GetModSpecifications().speedMax); + UINT n = atoi(s); + n = CLAMP(n, m_pSndFile->GetModSpecifications().speedMin, m_pSndFile->GetModSpecifications().speedMax); if (n != m_pSndFile->m_nDefaultSpeed) { m_bEditsLocked=true; m_EditSpeed.SetModify(FALSE); @@ -389,7 +391,8 @@ if ((m_pSndFile) && (m_pModDoc) && (m_bInitialized)) { m_EditVSTiVol.GetWindowText(s, sizeof(s)); if (s[0]) { - int n = CLAMP(atoi(s), 0, 2000); + int n = atoi(s); + n = CLAMP(n, 0, 2000); if (n != m_pSndFile->m_nVSTiVolume) { m_bEditsLocked=true; m_pSndFile->m_nVSTiVolume = n; @@ -410,7 +413,8 @@ if ((m_pSndFile) && (m_pModDoc) && (m_bInitialized)) { m_EditSamplePA.GetWindowText(s, sizeof(s)); if (s[0]) { - int n = CLAMP(atoi(s), 0, 2000); + int n = atoi(s); + n = CLAMP(n, 0, 2000); if (n != m_pSndFile->m_nSamplePreAmp) { m_bEditsLocked=true; m_pSndFile->m_nSamplePreAmp = n; @@ -432,7 +436,8 @@ m_EditGlobalVol.GetWindowText(s, sizeof(s)); if (s[0]) { - UINT n = CLAMP(atoi(s), 0, 128); + UINT n = atoi(s); + n = CLAMP(n, 0, 128); if (n != (m_pSndFile->m_nDefaultGlobalVolume >> 1)) { m_bEditsLocked=true; @@ -458,7 +463,8 @@ m_EditRestartPos.GetWindowText(s, sizeof(s)); if (s[0]) { - UINT n = CLAMP(atoi(s), 0, m_pSndFile->Order.size()); + UINT n = atoi(s); + n = CLAMP(n, 0, m_pSndFile->Order.size()); for (ORDERINDEX i = 0; i <= n; i++) if (m_pSndFile->Order[i] == m_pSndFile->Order.GetInvalidPatIndex()) return; Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2009-07-26 23:50:13 UTC (rev 305) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2009-07-27 17:27:59 UTC (rev 306) @@ -3051,11 +3051,17 @@ _tcscpy(szPath, szFilenameFrom); } + TCHAR szOldDir[sizeof(directories[dir])]; // for comparison + _tcscpy(szOldDir, directories[dir]); + _tcscpy(directories[dir], szPath); - // When updating default directory, also update the working directory (if it hasn't been set yet). - if(szPath[0] && directories == m_szDefaultDirectory && !m_szWorkingDirectory[dir][0]) - SetWorkingDirectory(szPath, dir); + // When updating default directory, also update the working directory. + if(szPath[0] && directories == m_szDefaultDirectory) + { + if(_tcscmp(szOldDir, szPath) != 0) // update only if default directory has changed + SetWorkingDirectory(szPath, dir); + } } void CMainFrame::SetDefaultDirectory(const LPCTSTR szFilenameFrom, Directory dir, bool bStripFilename) Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-26 23:50:13 UTC (rev 305) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2009-07-27 17:27:59 UTC (rev 306) @@ -1363,15 +1363,12 @@ void CModDoc::OnFileWaveConvert() //------------------------------- { - CHAR path[_MAX_PATH]="", drive[_MAX_DRIVE]=""; - CHAR s[_MAX_PATH], fname[_MAX_FNAME]=""; + TCHAR fname[_MAX_FNAME]=""; CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); if ((!pMainFrm) || (!m_SndFile.GetType())) return; - _splitpath(GetPathName(), drive, path, fname, NULL); - strcpy(s, fname); - strcat(s, ".wav"); - CFileDialog dlg(FALSE, "wav", s, + _splitpath(GetPathName(), NULL, NULL, fname, NULL); + CFileDialog dlg(FALSE, "wav", fname, OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN, "Wave Files (*.wav)|*.wav||", pMainFrm); dlg.m_ofn.lpstrInitialDir = CMainFrame::GetWorkingDirectory(DIR_EXPORT); @@ -1383,6 +1380,7 @@ // will set default dir here because there's no setup option for export dir yet (feel free to add one...) pMainFrm->SetDefaultDirectory(dlg.GetPathName(), DIR_EXPORT, true); + TCHAR s[_MAX_PATH]; strcpy(s, dlg.GetPathName()); // Saving as wave file @@ -1492,16 +1490,12 @@ void CModDoc::OnFileMP3Convert() //------------------------------ { - CHAR path[_MAX_PATH]="", drive[_MAX_DRIVE]=""; - CHAR s[_MAX_PATH], fname[_MAX_FNAME]="", fext[_MAX_EXT] = ""; + TCHAR sFName[_MAX_FNAME] = ""; CMainFrame *pMainFrm = CMainFrame::GetMainFrame(); if ((!pMainFrm) || (!m_SndFile.GetType())) return; - _splitpath(GetPathName(), drive, path, fname, NULL); - strcpy(s, drive); - strcat(s, path); - strcat(s, fname); - CFileDialog dlg(FALSE, "mp3", s, + _splitpath(GetPathName(), NULL, NULL, sFName, NULL); + CFileDialog dlg(FALSE, "mp3", sFName, OFN_HIDEREADONLY | OFN_ENABLESIZING | OFN_OVERWRITEPROMPT | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN, "MPEG Layer III Files (*.mp3)|*.mp3|Layer3 Wave Files (*.wav)|*.wav||", pMainFrm); dlg.m_ofn.nFilterIndex = 0; @@ -1516,6 +1510,7 @@ // will set default dir here because there's no setup option for export dir yet (feel free to add one...) pMainFrm->SetDefaultDirectory(dlg.GetPathName(), DIR_EXPORT, true); + TCHAR s[_MAX_PATH], fext[_MAX_EXT]; strcpy(s, dlg.GetPathName()); _splitpath(s, NULL, NULL, NULL, fext); if (strlen(fext) <= 1) Modified: trunk/OpenMPT/mptrack/Moddoc.h =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.h 2009-07-26 23:50:13 UTC (rev 305) +++ trunk/OpenMPT/mptrack/Moddoc.h 2009-07-27 17:27:59 UTC (rev 306) @@ -125,6 +125,8 @@ DWORD m_dwNotifyType; PATTERNUNDOBUFFER PatternUndo[MAX_UNDO_LEVEL]; + bool bModifiedAutosave; // Modified since last autosave? + bool m_ShowSavedialog; // -> CODE#0015 @@ -142,7 +144,8 @@ void InitPlayer(); CSoundFile *GetSoundFile() { return &m_SndFile; } void SetPause(BOOL bPause) { m_bPaused = bPause; } - void SetModified(BOOL bModified=TRUE) { SetModifiedFlag(bModified); } + void SetModified(BOOL bModified=TRUE) { SetModifiedFlag(bModified); bModifiedAutosave = bModified; } + BOOL ModifiedSinceLastAutosave() { bool bRetval = bModifiedAutosave; bModifiedAutosave = false; return bRetval; } // return "IsModified" value and reset it until the next SetModified() (as this is only used for polling) void SetShowSaveDialog(bool b) {m_ShowSavedialog = b;} void PostMessageToAllViews(UINT uMsg, WPARAM wParam=0, LPARAM lParam=0); void SendMessageToActiveViews(UINT uMsg, WPARAM wParam=0, LPARAM lParam=0); Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2009-07-26 23:50:13 UTC (rev 305) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2009-07-27 17:27:59 UTC (rev 306) @@ -42,8 +42,7 @@ DWORD size; CHAR name[22]; BYTE type; - BYTE samples; - BYTE samplesh; + WORD samples; } XMINSTRUMENTHEADER; @@ -97,9 +96,11 @@ UINT unused_samples; bool bMadeWithModPlug = false; + // set this here already because XMs compressed with BoobieSqueezer will exit the function early + SetModFlag(MSF_COMPATIBLE_PLAY, true); m_nChannels = 0; - if ((!lpStream) || (dwMemLength < 0x200)) return FALSE; + if ((!lpStream) || (dwMemLength < 0xAA)) return FALSE; // the smallest XM I know is 174 Bytes if (_strnicmp((LPCSTR)lpStream, "Extended Module", 15)) return FALSE; memcpy(m_szNames[0], lpStream + 17, 20); dwHdrSize = LittleEndian(*((DWORD *)(lpStream+60))); @@ -298,8 +299,11 @@ UINT samplemap[32]; WORD nsamples; - if (dwMemPos + sizeof(XMINSTRUMENTHEADER) >= dwMemLength) return TRUE; - pih = (XMINSTRUMENTHEADER *)(lpStream+dwMemPos); + if (dwMemPos + sizeof(DWORD) >= dwMemLength) return TRUE; + DWORD ihsize = LittleEndian(*((DWORD *)(lpStream + dwMemPos))); + if (dwMemPos + ihsize >= dwMemLength) return TRUE; + + pih = (XMINSTRUMENTHEADER *)(lpStream + dwMemPos); if (dwMemPos + LittleEndian(pih->size) > dwMemLength) return TRUE; if ((Headers[iIns] = new INSTRUMENTHEADER) == NULL) continue; memset(Headers[iIns], 0, sizeof(INSTRUMENTHEADER)); @@ -308,14 +312,29 @@ Headers[iIns]->nPluginVolumeHandling = PLUGIN_VOLUMEHANDLING_IGNORE; memcpy(Headers[iIns]->name, pih->name, 22); + if ((nsamples = pih->samples) > 0) { - if (dwMemPos + sizeof(XMSAMPLEHEADER) > dwMemLength) return TRUE; - memcpy(&xmsh, lpStream+dwMemPos+sizeof(XMINSTRUMENTHEADER), sizeof(XMSAMPLEHEADER)); + if (dwMemPos + sizeof(XMINSTRUMENTHEADER) + sizeof(DWORD) >= dwMemLength) return TRUE; + DWORD shsize = LittleEndian(*((DWORD *)(lpStream + dwMemPos + sizeof(XMINSTRUMENTHEADER)))); + + memset(&xmsh, 0, sizeof(XMSAMPLEHEADER)); + + // *very* dirty, but it works! + DWORD dwReadLength = sizeof(XMSAMPLEHEADER); + if(ihsize == 38 && (int)(shsize - ihsize) >= 0) // BoobieSqueezer compressed - ihsize = 38, shsize = 40 + dwReadLength = shsize - ihsize; + + if (dwMemPos + sizeof(XMINSTRUMENTHEADER) + dwReadLength >= dwMemLength || shsize > sizeof(XMSAMPLEHEADER)) + return TRUE; + else + memcpy(&xmsh, lpStream + dwMemPos + sizeof(XMINSTRUMENTHEADER), dwReadLength); + xmsh.shsize = LittleEndian(xmsh.shsize); + for (int i = 0; i < 24; ++i) { - xmsh.venv[i] = LittleEndianW(xmsh.venv[i]); - xmsh.penv[i] = LittleEndianW(xmsh.penv[i]); + xmsh.venv[i] = LittleEndianW(xmsh.venv[i]); + xmsh.penv[i] = LittleEndianW(xmsh.penv[i]); } xmsh.volfade = LittleEndianW(xmsh.volfade); xmsh.res = LittleEndianW(xmsh.res); @@ -609,8 +628,7 @@ bMadeWithModPlug = true; } - if(bMadeWithModPlug == false) - SetModFlag(MSF_COMPATIBLE_PLAY, true); + SetModFlag(MSF_COMPATIBLE_PLAY, !bMadeWithModPlug); // -> CODE#0027 // -> DESC="per-instrument volume ramping setup (refered as attack)" @@ -618,14 +636,14 @@ // Leave if no extra instrument settings are available (end of file reached) if(dwMemPos >= dwMemLength) return TRUE; - bool bInterpretMptMade = false; + bool bInterpretOpenMPTMade = false; // specific for OpenMPT 1.17+ (bMadeWithModPlug is also for MPT 1.16) LPCBYTE ptr = lpStream + dwMemPos; if(m_nInstruments) - ptr = LoadExtendedInstrumentProperties(ptr, lpStream+dwMemLength, &bInterpretMptMade); + ptr = LoadExtendedInstrumentProperties(ptr, lpStream+dwMemLength, &bInterpretOpenMPTMade); - LoadExtendedSongProperties(GetType(), ptr, lpStream, dwMemLength, &bInterpretMptMade); + LoadExtendedSongProperties(GetType(), ptr, lpStream, dwMemLength, &bInterpretOpenMPTMade); - if(bInterpretMptMade && m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 17, 2, 50)) + if(bInterpretOpenMPTMade && m_dwLastSavedWithVersion < MAKE_VERSION_NUMERIC(1, 17, 2, 50)) SetModFlag(MSF_MIDICC_BUGEMULATION, true); return TRUE; @@ -652,7 +670,7 @@ fwrite("Extended Module: ", 17, 1, f); fwrite(m_szNames[0], 20, 1, f); s[0] = 0x1A; - lstrcpy((LPSTR)&s[1], (nPacking) ? "MOD Plugin packed " : "FastTracker v2.00 "); + lstrcpy((LPSTR)&s[1], (nPacking) ? "MOD Plugin packed " : "Open ModPlugTracker "); s[21] = 0x04; s[22] = 0x01; fwrite(&s[0], 23, 1, f); Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-26 23:50:13 UTC (rev 305) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2009-07-27 17:27:59 UTC (rev 306) @@ -1965,7 +1965,7 @@ UINT CSoundFile::ReadSample(MODINSTRUMENT *pIns, UINT nFlags, LPCSTR lpMemFile, DWORD dwMemLength, const WORD format) //----------------------------------------------------------------------------------------------------------------------- { - if ((!pIns) || (pIns->nLength < 4) || (!lpMemFile)) return 0; + if ((!pIns) || (pIns->nLength < 2) || (!lpMemFile)) return 0; if(pIns->nLength > MAX_SAMPLE_LENGTH) pIns->nLength = MAX_SAMPLE_LENGTH; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |