diff --git a/resources/48x48/juce.png b/resources/48x48/juce.png index 5caddfde7..365d3d542 100644 Binary files a/resources/48x48/juce.png and b/resources/48x48/juce.png differ diff --git a/resources/ui/carla_about_juce.ui b/resources/ui/carla_about_juce.ui index 68053c85b..3f6c28502 100644 --- a/resources/ui/carla_about_juce.ui +++ b/resources/ui/carla_about_juce.ui @@ -111,7 +111,7 @@ It contains pretty much everything you're likely to need to create most applicat JUCE is licensed under the GNU Public Licence version 2.0. One module (juce_core) is permissively licensed under the ISC. -Copyright (C) 2015 - ROLI Ltd. +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" // -------------------------------------------------------------------------------------------------------------------