diff --git a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp index c68df97e5c..624e657624 100644 --- a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp @@ -177,30 +177,6 @@ struct AAXClasses return nullptr; } - //============================================================================== - struct JUCELibraryRefCount - { - JUCELibraryRefCount() { if (getCount()++ == 0) initialise(); } - ~JUCELibraryRefCount() { if (--getCount() == 0) shutdown(); } - - private: - static void initialise() - { - initialiseJuce_GUI(); - } - - static void shutdown() - { - shutdownJuce_GUI(); - } - - int& getCount() noexcept - { - static int count = 0; - return count; - } - }; - //============================================================================== class JuceAAX_Processor; @@ -389,7 +365,7 @@ struct AAXClasses ScopedPointer component; - JUCELibraryRefCount juceCount; + ScopedJuceInitialiser_GUI libraryInitialiser; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceAAX_GUI) }; @@ -896,7 +872,7 @@ struct AAXClasses check (Controller()->SetSignalLatency (audioProcessor.getLatencySamples())); } - JUCELibraryRefCount juceCount; + ScopedJuceInitialiser_GUI libraryInitialiser; ScopedPointer pluginInstance; MidiBuffer midiBuffer; @@ -1020,7 +996,7 @@ struct AAXClasses AAX_Result JUCE_CDECL GetEffectDescriptions (AAX_ICollection*); AAX_Result JUCE_CDECL GetEffectDescriptions (AAX_ICollection* collection) { - AAXClasses::JUCELibraryRefCount libraryRefCount; + ScopedJuceInitialiser_GUI libraryInitialiser; if (AAX_IEffectDescriptor* const descriptor = collection->NewDescriptor()) { diff --git a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp index ba8ca4cd60..9136a4df60 100644 --- a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp @@ -60,23 +60,6 @@ namespace juce using namespace Steinberg; -//============================================================================== -class JuceLibraryRefCount -{ -public: - JuceLibraryRefCount() { if ((getCount()++) == 0) initialiseJuce_GUI(); } - ~JuceLibraryRefCount() { if ((--getCount()) == 0) shutdownJuce_GUI(); } - -private: - int& getCount() noexcept - { - static int count = 0; - return count; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceLibraryRefCount) -}; - //============================================================================== #if JUCE_MAC extern void initialiseMac(); @@ -104,6 +87,7 @@ public: private: Atomic refCount; ScopedPointer audioProcessor; + ScopedJuceInitialiser_GUI libraryInitialiser; JuceAudioProcessor() JUCE_DELETED_FUNCTION; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceAudioProcessor) @@ -301,7 +285,7 @@ public: private: //============================================================================== ComSmartPtr audioProcessor; - const JuceLibraryRefCount juceCount; + ScopedJuceInitialiser_GUI libraryInitialiser; //============================================================================== void setupParameters() @@ -539,6 +523,8 @@ private: WindowsHooks hooks; #endif + ScopedJuceInitialiser_GUI libraryInitialiser; + //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVST3Editor) }; @@ -1338,7 +1324,7 @@ private: MidiBuffer midiBuffer; Array channelList; - const JuceLibraryRefCount juceCount; + ScopedJuceInitialiser_GUI libraryInitialiser; //============================================================================== void addBusTo (Vst::BusList& busList, Vst::Bus* newBus) @@ -1696,7 +1682,7 @@ public: private: //============================================================================== - const JuceLibraryRefCount juceCount; + ScopedJuceInitialiser_GUI libraryInitialiser; Atomic refCount; const PFactoryInfo factoryInfo; ComSmartPtr host; diff --git a/modules/juce_events/messages/juce_Initialisation.h b/modules/juce_events/messages/juce_Initialisation.h index 4a93b0f040..84f5e82b2d 100644 --- a/modules/juce_events/messages/juce_Initialisation.h +++ b/modules/juce_events/messages/juce_Initialisation.h @@ -55,13 +55,17 @@ JUCE_API void JUCE_CALLTYPE shutdownJuce_GUI(); /** A utility object that helps you initialise and shutdown Juce correctly using an RAII pattern. - When an instance of this class is created, it calls initialiseJuce_GUI(), - and when it's deleted, it calls shutdownJuce_GUI(), which lets you easily - make sure that these functions are matched correctly. + When the first instance of this class is created, it calls initialiseJuce_GUI(), + and when the last instance is deleted, it calls shutdownJuce_GUI(), so that you + can easily be sure that as long as at least one instance of the class exists, the + library will be initialised. This class is particularly handy to use at the beginning of a console app's main() function, because it'll take care of shutting down whenever you return from the main() call. + + Be careful with your threading though - to be safe, you should always make sure + that these objects are created and deleted on the message thread. */ class JUCE_API ScopedJuceInitialiser_GUI { diff --git a/modules/juce_events/messages/juce_MessageManager.cpp b/modules/juce_events/messages/juce_MessageManager.cpp index 2f38a1c4cf..9383d50b49 100644 --- a/modules/juce_events/messages/juce_MessageManager.cpp +++ b/modules/juce_events/messages/juce_MessageManager.cpp @@ -334,5 +334,7 @@ JUCE_API void JUCE_CALLTYPE shutdownJuce_GUI() } } -ScopedJuceInitialiser_GUI::ScopedJuceInitialiser_GUI() { initialiseJuce_GUI(); } -ScopedJuceInitialiser_GUI::~ScopedJuceInitialiser_GUI() { shutdownJuce_GUI(); } +static int numScopedInitInstances = 0; + +ScopedJuceInitialiser_GUI::ScopedJuceInitialiser_GUI() { if (numScopedInitInstances++ == 0) initialiseJuce_GUI(); } +ScopedJuceInitialiser_GUI::~ScopedJuceInitialiser_GUI() { if (--numScopedInitInstances == 0) shutdownJuce_GUI(); } diff --git a/modules/juce_gui_basics/native/juce_android_Windowing.cpp b/modules/juce_gui_basics/native/juce_android_Windowing.cpp index 02353be730..2b73eedbaf 100644 --- a/modules/juce_gui_basics/native/juce_android_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_android_Windowing.cpp @@ -39,7 +39,7 @@ JUCE_JNI_CALLBACK (JUCE_ANDROID_ACTIVITY_CLASSNAME, launchApp, void, (JNIEnv* en JUCEApplicationBase::createInstance = &juce_CreateApplication; - initialiseJuce_GUI(); + ScopedJuceInitialiser_GUI libraryInitialiser; JUCEApplicationBase* app = JUCEApplicationBase::createInstance(); if (! app->initialiseApp()) diff --git a/modules/juce_gui_basics/native/juce_ios_Windowing.mm b/modules/juce_gui_basics/native/juce_ios_Windowing.mm index 6b9031fb74..abf218d863 100644 --- a/modules/juce_gui_basics/native/juce_ios_Windowing.mm +++ b/modules/juce_gui_basics/native/juce_ios_Windowing.mm @@ -44,7 +44,8 @@ extern bool isIOSAppActive; - (void) applicationDidFinishLaunching: (UIApplication*) application { (void) application; - initialiseJuce_GUI(); + + ScopedJuceInitialiser_GUI libraryInitialiser; JUCEApplicationBase* app = JUCEApplicationBase::createInstance();