Skip to content

Commit 8b0ae50

Browse files
committed
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).
1 parent 5ec4d85 commit 8b0ae50

File tree

1 file changed

+21
-21
lines changed

1 file changed

+21
-21
lines changed

modules/juce_audio_devices/native/juce_CoreMidi_mac.mm

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1232,6 +1232,23 @@ explicit Observers ([[maybe_unused]] SharedEndpointsImplNative& owner)
12321232
Endpoints endpoints;
12331233
};
12341234

1235+
struct TimeConverter
1236+
{
1237+
CoreAudioTimeConversions timeConversions;
1238+
#if JUCE_IOS
1239+
const MIDITimeStamp startTimeNative = mach_absolute_time();
1240+
#else
1241+
const MIDITimeStamp startTimeNative = AudioGetCurrentHostTime();
1242+
#endif
1243+
uint32_t startTimeMillis = Time::getMillisecondCounter();
1244+
1245+
double convertToMillis (uint64_t packetTimeNative) const
1246+
{
1247+
const auto elapsedTime = packetTimeNative - startTimeNative;
1248+
return startTimeMillis + (1e-6 * (double) timeConversions.hostTimeToNanos (elapsedTime));
1249+
}
1250+
};
1251+
12351252
//==============================================================================
12361253
template <ImplementationStrategy>
12371254
struct Receiver;
@@ -1254,8 +1271,7 @@ void pushUmp (const MIDIEventList* list)
12541271

12551272
for (uint32_t i = 0; i < list->numPackets; ++i)
12561273
{
1257-
const auto elapsedTime = packet->timeStamp - startTimeNative;
1258-
const auto juceTimeMillis = startTimeMillis + (1e6 * (double) timeConversions.hostTimeToNanos (elapsedTime));
1274+
const auto juceTimeMillis = converter.convertToMillis (packet->timeStamp);
12591275

12601276
static_assert (sizeof (uint32_t) == sizeof (UInt32)
12611277
&& alignof (uint32_t) == alignof (UInt32),
@@ -1271,14 +1287,7 @@ void pushUmp (const MIDIEventList* list)
12711287

12721288
private:
12731289
ump::Consumer& callback;
1274-
1275-
#if JUCE_IOS
1276-
const MIDITimeStamp startTimeNative = mach_absolute_time();
1277-
#else
1278-
const MIDITimeStamp startTimeNative = AudioGetCurrentHostTime();
1279-
#endif
1280-
const uint32_t startTimeMillis = Time::getMillisecondCounter();
1281-
CoreAudioTimeConversions timeConversions;
1290+
TimeConverter converter;
12821291
};
12831292

12841293
template <>
@@ -1347,9 +1356,7 @@ void pushBytes (const MIDIPacketList* list)
13471356

13481357
for (unsigned int i = 0; i < list->numPackets; ++i)
13491358
{
1350-
const auto elapsedTime = packet->timeStamp - startTimeNative;
1351-
const auto juceTimeMillis = startTimeMillis + (1e6 * (double) timeConversions.hostTimeToNanos (elapsedTime));
1352-
1359+
const auto juceTimeMillis = converter.convertToMillis (packet->timeStamp);
13531360
const auto* bytes = unalignedPointerCast<const std::byte*> (packet->data);
13541361
const auto len = readUnaligned<decltype (packet->length)> (&(packet->length));
13551362

@@ -1367,14 +1374,7 @@ void pushBytes (const MIDIPacketList* list)
13671374
private:
13681375
ump::BytestreamToUMPDispatcher dispatcher;
13691376
ump::Consumer& callback;
1370-
1371-
#if JUCE_IOS
1372-
const MIDITimeStamp startTimeNative = mach_absolute_time();
1373-
#else
1374-
const MIDITimeStamp startTimeNative = AudioGetCurrentHostTime();
1375-
#endif
1376-
const uint32_t startTimeMillis = Time::getMillisecondCounter();
1377-
CoreAudioTimeConversions timeConversions;
1377+
TimeConverter converter;
13781378
};
13791379

13801380
template <>

0 commit comments

Comments
 (0)