Signed-off-by: falkTX <falktx@falktx.com>tags/v2.2.0-RC1
@@ -19,6 +19,7 @@ | |||||
#define CARLA_HOST_IMPL_HPP_INCLUDED | #define CARLA_HOST_IMPL_HPP_INCLUDED | ||||
#include "CarlaHost.h" | #include "CarlaHost.h" | ||||
#include "CarlaUtils.h" | |||||
#include "CarlaEngine.hpp" | #include "CarlaEngine.hpp" | ||||
#ifdef BUILD_BRIDGE | #ifdef BUILD_BRIDGE | ||||
@@ -34,23 +34,6 @@ | |||||
# include "CarlaLogThread.hpp" | # include "CarlaLogThread.hpp" | ||||
#endif | #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) \ | #define CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(cond, msg, ret) \ | ||||
if (! (cond)) { \ | if (! (cond)) { \ | ||||
carla_stderr2("%s: " msg, __FUNCTION__); \ | carla_stderr2("%s: " msg, __FUNCTION__); \ | ||||
@@ -66,6 +49,13 @@ | |||||
#include "CarlaHostCommon.cpp" | #include "CarlaHostCommon.cpp" | ||||
#undef CARLA_COMMON_NEED_CHECKSTRINGPTR | #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() | uint carla_get_engine_driver_count() | ||||
@@ -321,10 +311,7 @@ bool carla_engine_init(CarlaHostHandle handle, const char* driverName, const cha | |||||
#endif | #endif | ||||
#ifdef USING_JUCE | #ifdef USING_JUCE | ||||
juce::initialiseJuce_GUI(); | |||||
#if !(defined(CARLA_OS_MAC) || defined(CARLA_OS_WIN)) | |||||
juce::MessageManager::getInstance()->setCurrentThreadAsMessageThread(); | |||||
#endif | |||||
carla_juce_init(); | |||||
#endif | #endif | ||||
CarlaHostStandalone& shandle((CarlaHostStandalone&)*handle); | CarlaHostStandalone& shandle((CarlaHostStandalone&)*handle); | ||||
@@ -374,7 +361,7 @@ bool carla_engine_init(CarlaHostHandle handle, const char* driverName, const cha | |||||
shandle.engine = nullptr; | shandle.engine = nullptr; | ||||
delete engine; | delete engine; | ||||
#ifdef USING_JUCE | #ifdef USING_JUCE | ||||
juce::shutdownJuce_GUI(); | |||||
carla_juce_cleanup(); | |||||
#endif | #endif | ||||
return false; | return false; | ||||
} | } | ||||
@@ -454,7 +441,7 @@ bool carla_engine_close(CarlaHostHandle handle) | |||||
delete engine; | delete engine; | ||||
#ifdef USING_JUCE | #ifdef USING_JUCE | ||||
juce::shutdownJuce_GUI(); | |||||
carla_juce_cleanup(); | |||||
#endif | #endif | ||||
return closed; | return closed; | ||||
} | } | ||||
@@ -465,11 +452,9 @@ void carla_engine_idle(CarlaHostHandle handle) | |||||
handle->engine->idle(); | 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 | #endif | ||||
} | } | ||||
@@ -166,11 +166,15 @@ CARLA_EXPORT const char* const* carla_get_supported_features(void); | |||||
* Get how many cached plugins are available. | * Get how many cached plugins are available. | ||||
* Internal and LV2 plugin formats are cached and need to be discovered via this function. | * Internal and LV2 plugin formats are cached and need to be discovered via this function. | ||||
* Do not call this for any other plugin formats. | * 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); | CARLA_EXPORT uint carla_get_cached_plugin_count(PluginType ptype, const char* pluginPath); | ||||
/*! | /*! | ||||
* Get information about a cached plugin. | * 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); | 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. | * Get the folder where this carla library resides. | ||||
*/ | */ | ||||
CARLA_EXPORT const char* carla_get_library_folder(void); | 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 | #endif | ||||
/* -------------------------------------------------------------------------------------------------------------------- | /* -------------------------------------------------------------------------------------------------------------------- | ||||
@@ -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 |
@@ -16,6 +16,7 @@ BUILD_CXX_FLAGS += $(FLUIDSYNTH_FLAGS) | |||||
OBJS = \ | OBJS = \ | ||||
$(OBJDIR)/CachedPlugins.cpp.o \ | $(OBJDIR)/CachedPlugins.cpp.o \ | ||||
$(OBJDIR)/Information.cpp.o \ | $(OBJDIR)/Information.cpp.o \ | ||||
$(OBJDIR)/JUCE.cpp.o \ | |||||
$(OBJDIR)/PipeClient.cpp.o \ | $(OBJDIR)/PipeClient.cpp.o \ | ||||
$(OBJDIR)/System.cpp.o \ | $(OBJDIR)/System.cpp.o \ | ||||
$(OBJDIR)/Windows.cpp.o | $(OBJDIR)/Windows.cpp.o | ||||
@@ -931,6 +931,9 @@ class SearchPluginsThread(QThread): | |||||
plugins = [] | plugins = [] | ||||
self._pluginLook(self.fLastCheckValue, "{} plugins...".format(PLUG_TEXT)) | 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) | count = gCarla.utils.get_cached_plugin_count(PLUG_TYPE, PLUG_PATH) | ||||
if not self.fContinueChecking: | if not self.fContinueChecking: | ||||
@@ -950,6 +953,9 @@ class SearchPluginsThread(QThread): | |||||
if not self.fContinueChecking: | if not self.fContinueChecking: | ||||
break | break | ||||
if not isLV2: | |||||
gCarla.utils.juce_cleanup() | |||||
self.fLastCheckValue += self.fCurPercentValue | self.fLastCheckValue += self.fCurPercentValue | ||||
return plugins | return plugins | ||||
@@ -1903,6 +1909,9 @@ class PluginDatabaseW(QDialog): | |||||
plugins = settingsDB.value("Plugins/" + ptypeStr, [], list) | plugins = settingsDB.value("Plugins/" + ptypeStr, [], list) | ||||
pluginCount = settingsDB.value("PluginCount/" + ptypeStr, 0, int) | pluginCount = settingsDB.value("PluginCount/" + ptypeStr, 0, int) | ||||
if ptype == PLUGIN_AU: | |||||
gCarla.utils.juce_init() | |||||
pluginCountNew = gCarla.utils.get_cached_plugin_count(ptype, path) | 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): | 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 | pluginCount = pluginCountNew | ||||
QApplication.processEvents(QEventLoop.ExcludeUserInputEvents, 50) | QApplication.processEvents(QEventLoop.ExcludeUserInputEvents, 50) | ||||
if ptype == PLUGIN_AU: | |||||
gCarla.utils.juce_idle() | |||||
for i in range(pluginCountNew): | for i in range(pluginCountNew): | ||||
descInfo = gCarla.utils.get_cached_plugin_info(ptype, i) | descInfo = gCarla.utils.get_cached_plugin_info(ptype, i) | ||||
@@ -1923,10 +1934,15 @@ class PluginDatabaseW(QDialog): | |||||
if i % 50 == 0: | if i % 50 == 0: | ||||
QApplication.processEvents(QEventLoop.ExcludeUserInputEvents, 50) | QApplication.processEvents(QEventLoop.ExcludeUserInputEvents, 50) | ||||
if ptype == PLUGIN_AU: | |||||
gCarla.utils.juce_idle() | |||||
settingsDB.setValue("Plugins/" + ptypeStr, plugins) | settingsDB.setValue("Plugins/" + ptypeStr, plugins) | ||||
settingsDB.setValue("PluginCount/" + ptypeStr, pluginCount) | settingsDB.setValue("PluginCount/" + ptypeStr, pluginCount) | ||||
if ptype == PLUGIN_AU: | |||||
gCarla.utils.juce_cleanup() | |||||
# prepare rows in advance | # prepare rows in advance | ||||
self.ui.tableWidget.setRowCount(self.fLastTableIndex + len(plugins)) | self.ui.tableWidget.setRowCount(self.fLastTableIndex + len(plugins)) | ||||
@@ -249,6 +249,15 @@ class CarlaUtils(object): | |||||
self.lib.carla_pipe_client_destroy.argtypes = [CarlaPipeClientHandle] | self.lib.carla_pipe_client_destroy.argtypes = [CarlaPipeClientHandle] | ||||
self.lib.carla_pipe_client_destroy.restype = None | 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.argtypes = [c_uintptr] | ||||
self.lib.carla_cocoa_get_window.restype = c_int | self.lib.carla_cocoa_get_window.restype = c_int | ||||
@@ -388,6 +397,15 @@ class CarlaUtils(object): | |||||
def pipe_client_destroy(self, handle): | def pipe_client_destroy(self, handle): | ||||
self.lib.carla_pipe_client_destroy(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): | def cocoa_get_window(self, winId): | ||||
return self.lib.carla_cocoa_get_window(winId) | return self.lib.carla_cocoa_get_window(winId) | ||||