Signed-off-by: falkTX <falktx@falktx.com>tags/v2.2.0-RC1
| @@ -19,6 +19,7 @@ | |||
| #define CARLA_HOST_IMPL_HPP_INCLUDED | |||
| #include "CarlaHost.h" | |||
| #include "CarlaUtils.h" | |||
| #include "CarlaEngine.hpp" | |||
| #ifdef BUILD_BRIDGE | |||
| @@ -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 | |||
| } | |||
| @@ -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 | |||
| /* -------------------------------------------------------------------------------------------------------------------- | |||
| @@ -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 = \ | |||
| $(OBJDIR)/CachedPlugins.cpp.o \ | |||
| $(OBJDIR)/Information.cpp.o \ | |||
| $(OBJDIR)/JUCE.cpp.o \ | |||
| $(OBJDIR)/PipeClient.cpp.o \ | |||
| $(OBJDIR)/System.cpp.o \ | |||
| $(OBJDIR)/Windows.cpp.o | |||
| @@ -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)) | |||
| @@ -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) | |||