From c01b7b78423e2eef98a061f960d49e94a2bf2502 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 15 Sep 2020 19:32:14 +0200 Subject: [PATCH] Detect LV2 categories by URI --- libs/ardour/ardour/lv2_plugin.h | 9 +++++++ libs/ardour/lv2_plugin.cc | 45 +++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/libs/ardour/ardour/lv2_plugin.h b/libs/ardour/ardour/lv2_plugin.h index 098a766077..a54876efae 100644 --- a/libs/ardour/ardour/lv2_plugin.h +++ b/libs/ardour/ardour/lv2_plugin.h @@ -403,7 +403,16 @@ public: PluginPtr load (Session& session); std::vector get_presets (bool user_only) const; + bool is_instrument () const; + bool is_utility () const; + bool is_analyzer () const; + char * _plugin_uri; + +private: + bool _is_instrument; + bool _is_utility; + bool _is_analyzer; }; typedef boost::shared_ptr LV2PluginInfoPtr; diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index 0e1740edb6..12dd7c7839 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -3675,6 +3675,24 @@ LV2PluginInfo::discover() const LilvNode* label = lilv_plugin_class_get_label(pclass); info->category = lilv_node_as_string(label); + /* check main category */ + const char* pcat = lilv_node_as_uri (lilv_plugin_class_get_uri (pclass)); + assert (pcat); + info->_is_instrument = 0 == strcmp (pcat, LV2_CORE__InstrumentPlugin); + info->_is_utility = 0 == strcmp (pcat, LV2_CORE__UtilityPlugin); + info->_is_analyzer = 0 == strcmp (pcat, LV2_CORE__AnalyserPlugin); + + /* iterate over additional classes */ + LilvPluginClasses* classes = lilv_plugin_class_get_children (pclass); + LILV_FOREACH(plugin_classes, i, classes) { + const char* pc = lilv_node_as_uri (lilv_plugin_class_get_uri (lilv_plugin_classes_get (classes, i))); + assert (pc); + info->_is_instrument |= 0 == strcmp (pc, LV2_CORE__InstrumentPlugin); + info->_is_utility |= 0 == strcmp (pc, LV2_CORE__UtilityPlugin); + info->_is_analyzer |= 0 == strcmp (pc, LV2_CORE__AnalyserPlugin); + } + lilv_plugin_classes_free (classes); + LilvNode* author_name = lilv_plugin_get_author_name(p); info->creator = author_name ? string(lilv_node_as_string(author_name)) : "Unknown"; lilv_node_free(author_name); @@ -3734,3 +3752,30 @@ LV2PluginInfo::discover() return plugs; } + +bool +LV2PluginInfo::is_instrument () const +{ + if (_is_instrument) { + return true; + } + return PluginInfo::is_instrument (); +} + +bool +LV2PluginInfo::is_utility () const +{ + if (_is_utility) { + return true; + } + return PluginInfo::is_utility (); +} + +bool +LV2PluginInfo::is_analyzer () const +{ + if (_is_analyzer) { + return true; + } + return PluginInfo::is_analyzer (); +}