From 4dedc0c6573f34a03bea934a0a27135c51d900ba Mon Sep 17 00:00:00 2001 From: falkTX Date: Mon, 21 Aug 2017 00:41:35 +0100 Subject: [PATCH] Run juce messages on linux host thread; Update juce icon; Cleanup --- resources/48x48/juce.png | Bin 3243 -> 3304 bytes resources/ui/carla_about_juce.ui | 2 +- source/backend/CarlaStandalone.cpp | 9 ++++ source/backend/engine/CarlaEngineNative.cpp | 42 ++++++++++++++++-- source/backend/plugin/CarlaPluginNative.cpp | 3 ++ source/bridges-plugin/Makefile | 14 +++--- source/includes/CarlaNative.h | 3 +- .../messages/juce_MessageManager.h | 2 +- source/plugin/carla-lv2.cpp | 1 + source/plugin/carla-vst.cpp | 1 + source/utils/CarlaJuceAudioProcessors.cpp | 2 +- 11 files changed, 65 insertions(+), 14 deletions(-) diff --git a/resources/48x48/juce.png b/resources/48x48/juce.png index 5caddfde7f3958b3a18498359d8fbe35be114c62..365d3d54207dc79cddef243613b744ebb081224e 100644 GIT binary patch delta 3300 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 Lkh>=fWDnvF+b-;1zp z63ko)v;Lr(R!%Q?@kWrg@_x|4aNC?pfdoVIIUW2_evV=^{LaOk#1~E)5XfXbY<~>Q z(CeP97{v1-CkOgZf|`Aymy(%W7AXFYnQ&kO{AP|~u99)EI11w#sSkYn8X8MJc zb?8*1p?_htoe(<&Ak${0bX;(15V0J{?xB82h7v$Cz!NZdI-EHGb%((a%3HMKa3mNe zoZ6!TUb!8%E&`FL) z2Gs3?(~T-Rv@$3NHNEEp9!y*Sx=^f?t^+N|bbs~s-fuq}1Z?6YNd%hs32vtVeE-aT z^l)yK5-yn2a#D+oC@O~h5~wa$j3k4$Mi>@&0q9vU{bx!St-KzN?o+Ab2W{!HwfCEK zQrZWda_ZU4FmgzRRN5H;-C!>Q`1?k6;Dw)tUL(N?6u&2dejk8%F6{l4lDxjte7BMc zX@3W@`@q#t!|+eS?{9;@t$~=KCbRY(x3%|aRlq`Qpo&Ta1`)h20T7FMgGg2xWlN!I zA7tgjsCR(3GnjmQ1&F4no^d6w|c*I z$_N3D4|zRo>gD4MCKnr<6t!KSiCya<&VMw)#zo)@81O;3b|vHwg{XjmSHRxiLeht1 z3Q~^J^4&+k)W_hOUnr&d>zS}~NjTsK?UZH*snaa>0tueBkdqw8Mg!dT`QPbkQQi}K znbWC{a@Bn>;TwuV8&AN&QW!V^-dqiTdKwI=M#Et6K>3TX?ru1?7b0ec!GA;t zO0#tobW=4&!+4Gg?+$W_;*utUC%#YhzXo6`MGO%y;ma{xaW9O%1+uy;T6B^jLs^+q zl66qE8~*qM*tZINH{8s*Z4DM3q)oH&whOu_jl|8K~Jb1kbM%8wSTbtSvXpziqsT}Zi9Ag)86=?RobLo(AiI#*)(#L zI2s-f4mBO6PnWmT@-vupV+CoZV}*BF8d!PYr&ToEPy^|J7N(4(V};qK3PUxM@<6bf zGXsjeJ^D}P2!NPPJy zRV=0(K0bO^jDK6t2jo01Mi^fv5?q5Dn3&H$s%8_|iO;UjRnV*J1LghtNgedOt1A{v{vJ8}>P#c53AjD3pD;}aQ z*hCX9*(8WyqvK;D#Y3GNe}8VCk1U{B`oZyz- +Copyright (C) 2017 ROLI Ltd. true diff --git a/source/backend/CarlaStandalone.cpp b/source/backend/CarlaStandalone.cpp index 5a1822eaa..8eff73948 100644 --- a/source/backend/CarlaStandalone.cpp +++ b/source/backend/CarlaStandalone.cpp @@ -429,6 +429,15 @@ void carla_engine_idle() CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr,); gStandalone.engine->idle(); + +#if ! (defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN)) + using juce::MessageManager; + + const MessageManager* const msgMgr(MessageManager::getInstanceWithoutCreating()); + CARLA_SAFE_ASSERT_RETURN(msgMgr != nullptr,); + + for (; msgMgr->dispatchNextMessageOnSystemQueue(true);) {} +#endif } bool carla_is_engine_running() diff --git a/source/backend/engine/CarlaEngineNative.cpp b/source/backend/engine/CarlaEngineNative.cpp index 9f7a7607e..6d7dfc4d2 100644 --- a/source/backend/engine/CarlaEngineNative.cpp +++ b/source/backend/engine/CarlaEngineNative.cpp @@ -45,7 +45,6 @@ using juce::File; using juce::FloatVectorOperations; using juce::MemoryOutputStream; -using juce::ScopedJuceInitialiser_GUI; using juce::ScopedPointer; using juce::String; using juce::XmlDocument; @@ -53,6 +52,27 @@ using juce::XmlElement; CARLA_BACKEND_START_NAMESPACE +static int numScopedInitInstances = 0; + +class OptionalScopedJuceInitialiser_GUI +{ +public: + OptionalScopedJuceInitialiser_GUI(bool performInit) + : fPerformInit(performInit) + { + if (fPerformInit && numScopedInitInstances++ == 0) + juce::initialiseJuce_GUI(); + } + ~OptionalScopedJuceInitialiser_GUI() + { + if (fPerformInit && --numScopedInitInstances == 0) + juce::shutdownJuce_GUI(); + } + +private: + bool fPerformInit; +}; + // ----------------------------------------------------------------------- class CarlaEngineNativeUI : public CarlaExternalUI @@ -594,8 +614,11 @@ public: fIsActive(false), fIsRunning(false), fUiServer(this), + fNeedsJuceMsgIdle(host->dispatcher(pHost->handle, + NATIVE_HOST_OPCODE_INTERNAL_PLUGIN, 0, 0, nullptr, 0.0f) == 0), fOptionsForced(false), - fWaitForReadyMsg(false) + fWaitForReadyMsg(false), + kJuceGuiInit(fNeedsJuceMsgIdle) { carla_debug("CarlaEngineNative::CarlaEngineNative()"); @@ -1640,6 +1663,18 @@ protected: fUiServer.stopPipeServer(1000); break; } + +#if ! (defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN)) + if (fNeedsJuceMsgIdle) + { + using juce::MessageManager; + + const MessageManager* const msgMgr(MessageManager::getInstanceWithoutCreating()); + CARLA_SAFE_ASSERT_RETURN(msgMgr != nullptr,); + + for (; msgMgr->dispatchNextMessageOnSystemQueue(true);) {} + } +#endif } // ------------------------------------------------------------------- @@ -1830,11 +1865,12 @@ private: bool fIsActive, fIsRunning; CarlaEngineNativeUI fUiServer; + bool fNeedsJuceMsgIdle; bool fOptionsForced; bool fWaitForReadyMsg; char fTmpBuf[STR_MAX+1]; - const ScopedJuceInitialiser_GUI juceGuiInit; + const OptionalScopedJuceInitialiser_GUI kJuceGuiInit; CarlaPlugin* _getFirstPlugin() const noexcept { diff --git a/source/backend/plugin/CarlaPluginNative.cpp b/source/backend/plugin/CarlaPluginNative.cpp index 31af18ea0..65cf70d1e 100644 --- a/source/backend/plugin/CarlaPluginNative.cpp +++ b/source/backend/plugin/CarlaPluginNative.cpp @@ -2267,6 +2267,9 @@ protected: case NATIVE_HOST_OPCODE_HOST_IDLE: pData->engine->callback(ENGINE_CALLBACK_IDLE, 0, 0, 0, 0.0f, nullptr); break; + case NATIVE_HOST_OPCODE_INTERNAL_PLUGIN: + ret = 1; + break; } return ret; diff --git a/source/bridges-plugin/Makefile b/source/bridges-plugin/Makefile index 662268af3..eac84b991 100644 --- a/source/bridges-plugin/Makefile +++ b/source/bridges-plugin/Makefile @@ -61,6 +61,13 @@ LIBS_win32 += $(MODULEDIR)/juce_core.win32.a LIBS_win64 += $(MODULEDIR)/juce_core.win64.a LINK_FLAGS += $(JUCE_CORE_LIBS) +LIBS_native += $(MODULEDIR)/juce_events.a +LIBS_posix32 += $(MODULEDIR)/juce_events.posix32.a +LIBS_posix64 += $(MODULEDIR)/juce_events.posix64.a +LIBS_win32 += $(MODULEDIR)/juce_events.win32.a +LIBS_win64 += $(MODULEDIR)/juce_events.win64.a +LINK_FLAGS += $(JUCE_EVENTS_LIBS) + LIBS_native += $(MODULEDIR)/lilv.a LIBS_posix32 += $(MODULEDIR)/lilv.posix32.a LIBS_posix64 += $(MODULEDIR)/lilv.posix64.a @@ -90,13 +97,6 @@ LIBS_win32 += $(MODULEDIR)/juce_data_structures.win32.a LIBS_win64 += $(MODULEDIR)/juce_data_structures.win64.a LINK_FLAGS += $(JUCE_DATA_STRUCTURES_LIBS) -LIBS_native += $(MODULEDIR)/juce_events.a -LIBS_posix32 += $(MODULEDIR)/juce_events.posix32.a -LIBS_posix64 += $(MODULEDIR)/juce_events.posix64.a -LIBS_win32 += $(MODULEDIR)/juce_events.win32.a -LIBS_win64 += $(MODULEDIR)/juce_events.win64.a -LINK_FLAGS += $(JUCE_EVENTS_LIBS) - LIBS_native += $(MODULEDIR)/juce_graphics.a LIBS_posix32 += $(MODULEDIR)/juce_graphics.posix32.a LIBS_posix64 += $(MODULEDIR)/juce_graphics.posix64.a diff --git a/source/includes/CarlaNative.h b/source/includes/CarlaNative.h index 01b746dbc..a24cae949 100644 --- a/source/includes/CarlaNative.h +++ b/source/includes/CarlaNative.h @@ -104,7 +104,8 @@ typedef enum { NATIVE_HOST_OPCODE_RELOAD_MIDI_PROGRAMS = 4, /** nothing */ NATIVE_HOST_OPCODE_RELOAD_ALL = 5, /** nothing */ NATIVE_HOST_OPCODE_UI_UNAVAILABLE = 6, /** nothing */ - NATIVE_HOST_OPCODE_HOST_IDLE = 7 /** nothing */ + NATIVE_HOST_OPCODE_HOST_IDLE = 7, /** nothing */ + NATIVE_HOST_OPCODE_INTERNAL_PLUGIN = 8 /** nothing */ } NativeHostDispatcherOpcode; /* ------------------------------------------------------------------------------------------------------------ diff --git a/source/modules/juce_events/messages/juce_MessageManager.h b/source/modules/juce_events/messages/juce_MessageManager.h index e0734f8e3..cc8d44db5 100644 --- a/source/modules/juce_events/messages/juce_MessageManager.h +++ b/source/modules/juce_events/messages/juce_MessageManager.h @@ -189,6 +189,7 @@ public: // Internal methods - do not use! void deliverBroadcastMessage (const String&); ~MessageManager() noexcept; + static bool dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages); #endif private: @@ -212,7 +213,6 @@ private: static void* exitModalLoopCallback (void*); static void doPlatformSpecificInitialisation(); static void doPlatformSpecificShutdown(); - static bool dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages); template struct AsyncCallInvoker : public MessageBase diff --git a/source/plugin/carla-lv2.cpp b/source/plugin/carla-lv2.cpp index 16b0b1e8d..b0bf324e3 100644 --- a/source/plugin/carla-lv2.cpp +++ b/source/plugin/carla-lv2.cpp @@ -1087,6 +1087,7 @@ protected: case NATIVE_HOST_OPCODE_RELOAD_MIDI_PROGRAMS: case NATIVE_HOST_OPCODE_RELOAD_ALL: case NATIVE_HOST_OPCODE_HOST_IDLE: + case NATIVE_HOST_OPCODE_INTERNAL_PLUGIN: // nothing break; case NATIVE_HOST_OPCODE_UI_UNAVAILABLE: diff --git a/source/plugin/carla-vst.cpp b/source/plugin/carla-vst.cpp index 46277cd17..56847e208 100644 --- a/source/plugin/carla-vst.cpp +++ b/source/plugin/carla-vst.cpp @@ -570,6 +570,7 @@ protected: case NATIVE_HOST_OPCODE_RELOAD_MIDI_PROGRAMS: case NATIVE_HOST_OPCODE_RELOAD_ALL: case NATIVE_HOST_OPCODE_UI_UNAVAILABLE: + case NATIVE_HOST_OPCODE_INTERNAL_PLUGIN: break; case NATIVE_HOST_OPCODE_HOST_IDLE: diff --git a/source/utils/CarlaJuceAudioProcessors.cpp b/source/utils/CarlaJuceAudioProcessors.cpp index 89413052c..995036413 100644 --- a/source/utils/CarlaJuceAudioProcessors.cpp +++ b/source/utils/CarlaJuceAudioProcessors.cpp @@ -15,7 +15,7 @@ * For a full copy of the GNU General Public License see the doc/GPL.txt file. */ -#include "CarlaJuceUtils.hpp" +#include "CarlaDefines.h" // -------------------------------------------------------------------------------------------------------------------