diff options
Diffstat (limited to 'soundlib/ITTools.cpp')
-rw-r--r-- | soundlib/ITTools.cpp | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/soundlib/ITTools.cpp b/soundlib/ITTools.cpp index 56cce3e..13a3923 100644 --- a/soundlib/ITTools.cpp +++ b/soundlib/ITTools.cpp @@ -637,12 +637,15 @@ void ITHistoryStruct::ConvertToMPT(FileHistory &mptHistory) const { // Decode FAT date and time MemsetZero(mptHistory.loadDate); - mptHistory.loadDate.tm_year = ((fatdate >> 9) & 0x7F) + 80; - mptHistory.loadDate.tm_mon = Clamp((fatdate >> 5) & 0x0F, 1, 12) - 1; - mptHistory.loadDate.tm_mday = Clamp(fatdate & 0x1F, 1, 31); - mptHistory.loadDate.tm_hour = Clamp((fattime >> 11) & 0x1F, 0, 23); - mptHistory.loadDate.tm_min = Clamp((fattime >> 5) & 0x3F, 0, 59); - mptHistory.loadDate.tm_sec = Clamp((fattime & 0x1F) * 2, 0, 59); + if(fatdate != 0 || fattime != 0) + { + mptHistory.loadDate.tm_year = ((fatdate >> 9) & 0x7F) + 80; + mptHistory.loadDate.tm_mon = Clamp((fatdate >> 5) & 0x0F, 1, 12) - 1; + mptHistory.loadDate.tm_mday = Clamp(fatdate & 0x1F, 1, 31); + mptHistory.loadDate.tm_hour = Clamp((fattime >> 11) & 0x1F, 0, 23); + mptHistory.loadDate.tm_min = Clamp((fattime >> 5) & 0x3F, 0, 59); + mptHistory.loadDate.tm_sec = Clamp((fattime & 0x1F) * 2, 0, 59); + } mptHistory.openTime = static_cast<uint32>(runtime * (HISTORY_TIMER_PRECISION / 18.2)); } @@ -651,10 +654,31 @@ void ITHistoryStruct::ConvertToMPT(FileHistory &mptHistory) const void ITHistoryStruct::ConvertToIT(const FileHistory &mptHistory) { // Create FAT file dates - fatdate = static_cast<uint16>(mptHistory.loadDate.tm_mday | ((mptHistory.loadDate.tm_mon + 1) << 5) | ((mptHistory.loadDate.tm_year - 80) << 9)); - fattime = static_cast<uint16>((mptHistory.loadDate.tm_sec / 2) | (mptHistory.loadDate.tm_min << 5) | (mptHistory.loadDate.tm_hour << 11)); + if(mptHistory.HasValidDate()) + { + fatdate = static_cast<uint16>(mptHistory.loadDate.tm_mday | ((mptHistory.loadDate.tm_mon + 1) << 5) | ((mptHistory.loadDate.tm_year - 80) << 9)); + fattime = static_cast<uint16>((mptHistory.loadDate.tm_sec / 2) | (mptHistory.loadDate.tm_min << 5) | (mptHistory.loadDate.tm_hour << 11)); + } else + { + fatdate = 0; + fattime = 0; + } runtime = static_cast<uint32>(mptHistory.openTime * (18.2 / HISTORY_TIMER_PRECISION)); } +uint32 DecodeITEditTimer(uint16 cwtv, uint32 editTime) +{ + if((cwtv & 0xFFF) >= 0x0208) + { + editTime ^= 0x4954524B; // 'ITRK' + editTime = (editTime >> 7) | (editTime << (32 - 7)); + editTime = -(int32)editTime; + editTime = (editTime << 4) | (editTime >> (32 - 4)); + editTime ^= 0x4A54484C; // 'JTHL' + } + return editTime; +} + + OPENMPT_NAMESPACE_END |