|
|
@@ -201,6 +201,25 @@ static const char* getPathForVST2() |
|
|
|
path += getSpecialPath(kSpecialPathCommonProgramFiles) + "\\VST2"; |
|
|
|
#else |
|
|
|
path = homeDir() + "/.vst:/usr/lib/vst:/usr/local/lib/vst"; |
|
|
|
|
|
|
|
std::string winePrefix; |
|
|
|
if (const char* const envWINEPREFIX = std::getenv("WINEPREFIX")) |
|
|
|
winePrefix = envWINEPREFIX; |
|
|
|
|
|
|
|
if (winePrefix.empty()) |
|
|
|
winePrefix = homeDir() + "/.wine"; |
|
|
|
|
|
|
|
if (system::exists(winePrefix)) |
|
|
|
{ |
|
|
|
path += ":" + winePrefix + "/drive_c/Program Files/Common Files/VST2"; |
|
|
|
path += ":" + winePrefix + "/drive_c/Program Files/VstPlugins"; |
|
|
|
path += ":" + winePrefix + "/drive_c/Program Files/Steinberg/VstPlugins"; |
|
|
|
#ifdef CARLA_OS_64BIT |
|
|
|
path += ":" + winePrefix + "/drive_c/Program Files (x86)/Common Files/VST2"; |
|
|
|
path += ":" + winePrefix + "/drive_c/Program Files (x86)/VstPlugins"; |
|
|
|
path += ":" + winePrefix + "/drive_c/Program Files (x86)/Steinberg/VstPlugins"; |
|
|
|
#endif |
|
|
|
} |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
@@ -224,6 +243,21 @@ static const char* getPathForVST3() |
|
|
|
path += getSpecialPath(kSpecialPathCommonProgramFiles) + "\\VST3"; |
|
|
|
#else |
|
|
|
path = homeDir() + "/.vst3:/usr/lib/vst3:/usr/local/lib/vst3"; |
|
|
|
|
|
|
|
std::string winePrefix; |
|
|
|
if (const char* const envWINEPREFIX = std::getenv("WINEPREFIX")) |
|
|
|
winePrefix = envWINEPREFIX; |
|
|
|
|
|
|
|
if (winePrefix.empty()) |
|
|
|
winePrefix = homeDir() + "/.wine"; |
|
|
|
|
|
|
|
if (system::exists(winePrefix)) |
|
|
|
{ |
|
|
|
path += ":" + winePrefix + "/drive_c/Program Files/Common Files/VST3"; |
|
|
|
#ifdef CARLA_OS_64BIT |
|
|
|
path += ":" + winePrefix + "/drive_c/Program Files (x86)/Common Files/VST3"; |
|
|
|
#endif |
|
|
|
} |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
@@ -247,6 +281,21 @@ static const char* getPathForCLAP() |
|
|
|
path += getSpecialPath(kSpecialPathCommonProgramFiles) + "\\CLAP"; |
|
|
|
#else |
|
|
|
path = homeDir() + "/.clap:/usr/lib/clap:/usr/local/lib/clap"; |
|
|
|
|
|
|
|
std::string winePrefix; |
|
|
|
if (const char* const envWINEPREFIX = std::getenv("WINEPREFIX")) |
|
|
|
winePrefix = envWINEPREFIX; |
|
|
|
|
|
|
|
if (winePrefix.empty()) |
|
|
|
winePrefix = homeDir() + "/.wine"; |
|
|
|
|
|
|
|
if (system::exists(winePrefix)) |
|
|
|
{ |
|
|
|
path += ":" + winePrefix + "/drive_c/Program Files/Common Files/CLAP"; |
|
|
|
#ifdef CARLA_OS_64BIT |
|
|
|
path += ":" + winePrefix + "/drive_c/Program Files (x86)/Common Files/CLAP"; |
|
|
|
#endif |
|
|
|
} |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
@@ -361,7 +410,7 @@ struct IldaeilModule : Module { |
|
|
|
|
|
|
|
NativeTimeInfo fCarlaTimeInfo; |
|
|
|
|
|
|
|
CarlaString fDiscoveryTool; |
|
|
|
String fBinaryPath; |
|
|
|
|
|
|
|
void* fUI = nullptr; |
|
|
|
bool canUseBridges = true; |
|
|
@@ -431,7 +480,7 @@ struct IldaeilModule : Module { |
|
|
|
if (system::exists(winBinaryDir)) |
|
|
|
{ |
|
|
|
const std::string winResourceDir = system::join(winBinaryDir, "resources"); |
|
|
|
fDiscoveryTool = winBinaryDir.c_str(); |
|
|
|
fBinaryPath = winBinaryDir.c_str(); |
|
|
|
carla_set_engine_option(fCarlaHostHandle, ENGINE_OPTION_PATH_BINARIES, 0, winBinaryDir.c_str()); |
|
|
|
carla_set_engine_option(fCarlaHostHandle, ENGINE_OPTION_PATH_RESOURCES, 0, winResourceDir.c_str()); |
|
|
|
} |
|
|
@@ -439,13 +488,13 @@ struct IldaeilModule : Module { |
|
|
|
#if defined(CARLA_OS_MAC) |
|
|
|
if (system::exists("~/Applications/Carla.app")) |
|
|
|
{ |
|
|
|
fDiscoveryTool = "~/Applications/Carla.app/Contents/MacOS"; |
|
|
|
fBinaryPath = "~/Applications/Carla.app/Contents/MacOS"; |
|
|
|
carla_set_engine_option(fCarlaHostHandle, ENGINE_OPTION_PATH_BINARIES, 0, "~/Applications/Carla.app/Contents/MacOS"); |
|
|
|
carla_set_engine_option(fCarlaHostHandle, ENGINE_OPTION_PATH_RESOURCES, 0, "~/Applications/Carla.app/Contents/MacOS/resources"); |
|
|
|
} |
|
|
|
else if (system::exists("/Applications/Carla.app")) |
|
|
|
{ |
|
|
|
fDiscoveryTool = "/Applications/Carla.app/Contents/MacOS"; |
|
|
|
fBinaryPath = "/Applications/Carla.app/Contents/MacOS"; |
|
|
|
carla_set_engine_option(fCarlaHostHandle, ENGINE_OPTION_PATH_BINARIES, 0, "/Applications/Carla.app/Contents/MacOS"); |
|
|
|
carla_set_engine_option(fCarlaHostHandle, ENGINE_OPTION_PATH_RESOURCES, 0, "/Applications/Carla.app/Contents/MacOS/resources"); |
|
|
|
} |
|
|
@@ -456,13 +505,13 @@ struct IldaeilModule : Module { |
|
|
|
#endif |
|
|
|
else if (system::exists("/usr/local/lib/carla")) |
|
|
|
{ |
|
|
|
fDiscoveryTool = "/usr/local/lib/carla"; |
|
|
|
fBinaryPath = "/usr/local/lib/carla"; |
|
|
|
carla_set_engine_option(fCarlaHostHandle, ENGINE_OPTION_PATH_BINARIES, 0, "/usr/local/lib/carla"); |
|
|
|
carla_set_engine_option(fCarlaHostHandle, ENGINE_OPTION_PATH_RESOURCES, 0, "/usr/local/share/carla/resources"); |
|
|
|
} |
|
|
|
else if (system::exists("/usr/lib/carla")) |
|
|
|
{ |
|
|
|
fDiscoveryTool = "/usr/lib/carla"; |
|
|
|
fBinaryPath = "/usr/lib/carla"; |
|
|
|
carla_set_engine_option(fCarlaHostHandle, ENGINE_OPTION_PATH_BINARIES, 0, "/usr/lib/carla"); |
|
|
|
carla_set_engine_option(fCarlaHostHandle, ENGINE_OPTION_PATH_RESOURCES, 0, "/usr/share/carla/resources"); |
|
|
|
} |
|
|
@@ -479,14 +528,8 @@ struct IldaeilModule : Module { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (fDiscoveryTool.isNotEmpty()) |
|
|
|
{ |
|
|
|
fDiscoveryTool += DISTRHO_OS_SEP_STR "carla-discovery-native"; |
|
|
|
#ifdef CARLA_OS_WIN |
|
|
|
fDiscoveryTool += ".exe"; |
|
|
|
#endif |
|
|
|
carla_stdout("Using discovery tool: %s", fDiscoveryTool.buffer()); |
|
|
|
} |
|
|
|
if (fBinaryPath.isNotEmpty()) |
|
|
|
carla_stdout("Using binary path for discovery tools: %s", fBinaryPath.buffer()); |
|
|
|
|
|
|
|
carla_set_engine_option(fCarlaHostHandle, ENGINE_OPTION_PLUGIN_PATH, PLUGIN_LADSPA, getPluginPath(PLUGIN_LADSPA)); |
|
|
|
carla_set_engine_option(fCarlaHostHandle, ENGINE_OPTION_PLUGIN_PATH, PLUGIN_DSSI, getPluginPath(PLUGIN_DSSI)); |
|
|
@@ -900,6 +943,7 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback, Runner { |
|
|
|
} |
|
|
|
} fRunnerData; |
|
|
|
|
|
|
|
BinaryType fBinaryType = BINARY_NATIVE; |
|
|
|
#ifdef CARLA_OS_WASM |
|
|
|
PluginType fPluginType = PLUGIN_JSFX; |
|
|
|
#else |
|
|
@@ -922,7 +966,7 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback, Runner { |
|
|
|
bool fPluginSearchFirstShow = false; |
|
|
|
char fPluginSearchString[0xff] = {}; |
|
|
|
|
|
|
|
String fPopupError, fPluginFilename; |
|
|
|
String fPopupError, fPluginFilename, fDiscoveryTool; |
|
|
|
|
|
|
|
bool idleCallbackActive = false; |
|
|
|
IldaeilModule* const module; |
|
|
@@ -1470,12 +1514,28 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback, Runner { |
|
|
|
} |
|
|
|
|
|
|
|
d_stdout("Will scan plugins now..."); |
|
|
|
fRunnerData.handle = carla_plugin_discovery_start(module->fDiscoveryTool, |
|
|
|
fPluginType, |
|
|
|
getPluginPath(fPluginType), |
|
|
|
_binaryPluginSearchCallback, |
|
|
|
_binaryPluginCheckCacheCallback, |
|
|
|
this); |
|
|
|
|
|
|
|
const String& binaryPath(module->fBinaryPath); |
|
|
|
|
|
|
|
if (binaryPath.isNotEmpty()) |
|
|
|
{ |
|
|
|
fBinaryType = BINARY_NATIVE; |
|
|
|
|
|
|
|
fDiscoveryTool = binaryPath; |
|
|
|
fDiscoveryTool += DISTRHO_OS_SEP_STR "carla-discovery-native"; |
|
|
|
#ifdef CARLA_OS_WIN |
|
|
|
fDiscoveryTool += ".exe"; |
|
|
|
#endif |
|
|
|
|
|
|
|
fRunnerData.handle = carla_plugin_discovery_start(fDiscoveryTool, |
|
|
|
fBinaryType, |
|
|
|
fPluginType, |
|
|
|
getPluginPath(fPluginType), |
|
|
|
_binaryPluginSearchCallback, |
|
|
|
_binaryPluginCheckCacheCallback, |
|
|
|
this); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (fDrawingState == kDrawingLoading) |
|
|
|
{ |
|
|
@@ -1483,7 +1543,7 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback, Runner { |
|
|
|
fPluginSearchFirstShow = true; |
|
|
|
} |
|
|
|
|
|
|
|
if (fRunnerData.handle == nullptr) |
|
|
|
if (binaryPath.isEmpty() || (fRunnerData.handle == nullptr && !startNextDiscovery())) |
|
|
|
{ |
|
|
|
d_stdout("Nothing found!"); |
|
|
|
return false; |
|
|
@@ -1496,11 +1556,103 @@ struct IldaeilWidget : ImGuiWidget, IdleCallback, Runner { |
|
|
|
return true; |
|
|
|
|
|
|
|
// stop here |
|
|
|
d_stdout("Found %lu plugins!", (ulong)fPlugins.size()); |
|
|
|
carla_plugin_discovery_stop(fRunnerData.handle); |
|
|
|
fRunnerData.handle = nullptr; |
|
|
|
|
|
|
|
if (startNextDiscovery()) |
|
|
|
return true; |
|
|
|
|
|
|
|
d_stdout("Found %lu plugins!", (ulong)fPlugins.size()); |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
bool startNextDiscovery() |
|
|
|
{ |
|
|
|
if (! setNextDiscoveryTool()) |
|
|
|
return false; |
|
|
|
|
|
|
|
fRunnerData.handle = carla_plugin_discovery_start(fDiscoveryTool, |
|
|
|
fBinaryType, |
|
|
|
fPluginType, |
|
|
|
getPluginPath(fPluginType), |
|
|
|
_binaryPluginSearchCallback, |
|
|
|
_binaryPluginCheckCacheCallback, |
|
|
|
this); |
|
|
|
|
|
|
|
if (fRunnerData.handle == nullptr) |
|
|
|
return startNextDiscovery(); |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
bool setNextDiscoveryTool() |
|
|
|
{ |
|
|
|
switch (fPluginType) |
|
|
|
{ |
|
|
|
case PLUGIN_VST2: |
|
|
|
case PLUGIN_VST3: |
|
|
|
case PLUGIN_CLAP: |
|
|
|
break; |
|
|
|
default: |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
#ifdef CARLA_OS_WIN |
|
|
|
#ifdef CARLA_OS_WIN64 |
|
|
|
// look for win32 plugins on win64 |
|
|
|
if (fBinaryType == BINARY_NATIVE) |
|
|
|
{ |
|
|
|
fBinaryType = BINARY_WIN32; |
|
|
|
fDiscoveryTool = module->fBinaryPath; |
|
|
|
fDiscoveryTool += CARLA_OS_SEP_STR "carla-discovery-win32.exe"; |
|
|
|
|
|
|
|
if (system::exists(fDiscoveryTool.buffer())) |
|
|
|
return true; |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
// no other types to try |
|
|
|
return false; |
|
|
|
#else // CARLA_OS_WIN |
|
|
|
|
|
|
|
#ifndef CARLA_OS_MAC |
|
|
|
// try 32bit plugins on 64bit systems, skipping macOS where 32bit is no longer supported |
|
|
|
if (fBinaryType == BINARY_NATIVE) |
|
|
|
{ |
|
|
|
fBinaryType = BINARY_POSIX32; |
|
|
|
fDiscoveryTool = module->fBinaryPath; |
|
|
|
fDiscoveryTool += CARLA_OS_SEP_STR "carla-discovery-posix32"; |
|
|
|
|
|
|
|
if (system::exists(fDiscoveryTool.buffer())) |
|
|
|
return true; |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
// try wine bridges |
|
|
|
#ifdef CARLA_OS_64BIT |
|
|
|
if (fBinaryType == BINARY_NATIVE || fBinaryType == BINARY_POSIX32) |
|
|
|
{ |
|
|
|
fBinaryType = BINARY_WIN64; |
|
|
|
fDiscoveryTool = module->fBinaryPath; |
|
|
|
fDiscoveryTool += CARLA_OS_SEP_STR "carla-discovery-win64.exe"; |
|
|
|
|
|
|
|
if (system::exists(fDiscoveryTool.buffer())) |
|
|
|
return true; |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
if (fBinaryType != BINARY_WIN32) |
|
|
|
{ |
|
|
|
fBinaryType = BINARY_WIN32; |
|
|
|
fDiscoveryTool = module->fBinaryPath; |
|
|
|
fDiscoveryTool += CARLA_OS_SEP_STR "carla-discovery-win32.exe"; |
|
|
|
|
|
|
|
if (system::exists(fDiscoveryTool.buffer())) |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
return false; |
|
|
|
#endif // CARLA_OS_WIN |
|
|
|
} |
|
|
|
|
|
|
|
void binaryPluginSearchCallback(const CarlaPluginDiscoveryInfo* const info, const char* const sha1sum) |
|
|
|