X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Flv2_plugin.cc;h=6d4a71869f0c9105bd02060d3ed39dca8e02a0f7;hb=e487814e9dc52b712d7c5cd242ce4fac76397b1a;hp=5b1e8568055573f8d5b012f714be5f7950995971;hpb=725e7443ad1b0d211b7c531f96d780c0abd73961;p=ardour.git diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index 5b1e856805..6d4a71869f 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -31,6 +31,7 @@ #include +#include "pbd/pathscanner.h" #include "pbd/compose.h" #include "pbd/error.h" #include "pbd/xml++.h" @@ -46,6 +47,7 @@ #include "ardour/types.h" #include "ardour/utils.h" #include "ardour/worker.h" +#include "ardour/lv2_bundled_search_path.h" #include "i18n.h" #include @@ -110,6 +112,8 @@ public: LV2World (); ~LV2World (); + void load_bundled_plugins(); + LilvWorld* world; LilvNode* atom_AtomPort; @@ -126,6 +130,7 @@ public: LilvNode* lv2_InputPort; LilvNode* lv2_OutputPort; LilvNode* lv2_enumeration; + LilvNode* lv2_freewheeling; LilvNode* lv2_inPlaceBroken; LilvNode* lv2_integer; LilvNode* lv2_reportsLatency; @@ -137,6 +142,9 @@ public: LilvNode* time_Position; LilvNode* ui_GtkUI; LilvNode* ui_external; + +private: + bool _bundle_checked; }; static LV2World _world; @@ -445,11 +453,12 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate) flags |= PORT_POSITION; } } - LilvNode* min_size = lilv_port_get(_impl->plugin, port, _world.rsz_minimumSize); + LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize); + LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL; if (min_size && lilv_node_is_int(min_size)) { minimumSize = lilv_node_as_int(min_size); } - lilv_node_free(min_size); + lilv_nodes_free(min_size_v); lilv_nodes_free(buffer_types); lilv_nodes_free(atom_supports); } else { @@ -1335,6 +1344,17 @@ LV2Plugin::describe_parameter(Evoral::Parameter which) lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.ext_notOnGUI)) { return X_("hidden"); } + + if (lilv_port_has_property(_impl->plugin, + lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_freewheeling)) { + return X_("hidden"); + } + + if (lilv_port_has_property(_impl->plugin, + lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_sampleRate)) { + return X_("hidden"); + } + if (lilv_port_has_property(_impl->plugin, lilv_plugin_get_port_by_index(_impl->plugin, which.id()), _world.lv2_reportsLatency)) { return X_("latency"); @@ -1435,10 +1455,12 @@ LV2Plugin::allocate_atom_event_buffers() if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) { count_atom_out++; } - LilvNode* min_size = lilv_port_get(_impl->plugin, port, _world.rsz_minimumSize); + LilvNodes* min_size_v = lilv_port_get_value(_impl->plugin, port, _world.rsz_minimumSize); + LilvNode* min_size = min_size_v ? lilv_nodes_get_first(min_size_v) : NULL; if (min_size && lilv_node_is_int(min_size)) { minimumSize = std::max(minimumSize, lilv_node_as_int(min_size)); } + lilv_nodes_free(min_size_v); } lilv_nodes_free(buffer_types); lilv_nodes_free(atom_supports); @@ -1876,10 +1898,20 @@ LV2Plugin::Impl::designated_input (const char* uri, void** bufptrs[], void** buf return port; } +static bool lv2_filter (const string& str, void *arg) +{ + /* Not a dotfile, has a prefix before a period, suffix is "lv2" */ + + return str[0] != '.' && (str.length() > 3 && str.find (".lv2") == (str.length() - 4)); +} + + LV2World::LV2World() : world(lilv_world_new()) + , _bundle_checked(false) { lilv_world_load_all(world); + atom_AtomPort = lilv_new_uri(world, LV2_ATOM__AtomPort); atom_Chunk = lilv_new_uri(world, LV2_ATOM__Chunk); atom_Sequence = lilv_new_uri(world, LV2_ATOM__Sequence); @@ -1899,6 +1931,7 @@ LV2World::LV2World() lv2_sampleRate = lilv_new_uri(world, LV2_CORE__sampleRate); lv2_toggled = lilv_new_uri(world, LV2_CORE__toggled); lv2_enumeration = lilv_new_uri(world, LV2_CORE__enumeration); + lv2_freewheeling = lilv_new_uri(world, LV2_CORE__freeWheeling); midi_MidiEvent = lilv_new_uri(world, LILV_URI_MIDI_EVENT); rdfs_comment = lilv_new_uri(world, LILV_NS_RDFS "comment"); rsz_minimumSize = lilv_new_uri(world, LV2_RESIZE_PORT__minimumSize); @@ -1916,6 +1949,7 @@ LV2World::~LV2World() lilv_node_free(rdfs_comment); lilv_node_free(midi_MidiEvent); lilv_node_free(lv2_enumeration); + lilv_node_free(lv2_freewheeling); lilv_node_free(lv2_toggled); lilv_node_free(lv2_sampleRate); lilv_node_free(lv2_reportsLatency); @@ -1936,6 +1970,29 @@ LV2World::~LV2World() lilv_node_free(atom_AtomPort); } +void +LV2World::load_bundled_plugins() +{ + if (!_bundle_checked) { + cout << "Scanning folders for bundled LV2s: " << ARDOUR::lv2_bundled_search_path().to_string() << endl; + PathScanner scanner; + vector *plugin_objects = scanner (ARDOUR::lv2_bundled_search_path().to_string(), lv2_filter, 0, true, true); + if (plugin_objects) { + for ( vector::iterator x = plugin_objects->begin(); x != plugin_objects->end (); ++x) { +#ifdef WINDOWS + string uri = "file:///" + **x + "/"; +#else + string uri = "file://" + **x + "/"; +#endif + LilvNode *node = lilv_new_uri(world, uri.c_str()); + lilv_world_load_bundle(world, node); + lilv_node_free(node); + } + } + delete (plugin_objects); + } +} + LV2PluginInfo::LV2PluginInfo (const void* c_plugin) : _c_plugin(c_plugin) { @@ -1967,6 +2024,8 @@ LV2PluginInfo::load(Session& session) PluginInfoList* LV2PluginInfo::discover() { + _world.load_bundled_plugins(); + PluginInfoList* plugs = new PluginInfoList; const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);