diff --git a/lilv/lilv.h b/lilv/lilv.h index 37dd849..760f7b5 100644 --- a/lilv/lilv.h +++ b/lilv/lilv.h @@ -26,8 +26,9 @@ #include #include -#include "lv2/lv2plug.in/ns/lv2core/lv2.h" -#include "lv2/lv2plug.in/ns/ext/urid/urid.h" +#include "lv2/lv2.h" +#include "lv2/state.h" +#include "lv2/urid.h" #ifdef LILV_SHARED # ifdef _WIN32 @@ -564,7 +565,7 @@ lilv_world_free(LilvWorld* world); with special plugin bundles which are installed to a known location). */ LILV_API void -lilv_world_load_all(LilvWorld* world); +lilv_world_load_all(LilvWorld* world, const char* lv2_path); /** Load a specific bundle. @@ -1221,9 +1222,9 @@ lilv_port_get_scale_points(const LilvPlugin* plugin, @return A new LilvState which must be freed with lilv_state_free(), or NULL. */ LILV_API LilvState* -lilv_state_new_from_world(LilvWorld* world, - LV2_URID_Map* map, - const LilvNode* subject); +lilv_state_new_from_world(LilvWorld* world, + const LV2_URID_Map* map, + const LilvNode* subject); /** Load a state snapshot from a file. @@ -1241,18 +1242,18 @@ lilv_state_new_from_world(LilvWorld* world, new memory consumed once this function returns. */ LILV_API LilvState* -lilv_state_new_from_file(LilvWorld* world, - LV2_URID_Map* map, - const LilvNode* subject, - const char* path); +lilv_state_new_from_file(LilvWorld* world, + const LV2_URID_Map* map, + const LilvNode* subject, + const char* path); /** Load a state snapshot from a string made by lilv_state_to_string(). */ LILV_API LilvState* -lilv_state_new_from_string(LilvWorld* world, - LV2_URID_Map* map, - const char* str); +lilv_state_new_from_string(LilvWorld* world, + const LV2_URID_Map* map, + const char* str); /** Function to get a port value. @@ -1469,7 +1470,8 @@ lilv_state_emit_port_values(const LilvState* state, */ LILV_API void lilv_state_restore(const LilvState* state, - LilvInstance* instance, + const LV2_State_Interface* iface, + LV2_Handle handle, LilvSetPortValueFunc set_value, void* user_data, uint32_t flags, @@ -1830,6 +1832,42 @@ LILV_API const LilvNode* lilv_ui_get_binary_uri(const LilvUI* ui); /** + Custom calls +*/ +LILV_API LilvNode* +lilv_plugin_get_modgui_resources_directory(const LilvPlugin* plugin); + +LILV_API LilvNode* +lilv_plugin_get_modgui_stylesheet(const LilvPlugin* plugin); + +LILV_API LilvNode* +lilv_plugin_get_modgui_icon_template(const LilvPlugin* plugin); + +LILV_API LilvNode* +lilv_plugin_get_modgui_settings_template(const LilvPlugin* plugin); + +LILV_API LilvNode* +lilv_plugin_get_modgui_template_data(const LilvPlugin* plugin); + +LILV_API LilvNode* +lilv_plugin_get_modgui_screenshot(const LilvPlugin* plugin); + +LILV_API LilvNode* +lilv_plugin_get_modgui_thumbnail(const LilvPlugin* plugin); + +LILV_API const LilvNodes* +lilv_ui_get_supported_features(const LilvUI* ui); + +LILV_API const LilvNodes* +lilv_ui_get_required_features(const LilvUI* ui); + +LILV_API const LilvNodes* +lilv_ui_get_optional_features(const LilvUI* ui); + +LILV_API const LilvNodes* +lilv_ui_get_extension_data(const LilvUI* ui); + +/** @} @} */ diff --git a/lilv/lilvmm.hpp b/lilv/lilvmm.hpp index b9b3a69..1f67e81 100644 --- a/lilv/lilvmm.hpp +++ b/lilv/lilvmm.hpp @@ -17,6 +17,8 @@ #ifndef LILV_LILVMM_HPP #define LILV_LILVMM_HPP +#include "CarlaDefines.h" + #include "lilv/lilv.h" #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) @@ -27,14 +29,12 @@ namespace Lilv { -static inline const char* -uri_to_path(const char* uri) { - return lilv_uri_to_path(uri); -} - #define LILV_WRAP0(RT, prefix, name) \ inline RT name() { return lilv_ ## prefix ## _ ## name (me); } +#define LILV_WRAP0_CONST(RT, prefix, name) \ + inline RT name() const { return lilv_ ## prefix ## _ ## name (me); } + #define LILV_WRAP0_VOID(prefix, name) \ inline void name() { lilv_ ## prefix ## _ ## name(me); } @@ -65,6 +65,7 @@ uri_to_path(const char* uri) { #endif struct Node { + inline Node(LilvNode* node) : me(node) {} inline Node(const LilvNode* node) : me(lilv_node_duplicate(node)) {} inline Node(const Node& copy) : me(lilv_node_duplicate(copy.me)) {} @@ -78,20 +79,26 @@ struct Node { LILV_WRAP_CONVERSION(LilvNode); - LILV_WRAP0(char*, node, get_turtle_token); - LILV_WRAP0(bool, node, is_uri); - LILV_WRAP0(const char*, node, as_uri); - LILV_WRAP0(bool, node, is_blank); - LILV_WRAP0(const char*, node, as_blank); - LILV_WRAP0(bool, node, is_literal); - LILV_WRAP0(bool, node, is_string); - LILV_WRAP0(const char*, node, as_string); - LILV_WRAP0(bool, node, is_float); - LILV_WRAP0(float, node, as_float); - LILV_WRAP0(bool, node, is_int); - LILV_WRAP0(int, node, as_int); - LILV_WRAP0(bool, node, is_bool); - LILV_WRAP0(bool, node, as_bool); + LILV_WRAP0_CONST(char*, node, get_turtle_token); + LILV_WRAP0_CONST(bool, node, is_uri); + LILV_WRAP0_CONST(const char*, node, as_uri); + LILV_WRAP0_CONST(bool, node, is_blank); + LILV_WRAP0_CONST(const char*, node, as_blank); + LILV_WRAP0_CONST(bool, node, is_literal); + LILV_WRAP0_CONST(bool, node, is_string); + LILV_WRAP0_CONST(const char*, node, as_string); + LILV_WRAP0_CONST(bool, node, is_float); + LILV_WRAP0_CONST(float, node, as_float); + LILV_WRAP0_CONST(bool, node, is_int); + LILV_WRAP0_CONST(int, node, as_int); + LILV_WRAP0_CONST(bool, node, is_bool); + LILV_WRAP0_CONST(bool, node, as_bool); + + Node& operator=(const Node& copy) { + lilv_node_free(me); + me = lilv_node_duplicate(copy.me); + return *this; + } LilvNode* me; }; @@ -126,7 +133,7 @@ struct PluginClass { LILV_WRAP0(LilvIter*, prefix, begin); \ LILV_WRAP1(LilvIter*, prefix, next, LilvIter*, i); \ LILV_WRAP1(bool, prefix, is_end, LilvIter*, i); \ - const Lilv ## CT* me; \ + const Lilv ## CT* me struct PluginClasses { LILV_WRAP_COLL(PluginClasses, PluginClass, plugin_classes); @@ -141,22 +148,24 @@ struct ScalePoints { struct Nodes { LILV_WRAP_COLL(Nodes, Node, nodes); LILV_WRAP1(bool, nodes, contains, const Node, node); - LILV_WRAP0(Node, nodes, get_first); + + inline Node get_first() const { + return Node((const LilvNode*)lilv_nodes_get_first(me)); + } }; struct UI { inline UI(const LilvUI* c_obj) : me(c_obj) {} LILV_WRAP_CONVERSION(const LilvUI); - LILV_WRAP0(const LilvNode*, ui, get_uri); - LILV_WRAP0(const LilvNode*, ui, get_bundle_uri); - LILV_WRAP0(const LilvNode*, ui, get_binary_uri); - LILV_WRAP0(const LilvNodes*, ui, get_classes); - /*LILV_WRAP3(bool, ui, is_supported, - LilvUISupportedFunc, supported_func, - const LilvNode*, container_type, - const LilvNode**, ui_type);*/ - LILV_WRAP1(bool, ui, is_a, const LilvNode*, class_uri); + LILV_WRAP0(Node, ui, get_uri); + LILV_WRAP1(bool, ui, is_a, LilvNode*, ui_class); + LILV_WRAP0(Node, ui, get_bundle_uri); + LILV_WRAP0(Node, ui, get_binary_uri); + LILV_WRAP0(Nodes, ui, get_supported_features); + LILV_WRAP0(Nodes, ui, get_required_features); + LILV_WRAP0(Nodes, ui, get_optional_features); + LILV_WRAP0(Nodes, ui, get_extension_data); const LilvUI* me; }; @@ -220,6 +229,13 @@ struct Plugin { LILV_WRAP0(Nodes, plugin, get_extension_data); LILV_WRAP0(UIs, plugin, get_uis); LILV_WRAP1(Nodes, plugin, get_related, Node, type); + LILV_WRAP0(Node, plugin, get_modgui_resources_directory); + LILV_WRAP0(Node, plugin, get_modgui_stylesheet); + LILV_WRAP0(Node, plugin, get_modgui_icon_template); + LILV_WRAP0(Node, plugin, get_modgui_settings_template); + LILV_WRAP0(Node, plugin, get_modgui_template_data); + LILV_WRAP0(Node, plugin, get_modgui_screenshot); + LILV_WRAP0(Node, plugin, get_modgui_thumbnail); inline Port get_port_by_index(unsigned index) { return Port(me, lilv_plugin_get_port_by_index(me, index)); @@ -259,15 +275,13 @@ struct Instance { inline Instance(LilvInstance* instance) : me(instance) {} LILV_DEPRECATED - inline Instance(Plugin plugin, double sample_rate) { - me = lilv_plugin_instantiate(plugin, sample_rate, NULL); - } + inline Instance(Plugin plugin, double sample_rate) + : me(lilv_plugin_instantiate(plugin, sample_rate, NULL)) {} LILV_DEPRECATED inline Instance(Plugin plugin, double sample_rate, - LV2_Feature* const* features) { - me = lilv_plugin_instantiate(plugin, sample_rate, features); - } + LV2_Feature* const* features) + : me(lilv_plugin_instantiate(plugin, sample_rate, features)) {} static inline Instance* create(Plugin plugin, double sample_rate, @@ -304,22 +318,25 @@ struct Instance { }; struct World { - inline World() : me(lilv_world_new()) {} - inline ~World() { lilv_world_free(me); } + inline World() : me(lilv_world_new()) {} + inline virtual ~World() { lilv_world_free(me); } - inline LilvNode* new_uri(const char* uri) { + inline LilvNode* new_uri(const char* uri) const { return lilv_new_uri(me, uri); } - inline LilvNode* new_string(const char* str) { + inline LilvNode* new_file_uri(const char* host, const char* path) const { + return lilv_new_file_uri(me, host, path); + } + inline LilvNode* new_string(const char* str) const { return lilv_new_string(me, str); } - inline LilvNode* new_int(int val) { + inline LilvNode* new_int(int val) const { return lilv_new_int(me, val); } - inline LilvNode* new_float(float val) { + inline LilvNode* new_float(float val) const { return lilv_new_float(me, val); } - inline LilvNode* new_bool(bool val) { + inline LilvNode* new_bool(bool val) const { return lilv_new_bool(me, val); } inline Nodes find_nodes(const LilvNode* subject, @@ -329,7 +346,7 @@ struct World { } LILV_WRAP2_VOID(world, set_option, const char*, uri, LilvNode*, value); - LILV_WRAP0_VOID(world, load_all); + LILV_WRAP1_VOID(world, load_all, const char*, lv2_path); LILV_WRAP1_VOID(world, load_bundle, LilvNode*, bundle_uri); LILV_WRAP0(const LilvPluginClass*, world, get_plugin_class); LILV_WRAP0(const LilvPluginClasses*, world, get_plugin_classes); @@ -337,6 +354,8 @@ struct World { LILV_WRAP1(int, world, load_resource, const LilvNode*, resource); LilvWorld* me; + + CARLA_DECLARE_NON_COPY_STRUCT(World) }; } /* namespace Lilv */ diff --git a/src/lilv_internal.h b/src/lilv_internal.h index af8e31a..7b6e84d 100644 --- a/src/lilv_internal.h +++ b/src/lilv_internal.h @@ -58,7 +58,7 @@ static inline const char* dlerror(void) { return "Unknown error"; } #include "lilv/lilv.h" #ifdef LILV_DYN_MANIFEST -# include "lv2/lv2plug.in/ns/ext/dynmanifest/dynmanifest.h" +# include "lv2/dynmanifest.h" #endif /* diff --git a/src/plugin.c b/src/plugin.c index 5e10d7c..108ee2b 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -27,10 +27,11 @@ #include "lilv_config.h" #include "lilv_internal.h" -#include "lv2/lv2plug.in/ns/extensions/ui/ui.h" +#include "lv2/ui.h" #define NS_DOAP (const uint8_t*)"http://usefulinc.com/ns/doap#" #define NS_FOAF (const uint8_t*)"http://xmlns.com/foaf/0.1/" +#define NS_MOD (const uint8_t*)"http://moddevices.com/ns/modgui#" static void lilv_plugin_init(LilvPlugin* plugin, LilvNode* bundle_uri) @@ -930,6 +931,131 @@ lilv_plugin_get_author_homepage(const LilvPlugin* plugin) return lilv_plugin_get_author_property(plugin, NS_FOAF "homepage"); } +static const SordNode* +lilv_plugin_get_modgui(const LilvPlugin* p) +{ + lilv_plugin_load_if_necessary(p); + + SordNode* mod_gui = sord_new_uri( + p->world->world, NS_MOD "gui"); + + SordIter* gui = lilv_world_query_internal( + p->world, + p->plugin_uri->node, + mod_gui, + NULL); + + sord_node_free(p->world->world, mod_gui); + + if (sord_iter_end(gui)) { + sord_iter_free(gui); + return NULL; + } + + const SordNode* Gui = sord_iter_get_node(gui, SORD_OBJECT); + + sord_iter_free(gui); + return Gui; +} + +LILV_API LilvNode* +lilv_plugin_get_modgui_resources_directory(const LilvPlugin* plugin) +{ + const SordNode* modgui = lilv_plugin_get_modgui(plugin); + if (modgui) { + SordWorld* sworld = plugin->world->world; + SordNode* modgui_res = sord_new_uri(sworld, NS_MOD "resourcesDirectory"); + LilvNode* ret = lilv_plugin_get_one(plugin, modgui, modgui_res); + sord_node_free(sworld, modgui_res); + return ret; + } + return NULL; +} + +LILV_API LilvNode* +lilv_plugin_get_modgui_stylesheet(const LilvPlugin* plugin) +{ + const SordNode* modgui = lilv_plugin_get_modgui(plugin); + if (modgui) { + SordWorld* sworld = plugin->world->world; + SordNode* modgui_style = sord_new_uri(sworld, NS_MOD "stylesheet"); + LilvNode* ret = lilv_plugin_get_one(plugin, modgui, modgui_style); + sord_node_free(sworld, modgui_style); + return ret; + } + return NULL; +} + +LILV_API LilvNode* +lilv_plugin_get_modgui_icon_template(const LilvPlugin* plugin) +{ + const SordNode* modgui = lilv_plugin_get_modgui(plugin); + if (modgui) { + SordWorld* sworld = plugin->world->world; + SordNode* modgui_tmpl = sord_new_uri(sworld, NS_MOD "iconTemplate"); + LilvNode* ret = lilv_plugin_get_one(plugin, modgui, modgui_tmpl); + sord_node_free(sworld, modgui_tmpl); + return ret; + } + return NULL; +} + +LILV_API LilvNode* +lilv_plugin_get_modgui_settings_template(const LilvPlugin* plugin) +{ + const SordNode* modgui = lilv_plugin_get_modgui(plugin); + if (modgui) { + SordWorld* sworld = plugin->world->world; + SordNode* modgui_tmpl = sord_new_uri(sworld, NS_MOD "settingsTemplate"); + LilvNode* ret = lilv_plugin_get_one(plugin, modgui, modgui_tmpl); + sord_node_free(sworld, modgui_tmpl); + return ret; + } + return NULL; +} + +LILV_API LilvNode* +lilv_plugin_get_modgui_template_data(const LilvPlugin* plugin) +{ + const SordNode* modgui = lilv_plugin_get_modgui(plugin); + if (modgui) { + SordWorld* sworld = plugin->world->world; + SordNode* modgui_tmpl = sord_new_uri(sworld, NS_MOD "templateData"); + LilvNode* ret = lilv_plugin_get_one(plugin, modgui, modgui_tmpl); + sord_node_free(sworld, modgui_tmpl); + return ret; + } + return NULL; +} + +LILV_API LilvNode* +lilv_plugin_get_modgui_screenshot(const LilvPlugin* plugin) +{ + const SordNode* modgui = lilv_plugin_get_modgui(plugin); + if (modgui) { + SordWorld* sworld = plugin->world->world; + SordNode* modgui_scr = sord_new_uri(sworld, NS_MOD "screenshot"); + LilvNode* ret = lilv_plugin_get_one(plugin, modgui, modgui_scr); + sord_node_free(sworld, modgui_scr); + return ret; + } + return NULL; +} + +LILV_API LilvNode* +lilv_plugin_get_modgui_thumbnail(const LilvPlugin* plugin) +{ + const SordNode* modgui = lilv_plugin_get_modgui(plugin); + if (modgui) { + SordWorld* sworld = plugin->world->world; + SordNode* modgui_thumb = sord_new_uri(sworld, NS_MOD "thumbnail"); + LilvNode* ret = lilv_plugin_get_one(plugin, modgui, modgui_thumb); + sord_node_free(sworld, modgui_thumb); + return ret; + } + return NULL; +} + LILV_API bool lilv_plugin_is_replaced(const LilvPlugin* plugin) { diff --git a/src/port.c b/src/port.c index 6bf8fc7..0a50891 100644 --- a/src/port.c +++ b/src/port.c @@ -20,8 +20,8 @@ #include #include -#include "lv2/lv2plug.in/ns/ext/atom/atom.h" -#include "lv2/lv2plug.in/ns/ext/event/event.h" +#include "lv2/atom.h" +#include "lv2/event.h" #include "lilv_internal.h" diff --git a/src/state.c b/src/state.c index 4781405..c0173b1 100644 --- a/src/state.c +++ b/src/state.c @@ -18,10 +18,10 @@ #include #include -#include "lv2/lv2plug.in/ns/ext/atom/atom.h" -#include "lv2/lv2plug.in/ns/ext/atom/forge.h" -#include "lv2/lv2plug.in/ns/ext/presets/presets.h" -#include "lv2/lv2plug.in/ns/ext/state/state.h" +#include "lv2/atom.h" +#include "lv2/atom-forge.h" +#include "lv2/presets.h" +#include "lv2/state.h" #include "lilv_config.h" #include "lilv_internal.h" @@ -431,40 +431,18 @@ lilv_state_emit_port_values(const LilvState* state, LILV_API void lilv_state_restore(const LilvState* state, - LilvInstance* instance, + const LV2_State_Interface* iface, + LV2_Handle handle, LilvSetPortValueFunc set_value, void* user_data, uint32_t flags, const LV2_Feature *const * features) { - if (!state) { - LILV_ERROR("lilv_state_restore() called on NULL state\n"); - return; + if (iface && iface->restore) { + iface->restore(handle, retrieve_callback, + (LV2_State_Handle)state, flags, features); } - LV2_State_Map_Path map_path = { - (LilvState*)state, abstract_path, absolute_path }; - LV2_Feature map_feature = { LV2_STATE__mapPath, &map_path }; - - if (instance) { - const LV2_Descriptor* desc = instance->lv2_descriptor; - if (desc->extension_data) { - const LV2_State_Interface* iface = (const LV2_State_Interface*) - desc->extension_data(LV2_STATE__interface); - - if (iface && iface->restore) { - const LV2_Feature** sfeatures = add_features( - features, &map_feature, NULL); - - iface->restore(instance->lv2_handle, retrieve_callback, - (LV2_State_Handle)state, flags, sfeatures); - - free(sfeatures); - } - } - } - - if (set_value) { lilv_state_emit_port_values(state, set_value, user_data); } @@ -616,9 +594,9 @@ new_state_from_model(LilvWorld* world, } LILV_API LilvState* -lilv_state_new_from_world(LilvWorld* world, - LV2_URID_Map* map, - const LilvNode* node) +lilv_state_new_from_world(LilvWorld* world, + const LV2_URID_Map* map, + const LilvNode* node) { if (!lilv_node_is_uri(node) && !lilv_node_is_blank(node)) { LILV_ERRORF("Subject `%s' is not a URI or blank node.\n", @@ -630,10 +608,10 @@ lilv_state_new_from_world(LilvWorld* world, } LILV_API LilvState* -lilv_state_new_from_file(LilvWorld* world, - LV2_URID_Map* map, - const LilvNode* subject, - const char* path) +lilv_state_new_from_file(LilvWorld* world, + const LV2_URID_Map* map, + const LilvNode* subject, + const char* path) { if (subject && !lilv_node_is_uri(subject) && !lilv_node_is_blank(subject)) { @@ -683,9 +661,9 @@ set_prefixes(SerdEnv* env) } LILV_API LilvState* -lilv_state_new_from_string(LilvWorld* world, - LV2_URID_Map* map, - const char* str) +lilv_state_new_from_string(LilvWorld* world, + const LV2_URID_Map* map, + const char* str) { if (!str) { return NULL; diff --git a/src/ui.c b/src/ui.c index 0f4f2f6..a3e17da 100644 --- a/src/ui.c +++ b/src/ui.c @@ -109,3 +109,54 @@ lilv_ui_get_binary_uri(const LilvUI* ui) { return ui->binary_uri; } + +static LilvNodes* +lilv_ui_get_value_internal(const LilvUI* ui, const SordNode* predicate) +{ + assert(ui); + return lilv_world_find_nodes_internal(ui->world, ui->uri->node, predicate, NULL); +} + +LILV_API const LilvNodes* +lilv_ui_get_supported_features(const LilvUI* ui) +{ + assert(ui); + LilvNodes* optional = lilv_ui_get_optional_features(ui); + LilvNodes* required = lilv_ui_get_required_features(ui); + LilvNodes* result = lilv_nodes_new(); + + LILV_FOREACH(nodes, i, optional) + zix_tree_insert((ZixTree*)result, lilv_node_duplicate(lilv_nodes_get(optional, i)), NULL); + + LILV_FOREACH(nodes, i, required) + zix_tree_insert((ZixTree*)result, lilv_node_duplicate(lilv_nodes_get(required, i)), NULL); + + lilv_nodes_free(optional); + lilv_nodes_free(required); + + return result; +} + +LILV_API const LilvNodes* +lilv_ui_get_required_features(const LilvUI* ui) +{ + assert(ui); + assert(ui->world); + return lilv_ui_get_value_internal(ui, ui->world->uris.lv2_requiredFeature); +} + +LILV_API const LilvNodes* +lilv_ui_get_optional_features(const LilvUI* ui) +{ + assert(ui); + assert(ui->world); + return lilv_ui_get_value_internal(ui, ui->world->uris.lv2_optionalFeature); +} + +LILV_API const LilvNodes* +lilv_ui_get_extension_data(const LilvUI* ui) +{ + assert(ui); + assert(ui->world); + return lilv_ui_get_value_internal(ui, ui->world->uris.lv2_extensionData); +} diff --git a/src/util.c b/src/util.c index 0c1fd5e..239aa78 100644 --- a/src/util.c +++ b/src/util.c @@ -453,10 +453,7 @@ lilv_symlink(const char* oldpath, const char* newpath) int ret = 0; if (strcmp(oldpath, newpath)) { #ifdef _WIN32 - ret = !CreateSymbolicLink(newpath, oldpath, 0); - if (ret) { - ret = !CreateHardLink(newpath, oldpath, 0); - } + ret = 1; #else ret = symlink(oldpath, newpath); #endif diff --git a/src/world.c b/src/world.c index 622e0a5..04403ca 100644 --- a/src/world.c +++ b/src/world.c @@ -19,7 +19,7 @@ #include #include -#include "lv2/lv2plug.in/ns/ext/presets/presets.h" +#include "lv2/presets.h" #include "lilv_internal.h" @@ -1009,12 +1009,8 @@ lilv_world_load_plugin_classes(LilvWorld* world) } LILV_API void -lilv_world_load_all(LilvWorld* world) +lilv_world_load_all(LilvWorld* world, const char* lv2_path) { - const char* lv2_path = getenv("LV2_PATH"); - if (!lv2_path) - lv2_path = LILV_DEFAULT_LV2_PATH; - // Discover bundles and read all manifest files into model lilv_world_load_path(world, lv2_path);