From: <sag...@us...> - 2013-05-05 21:41:40
|
Revision: 2008 http://sourceforge.net/p/modplug/code/2008 Author: saga-games Date: 2013-05-05 21:41:31 +0000 (Sun, 05 May 2013) Log Message: ----------- [Imp] Improve IT, S3M, XM tracker detection. Modified Paths: -------------- trunk/OpenMPT/common/mptString.cpp trunk/OpenMPT/common/mptString.h trunk/OpenMPT/soundlib/Load_it.cpp trunk/OpenMPT/soundlib/Load_s3m.cpp trunk/OpenMPT/soundlib/Load_xm.cpp trunk/OpenMPT/soundlib/Sndfile.h Modified: trunk/OpenMPT/common/mptString.cpp =================================================================== --- trunk/OpenMPT/common/mptString.cpp 2013-05-05 00:25:59 UTC (rev 2007) +++ trunk/OpenMPT/common/mptString.cpp 2013-05-05 21:41:31 UTC (rev 2008) @@ -46,4 +46,30 @@ #endif } + +// Remove whitespaces at start of string +void String::LTrim() +{ + size_type pos = find_first_not_of(" \n\r\t"); + if(pos != npos) + erase(begin(), begin() + pos); +} + + +// Remove whitespaces at end of string +void String::RTrim() +{ + size_type pos = find_last_not_of(" \n\r\t"); + if(pos != npos) + erase(begin() + pos + 1, end()); +} + + +// Remove whitespaces at start and end of string +void String::Trim() +{ + LTrim(); + RTrim(); +} + } // namespace mpt Modified: trunk/OpenMPT/common/mptString.h =================================================================== --- trunk/OpenMPT/common/mptString.h 2013-05-05 00:25:59 UTC (rev 2007) +++ trunk/OpenMPT/common/mptString.h 2013-05-05 21:41:31 UTC (rev 2008) @@ -65,6 +65,13 @@ // Formats this string, like CString::Format. void Format(const CharT* pszFormat, ...); + + // Remove whitespaces at start of string + void LTrim(); + // Remove whitespaces at end of string + void RTrim(); + // Remove whitespaces at start and end of string + void Trim(); }; } Modified: trunk/OpenMPT/soundlib/Load_it.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_it.cpp 2013-05-05 00:25:59 UTC (rev 2007) +++ trunk/OpenMPT/soundlib/Load_it.cpp 2013-05-05 21:41:31 UTC (rev 2008) @@ -278,6 +278,31 @@ } +// Get version of Schism Tracker that was used to create an IT/S3M file. +mpt::String CSoundFile::GetSchismTrackerVersion(uint16 cwtv) +//---------------------------------------------------------- +{ + cwtv &= 0xFFF; + mpt::String version; + if(cwtv > 0x050) + { + tm epoch, *verTime; + MemsetZero(epoch); + epoch.tm_year = 109, epoch.tm_mon = 9; epoch.tm_mday = 31; + time_t versionSec = ((cwtv - 0x050) * 86400) + mktime(&epoch); + if((verTime = localtime(&versionSec)) != nullptr) + { + version.Format("Schism Tracker %04d-%02d-%02d", + verTime->tm_year + 1900, verTime->tm_mon + 1, verTime->tm_mday); + } + } else + { + version.Format("Schism Tracker 0.%x", cwtv & 0xFF); + } + return version; +} + + bool CSoundFile::ReadIT(FileReader &file, ModLoadingFlags loadFlags) //------------------------------------------------------------------ { @@ -960,25 +985,7 @@ } break; case 1: - madeWithTracker = "Schism Tracker "; - if(fileHeader.cwtv > 0x1050) - { - mpt::String version; - tm epoch; - MemsetZero(epoch); - epoch.tm_year = 109, epoch.tm_mon = 9; epoch.tm_mday = 31; - //int32 versionSec = ((fileHeader.cwtv - 0x050) * 86400) + mktime(&epoch); - // TODO what's the difference between localtime and localtime_r? -// if(localtime_r(&versionSec, &epoch)) { -// sprintf(buf, "%04d-%02d-%02d", -// version.tm_year + 1900, version.tm_mon + 1, version.tm_mday); -// return; - } else - { - mpt::String version; - version.Format("0.%x", fileHeader.cwtv & 0xFF); - madeWithTracker += version; - } + madeWithTracker = GetSchismTrackerVersion(fileHeader.cwtv); break; case 6: madeWithTracker.Format("BeRoTracker %x.%x"); Modified: trunk/OpenMPT/soundlib/Load_s3m.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-05-05 00:25:59 UTC (rev 2007) +++ trunk/OpenMPT/soundlib/Load_s3m.cpp 2013-05-05 21:41:31 UTC (rev 2008) @@ -481,7 +481,7 @@ if(fileHeader.cwtv == S3MFileHeader::trkBeRoTrackerOld) trackerName = "BeRoTracker"; else - trackerName = "Schism Tracker"; // TODO Version Number + trackerName = GetSchismTrackerVersion(fileHeader.cwtv); break; case S3MFileHeader::trkOpenMPT: trackerName = "OpenMPT %d.%02x"; Modified: trunk/OpenMPT/soundlib/Load_xm.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_xm.cpp 2013-05-05 00:25:59 UTC (rev 2007) +++ trunk/OpenMPT/soundlib/Load_xm.cpp 2013-05-05 21:41:31 UTC (rev 2008) @@ -282,17 +282,14 @@ { if(fileHeader.version < 0x0104) madeWith = verFT2Generic | verConfirmed; + else if(memchr(fileHeader.songName, '\0', 20) != nullptr) + // FT2 pads the song title with spaces, some other trackers use null chars + madeWith = verFT2Clone | verNewModPlug; else madeWith = verFT2Generic | verNewModPlug; - - // FT2 pads the song title with spaces, some other trackers don't - if(madeWith[verFT2Generic] && memchr(fileHeader.songName, '\0', 20) != nullptr) - madeWith = verFT2Generic | verNewModPlug; } else if(!memcmp(fileHeader.trackerName + 12, "v 2.00 ", 8)) { - // Old MPT: - // - 1.00a5 (ihdr=245) - // - beta 3.3 (ihdr=263) + // MPT 1.0 (exact version to be determined later) madeWith = verOldModPlug; } else { @@ -303,8 +300,9 @@ } else { // Something else! - madeWith.set(verConfirmed); + madeWith = verUnknown |verConfirmed; madeWithTracker.AppendChars(fileHeader.trackerName); + madeWithTracker.RTrim(); } StringFixer::ReadString<StringFixer::spacePadded>(m_szNames[0], fileHeader.songName); @@ -362,21 +360,31 @@ { // ModPlug Tracker Alpha m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 00, 00, A5); - madeWithTracker = "ModPlug Tracker 1.0a5"; + madeWithTracker = "ModPlug Tracker 1.0 alpha"; } else if(instrHeader.size == 263) { // ModPlug Tracker Beta (Beta 1 still behaves like Alpha, but Beta 3.3 does it this way) m_dwLastSavedWithVersion = MAKE_VERSION_NUMERIC(1, 00, 00, B3); - madeWithTracker = "ModPlug Tracker 1.0b3"; + madeWithTracker = "ModPlug Tracker 1.0 beta"; } else { // WTF? madeWith = (verUnknown | verConfirmed); } - } else if(madeWith[verNewModPlug] && instrHeader.numSamples == 0) + } else if(instrHeader.numSamples == 0) { // Empty instruments make tracker identification pretty easy! - madeWith = ((instrHeader.size == 263 && instrHeader.sampleHeaderSize == 0) ? verNewModPlug : verUnknown) | verConfirmed; + if(instrHeader.size == 263 && instrHeader.sampleHeaderSize == 0 && madeWith[verNewModPlug]) + madeWith.set(verConfirmed); + else if(instrHeader.size != 29 && madeWith[verDigiTracker]) + madeWith.reset(verDigiTracker); + else if(madeWith[verFT2Clone |verFT2Generic] && instrHeader.size != 33) + { + // Sure isn't FT2. + // Note: FT2 NORMALLY writes shdr=40 for all samples, but sometimes it + // just happens to write random garbage there instead. Surprise! + madeWith = verUnknown; + } } if(AllocateInstrument(instr) == nullptr) @@ -403,7 +411,7 @@ if((instrHeader.instrument.midiEnabled | instrHeader.instrument.midiChannel | instrHeader.instrument.midiProgram | instrHeader.instrument.muteComputer) != 0) { // Definitely not an old MPT. - madeWith = verUnknown; + madeWith.reset(verOldModPlug | verNewModPlug); } // Read sample headers Modified: trunk/OpenMPT/soundlib/Sndfile.h =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.h 2013-05-05 00:25:59 UTC (rev 2007) +++ trunk/OpenMPT/soundlib/Sndfile.h 2013-05-05 21:41:31 UTC (rev 2008) @@ -409,8 +409,8 @@ enum ModLoadingFlags { onlyVerifyHeader = 0x00, - loadPatternData = 0x01, // Advise loaders to not process any pattern data (if possible) - loadSampleData = 0x02, // Advise loaders to not process any sample data (if possible) + loadPatternData = 0x01, // If unset, advise loaders to not process any pattern data (if possible) + loadSampleData = 0x02, // If unset, advise loaders to not process any sample data (if possible) // Shortcuts loadCompleteModule = loadSampleData | loadPatternData, loadNoPatternData = loadSampleData, @@ -547,6 +547,8 @@ void LoadExtendedSongProperties(const MODTYPE modtype, FileReader &file, bool* pInterpretMptMade = nullptr); static size_t LoadModularInstrumentData(FileReader &file, ModInstrument &ins); + mpt::String GetSchismTrackerVersion(uint16 cwtv); + // Reads extended instrument properties(XM/IT/MPTM). // If no errors occur and song extension tag is found, returns pointer to the beginning // of the tag, else returns NULL. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |