| @@ -177,30 +177,6 @@ struct AAXClasses | |||||
| return nullptr; | 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; | class JuceAAX_Processor; | ||||
| @@ -389,7 +365,7 @@ struct AAXClasses | |||||
| ScopedPointer<ContentWrapperComponent> component; | ScopedPointer<ContentWrapperComponent> component; | ||||
| JUCELibraryRefCount juceCount; | |||||
| ScopedJuceInitialiser_GUI libraryInitialiser; | |||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceAAX_GUI) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceAAX_GUI) | ||||
| }; | }; | ||||
| @@ -896,7 +872,7 @@ struct AAXClasses | |||||
| check (Controller()->SetSignalLatency (audioProcessor.getLatencySamples())); | check (Controller()->SetSignalLatency (audioProcessor.getLatencySamples())); | ||||
| } | } | ||||
| JUCELibraryRefCount juceCount; | |||||
| ScopedJuceInitialiser_GUI libraryInitialiser; | |||||
| ScopedPointer<AudioProcessor> pluginInstance; | ScopedPointer<AudioProcessor> pluginInstance; | ||||
| MidiBuffer midiBuffer; | MidiBuffer midiBuffer; | ||||
| @@ -1020,7 +996,7 @@ struct AAXClasses | |||||
| AAX_Result JUCE_CDECL GetEffectDescriptions (AAX_ICollection*); | AAX_Result JUCE_CDECL GetEffectDescriptions (AAX_ICollection*); | ||||
| AAX_Result JUCE_CDECL GetEffectDescriptions (AAX_ICollection* collection) | AAX_Result JUCE_CDECL GetEffectDescriptions (AAX_ICollection* collection) | ||||
| { | { | ||||
| AAXClasses::JUCELibraryRefCount libraryRefCount; | |||||
| ScopedJuceInitialiser_GUI libraryInitialiser; | |||||
| if (AAX_IEffectDescriptor* const descriptor = collection->NewDescriptor()) | if (AAX_IEffectDescriptor* const descriptor = collection->NewDescriptor()) | ||||
| { | { | ||||
| @@ -60,23 +60,6 @@ namespace juce | |||||
| using namespace Steinberg; | 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 | #if JUCE_MAC | ||||
| extern void initialiseMac(); | extern void initialiseMac(); | ||||
| @@ -104,6 +87,7 @@ public: | |||||
| private: | private: | ||||
| Atomic<int> refCount; | Atomic<int> refCount; | ||||
| ScopedPointer<AudioProcessor> audioProcessor; | ScopedPointer<AudioProcessor> audioProcessor; | ||||
| ScopedJuceInitialiser_GUI libraryInitialiser; | |||||
| JuceAudioProcessor() JUCE_DELETED_FUNCTION; | JuceAudioProcessor() JUCE_DELETED_FUNCTION; | ||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceAudioProcessor) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceAudioProcessor) | ||||
| @@ -301,7 +285,7 @@ public: | |||||
| private: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| ComSmartPtr<JuceAudioProcessor> audioProcessor; | ComSmartPtr<JuceAudioProcessor> audioProcessor; | ||||
| const JuceLibraryRefCount juceCount; | |||||
| ScopedJuceInitialiser_GUI libraryInitialiser; | |||||
| //============================================================================== | //============================================================================== | ||||
| void setupParameters() | void setupParameters() | ||||
| @@ -539,6 +523,8 @@ private: | |||||
| WindowsHooks hooks; | WindowsHooks hooks; | ||||
| #endif | #endif | ||||
| ScopedJuceInitialiser_GUI libraryInitialiser; | |||||
| //============================================================================== | //============================================================================== | ||||
| JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVST3Editor) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVST3Editor) | ||||
| }; | }; | ||||
| @@ -1338,7 +1324,7 @@ private: | |||||
| MidiBuffer midiBuffer; | MidiBuffer midiBuffer; | ||||
| Array<float*> channelList; | Array<float*> channelList; | ||||
| const JuceLibraryRefCount juceCount; | |||||
| ScopedJuceInitialiser_GUI libraryInitialiser; | |||||
| //============================================================================== | //============================================================================== | ||||
| void addBusTo (Vst::BusList& busList, Vst::Bus* newBus) | void addBusTo (Vst::BusList& busList, Vst::Bus* newBus) | ||||
| @@ -1696,7 +1682,7 @@ public: | |||||
| private: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| const JuceLibraryRefCount juceCount; | |||||
| ScopedJuceInitialiser_GUI libraryInitialiser; | |||||
| Atomic<int> refCount; | Atomic<int> refCount; | ||||
| const PFactoryInfo factoryInfo; | const PFactoryInfo factoryInfo; | ||||
| ComSmartPtr<Vst::IHostApplication> host; | ComSmartPtr<Vst::IHostApplication> host; | ||||
| @@ -55,13 +55,17 @@ JUCE_API void JUCE_CALLTYPE shutdownJuce_GUI(); | |||||
| /** A utility object that helps you initialise and shutdown Juce correctly | /** A utility object that helps you initialise and shutdown Juce correctly | ||||
| using an RAII pattern. | 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 | 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 | main() function, because it'll take care of shutting down whenever you return | ||||
| from the main() call. | 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 | class JUCE_API ScopedJuceInitialiser_GUI | ||||
| { | { | ||||
| @@ -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(); } | |||||
| @@ -39,7 +39,7 @@ JUCE_JNI_CALLBACK (JUCE_ANDROID_ACTIVITY_CLASSNAME, launchApp, void, (JNIEnv* en | |||||
| JUCEApplicationBase::createInstance = &juce_CreateApplication; | JUCEApplicationBase::createInstance = &juce_CreateApplication; | ||||
| initialiseJuce_GUI(); | |||||
| ScopedJuceInitialiser_GUI libraryInitialiser; | |||||
| JUCEApplicationBase* app = JUCEApplicationBase::createInstance(); | JUCEApplicationBase* app = JUCEApplicationBase::createInstance(); | ||||
| if (! app->initialiseApp()) | if (! app->initialiseApp()) | ||||
| @@ -44,7 +44,8 @@ extern bool isIOSAppActive; | |||||
| - (void) applicationDidFinishLaunching: (UIApplication*) application | - (void) applicationDidFinishLaunching: (UIApplication*) application | ||||
| { | { | ||||
| (void) application; | (void) application; | ||||
| initialiseJuce_GUI(); | |||||
| ScopedJuceInitialiser_GUI libraryInitialiser; | |||||
| JUCEApplicationBase* app = JUCEApplicationBase::createInstance(); | JUCEApplicationBase* app = JUCEApplicationBase::createInstance(); | ||||