| @@ -49,6 +49,14 @@ typedef void (*CarlaPipeCallbackFunc)(void* ptr, const char* msg); | |||||
| * @see carla_get_cached_plugin_info() | * @see carla_get_cached_plugin_info() | ||||
| */ | */ | ||||
| typedef struct _CarlaCachedPluginInfo { | typedef struct _CarlaCachedPluginInfo { | ||||
| /*! | |||||
| * Wherever the data in this struct is valid. | |||||
| * For performance reasons, plugins are only checked on request, | |||||
| * and as such, the count vs number of really valid plugins might not match. | |||||
| * Use this field to skip on plugins which cannot be loaded in Carla. | |||||
| */ | |||||
| bool valid; | |||||
| /*! | /*! | ||||
| * Plugin category. | * Plugin category. | ||||
| */ | */ | ||||
| @@ -25,10 +25,23 @@ namespace CB = CarlaBackend; | |||||
| static const char* const gNullCharPtr = ""; | static const char* const gNullCharPtr = ""; | ||||
| static bool isCachedPluginType(const CB::PluginType ptype) | |||||
| { | |||||
| switch (ptype) | |||||
| { | |||||
| case CB::PLUGIN_INTERNAL: | |||||
| case CB::PLUGIN_LV2: | |||||
| return false; | |||||
| default: | |||||
| return true; | |||||
| } | |||||
| } | |||||
| // ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
| _CarlaCachedPluginInfo::_CarlaCachedPluginInfo() noexcept | _CarlaCachedPluginInfo::_CarlaCachedPluginInfo() noexcept | ||||
| : category(CB::PLUGIN_CATEGORY_NONE), | |||||
| : valid(false), | |||||
| category(CB::PLUGIN_CATEGORY_NONE), | |||||
| hints(0x0), | hints(0x0), | ||||
| audioIns(0), | audioIns(0), | ||||
| audioOuts(0), | audioOuts(0), | ||||
| @@ -45,7 +58,7 @@ _CarlaCachedPluginInfo::_CarlaCachedPluginInfo() noexcept | |||||
| uint carla_get_cached_plugin_count(CB::PluginType ptype, const char* pluginPath) | uint carla_get_cached_plugin_count(CB::PluginType ptype, const char* pluginPath) | ||||
| { | { | ||||
| CARLA_SAFE_ASSERT_RETURN(ptype == CB::PLUGIN_INTERNAL || ptype == CB::PLUGIN_LV2, 0); | |||||
| CARLA_SAFE_ASSERT_RETURN(isCachedPluginType(ptype), 0); | |||||
| carla_debug("carla_get_cached_plugin_count(%i:%s)", ptype, CB::PluginType2Str(ptype)); | carla_debug("carla_get_cached_plugin_count(%i:%s)", ptype, CB::PluginType2Str(ptype)); | ||||
| switch (ptype) | switch (ptype) | ||||
| @@ -99,6 +112,7 @@ const CarlaCachedPluginInfo* carla_get_cached_plugin_info(CB::PluginType ptype, | |||||
| if (desc.hints & NATIVE_PLUGIN_USES_MULTI_PROGS) | if (desc.hints & NATIVE_PLUGIN_USES_MULTI_PROGS) | ||||
| info.hints |= CB::PLUGIN_USES_MULTI_PROGS; | info.hints |= CB::PLUGIN_USES_MULTI_PROGS; | ||||
| info.valid = true; | |||||
| info.audioIns = desc.audioIns; | info.audioIns = desc.audioIns; | ||||
| info.audioOuts = desc.audioOuts; | info.audioOuts = desc.audioOuts; | ||||
| info.midiIns = desc.midiIns; | info.midiIns = desc.midiIns; | ||||
| @@ -382,6 +396,7 @@ const CarlaCachedPluginInfo* carla_get_cached_plugin_info(CB::PluginType ptype, | |||||
| lilv_nodes_free(const_cast<LilvNodes*>(licenseNodes.me)); | lilv_nodes_free(const_cast<LilvNodes*>(licenseNodes.me)); | ||||
| info.valid = true; | |||||
| info.name = sname; | info.name = sname; | ||||
| info.label = suri; | info.label = suri; | ||||
| info.maker = smaker; | info.maker = smaker; | ||||
| @@ -394,6 +409,7 @@ const CarlaCachedPluginInfo* carla_get_cached_plugin_info(CB::PluginType ptype, | |||||
| break; | break; | ||||
| } | } | ||||
| info.valid = true; | |||||
| info.category = CB::PLUGIN_CATEGORY_NONE; | info.category = CB::PLUGIN_CATEGORY_NONE; | ||||
| info.hints = 0x0; | info.hints = 0x0; | ||||
| info.audioIns = 0; | info.audioIns = 0; | ||||
| @@ -90,6 +90,12 @@ CarlaPipeCallbackFunc = CFUNCTYPE(None, c_void_p, c_char_p) | |||||
| # @see carla_get_cached_plugin_info() | # @see carla_get_cached_plugin_info() | ||||
| class CarlaCachedPluginInfo(Structure): | class CarlaCachedPluginInfo(Structure): | ||||
| _fields_ = [ | _fields_ = [ | ||||
| # Wherever the data in this struct is valid. | |||||
| # For performance reasons, plugins are only checked on request, | |||||
| # and as such, the count vs number of really valid plugins might not match. | |||||
| # Use this field to skip on plugins which cannot be loaded in Carla. | |||||
| ("valid", c_bool), | |||||
| # Plugin category. | # Plugin category. | ||||
| ("category", c_enum), | ("category", c_enum), | ||||
| @@ -133,6 +139,7 @@ class CarlaCachedPluginInfo(Structure): | |||||
| # @see CarlaCachedPluginInfo | # @see CarlaCachedPluginInfo | ||||
| PyCarlaCachedPluginInfo = { | PyCarlaCachedPluginInfo = { | ||||
| 'valid': False, | |||||
| 'category': PLUGIN_CATEGORY_NONE, | 'category': PLUGIN_CATEGORY_NONE, | ||||
| 'hints': 0x0, | 'hints': 0x0, | ||||
| 'audioIns': 0, | 'audioIns': 0, | ||||
| @@ -44,8 +44,7 @@ | |||||
| #include "water/text/StringArray.h" | #include "water/text/StringArray.h" | ||||
| #ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
| # define CARLA_UTILS_CACHED_PLUGINS_ONLY | |||||
| # include "CarlaUtils.cpp" | |||||
| # include "../backend/utils/CachedPlugins.cpp" | |||||
| #endif | #endif | ||||
| #define DISCOVERY_OUT(x, y) std::cout << "\ncarla-discovery::" << x << "::" << y << std::endl; | #define DISCOVERY_OUT(x, y) std::cout << "\ncarla-discovery::" << x << "::" << y << std::endl; | ||||
| @@ -280,6 +279,9 @@ static void do_cached_check(const PluginType type) | |||||
| const CarlaCachedPluginInfo* pinfo(carla_get_cached_plugin_info(type, i)); | const CarlaCachedPluginInfo* pinfo(carla_get_cached_plugin_info(type, i)); | ||||
| CARLA_SAFE_ASSERT_CONTINUE(pinfo != nullptr); | CARLA_SAFE_ASSERT_CONTINUE(pinfo != nullptr); | ||||
| if (! pinfo->valid) | |||||
| continue; | |||||
| DISCOVERY_OUT("init", "-----------"); | DISCOVERY_OUT("init", "-----------"); | ||||
| DISCOVERY_OUT("build", BINARY_NATIVE); | DISCOVERY_OUT("build", BINARY_NATIVE); | ||||
| DISCOVERY_OUT("hints", pinfo->hints); | DISCOVERY_OUT("hints", pinfo->hints); | ||||
| @@ -1476,18 +1478,16 @@ int main(int argc, char* argv[]) | |||||
| break; | break; | ||||
| } | } | ||||
| if (type != PLUGIN_SF2 && type != PLUGIN_SFZ) | |||||
| if (type != PLUGIN_SF2 && filenameCheck.contains("fluidsynth", true)) | |||||
| { | { | ||||
| if (filenameCheck.contains("fluidsynth", true)) | |||||
| { | |||||
| DISCOVERY_OUT("info", "skipping fluidsynth based plugin"); | |||||
| return 0; | |||||
| } | |||||
| DISCOVERY_OUT("info", "skipping fluidsynth based plugin"); | |||||
| return 0; | |||||
| } | |||||
| #ifdef CARLA_OS_MAC | #ifdef CARLA_OS_MAC | ||||
| if (type == PLUGIN_VST2 && (filenameCheck.endsWith(".vst") || filenameCheck.endsWith(".vst/"))) | |||||
| openLib = false; | |||||
| if (type == PLUGIN_VST2 && (filenameCheck.endsWith(".vst") || filenameCheck.endsWith(".vst/"))) | |||||
| openLib = false; | |||||
| #endif | #endif | ||||
| } | |||||
| if (openLib) | if (openLib) | ||||
| { | { | ||||
| @@ -68,6 +68,7 @@ void handle_carla_get_cached_plugin_info(const std::shared_ptr<Session> session) | |||||
| char* jsonBuf; | char* jsonBuf; | ||||
| jsonBuf = json_buf_start(); | jsonBuf = json_buf_start(); | ||||
| jsonBuf = json_buf_add_bool(jsonBuf, "valid", info->valid); | |||||
| jsonBuf = json_buf_add_uint(jsonBuf, "category", info->category); | jsonBuf = json_buf_add_uint(jsonBuf, "category", info->category); | ||||
| jsonBuf = json_buf_add_uint(jsonBuf, "hints", info->hints); | jsonBuf = json_buf_add_uint(jsonBuf, "hints", info->hints); | ||||
| jsonBuf = json_buf_add_uint(jsonBuf, "audioIns", info->audioIns); | jsonBuf = json_buf_add_uint(jsonBuf, "audioIns", info->audioIns); | ||||