summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2014-01-18 01:34:45 +0000
committerDavid Robillard <d@drobilla.net>2014-01-18 01:34:45 +0000
commitd10ea3bd9e270216bad0fa8eb3f40197332ddbce (patch)
tree1e67b3d7ac7ac54eb22a9bdc7e5ee36047834809 /src
parentb981fe987511c429aca18151429e233ba80ccf94 (diff)
downloadlilv-d10ea3bd9e270216bad0fa8eb3f40197332ddbce.tar.gz
lilv-d10ea3bd9e270216bad0fa8eb3f40197332ddbce.tar.bz2
lilv-d10ea3bd9e270216bad0fa8eb3f40197332ddbce.zip
Call lv2_lib_descriptor separately for different bundle paths
(fix loading several dynamic plugins like Ingen at once). git-svn-id: http://svn.drobilla.net/lad/trunk/lilv@5314 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src')
-rw-r--r--src/lib.c8
-rw-r--r--src/lilv_internal.h2
-rw-r--r--src/world.c20
3 files changed, 26 insertions, 4 deletions
diff --git a/src/lib.c b/src/lib.c
index 7eb62aa..314a943 100644
--- a/src/lib.c
+++ b/src/lib.c
@@ -22,8 +22,10 @@ lilv_lib_open(LilvWorld* world,
const char* bundle_path,
const LV2_Feature*const* features)
{
- ZixTreeIter* i = NULL;
- const struct LilvHeader key = { world, (LilvNode*)uri };
+ ZixTreeIter* i = NULL;
+ const LilvLib key = {
+ world, (LilvNode*)uri, (char*)bundle_path, NULL, NULL, NULL, 0
+ };
if (!zix_tree_find(world->libs, &key, &i)) {
LilvLib* llib = (LilvLib*)zix_tree_get(i);
++llib->refs;
@@ -69,6 +71,7 @@ lilv_lib_open(LilvWorld* world,
LilvLib* llib = (LilvLib*)malloc(sizeof(LilvLib));
llib->world = world;
llib->uri = lilv_node_duplicate(uri);
+ llib->bundle_path = lilv_strdup(bundle_path);
llib->lib = lib;
llib->lv2_descriptor = df;
#ifdef LILV_NEW_LV2
@@ -106,6 +109,7 @@ lilv_lib_close(LilvLib* lib)
}
lilv_node_free(lib->uri);
+ free(lib->bundle_path);
free(lib);
}
}
diff --git a/src/lilv_internal.h b/src/lilv_internal.h
index ae58e04..ff68070 100644
--- a/src/lilv_internal.h
+++ b/src/lilv_internal.h
@@ -99,6 +99,7 @@ typedef struct {
typedef struct {
LilvWorld* world;
LilvNode* uri;
+ char* bundle_path;
void* lib;
LV2_Descriptor_Function lv2_descriptor;
#ifdef LILV_NEW_LV2
@@ -298,6 +299,7 @@ LilvNode* lilv_node_new_from_node(LilvWorld* world,
const SordNode* lilv_node_as_node(const LilvNode* value);
int lilv_header_compare_by_uri(const void* a, const void* b, void* user_data);
+int lilv_lib_compare(const void* a, const void* b, void* user_data);
int
lilv_ptr_cmp(const void* a, const void* b, void* user_data);
diff --git a/src/world.c b/src/world.c
index e6fcc47..7921a71 100644
--- a/src/world.c
+++ b/src/world.c
@@ -44,8 +44,7 @@ lilv_world_new(void)
false, lilv_resource_node_cmp, NULL, (ZixDestroyFunc)lilv_node_free);
#ifdef LILV_NEW_LV2
- world->libs = zix_tree_new(
- false, lilv_header_compare_by_uri, NULL, NULL);
+ world->libs = zix_tree_new(false, lilv_lib_compare, NULL, NULL);
#endif
#define NS_DCTERMS "http://purl.org/dc/terms/"
@@ -292,6 +291,23 @@ lilv_header_compare_by_uri(const void* a, const void* b, void* user_data)
lilv_node_as_uri(header_b->uri));
}
+/**
+ Comparator for libraries (world->libs).
+
+ Libraries do have a LilvHeader, but we must also compare the bundle to
+ handle the case where the same library is loaded with different bundles, and
+ consequently different contents (mainly plugins).
+ */
+int
+lilv_lib_compare(const void* a, const void* b, void* user_data)
+{
+ const LilvLib* const lib_a = (const LilvLib*)a;
+ const LilvLib* const lib_b = (const LilvLib*)b;
+ int cmp = strcmp(lilv_node_as_uri(lib_a->uri),
+ lilv_node_as_uri(lib_b->uri));
+ return cmp ? cmp : strcmp(lib_a->bundle_path, lib_b->bundle_path);
+}
+
/** Get an element of a collection of any object with an LilvHeader by URI. */
struct LilvHeader*
lilv_collection_get_by_uri(const ZixTree* const_seq,