mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +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:
parent
5ec4d85d82
commit
8b0ae502ff
1 changed files with 21 additions and 21 deletions
|
|
@ -1232,6 +1232,23 @@ struct CoreMidiHelpers
|
||||||
Endpoints endpoints;
|
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>
|
template <ImplementationStrategy>
|
||||||
struct Receiver;
|
struct Receiver;
|
||||||
|
|
@ -1254,8 +1271,7 @@ struct CoreMidiHelpers
|
||||||
|
|
||||||
for (uint32_t i = 0; i < list->numPackets; ++i)
|
for (uint32_t i = 0; i < list->numPackets; ++i)
|
||||||
{
|
{
|
||||||
const auto elapsedTime = packet->timeStamp - startTimeNative;
|
const auto juceTimeMillis = converter.convertToMillis (packet->timeStamp);
|
||||||
const auto juceTimeMillis = startTimeMillis + (1e6 * (double) timeConversions.hostTimeToNanos (elapsedTime));
|
|
||||||
|
|
||||||
static_assert (sizeof (uint32_t) == sizeof (UInt32)
|
static_assert (sizeof (uint32_t) == sizeof (UInt32)
|
||||||
&& alignof (uint32_t) == alignof (UInt32),
|
&& alignof (uint32_t) == alignof (UInt32),
|
||||||
|
|
@ -1271,14 +1287,7 @@ struct CoreMidiHelpers
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ump::Consumer& callback;
|
ump::Consumer& callback;
|
||||||
|
TimeConverter converter;
|
||||||
#if JUCE_IOS
|
|
||||||
const MIDITimeStamp startTimeNative = mach_absolute_time();
|
|
||||||
#else
|
|
||||||
const MIDITimeStamp startTimeNative = AudioGetCurrentHostTime();
|
|
||||||
#endif
|
|
||||||
const uint32_t startTimeMillis = Time::getMillisecondCounter();
|
|
||||||
CoreAudioTimeConversions timeConversions;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
|
|
@ -1347,9 +1356,7 @@ struct CoreMidiHelpers
|
||||||
|
|
||||||
for (unsigned int i = 0; i < list->numPackets; ++i)
|
for (unsigned int i = 0; i < list->numPackets; ++i)
|
||||||
{
|
{
|
||||||
const auto elapsedTime = packet->timeStamp - startTimeNative;
|
const auto juceTimeMillis = converter.convertToMillis (packet->timeStamp);
|
||||||
const auto juceTimeMillis = startTimeMillis + (1e6 * (double) timeConversions.hostTimeToNanos (elapsedTime));
|
|
||||||
|
|
||||||
const auto* bytes = unalignedPointerCast<const std::byte*> (packet->data);
|
const auto* bytes = unalignedPointerCast<const std::byte*> (packet->data);
|
||||||
const auto len = readUnaligned<decltype (packet->length)> (&(packet->length));
|
const auto len = readUnaligned<decltype (packet->length)> (&(packet->length));
|
||||||
|
|
||||||
|
|
@ -1367,14 +1374,7 @@ struct CoreMidiHelpers
|
||||||
private:
|
private:
|
||||||
ump::BytestreamToUMPDispatcher dispatcher;
|
ump::BytestreamToUMPDispatcher dispatcher;
|
||||||
ump::Consumer& callback;
|
ump::Consumer& callback;
|
||||||
|
TimeConverter converter;
|
||||||
#if JUCE_IOS
|
|
||||||
const MIDITimeStamp startTimeNative = mach_absolute_time();
|
|
||||||
#else
|
|
||||||
const MIDITimeStamp startTimeNative = AudioGetCurrentHostTime();
|
|
||||||
#endif
|
|
||||||
const uint32_t startTimeMillis = Time::getMillisecondCounter();
|
|
||||||
CoreAudioTimeConversions timeConversions;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue