|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- /*
- * Carla Plugin Host
- * Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2 of
- * the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * For a full copy of the GNU General Public License see the doc/GPL.txt file.
- */
-
- #ifndef USING_JUCE
- # error this file is not meant to be built if not using juce!
- #endif
-
- #include "carla_juce.h"
-
- #include "CarlaUtils.hpp"
-
- #include "juce_events/juce_events.h"
- #if defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN)
- # include "juce_gui_basics/juce_gui_basics.h"
- #endif
-
- namespace juce {
- bool dispatchNextMessageOnSystemQueue(bool returnIfNoPendingMessages);
- }
-
- namespace CarlaJUCE {
-
- void initialiseJuce_GUI()
- {
- juce::initialiseJuce_GUI();
- #if !(defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN))
- juce::MessageManager::getInstance()->setCurrentThreadAsMessageThread();
- #endif
- }
-
- void idleJuce_GUI()
- {
- #if !(defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN))
- juce::dispatchNextMessageOnSystemQueue(true);
- #endif
- }
-
- void shutdownJuce_GUI()
- {
- juce::shutdownJuce_GUI();
- }
-
- const char* getVersion()
- {
- static const juce::String version(juce::SystemStats::getJUCEVersion());
- return version.toRawUTF8();
- }
-
- static int numScopedInitInstances = 0;
-
- ScopedJuceInitialiser_GUI::ScopedJuceInitialiser_GUI()
- {
- if (numScopedInitInstances++ == 0)
- initialiseJuce_GUI();
- }
-
- ScopedJuceInitialiser_GUI::~ScopedJuceInitialiser_GUI()
- {
- if (--numScopedInitInstances == 0)
- shutdownJuce_GUI();
- }
-
- #ifdef USE_REFCOUNTER_JUCE_MESSAGE_MANAGER
- ReferenceCountedJuceMessageMessager::ReferenceCountedJuceMessageMessager()
- {
- CARLA_SAFE_ASSERT(numScopedInitInstances == 0);
- }
-
- ReferenceCountedJuceMessageMessager::~ReferenceCountedJuceMessageMessager()
- {
- CARLA_SAFE_ASSERT(numScopedInitInstances == 0);
- }
-
- void ReferenceCountedJuceMessageMessager::incRef() const
- {
- if (numScopedInitInstances++ == 0)
- {
- juce::initialiseJuce_GUI();
- juce::MessageManager::getInstance()->setCurrentThreadAsMessageThread();
- }
- }
-
- void ReferenceCountedJuceMessageMessager::decRef() const
- {
- if (--numScopedInitInstances == 0)
- {
- juce::shutdownJuce_GUI();
- }
- }
-
- void setMessageManagerForThisThread()
- {
- juce::MessageManager* const msgMgr = juce::MessageManager::getInstanceWithoutCreating();
- CARLA_SAFE_ASSERT_RETURN(msgMgr != nullptr,);
-
- if (! msgMgr->isThisTheMessageThread())
- {
- try {
- msgMgr->setCurrentThreadAsMessageThread();
- } CARLA_SAFE_EXCEPTION_RETURN("setCurrentThreadAsMessageThread",);
- }
- }
-
- void dispatchMessageManagerMessages()
- {
- const juce::MessageManagerLock mml;
- juce::dispatchNextMessageOnSystemQueue(true);
- }
- #endif
-
- #ifdef USE_STANDALONE_JUCE_APPLICATION
- static std::function<void()> sIdleFn;
- static volatile bool* sClosedSignalPtr;
-
- class CarlaJuceApp : public juce::JUCEApplication,
- private juce::Timer
- {
- public:
- CarlaJuceApp() {}
- ~CarlaJuceApp() {}
-
- void initialise(const juce::String&) override
- {
- startTimer(8);
- }
-
- void shutdown() override
- {
- *sClosedSignalPtr = true;
- stopTimer();
- }
-
- const juce::String getApplicationName() override
- {
- return "CarlaPlugin";
- }
-
- const juce::String getApplicationVersion() override
- {
- return CARLA_VERSION_STRING;
- }
-
- void timerCallback() override
- {
- sIdleFn();
-
- if (*sClosedSignalPtr)
- {
- quit();
- *sClosedSignalPtr = false;
- }
- }
- };
-
- static juce::JUCEApplicationBase* juce_CreateApplication() { return new CarlaJuceApp(); }
-
- void setupAndUseMainApplication(std::function<void()> idleFn, volatile bool* closedSignalPtr)
- {
- #ifndef CARLA_OS_WIN
- static const int argc = 0;
- static const char* argv[] = {};
- #endif
- sIdleFn = idleFn;
- sClosedSignalPtr = closedSignalPtr;
- juce::JUCEApplicationBase::createInstance = &juce_CreateApplication;
- juce::JUCEApplicationBase::main(JUCE_MAIN_FUNCTION_ARGS);
- }
- #endif
-
- } // namespace CarlaJUCE
|