51 const ScopedLock sl (midiCallbackLock);
54 jassert (hasCalledReset);
59 jassert (! approximatelyEqual (message.
getTimeStamp(), 0.0));
61 auto sampleNumber = (int) ((message.
getTimeStamp() - 0.001 * lastCallbackTime) * sampleRate);
63 incomingMessages.addEvent (message, sampleNumber);
67 if (sampleNumber > sampleRate)
68 incomingMessages.clear (0, sampleNumber - (
int) sampleRate);
74 const ScopedLock sl (midiCallbackLock);
77 jassert (hasCalledReset);
80 jassert (numSamples > 0);
83 auto msElapsed = timeNow - lastCallbackTime;
85 lastCallbackTime = timeNow;
87 if (! incomingMessages.isEmpty())
89 int numSourceSamples = jmax (1, roundToInt (msElapsed * 0.001 * sampleRate));
93 if (numSourceSamples > numSamples)
97 const int maxBlockLengthToUse = numSamples << 5;
99 auto iter = incomingMessages.cbegin();
101 if (numSourceSamples > maxBlockLengthToUse)
103 startSample = numSourceSamples - maxBlockLengthToUse;
104 numSourceSamples = maxBlockLengthToUse;
105 iter = incomingMessages.findNextSamplePosition (startSample);
108 scale = (numSamples << 10) / numSourceSamples;
112 const auto pos = ((meta.samplePosition - startSample) * scale) >> 10;
113 destBuffer.addEvent (meta.data, meta.numBytes, jlimit (0, numSamples - 1, pos));
120 startSample = numSamples - numSourceSamples;
122 for (
const auto metadata : incomingMessages)
123 destBuffer.
addEvent (metadata.data, metadata.numBytes,
124 jlimit (0, numSamples - 1, metadata.samplePosition + startSample));
127 incomingMessages.clear();