Ildaeil: Go back to using separate thread for plugin info fetching
Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
parent
e87f3a03b9
commit
af9e1adddf
1 changed files with 43 additions and 80 deletions
|
@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue