Browse Source

Move standalone juce init/idle/cleanup to new file, expose an API

Signed-off-by: falkTX <falktx@falktx.com>
tags/v2.2.0-RC1
falkTX 5 years ago
parent
commit
53c52cb3cf
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
7 changed files with 154 additions and 28 deletions
  1. +1
    -0
      source/backend/CarlaHostImpl.hpp
  2. +13
    -28
      source/backend/CarlaStandalone.cpp
  3. +28
    -0
      source/backend/CarlaUtils.h
  4. +77
    -0
      source/backend/utils/JUCE.cpp
  5. +1
    -0
      source/backend/utils/Makefile
  6. +16
    -0
      source/frontend/carla_database.py
  7. +18
    -0
      source/frontend/carla_utils.py

+ 1
- 0
source/backend/CarlaHostImpl.hpp View File

@@ -19,6 +19,7 @@
#define CARLA_HOST_IMPL_HPP_INCLUDED

#include "CarlaHost.h"
#include "CarlaUtils.h"
#include "CarlaEngine.hpp"

#ifdef BUILD_BRIDGE


+ 13
- 28
source/backend/CarlaStandalone.cpp View File

@@ -34,23 +34,6 @@
# include "CarlaLogThread.hpp"
#endif

#ifdef USING_JUCE
# if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wconversion"
# pragma GCC diagnostic ignored "-Weffc++"
# pragma GCC diagnostic ignored "-Wsign-conversion"
# pragma GCC diagnostic ignored "-Wundef"
# endif

# include "AppConfig.h"
# include "juce_events/juce_events.h"

# if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
# pragma GCC diagnostic pop
# endif
#endif

#define CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(cond, msg, ret) \
if (! (cond)) { \
carla_stderr2("%s: " msg, __FUNCTION__); \
@@ -66,6 +49,13 @@
#include "CarlaHostCommon.cpp"
#undef CARLA_COMMON_NEED_CHECKSTRINGPTR

#ifdef USING_JUCE
static void carla_juce_init();
static void carla_juce_idle();
static void carla_juce_cleanup();
# include "utils/JUCE.cpp"
#endif

// --------------------------------------------------------------------------------------------------------------------

uint carla_get_engine_driver_count()
@@ -321,10 +311,7 @@ bool carla_engine_init(CarlaHostHandle handle, const char* driverName, const cha
#endif

#ifdef USING_JUCE
juce::initialiseJuce_GUI();
#if !(defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN))
juce::MessageManager::getInstance()->setCurrentThreadAsMessageThread();
#endif
carla_juce_init();
#endif

CarlaHostStandalone& shandle((CarlaHostStandalone&)*handle);
@@ -374,7 +361,7 @@ bool carla_engine_init(CarlaHostHandle handle, const char* driverName, const cha
shandle.engine = nullptr;
delete engine;
#ifdef USING_JUCE
juce::shutdownJuce_GUI();
carla_juce_cleanup();
#endif
return false;
}
@@ -454,7 +441,7 @@ bool carla_engine_close(CarlaHostHandle handle)
delete engine;

#ifdef USING_JUCE
juce::shutdownJuce_GUI();
carla_juce_cleanup();
#endif
return closed;
}
@@ -465,11 +452,9 @@ void carla_engine_idle(CarlaHostHandle handle)

handle->engine->idle();

#if defined(USING_JUCE) && !(defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN))
const juce::MessageManager* const msgMgr(juce::MessageManager::getInstanceWithoutCreating());
CARLA_SAFE_ASSERT_RETURN(msgMgr != nullptr,);

for (; msgMgr->dispatchNextMessageOnSystemQueue(true);) {}
#ifdef USING_JUCE
if (handle->isStandalone)
carla_juce_idle();
#endif
}



+ 28
- 0
source/backend/CarlaUtils.h View File

@@ -166,11 +166,15 @@ CARLA_EXPORT const char* const* carla_get_supported_features(void);
* Get how many cached plugins are available.
* Internal and LV2 plugin formats are cached and need to be discovered via this function.
* Do not call this for any other plugin formats.
*
* @note if this carla build uses JUCE, then you must call carla_juce_init beforehand
*/
CARLA_EXPORT uint carla_get_cached_plugin_count(PluginType ptype, const char* pluginPath);

/*!
* Get information about a cached plugin.
*
* @note if this carla build uses JUCE, then you must call carla_juce_init beforehand
*/
CARLA_EXPORT const CarlaCachedPluginInfo* carla_get_cached_plugin_info(PluginType ptype, uint index);

@@ -271,6 +275,30 @@ CARLA_EXPORT const char* carla_get_library_filename(void);
* Get the folder where this carla library resides.
*/
CARLA_EXPORT const char* carla_get_library_folder(void);

/* --------------------------------------------------------------------------------------------------------------------
* JUCE */

/*!
* Initialize data structures and GUI support for JUCE.
* This is only needed when carla builds use JUCE and you call cached-plugin related APIs.
*
* Idle must then be called at somewhat regular intervals, though in practice there is no reason for it yet.
*
* Make sure to call carla_juce_cleanup after you are done with APIs that need JUCE.
*/
CARLA_EXPORT void carla_juce_init();

/*!
* Give idle time to JUCE stuff.
* Currently only used for Linux.
*/
CARLA_EXPORT void carla_juce_idle();

/*!
* Cleanup the JUCE stuff that was initialized by carla_juce_init.
*/
CARLA_EXPORT void carla_juce_cleanup();
#endif

/* --------------------------------------------------------------------------------------------------------------------


+ 77
- 0
source/backend/utils/JUCE.cpp View File

@@ -0,0 +1,77 @@
/*
* Carla Plugin Host
* Copyright (C) 2011-2020 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.
*/

#include "CarlaUtils.h"
#include "CarlaUtils.hpp"

#ifdef USING_JUCE

// -------------------------------------------------------------------------------------------------------------------

#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wconversion"
# pragma GCC diagnostic ignored "-Weffc++"
# pragma GCC diagnostic ignored "-Wsign-conversion"
# pragma GCC diagnostic ignored "-Wundef"
#endif

#include "AppConfig.h"
#include "juce_events/juce_events.h"

#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
# pragma GCC diagnostic pop
#endif

// -------------------------------------------------------------------------------------------------------------------

void carla_juce_init()
{
juce::initialiseJuce_GUI();
#if !(defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN))
juce::MessageManager::getInstance()->setCurrentThreadAsMessageThread();
#endif
}

void carla_juce_idle()
{
#if !(defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN))
const juce::MessageManager* const msgMgr(juce::MessageManager::getInstanceWithoutCreating());
CARLA_SAFE_ASSERT_RETURN(msgMgr != nullptr,);

for (; msgMgr->dispatchNextMessageOnSystemQueue(true);) {}
#endif
}

void carla_juce_cleanup()
{
juce::shutdownJuce_GUI();
}

// -------------------------------------------------------------------------------------------------------------------

#else // USING_JUCE

// -------------------------------------------------------------------------------------------------------------------

void carla_juce_init() {}
void carla_juce_idle() {}
void carla_juce_cleanup() {}

// -------------------------------------------------------------------------------------------------------------------

#endif // USING_JUCE

+ 1
- 0
source/backend/utils/Makefile View File

@@ -16,6 +16,7 @@ BUILD_CXX_FLAGS += $(FLUIDSYNTH_FLAGS)
OBJS = \
$(OBJDIR)/CachedPlugins.cpp.o \
$(OBJDIR)/Information.cpp.o \
$(OBJDIR)/JUCE.cpp.o \
$(OBJDIR)/PipeClient.cpp.o \
$(OBJDIR)/System.cpp.o \
$(OBJDIR)/Windows.cpp.o


+ 16
- 0
source/frontend/carla_database.py View File

@@ -931,6 +931,9 @@ class SearchPluginsThread(QThread):
plugins = []
self._pluginLook(self.fLastCheckValue, "{} plugins...".format(PLUG_TEXT))

if not isLV2:
gCarla.utils.juce_init()

count = gCarla.utils.get_cached_plugin_count(PLUG_TYPE, PLUG_PATH)

if not self.fContinueChecking:
@@ -950,6 +953,9 @@ class SearchPluginsThread(QThread):
if not self.fContinueChecking:
break

if not isLV2:
gCarla.utils.juce_cleanup()

self.fLastCheckValue += self.fCurPercentValue
return plugins

@@ -1903,6 +1909,9 @@ class PluginDatabaseW(QDialog):
plugins = settingsDB.value("Plugins/" + ptypeStr, [], list)
pluginCount = settingsDB.value("PluginCount/" + ptypeStr, 0, int)

if ptype == PLUGIN_AU:
gCarla.utils.juce_init()

pluginCountNew = gCarla.utils.get_cached_plugin_count(ptype, path)

if pluginCountNew != pluginCount or len(plugins) != pluginCount or (len(plugins) > 0 and plugins[0]['API'] != PLUGIN_QUERY_API_VERSION):
@@ -1910,6 +1919,8 @@ class PluginDatabaseW(QDialog):
pluginCount = pluginCountNew

QApplication.processEvents(QEventLoop.ExcludeUserInputEvents, 50)
if ptype == PLUGIN_AU:
gCarla.utils.juce_idle()

for i in range(pluginCountNew):
descInfo = gCarla.utils.get_cached_plugin_info(ptype, i)
@@ -1923,10 +1934,15 @@ class PluginDatabaseW(QDialog):

if i % 50 == 0:
QApplication.processEvents(QEventLoop.ExcludeUserInputEvents, 50)
if ptype == PLUGIN_AU:
gCarla.utils.juce_idle()

settingsDB.setValue("Plugins/" + ptypeStr, plugins)
settingsDB.setValue("PluginCount/" + ptypeStr, pluginCount)

if ptype == PLUGIN_AU:
gCarla.utils.juce_cleanup()

# prepare rows in advance
self.ui.tableWidget.setRowCount(self.fLastTableIndex + len(plugins))



+ 18
- 0
source/frontend/carla_utils.py View File

@@ -249,6 +249,15 @@ class CarlaUtils(object):
self.lib.carla_pipe_client_destroy.argtypes = [CarlaPipeClientHandle]
self.lib.carla_pipe_client_destroy.restype = None

self.lib.carla_juce_init.argtypes = None
self.lib.carla_juce_init.restype = None

self.lib.carla_juce_idle.argtypes = None
self.lib.carla_juce_idle.restype = None

self.lib.carla_juce_cleanup.argtypes = None
self.lib.carla_juce_cleanup.restype = None

self.lib.carla_cocoa_get_window.argtypes = [c_uintptr]
self.lib.carla_cocoa_get_window.restype = c_int

@@ -388,6 +397,15 @@ class CarlaUtils(object):
def pipe_client_destroy(self, handle):
self.lib.carla_pipe_client_destroy(handle)

def juce_init(self):
self.lib.carla_juce_init()

def juce_idle(self):
self.lib.carla_juce_idle()

def juce_cleanup(self):
self.lib.carla_juce_cleanup()

def cocoa_get_window(self, winId):
return self.lib.carla_cocoa_get_window(winId)



Loading…
Cancel
Save