| @@ -1109,9 +1109,7 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool loadPresets) | |||||
| if (presetNodes.size() > 0) | 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 | #ifdef USE_QT | ||||
| QStringList presetListURIs; | 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)); | 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 | #ifdef USE_QT | ||||
| const int index(presetListURIs.indexOf(QString(presetURI))); | const int index(presetListURIs.indexOf(QString(presetURI))); | ||||
| #else | #else | ||||
| const int index(presetListURIs.indexOf(juce::String(presetURI))); | const int index(presetListURIs.indexOf(juce::String(presetURI))); | ||||
| #endif | #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]); | LV2_RDF_Preset* const rdfPreset(&rdfDescriptor->Presets[index]); | ||||
| // --------------------------------------------------- | // --------------------------------------------------- | ||||
| // Set Preset Information | // 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)); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||