diff --git a/examples/Audio/MidiDemo.h b/examples/Audio/MidiDemo.h index 126ffd955d..c66369e9f0 100644 --- a/examples/Audio/MidiDemo.h +++ b/examples/Audio/MidiDemo.h @@ -59,19 +59,13 @@ struct MidiDeviceListEntry : ReferenceCountedObject using Ptr = ReferenceCountedObjectPtr; }; -//============================================================================== -struct MidiCallbackMessage : public Message -{ - MidiCallbackMessage (const MidiMessage& msg) : message (msg) {} - MidiMessage message; -}; //============================================================================== class MidiDemo : public Component, private Timer, private MidiKeyboardStateListener, private MidiInputCallback, - private MessageListener + private AsyncUpdater { public: //============================================================================== @@ -152,14 +146,6 @@ public: sendToOutputs (m); } - void handleMessage (const Message& msg) override - { - // This is called on the message loop - - auto& mm = dynamic_cast (msg).message; - midiMonitor.insertTextAtCaret (mm.getDescription() + "\n"); - } - void paint (Graphics&) override {} void resized() override @@ -253,11 +239,9 @@ public: private: //============================================================================== - class MidiDeviceListBox : public ListBox, - private ListBoxModel + struct MidiDeviceListBox : public ListBox, + private ListBoxModel { - public: - //============================================================================== MidiDeviceListBox (const String& name, MidiDemo& contentComponent, bool isInputDeviceList) @@ -277,7 +261,6 @@ private: : parent.getNumMidiOutputs(); } - //============================================================================== void paintListBoxItem (int rowNumber, Graphics& g, int width, int height, bool rowIsSelected) override { @@ -352,12 +335,30 @@ private: void handleIncomingMidiMessage (MidiInput* /*source*/, const MidiMessage& message) override { // This is called on the MIDI thread + const ScopedLock sl (midiMonitorLock); + incomingMessages.add (message); + triggerAsyncUpdate(); + } + + void handleAsyncUpdate() override + { + // This is called on the message loop + Array messages; + + { + const ScopedLock sl (midiMonitorLock); + messages.swapWith (incomingMessages); + } + + String messageText; + + for (auto& m : messages) + messageText << m.getDescription() << "\n"; - if (message.isNoteOnOrOff()) - postMessage (new MidiCallbackMessage (message)); + midiMonitor.insertTextAtCaret (messageText); } - void sendToOutputs(const MidiMessage& msg) + void sendToOutputs (const MidiMessage& msg) { for (auto midiOutput : midiOutputs) if (midiOutput->outDevice.get() != nullptr) @@ -469,11 +470,11 @@ private: TextEditor midiMonitor { "MIDI Monitor" }; TextButton pairButton { "MIDI Bluetooth devices..." }; - std::unique_ptr midiInputSelector; - std::unique_ptr midiOutputSelector; + std::unique_ptr midiInputSelector, midiOutputSelector; + ReferenceCountedArray midiInputs, midiOutputs; - ReferenceCountedArray midiInputs; - ReferenceCountedArray midiOutputs; + CriticalSection midiMonitorLock; + Array incomingMessages; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiDemo)