From: <sv...@op...> - 2024-05-11 15:30:19
|
Author: sagamusix Date: Sat May 11 17:30:11 2024 New Revision: 20758 URL: https://source.openmpt.org/browse/openmpt/?op=revision&rev=20758 Log: Merged revision(s) 20742, 20745-20746 from trunk/OpenMPT: [Fix] ULT: Strings are space-padded, not null-terminated. ........ [Imp] S3M: Detect files saved with PlayerPRO on intel platforms, where it tries to disguise as Scream Tracker 3 but the tracker ID bytes are swapped. Supposedly this will not work for files saved on Motorola Macs. ........ [Imp] S3M: Tell Velvet Studio apart from MPT more reliably. [Imp] S3M: Detect PlayerPRO when running on big-endian platforms (assumption based on source - I have not searched for any such S3M files yet.) ........ Modified: branches/OpenMPT-1.31/ (props changed) branches/OpenMPT-1.31/soundlib/Load_s3m.cpp branches/OpenMPT-1.31/soundlib/Load_ult.cpp branches/OpenMPT-1.31/soundlib/S3MTools.h Modified: branches/OpenMPT-1.31/soundlib/Load_s3m.cpp ============================================================================== --- branches/OpenMPT-1.31/soundlib/Load_s3m.cpp Sat May 11 09:36:53 2024 (r20757) +++ branches/OpenMPT-1.31/soundlib/Load_s3m.cpp Sat May 11 17:30:11 2024 (r20758) @@ -248,7 +248,7 @@ madeWithTracker = U_("Akord"); break; case S3MFileHeader::trkScreamTracker: - if(fileHeader.cwtv == S3MFileHeader::trkST3_20 && fileHeader.special == 0 && (fileHeader.ordNum & 0x0F) == 0 && fileHeader.ultraClicks == 0 && (fileHeader.flags & ~0x50) == 0) + if(fileHeader.cwtv == S3MFileHeader::trkST3_20 && fileHeader.special == 0 && (fileHeader.ordNum & 0x0F) == 0 && fileHeader.ultraClicks == 0 && (fileHeader.flags & ~0x50) == 0 && fileHeader.usePanningTable == S3MFileHeader::idPanning) { // MPT and OpenMPT before 1.17.03.02 - Simply keep default (filter) MIDI macros if((fileHeader.masterVolume & 0x80) != 0) @@ -266,7 +266,10 @@ m_playBehaviour.set(kST3LimitPeriod); } else if(fileHeader.cwtv == S3MFileHeader::trkST3_20 && fileHeader.special == 0 && fileHeader.ultraClicks == 0 && fileHeader.flags == 0 && fileHeader.usePanningTable == 0) { - madeWithTracker = U_("Velvet Studio"); + if(fileHeader.globalVol == 64 && fileHeader.masterVolume == 48) + madeWithTracker = U_("PlayerPRO"); + else // Always stereo + madeWithTracker = U_("Velvet Studio"); } else { // ST3.20 should only ever write ultra-click values 16, 24 and 32 (corresponding to 8, 12 and 16 in the GUI), ST3.01/3.03 should only write 0, @@ -279,8 +282,11 @@ } break; case S3MFileHeader::trkImagoOrpheus: - madeWithTracker = U_("Imago Orpheus"); - formatTrackerStr = true; + formatTrackerStr = (fileHeader.cwtv != S3MFileHeader::trkPlayerPRO); + if(formatTrackerStr) + madeWithTracker = U_("Imago Orpheus"); + else + madeWithTracker = U_("PlayerPRO"); nonCompatTracker = true; break; case S3MFileHeader::trkImpulseTracker: Modified: branches/OpenMPT-1.31/soundlib/Load_ult.cpp ============================================================================== --- branches/OpenMPT-1.31/soundlib/Load_ult.cpp Sat May 11 09:36:53 2024 (r20757) +++ branches/OpenMPT-1.31/soundlib/Load_ult.cpp Sat May 11 17:30:11 2024 (r20758) @@ -18,7 +18,7 @@ { char signature[14]; // "MAS_UTrack_V00" uint8 version; // '1'...'4' - char songName[32]; // Song Name, not guaranteed to be null-terminated + char songName[32]; // Song Name, space-padded uint8 messageLength; // Number of Lines }; @@ -51,7 +51,7 @@ mptSmp.Initialize(); mptSmp.Set16BitCuePoints(); - mptSmp.filename = mpt::String::ReadBuf(mpt::String::maybeNullTerminated, filename); + mptSmp.filename = mpt::String::ReadBuf(mpt::String::spacePadded, filename); if(sizeEnd <= sizeStart) { @@ -385,7 +385,7 @@ } InitializeGlobals(MOD_TYPE_ULT); - m_songName = mpt::String::ReadBuf(mpt::String::maybeNullTerminated, fileHeader.songName); + m_songName = mpt::String::ReadBuf(mpt::String::spacePadded, fileHeader.songName); const mpt::uchar *versions[] = {UL_("<1.4"), UL_("1.4"), UL_("1.5"), UL_("1.6")}; m_modFormat.formatName = U_("UltraTracker"); @@ -419,7 +419,7 @@ } sampleHeader.ConvertToMPT(Samples[smp]); - m_szNames[smp] = mpt::String::ReadBuf(mpt::String::maybeNullTerminated, sampleHeader.name); + m_szNames[smp] = mpt::String::ReadBuf(mpt::String::spacePadded, sampleHeader.name); } ReadOrderFromFile<uint8>(Order(), file, 256, 0xFF, 0xFE); Modified: branches/OpenMPT-1.31/soundlib/S3MTools.h ============================================================================== --- branches/OpenMPT-1.31/soundlib/S3MTools.h Sat May 11 09:36:53 2024 (r20757) +++ branches/OpenMPT-1.31/soundlib/S3MTools.h Sat May 11 17:30:11 2024 (r20758) @@ -53,6 +53,7 @@ trkBeRoTrackerOld = 0x4100, // Used from 2004 to 2012 trkGraoumfTracker = 0x5447, trkCamoto = 0xCA00, + trkPlayerPRO = 0x2013 // PlayerPRO on Intel doesn't byte-swap the tracker ID bytes }; // Flags |