From 087d7bec05f06af8d41084ebc49bf4fe5848afcd Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Wed, 8 Jan 2020 18:24:32 +0100 Subject: [PATCH] Implement sendNote for JACK --- Makefile.plugins.mk | 6 +-- distrho/src/DistrhoPluginJack.cpp | 61 +++++++++++++++++++++---------- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/Makefile.plugins.mk b/Makefile.plugins.mk index 4d69c3f1..d15418d8 100644 --- a/Makefile.plugins.mk +++ b/Makefile.plugins.mk @@ -100,7 +100,7 @@ endif ifneq ($(UI_TYPE),none) ifneq ($(WINDOWS),true) -VST_LIBS += -lpthread +THREAD_LIBS += -lpthread endif endif @@ -177,7 +177,7 @@ $(jack): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_JACK.cpp.o endif -@mkdir -p $(shell dirname $@) @echo "Creating JACK standalone for $(NAME)" - $(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(shell $(PKG_CONFIG) --libs jack) -o $@ + $(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(THREAD_LIBS) $(shell $(PKG_CONFIG) --libs jack) -o $@ # --------------------------------------------------------------------------------------------------------------------- # LADSPA @@ -240,7 +240,7 @@ $(vst): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_VST.cpp.o endif -@mkdir -p $(shell dirname $@) @echo "Creating VST plugin for $(NAME)" - $(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(VST_LIBS) $(SHARED) -o $@ + $(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(DGL_LIBS) $(THREAD_LIBS) $(SHARED) -o $@ # --------------------------------------------------------------------------------------------------------------------- diff --git a/distrho/src/DistrhoPluginJack.cpp b/distrho/src/DistrhoPluginJack.cpp index 7cb0684a..e1fa0c64 100644 --- a/distrho/src/DistrhoPluginJack.cpp +++ b/distrho/src/DistrhoPluginJack.cpp @@ -101,7 +101,7 @@ public: PluginJack(jack_client_t* const client) : fPlugin(this, writeMidiCallback), #if DISTRHO_PLUGIN_HAS_UI - fUI(this, 0, nullptr, setParameterValueCallback, setStateCallback, nullptr, setSizeCallback, getDesktopScaleFactor(), fPlugin.getInstancePointer()), + fUI(this, 0, nullptr, setParameterValueCallback, setStateCallback, sendNoteCallback, setSizeCallback, getDesktopScaleFactor(), fPlugin.getInstancePointer()), #endif fClient(client) { @@ -356,12 +356,13 @@ protected: jack_midi_clear_buffer(fPortMidiOutBuffer); #endif - if (const uint32_t eventCount = jack_midi_get_event_count(midiBuf)) - { #if DISTRHO_PLUGIN_WANT_MIDI_INPUT - uint32_t midiEventCount = 0; - MidiEvent midiEvents[eventCount]; + uint32_t midiEventCount = 0; + MidiEvent midiEvents[kMaxMidiEvents]; #endif + + if (const uint32_t eventCount = jack_midi_get_event_count(midiBuf)) + { jack_midi_event_t jevent; for (uint32_t i=0; i < eventCount; ++i) @@ -410,27 +411,26 @@ protected: #endif #if DISTRHO_PLUGIN_WANT_MIDI_INPUT - MidiEvent& midiEvent(midiEvents[midiEventCount++]); + if (midiEventCount < kMaxMidiEvents) + { + MidiEvent& midiEvent(midiEvents[midiEventCount++]); - midiEvent.frame = jevent.time; - midiEvent.size = jevent.size; + midiEvent.frame = jevent.time; + midiEvent.size = jevent.size; - if (midiEvent.size > MidiEvent::kDataSize) - midiEvent.dataExt = jevent.buffer; - else - std::memcpy(midiEvent.data, jevent.buffer, midiEvent.size); + if (midiEvent.size > MidiEvent::kDataSize) + midiEvent.dataExt = jevent.buffer; + else + std::memcpy(midiEvent.data, jevent.buffer, midiEvent.size); + } #endif } - -#if DISTRHO_PLUGIN_WANT_MIDI_INPUT - fPlugin.run(audioIns, audioOuts, nframes, midiEvents, midiEventCount); -#endif } #if DISTRHO_PLUGIN_WANT_MIDI_INPUT - else - { - fPlugin.run(audioIns, audioOuts, nframes, nullptr, 0); - } +# if DISTRHO_PLUGIN_HAS_UI + midiEventCount = fMidiQueue.receive(midiEvents, midiEventCount); +# endif + fPlugin.run(audioIns, audioOuts, nframes, midiEvents, midiEventCount); #else fPlugin.run(audioIns, audioOuts, nframes); #endif @@ -466,6 +466,17 @@ protected: #endif #if DISTRHO_PLUGIN_HAS_UI +# if DISTRHO_PLUGIN_WANT_MIDI_INPUT + void sendNote(const uint8_t channel, const uint8_t note, const uint8_t velocity) + { + uint8_t midiData[3]; + midiData[0] = 0x90 | channel; + midiData[1] = note; + midiData[2] = velocity; + fMidiQueue.send(midiData); + } +# endif + void setSize(const uint width, const uint height) { fUI.setWindowSize(width, height); @@ -535,6 +546,9 @@ private: # if DISTRHO_PLUGIN_WANT_PROGRAMS int fProgramChanged; # endif +# if DISTRHO_PLUGIN_WANT_MIDI_INPUT + SimpleMidiQueue fMidiQueue; +# endif #endif // ------------------------------------------------------------------- @@ -578,6 +592,13 @@ private: #endif #if DISTRHO_PLUGIN_HAS_UI + static void sendNoteCallback(void* ptr, uint8_t channel, uint8_t note, uint8_t velocity) + { +# if DISTRHO_PLUGIN_WANT_MIDI_INPUT + thisPtr->sendNote(channel, note, velocity); +#endif + } + static void setSizeCallback(void* ptr, uint width, uint height) { thisPtr->setSize(width, height);