@@ -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