26MidiOutput::MidiOutput (
const String& deviceName,
const String& deviceIdentifier)
27 : Thread (
"midi out"), deviceInfo (deviceName, deviceIdentifier)
31void MidiOutput::sendBlockOfMessagesNow (
const MidiBuffer& buffer)
38 sendMessageNow (message);
41void MidiOutput::sendBlockOfMessages (
const MidiBuffer& buffer,
46 jassert (isThreadRunning());
63 if (firstMessage ==
nullptr || firstMessage->message.getTimeStamp() >
eventTime)
65 m->next = firstMessage;
70 auto*
mm = firstMessage;
72 while (
mm->next !=
nullptr &&
mm->next->message.getTimeStamp() <=
eventTime)
83void MidiOutput::clearAllPendingMessages()
87 while (firstMessage !=
nullptr)
89 auto* m = firstMessage;
90 firstMessage = firstMessage->next;
95void MidiOutput::startBackgroundThread()
100void MidiOutput::stopBackgroundThread()
105void MidiOutput::run()
107 while (! threadShouldExit())
109 auto now = Time::getMillisecondCounter();
113 PendingMessage* message;
117 message = firstMessage;
119 if (message !=
nullptr)
121 eventTime = (uint32) roundToInt (message->message.getTimeStamp());
130 firstMessage = message->next;
135 if (message !=
nullptr)
137 std::unique_ptr<PendingMessage> messageDeleter (message);
141 Time::waitForMillisecondCounter (eventTime);
143 if (threadShouldExit())
147 if (eventTime > now - 200)
148 sendMessageNow (message->message);
152 jassert (timeToWait < 1000 * 30);
153 wait ((
int) timeToWait);
157 clearAllPendingMessages();
bool getNextEvent(MidiMessage &result, int &samplePosition) noexcept