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

Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
falkTX 2021-12-05 13:43:39 +00:00
parent e87f3a03b9
commit af9e1adddf
No known key found for this signature in database
GPG key ID: CDBAA37ABC74FBA0

View file

@ -553,7 +553,7 @@ static intptr_t host_dispatcher(const NativeHostHandle handle, const NativeHostD
// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------
#ifndef HEADLESS #ifndef HEADLESS
struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ { struct IldaeilWidget : ImGuiWidget, IdleCallback, Thread {
static constexpr const uint kButtonHeight = 20; static constexpr const uint kButtonHeight = 20;
struct PluginInfoCache { struct PluginInfoCache {
@ -631,15 +631,12 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ {
kIdleHidePluginUI, kIdleHidePluginUI,
kIdleGiveIdleToUI, kIdleGiveIdleToUI,
kIdleChangePluginType, kIdleChangePluginType,
kIdlePluginScanning,
kIdleNothing kIdleNothing
} fIdleState = kIdleInit; } fIdleState = kIdleInit;
PluginType fPluginType = PLUGIN_LV2; PluginType fPluginType = PLUGIN_LV2;
PluginType fNextPluginType = fPluginType; PluginType fNextPluginType = fPluginType;
uint fPluginCount = 0; uint fPluginCount = 0;
uint fPluginScanStep = 0;
uint fPluginScanMax = 0;
int fPluginSelected = -1; int fPluginSelected = -1;
bool fPluginScanningFinished = false; bool fPluginScanningFinished = false;
bool fPluginHasCustomUI = false; bool fPluginHasCustomUI = false;
@ -703,6 +700,9 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ {
module->fUI = nullptr; module->fUI = nullptr;
} }
if (isThreadRunning())
stopThread(-1);
fPluginGenericUI = nullptr; fPluginGenericUI = nullptr;
delete[] fPlugins; delete[] fPlugins;
@ -991,12 +991,14 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ {
switch (fIdleState) switch (fIdleState)
{ {
case kIdleInit: case kIdleInit:
scanStart(); fIdleState = kIdleNothing;
startThread();
break; break;
case kIdleInitPluginAlreadyLoaded: case kIdleInitPluginAlreadyLoaded:
fIdleState = kIdleNothing;
createOrUpdatePluginGenericUI(handle); createOrUpdatePluginGenericUI(handle);
scanStart(); startThread();
break; break;
case kIdlePluginLoadedFromDSP: case kIdlePluginLoadedFromDSP:
@ -1029,13 +1031,12 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ {
break; break;
case kIdleChangePluginType: case kIdleChangePluginType:
fIdleState = kIdleNothing;
fPluginSelected = -1; fPluginSelected = -1;
if (isThreadRunning())
stopThread(-1);
fPluginType = fNextPluginType; fPluginType = fNextPluginType;
scanStart(); startThread();
break;
case kIdlePluginScanning:
scanStep();
break; break;
case kIdleNothing: case kIdleNothing:
@ -1075,15 +1076,7 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ {
loadPlugin(handle, label); loadPlugin(handle, label);
} }
/* void run() override
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()
{ {
const char* path; const char* path;
switch (fPluginType) switch (fPluginType)
@ -1099,43 +1092,24 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ {
if (path != nullptr) if (path != nullptr)
carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_PLUGIN_PATH, fPluginType, path); carla_set_engine_option(module->fCarlaHostHandle, ENGINE_OPTION_PLUGIN_PATH, fPluginType, path);
fPluginCount = fPluginScanStep = 0; fPluginCount = 0;
{
const MutexLocker cml(sPluginInfoLoadMutex);
fPluginScanMax = carla_get_cached_plugin_count(fPluginType, path);
}
delete[] fPlugins; delete[] fPlugins;
if (fPluginScanMax != 0) const MutexLocker cml(sPluginInfoLoadMutex);
if (const uint count = carla_get_cached_plugin_count(fPluginType, path))
{ {
fPlugins = new PluginInfoCache[fPluginScanMax]; fPlugins = new PluginInfoCache[count];
fIdleState = kIdlePluginScanning;
}
else
{
fPlugins = nullptr;
fPluginScanningFinished = true;
fIdleState = kIdleNothing;
}
if (fDrawingState == kDrawingLoading) if (fDrawingState == kDrawingLoading)
{ {
fDrawingState = kDrawingPluginList; fDrawingState = kDrawingPluginList;
fPluginSearchFirstShow = true; fPluginSearchFirstShow = true;
} }
}
void scanStep() for (uint i=0, j; i < count && ! shouldThreadExit(); ++i)
{ {
for (uint i = 0, j; i < 10 && fPluginScanStep < fPluginScanMax; ++i, ++fPluginScanStep) const CarlaCachedPluginInfo* const info = carla_get_cached_plugin_info(fPluginType, i);
{
const CarlaCachedPluginInfo* info;
{
const MutexLocker cml(sPluginInfoLoadMutex);
info = carla_get_cached_plugin_info(fPluginType, fPluginScanStep);
}
DISTRHO_SAFE_ASSERT_CONTINUE(info != nullptr); DISTRHO_SAFE_ASSERT_CONTINUE(info != nullptr);
if (! info->valid) if (! info->valid)
@ -1148,12 +1122,14 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ {
fPlugins[j].label = strdup(info->label); fPlugins[j].label = strdup(info->label);
++fPluginCount; ++fPluginCount;
} }
if (fPluginScanStep == fPluginScanMax)
{
fPluginScanningFinished = true;
fIdleState = kIdleNothing;
} }
else
{
fPlugins = nullptr;
}
if (! shouldThreadExit())
fPluginScanningFinished = true;
} }
void drawImGui() override void drawImGui() override
@ -1362,9 +1338,6 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ {
static const char* pluginTypes[] = { static const char* pluginTypes[] = {
getPluginTypeAsString(PLUGIN_INTERNAL), getPluginTypeAsString(PLUGIN_INTERNAL),
getPluginTypeAsString(PLUGIN_LV2), getPluginTypeAsString(PLUGIN_LV2),
#ifdef DISTRHO_OS_MAC
getPluginTypeAsString(PLUGIN_AU),
#endif
}; };
setupMainWindowPos(); setupMainWindowPos();
@ -1412,11 +1385,6 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ {
case PLUGIN_LV2: case PLUGIN_LV2:
current = 1; current = 1;
break; break;
#ifdef DISTRHO_OS_MAC
case PLUGIN_AU:
current = 2;
break;
#endif
default: default:
current = 0; current = 0;
break; break;
@ -1433,11 +1401,6 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback /* , Thread */ {
case 1: case 1:
fNextPluginType = PLUGIN_LV2; fNextPluginType = PLUGIN_LV2;
break; break;
#ifdef DISTRHO_OS_MAC
case 2:
fNextPluginType = PLUGIN_AU;
break;
#endif
} }
} }