From 9ba8069bed5afd9f8ba41720bec83a9cfe7d59da Mon Sep 17 00:00:00 2001 From: falkTX Date: Sun, 7 Sep 2014 11:33:10 +0100 Subject: [PATCH] Fix for some broken LV2 plugins that set UI festures on DSP side Looking at you linuxDSP... --- source/backend/plugin/Lv2Plugin.cpp | 21 +++++++++++---------- source/carla_database.py | 5 +++++ source/discovery/carla-discovery.cpp | 20 ++++++++++---------- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/source/backend/plugin/Lv2Plugin.cpp b/source/backend/plugin/Lv2Plugin.cpp index 4dc353fb7..b5d92f46a 100644 --- a/source/backend/plugin/Lv2Plugin.cpp +++ b/source/backend/plugin/Lv2Plugin.cpp @@ -4593,19 +4593,20 @@ public: // Check supported features for (uint32_t j=0; j < fRdfDescriptor->FeatureCount && canContinue; ++j) { - if (! is_lv2_feature_supported(fRdfDescriptor->Features[j].URI)) + const LV2_RDF_Feature& feature(fRdfDescriptor->Features[j]); + + if (std::strcmp(feature.URI, LV2_DATA_ACCESS_URI) == 0 || std::strcmp(feature.URI, LV2_INSTANCE_ACCESS_URI) == 0) + { + carla_stderr("Plugin DSP wants UI feature '%s', ignoring this", feature.URI); + } + else if (LV2_IS_FEATURE_REQUIRED(feature.Type) && ! is_lv2_feature_supported(feature.URI)) { CarlaString msg("Plugin wants a feature that is not supported:\n"); - msg += fRdfDescriptor->Features[j].URI; + msg += feature.URI; - if (LV2_IS_FEATURE_REQUIRED(fRdfDescriptor->Features[j].Type)) - { - canContinue = false; - pData->engine->setLastError(msg); - break; - } - else - carla_stderr("%s", msg.buffer()); + canContinue = false; + pData->engine->setLastError(msg); + break; } } diff --git a/source/carla_database.py b/source/carla_database.py index 192b8e957..dd49d8b3c 100755 --- a/source/carla_database.py +++ b/source/carla_database.py @@ -219,6 +219,9 @@ def runCarlaDiscovery(itype, stype, filename, tool, isWine=False): elif line.startswith("carla-discovery::info::"): print("%s - %s" % (line, filename)) + elif line.startswith("carla-discovery::warning::"): + print("%s - %s" % (line, filename)) + elif line.startswith("carla-discovery::error::"): print("%s - %s" % (line, filename)) @@ -263,6 +266,8 @@ def runCarlaDiscovery(itype, stype, filename, tool, isWine=False): del pinfo pinfo = None continue + else: + print("%s - %s" % (line, filename)) # FIXME? tmp = gDiscoveryProcess diff --git a/source/discovery/carla-discovery.cpp b/source/discovery/carla-discovery.cpp index 1cdba0763..617d95ed5 100644 --- a/source/discovery/carla-discovery.cpp +++ b/source/discovery/carla-discovery.cpp @@ -164,21 +164,21 @@ static intptr_t VSTCALLBACK vstHostCallback(AEffect* const effect, const int32_t break; case audioMasterCurrentId: - if (gVstCurrentUniqueId == 0) DISCOVERY_OUT("warning", "plugin asked for uniqueId, but it's currently 0"); + if (gVstCurrentUniqueId == 0) DISCOVERY_OUT("warning", "Plugin asked for uniqueId, but it's currently 0"); ret = gVstCurrentUniqueId; break; case DECLARE_VST_DEPRECATED(audioMasterWantMidi): - if (gVstWantsMidi) DISCOVERY_OUT("warning", "plugin requested MIDI more than once"); + if (gVstWantsMidi) DISCOVERY_OUT("warning", "Plugin requested MIDI more than once"); gVstWantsMidi = true; ret = 1; break; case audioMasterGetTime: - if (! gVstIsProcessing) DISCOVERY_OUT("warning", "plugin requested timeInfo out of process"); - if (! gVstWantsTime) DISCOVERY_OUT("warning", "plugin requested timeInfo but didn't ask if host could do \"sendVstTimeInfo\""); + if (! gVstIsProcessing) DISCOVERY_OUT("warning", "Plugin requested timeInfo out of process"); + if (! gVstWantsTime) DISCOVERY_OUT("warning", "Plugin requested timeInfo but didn't ask if host could do \"sendVstTimeInfo\""); carla_zeroStruct(timeInfo); timeInfo.sampleRate = kSampleRate; @@ -208,7 +208,7 @@ static intptr_t VSTCALLBACK vstHostCallback(AEffect* const effect, const int32_t break; case DECLARE_VST_DEPRECATED(audioMasterNeedIdle): - if (gVstNeedsIdle) DISCOVERY_OUT("warning", "plugin requested idle more than once"); + if (gVstNeedsIdle) DISCOVERY_OUT("warning", "Plugin requested idle more than once"); gVstNeedsIdle = true; ret = 1; @@ -1030,15 +1030,15 @@ static void do_lv2_check(const char* const bundle, const bool doInit) for (uint32_t j=0; j < rdfDescriptor->FeatureCount && supported; ++j) { - const LV2_RDF_Feature* const rdfFeature(&rdfDescriptor->Features[j]); + const LV2_RDF_Feature& feature(rdfDescriptor->Features[j]); - if (is_lv2_feature_supported(rdfFeature->URI)) + if (std::strcmp(feature.URI, LV2_DATA_ACCESS_URI) == 0 || std::strcmp(feature.URI, LV2_INSTANCE_ACCESS_URI) == 0) { - pass(); + DISCOVERY_OUT("warning", "Plugin '" << rdfDescriptor->URI << "' DSP wants UI feature '" << feature.URI << "', ignoring this"); } - else if (LV2_IS_FEATURE_REQUIRED(rdfFeature->Type)) + else if (LV2_IS_FEATURE_REQUIRED(feature.Type) && ! is_lv2_feature_supported(feature.URI)) { - DISCOVERY_OUT("error", "Plugin '" << rdfDescriptor->URI << "' requires a non-supported feature '" << rdfFeature->URI << "'"); + DISCOVERY_OUT("error", "Plugin '" << rdfDescriptor->URI << "' requires a non-supported feature '" << feature.URI << "'"); supported = false; break; }