| @@ -1109,9 +1109,7 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool loadPresets) | |||
| if (presetNodes.size() > 0) | |||
| { | |||
| // create a list of preset URIs (for checking appliesTo, sorting and unique-ness) | |||
| // FIXME - check appliesTo? | |||
| // create a list of preset URIs (for sorting and unique-ness) | |||
| #ifdef USE_QT | |||
| QStringList presetListURIs; | |||
| @@ -1154,35 +1152,48 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool loadPresets) | |||
| { | |||
| Lilv::Node presetNode(presetNodes.get(it)); | |||
| if (lv2World.load_resource(presetNode) == -1) | |||
| continue; | |||
| const char* const presetURI(presetNode.as_uri()); | |||
| CARLA_SAFE_ASSERT_CONTINUE(presetURI != nullptr && presetURI[0] != '\0'); | |||
| // try to find label without loading the preset resource first | |||
| Lilv::Nodes presetLabelNodes(lv2World.find_nodes(presetNode, lv2World.rdfs_label, nullptr)); | |||
| // failed, try loading resource | |||
| if (presetLabelNodes.size() == 0) | |||
| { | |||
| // if loading resource fails, skip this preset | |||
| if (lv2World.load_resource(presetNode) == -1) | |||
| continue; | |||
| // ok, let's try again | |||
| presetLabelNodes = lv2World.find_nodes(presetNode, lv2World.rdfs_label, nullptr); | |||
| } | |||
| if (const char* const presetURI = presetNode.as_uri()) | |||
| if (presetLabelNodes.size() > 0) | |||
| { | |||
| #ifdef USE_QT | |||
| const int index(presetListURIs.indexOf(QString(presetURI))); | |||
| #else | |||
| const int index(presetListURIs.indexOf(juce::String(presetURI))); | |||
| #endif | |||
| CARLA_SAFE_ASSERT_CONTINUE(index >= 0); | |||
| CARLA_SAFE_ASSERT_CONTINUE(index >= 0 && index < static_cast<int>(rdfDescriptor->PresetCount)); | |||
| LV2_RDF_Preset* const rdfPreset(&rdfDescriptor->Presets[index]); | |||
| // --------------------------------------------------- | |||
| // Set Preset Information | |||
| { | |||
| rdfPreset->URI = carla_strdup(presetURI); | |||
| Lilv::Nodes presetLabelNodes(lv2World.find_nodes(presetNode, lv2World.rdfs_label, nullptr)); | |||
| rdfPreset->URI = carla_strdup(presetURI); | |||
| if (presetLabelNodes.size() > 0) | |||
| { | |||
| if (const char* const label = presetLabelNodes.get_first().as_string()) | |||
| rdfPreset->Label = carla_strdup(label); | |||
| } | |||
| Lilv::Nodes presetLabelNodes(lv2World.find_nodes(presetNode, lv2World.rdfs_label, nullptr)); | |||
| lilv_nodes_free(const_cast<LilvNodes*>(presetLabelNodes.me)); | |||
| if (presetLabelNodes.size() > 0) | |||
| { | |||
| if (const char* const label = presetLabelNodes.get_first().as_string()) | |||
| rdfPreset->Label = carla_strdup(label); | |||
| } | |||
| lilv_nodes_free(const_cast<LilvNodes*>(presetLabelNodes.me)); | |||
| } | |||
| } | |||
| } | |||