summaryrefslogtreecommitdiff
path: root/libs/ardour/lv2_plugin.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2014-09-10 03:31:03 +0200
committerRobin Gareus <robin@gareus.org>2014-09-10 03:31:03 +0200
commitcab09d87b8b660e6d2a6169346d30c1629d59bbb (patch)
treedb5198ec8b17839b6d573fcdce3d0398f4e805b5 /libs/ardour/lv2_plugin.cc
parenta361781e084c552518a3a90277a1455071aa0774 (diff)
free LV2 world after initial scan
Diffstat (limited to 'libs/ardour/lv2_plugin.cc')
-rw-r--r--libs/ardour/lv2_plugin.cc53
1 files changed, 31 insertions, 22 deletions
diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc
index deff882d70..e67b337d39 100644
--- a/libs/ardour/lv2_plugin.cc
+++ b/libs/ardour/lv2_plugin.cc
@@ -2014,6 +2014,7 @@ LV2World::~LV2World()
lilv_node_free(atom_Sequence);
lilv_node_free(atom_Chunk);
lilv_node_free(atom_AtomPort);
+ lilv_world_free(world);
}
void
@@ -2039,26 +2040,30 @@ LV2World::load_bundled_plugins()
}
}
-LV2PluginInfo::LV2PluginInfo (const void* c_plugin)
- : _c_plugin(c_plugin)
+LV2PluginInfo::LV2PluginInfo (const char* plugin_uri)
{
type = ARDOUR::LV2;
+ _plugin_uri = strdup(plugin_uri);
}
LV2PluginInfo::~LV2PluginInfo()
-{}
+{
+ free(_plugin_uri);
+}
PluginPtr
LV2PluginInfo::load(Session& session)
{
try {
PluginPtr plugin;
-
- plugin.reset(new LV2Plugin(session.engine(), session,
- (const LilvPlugin*)_c_plugin,
- session.frame_rate()));
-
- plugin->set_info(PluginInfoPtr(new LV2PluginInfo(*this)));
+ const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
+ LilvNode* uri = lilv_new_uri(_world.world, _plugin_uri);
+ if (!uri) { throw failed_constructor(); }
+ const LilvPlugin* lp = lilv_plugins_get_by_uri(plugins, uri);
+ if (!lp) { throw failed_constructor(); }
+ plugin.reset(new LV2Plugin(session.engine(), session, lp, session.frame_rate()));
+ lilv_node_free(uri);
+ plugin->set_info(PluginInfoPtr(new LV2PluginInfo(_plugin_uri)));
return plugin;
} catch (failed_constructor& err) {
return PluginPtr((Plugin*)0);
@@ -2070,10 +2075,12 @@ LV2PluginInfo::load(Session& session)
PluginInfoList*
LV2PluginInfo::discover()
{
+ LV2World world;
+ world.load_bundled_plugins();
_world.load_bundled_plugins();
PluginInfoList* plugs = new PluginInfoList;
- const LilvPlugins* plugins = lilv_world_get_all_plugins(_world.world);
+ const LilvPlugins* plugins = lilv_world_get_all_plugins(world.world);
if (!Config->get_show_plugin_scan_window()) {
info << "LV2: Discovering " << lilv_plugins_size(plugins) << " plugins" << endmsg;
@@ -2081,7 +2088,9 @@ LV2PluginInfo::discover()
LILV_FOREACH(plugins, i, plugins) {
const LilvPlugin* p = lilv_plugins_get(plugins, i);
- LV2PluginInfoPtr info(new LV2PluginInfo((const void*)p));
+ const LilvNode* pun = lilv_plugin_get_uri(p);
+ if (!pun) continue;
+ LV2PluginInfoPtr info(new LV2PluginInfo(lilv_node_as_string(pun)));
LilvNode* name = lilv_plugin_get_name(p);
if (!name || !lilv_plugin_get_port_by_index(p, 0)) {
@@ -2116,18 +2125,18 @@ LV2PluginInfo::discover()
int count_midi_in = 0;
for (uint32_t i = 0; i < lilv_plugin_get_num_ports(p); ++i) {
const LilvPort* port = lilv_plugin_get_port_by_index(p, i);
- if (lilv_port_is_a(p, port, _world.atom_AtomPort)) {
+ if (lilv_port_is_a(p, port, world.atom_AtomPort)) {
LilvNodes* buffer_types = lilv_port_get_value(
- p, port, _world.atom_bufferType);
+ p, port, world.atom_bufferType);
LilvNodes* atom_supports = lilv_port_get_value(
- p, port, _world.atom_supports);
+ p, port, world.atom_supports);
- if (lilv_nodes_contains(buffer_types, _world.atom_Sequence)
- && lilv_nodes_contains(atom_supports, _world.midi_MidiEvent)) {
- if (lilv_port_is_a(p, port, _world.lv2_InputPort)) {
+ if (lilv_nodes_contains(buffer_types, world.atom_Sequence)
+ && lilv_nodes_contains(atom_supports, world.midi_MidiEvent)) {
+ if (lilv_port_is_a(p, port, world.lv2_InputPort)) {
count_midi_in++;
}
- if (lilv_port_is_a(p, port, _world.lv2_OutputPort)) {
+ if (lilv_port_is_a(p, port, world.lv2_OutputPort)) {
count_midi_out++;
}
}
@@ -2138,18 +2147,18 @@ LV2PluginInfo::discover()
info->n_inputs.set_audio(
lilv_plugin_get_num_ports_of_class(
- p, _world.lv2_InputPort, _world.lv2_AudioPort, NULL));
+ p, world.lv2_InputPort, world.lv2_AudioPort, NULL));
info->n_inputs.set_midi(
lilv_plugin_get_num_ports_of_class(
- p, _world.lv2_InputPort, _world.ev_EventPort, NULL)
+ p, world.lv2_InputPort, world.ev_EventPort, NULL)
+ count_midi_in);
info->n_outputs.set_audio(
lilv_plugin_get_num_ports_of_class(
- p, _world.lv2_OutputPort, _world.lv2_AudioPort, NULL));
+ p, world.lv2_OutputPort, world.lv2_AudioPort, NULL));
info->n_outputs.set_midi(
lilv_plugin_get_num_ports_of_class(
- p, _world.lv2_OutputPort, _world.ev_EventPort, NULL)
+ p, world.lv2_OutputPort, world.ev_EventPort, NULL)
+ count_midi_out);
info->unique_id = lilv_node_as_uri(lilv_plugin_get_uri(p));