From af9e1adddfe4ca54e2172e502f1a9b4cd0aea5e2 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sun, 5 Dec 2021 13:43:39 +0000 Subject: [PATCH] Ildaeil: Go back to using separate thread for plugin info fetching Signed-off-by: falkTX --- plugins/Cardinal/src/Ildaeil.cpp | 115 +++++++++++-------------------- 1 file changed, 39 insertions(+), 76 deletions(-) diff --git a/plugins/Cardinal/src/Ildaeil.cpp b/plugins/Cardinal/src/Ildaeil.cpp index 2b7f847..a1c6c84 100644 --- a/plugins/Cardinal/src/Ildaeil.cpp +++ b/plugins/Cardinal/src/Ildaeil.cpp @@ -553,7 +553,7 @@ static intptr_t host_dispatcher(const NativeHostHandle handle, const NativeHostD // -------------------------------------------------------------------------------------------------------------------- #ifndef HEADLESS -struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ { +struct IldaeilWidget : ImGuiWidget, IdleCallback, Thread { static constexpr const uint kButtonHeight = 20; struct PluginInfoCache { @@ -631,15 +631,12 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ { kIdleHidePluginUI, kIdleGiveIdleToUI, kIdleChangePluginType, - kIdlePluginScanning, kIdleNothing } fIdleState = kIdleInit; PluginType fPluginType = PLUGIN_LV2; PluginType fNextPluginType = fPluginType; uint fPluginCount = 0; - uint fPluginScanStep = 0; - uint fPluginScanMax = 0; int fPluginSelected = -1; bool fPluginScanningFinished = false; bool fPluginHasCustomUI = false; @@ -703,6 +700,9 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ { module->fUI = nullptr; } + if (isThreadRunning()) + stopThread(-1); + fPluginGenericUI = nullptr; delete[] fPlugins; @@ -991,12 +991,14 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ { switch (fIdleState) { case kIdleInit: - scanStart(); + fIdleState = kIdleNothing; + startThread(); break; case kIdleInitPluginAlreadyLoaded: + fIdleState = kIdleNothing; createOrUpdatePluginGenericUI(handle); - scanStart(); + startThread(); break; case kIdlePluginLoadedFromDSP: @@ -1029,13 +1031,12 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ { break; case kIdleChangePluginType: + fIdleState = kIdleNothing; fPluginSelected = -1; + if (isThreadRunning()) + stopThread(-1); fPluginType = fNextPluginType; - scanStart(); - break; - - case kIdlePluginScanning: - scanStep(); + startThread(); break; case kIdleNothing: @@ -1075,15 +1076,7 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ { loadPlugin(handle, label); } - /* - void uiFileBrowserSelected(const char* const filename) override - { - if (fPlugin != nullptr && fPlugin->fCarlaHostHandle != nullptr && filename != nullptr) - carla_set_custom_data(fPlugin->fCarlaHostHandle, 0, CUSTOM_DATA_TYPE_STRING, "file", filename); - } - */ - - void scanStart() + void run() override { const char* path; switch (fPluginType) @@ -1099,61 +1092,44 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ { if (path != nullptr) carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_PLUGIN_PATH, fPluginType, path); - fPluginCount = fPluginScanStep = 0; - - { - const MutexLocker cml(sPluginInfoLoadMutex); - fPluginScanMax = carla_get_cached_plugin_count(fPluginType, path); - } - + fPluginCount = 0; delete[] fPlugins; - if (fPluginScanMax != 0) - { - fPlugins = new PluginInfoCache[fPluginScanMax]; - fIdleState = kIdlePluginScanning; - } - else - { - fPlugins = nullptr; - fPluginScanningFinished = true; - fIdleState = kIdleNothing; - } + const MutexLocker cml(sPluginInfoLoadMutex); - if (fDrawingState == kDrawingLoading) + if (const uint count = carla_get_cached_plugin_count(fPluginType, path)) { - fDrawingState = kDrawingPluginList; - fPluginSearchFirstShow = true; - } - } + fPlugins = new PluginInfoCache[count]; - void scanStep() - { - for (uint i = 0, j; i < 10 && fPluginScanStep < fPluginScanMax; ++i, ++fPluginScanStep) - { - const CarlaCachedPluginInfo* info; + if (fDrawingState == kDrawingLoading) { - const MutexLocker cml(sPluginInfoLoadMutex); - info = carla_get_cached_plugin_info(fPluginType, fPluginScanStep); + fDrawingState = kDrawingPluginList; + fPluginSearchFirstShow = true; } - DISTRHO_SAFE_ASSERT_CONTINUE(info != nullptr); - if (! info->valid) - continue; - if (info->audioIns != 0 && info->audioIns != 2) - continue; + for (uint i=0, j; i < count && ! shouldThreadExit(); ++i) + { + const CarlaCachedPluginInfo* const info = carla_get_cached_plugin_info(fPluginType, i); + DISTRHO_SAFE_ASSERT_CONTINUE(info != nullptr); - j = fPluginCount; - fPlugins[j].name = strdup(info->name); - fPlugins[j].label = strdup(info->label); - ++fPluginCount; - } + if (! info->valid) + continue; + if (info->audioIns != 0 && info->audioIns != 2) + continue; - if (fPluginScanStep == fPluginScanMax) + j = fPluginCount; + fPlugins[j].name = strdup(info->name); + fPlugins[j].label = strdup(info->label); + ++fPluginCount; + } + } + else { - fPluginScanningFinished = true; - fIdleState = kIdleNothing; + fPlugins = nullptr; } + + if (! shouldThreadExit()) + fPluginScanningFinished = true; } void drawImGui() override @@ -1362,9 +1338,6 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ { static const char* pluginTypes[] = { getPluginTypeAsString(PLUGIN_INTERNAL), getPluginTypeAsString(PLUGIN_LV2), - #ifdef DISTRHO_OS_MAC - getPluginTypeAsString(PLUGIN_AU), - #endif }; setupMainWindowPos(); @@ -1412,11 +1385,6 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ { case PLUGIN_LV2: current = 1; break; - #ifdef DISTRHO_OS_MAC - case PLUGIN_AU: - current = 2; - break; - #endif default: current = 0; break; @@ -1433,11 +1401,6 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ { case 1: fNextPluginType = PLUGIN_LV2; break; - #ifdef DISTRHO_OS_MAC - case 2: - fNextPluginType = PLUGIN_AU; - break; - #endif } }