Browse Source

Fix for some broken LV2 plugins that set UI festures on DSP side

Looking at you linuxDSP...
tags/1.9.5
falkTX 11 years ago
parent
commit
9ba8069bed
3 changed files with 26 additions and 20 deletions
  1. +11
    -10
      source/backend/plugin/Lv2Plugin.cpp
  2. +5
    -0
      source/carla_database.py
  3. +10
    -10
      source/discovery/carla-discovery.cpp

+ 11
- 10
source/backend/plugin/Lv2Plugin.cpp View File

@@ -4593,19 +4593,20 @@ public:
// Check supported features // Check supported features
for (uint32_t j=0; j < fRdfDescriptor->FeatureCount && canContinue; ++j) 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"); 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;
} }
} }




+ 5
- 0
source/carla_database.py View File

@@ -219,6 +219,9 @@ def runCarlaDiscovery(itype, stype, filename, tool, isWine=False):
elif line.startswith("carla-discovery::info::"): elif line.startswith("carla-discovery::info::"):
print("%s - %s" % (line, filename)) print("%s - %s" % (line, filename))


elif line.startswith("carla-discovery::warning::"):
print("%s - %s" % (line, filename))

elif line.startswith("carla-discovery::error::"): elif line.startswith("carla-discovery::error::"):
print("%s - %s" % (line, filename)) print("%s - %s" % (line, filename))


@@ -263,6 +266,8 @@ def runCarlaDiscovery(itype, stype, filename, tool, isWine=False):
del pinfo del pinfo
pinfo = None pinfo = None
continue continue
else:
print("%s - %s" % (line, filename))


# FIXME? # FIXME?
tmp = gDiscoveryProcess tmp = gDiscoveryProcess


+ 10
- 10
source/discovery/carla-discovery.cpp View File

@@ -164,21 +164,21 @@ static intptr_t VSTCALLBACK vstHostCallback(AEffect* const effect, const int32_t
break; break;


case audioMasterCurrentId: 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; ret = gVstCurrentUniqueId;
break; break;


case DECLARE_VST_DEPRECATED(audioMasterWantMidi): 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; gVstWantsMidi = true;
ret = 1; ret = 1;
break; break;


case audioMasterGetTime: 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<VstTimeInfo>(timeInfo); carla_zeroStruct<VstTimeInfo>(timeInfo);
timeInfo.sampleRate = kSampleRate; timeInfo.sampleRate = kSampleRate;
@@ -208,7 +208,7 @@ static intptr_t VSTCALLBACK vstHostCallback(AEffect* const effect, const int32_t
break; break;


case DECLARE_VST_DEPRECATED(audioMasterNeedIdle): 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; gVstNeedsIdle = true;
ret = 1; 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) 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; supported = false;
break; break;
} }


Loading…
Cancel
Save