summaryrefslogtreecommitdiff
path: root/soundlib/ITTools.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'soundlib/ITTools.cpp')
-rw-r--r--soundlib/ITTools.cpp40
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