Browse Source

Ildaeil: Go back to using separate thread for plugin info fetching

Signed-off-by: falkTX <falktx@falktx.com>
tags/22.02
falkTX 4 years ago
parent
commit
af9e1adddf
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
1 changed files with 39 additions and 76 deletions
  1. +39
    -76
      plugins/Cardinal/src/Ildaeil.cpp

+ 39
- 76
plugins/Cardinal/src/Ildaeil.cpp View File

@@ -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
}
}



Loading…
Cancel
Save