1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-09 23:34:20 +00:00

CoreMidi: Fix timestamps for incoming MIDI messages

Previously, the elapsed time in nanoseconds was multiplied by 1e6
instead of 1e-6, leading to incorrect timestamps on incoming messages.

This change also DRYs the code handling time conversions between the
native/host time and JUCE timestamps (milliseconds in double format).
This commit is contained in:
reuk 2025-11-03 13:11:16 +00:00
parent 5ec4d85d82
commit 8b0ae502ff
No known key found for this signature in database

View file

@ -1232,6 +1232,23 @@ struct CoreMidiHelpers
Endpoints endpoints;
};
struct TimeConverter
{
CoreAudioTimeConversions timeConversions;
#if JUCE_IOS
const MIDITimeStamp startTimeNative = mach_absolute_time();
#else
const MIDITimeStamp startTimeNative = AudioGetCurrentHostTime();
#endif
uint32_t startTimeMillis = Time::getMillisecondCounter();
double convertToMillis (uint64_t packetTimeNative) const
{
const auto elapsedTime = packetTimeNative - startTimeNative;
return startTimeMillis + (1e-6 * (double) timeConversions.hostTimeToNanos (elapsedTime));
}
};
//==============================================================================
template <ImplementationStrategy>
struct Receiver;
@ -1254,8 +1271,7 @@ struct CoreMidiHelpers
for (uint32_t i = 0; i < list->numPackets; ++i)
{
const auto elapsedTime = packet->timeStamp - startTimeNative;
const auto juceTimeMillis = startTimeMillis + (1e6 * (double) timeConversions.hostTimeToNanos (elapsedTime));
const auto juceTimeMillis = converter.convertToMillis (packet->timeStamp);
static_assert (sizeof (uint32_t) == sizeof (UInt32)
&& alignof (uint32_t) == alignof (UInt32),
@ -1271,14 +1287,7 @@ struct CoreMidiHelpers
private:
ump::Consumer& callback;
#if JUCE_IOS
const MIDITimeStamp startTimeNative = mach_absolute_time();
#else
const MIDITimeStamp startTimeNative = AudioGetCurrentHostTime();
#endif
const uint32_t startTimeMillis = Time::getMillisecondCounter();
CoreAudioTimeConversions timeConversions;
TimeConverter converter;
};
template <>
@ -1347,9 +1356,7 @@ struct CoreMidiHelpers
for (unsigned int i = 0; i < list->numPackets; ++i)
{
const auto elapsedTime = packet->timeStamp - startTimeNative;
const auto juceTimeMillis = startTimeMillis + (1e6 * (double) timeConversions.hostTimeToNanos (elapsedTime));
const auto juceTimeMillis = converter.convertToMillis (packet->timeStamp);
const auto* bytes = unalignedPointerCast<const std::byte*> (packet->data);
const auto len = readUnaligned<decltype (packet->length)> (&(packet->length));
@ -1367,14 +1374,7 @@ struct CoreMidiHelpers
private:
ump::BytestreamToUMPDispatcher dispatcher;
ump::Consumer& callback;
#if JUCE_IOS
const MIDITimeStamp startTimeNative = mach_absolute_time();
#else
const MIDITimeStamp startTimeNative = AudioGetCurrentHostTime();
#endif
const uint32_t startTimeMillis = Time::getMillisecondCounter();
CoreAudioTimeConversions timeConversions;
TimeConverter converter;
};
template <>