From d26a3e39c72c17acbe5bb371a6638acd2469bdac Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 22 Sep 2007 23:50:03 +0000 Subject: pluginguiinstance -> pluginuiinstance git-svn-id: http://svn.drobilla.net/lad/slv2@764 a436a847-0d15-0410-975c-d299462d15a1 --- src/Makefile.am | 2 +- src/pluginguiinstance.c | 175 ------------------------------------------------ src/pluginuiinstance.c | 175 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 176 insertions(+), 176 deletions(-) delete mode 100644 src/pluginguiinstance.c create mode 100644 src/pluginuiinstance.c (limited to 'src') diff --git a/src/Makefile.am b/src/Makefile.am index a85a1af..c32a0a1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,7 +7,7 @@ libslv2_la_SOURCES = \ plugin.c \ pluginclass.c \ pluginclasses.c \ - pluginguiinstance.c \ + pluginuiinstance.c \ plugininstance.c \ plugins.c \ port.c \ diff --git a/src/pluginguiinstance.c b/src/pluginguiinstance.c deleted file mode 100644 index ee6de5b..0000000 --- a/src/pluginguiinstance.c +++ /dev/null @@ -1,175 +0,0 @@ -/* SLV2 - * Copyright (C) 2007 Dave Robillard - * Author: Lars Luthman - * - * This library is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the Free - * Software Foundation; either version 2 of the License, or (at your option) - * any later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#define _XOPEN_SOURCE 500 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "slv2_internal.h" - - -SLV2UIInstance -slv2_plugin_ui_instantiate(SLV2Plugin plugin, - SLV2Value ui, - LV2UI_Write_Function write_function, - LV2UI_Command_Function command_function, - LV2UI_Program_Change_Function program_function, - LV2UI_Program_Save_Function save_function, - LV2UI_Controller controller, - const LV2_Host_Feature* const* host_features) -{ - assert(ui->type == SLV2_VALUE_UI); - - if (ui->val.ui_type_val != SLV2_UI_TYPE_GTK2) - return NULL; - - struct _SLV2UIInstance* result = NULL; - - bool local_host_features = (host_features == NULL); - if (local_host_features) { - host_features = malloc(sizeof(LV2_Host_Feature)); - ((LV2_Host_Feature**)host_features)[0] = NULL; - } - - const char* const lib_uri = slv2_value_as_uri(slv2_plugin_get_ui_library_uri(plugin, ui)); - const char* const lib_path = slv2_uri_to_path(lib_uri); - - if (!lib_path) - return NULL; - - dlerror(); - void* lib = dlopen(lib_path, RTLD_NOW); - if (!lib) { - fprintf(stderr, "Unable to open UI library %s (%s)\n", lib_path, dlerror()); - return NULL; - } - - LV2UI_DescriptorFunction df = dlsym(lib, "lv2ui_descriptor"); - - if (!df) { - fprintf(stderr, "Could not find symbol 'lv2ui_descriptor', " - "%s is not a LV2 plugin UI.\n", lib_path); - dlclose(lib); - return NULL; - } else { - // Search for plugin by URI - - // FIXME: Bundle in plugin UI only, boo - const char* bundle_path = slv2_uri_to_path(slv2_plugin_get_bundle_uri(plugin)); - printf("UI bundle path: %s\n", bundle_path); - - for (uint32_t i=0; 1; ++i) { - - const LV2UI_Descriptor* ld = df(i); - - if (!ld) { - fprintf(stderr, "Did not find UI %s in %s\n", - slv2_value_as_uri(ui), lib_path); - dlclose(lib); - break; // return NULL - } else if (!strcmp(ld->URI, slv2_value_as_uri(ui))) { - - printf("Found UI %s at index %u in:\n\t%s\n\n", - librdf_uri_as_string(plugin->plugin_uri), i, lib_path); - - assert(ld->instantiate); - - // Create SLV2UIInstance to return - result = malloc(sizeof(struct _SLV2UIInstance)); - struct _SLV2UIInstanceImpl* impl = malloc(sizeof(struct _SLV2UIInstanceImpl)); - impl->lv2ui_descriptor = ld; - impl->lv2ui_handle = ld->instantiate(ld, - slv2_plugin_get_uri(plugin), - (char*)bundle_path, - write_function, - command_function, - program_function, - save_function, - controller, - &impl->widget, - host_features); - impl->lib_handle = lib; - result->pimpl = impl; - break; - } - } - } - - assert(result); - assert(slv2_plugin_get_num_ports(plugin) > 0); - - // Failed to instantiate - if (result->pimpl->lv2ui_handle == NULL) { - //printf("Failed to instantiate %s\n", plugin->plugin_uri); - free(result); - return NULL; - } - - // Failed to create a widget, but still got a handle - this means that - // the plugin is buggy - if (result->pimpl->widget == NULL) { - slv2_ui_instance_free(result); - return NULL; - } - - if (local_host_features) - free((LV2_Host_Feature**)host_features); - - return result; -} - - -void -slv2_ui_instance_free(SLV2UIInstance instance) -{ - struct _SLV2UIInstance* i = (struct _SLV2UIInstance*)instance; - i->pimpl->lv2ui_descriptor->cleanup(i->pimpl->lv2ui_handle); - i->pimpl->lv2ui_descriptor = NULL; - dlclose(i->pimpl->lib_handle); - i->pimpl->lib_handle = NULL; - free(i->pimpl); - i->pimpl = NULL; - free(i); -} - - -LV2UI_Widget -slv2_ui_instance_get_widget(SLV2UIInstance instance) { - return instance->pimpl->widget; -} - - -const LV2UI_Descriptor* -slv2_ui_instance_get_descriptor(SLV2UIInstance instance) { - return instance->pimpl->lv2ui_descriptor; -} - - -LV2_Handle -slv2_ui_instance_get_handle(SLV2UIInstance instance) { - return instance->pimpl->lv2ui_handle; -} - diff --git a/src/pluginuiinstance.c b/src/pluginuiinstance.c new file mode 100644 index 0000000..ee6de5b --- /dev/null +++ b/src/pluginuiinstance.c @@ -0,0 +1,175 @@ +/* SLV2 + * Copyright (C) 2007 Dave Robillard + * Author: Lars Luthman + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#define _XOPEN_SOURCE 500 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "slv2_internal.h" + + +SLV2UIInstance +slv2_plugin_ui_instantiate(SLV2Plugin plugin, + SLV2Value ui, + LV2UI_Write_Function write_function, + LV2UI_Command_Function command_function, + LV2UI_Program_Change_Function program_function, + LV2UI_Program_Save_Function save_function, + LV2UI_Controller controller, + const LV2_Host_Feature* const* host_features) +{ + assert(ui->type == SLV2_VALUE_UI); + + if (ui->val.ui_type_val != SLV2_UI_TYPE_GTK2) + return NULL; + + struct _SLV2UIInstance* result = NULL; + + bool local_host_features = (host_features == NULL); + if (local_host_features) { + host_features = malloc(sizeof(LV2_Host_Feature)); + ((LV2_Host_Feature**)host_features)[0] = NULL; + } + + const char* const lib_uri = slv2_value_as_uri(slv2_plugin_get_ui_library_uri(plugin, ui)); + const char* const lib_path = slv2_uri_to_path(lib_uri); + + if (!lib_path) + return NULL; + + dlerror(); + void* lib = dlopen(lib_path, RTLD_NOW); + if (!lib) { + fprintf(stderr, "Unable to open UI library %s (%s)\n", lib_path, dlerror()); + return NULL; + } + + LV2UI_DescriptorFunction df = dlsym(lib, "lv2ui_descriptor"); + + if (!df) { + fprintf(stderr, "Could not find symbol 'lv2ui_descriptor', " + "%s is not a LV2 plugin UI.\n", lib_path); + dlclose(lib); + return NULL; + } else { + // Search for plugin by URI + + // FIXME: Bundle in plugin UI only, boo + const char* bundle_path = slv2_uri_to_path(slv2_plugin_get_bundle_uri(plugin)); + printf("UI bundle path: %s\n", bundle_path); + + for (uint32_t i=0; 1; ++i) { + + const LV2UI_Descriptor* ld = df(i); + + if (!ld) { + fprintf(stderr, "Did not find UI %s in %s\n", + slv2_value_as_uri(ui), lib_path); + dlclose(lib); + break; // return NULL + } else if (!strcmp(ld->URI, slv2_value_as_uri(ui))) { + + printf("Found UI %s at index %u in:\n\t%s\n\n", + librdf_uri_as_string(plugin->plugin_uri), i, lib_path); + + assert(ld->instantiate); + + // Create SLV2UIInstance to return + result = malloc(sizeof(struct _SLV2UIInstance)); + struct _SLV2UIInstanceImpl* impl = malloc(sizeof(struct _SLV2UIInstanceImpl)); + impl->lv2ui_descriptor = ld; + impl->lv2ui_handle = ld->instantiate(ld, + slv2_plugin_get_uri(plugin), + (char*)bundle_path, + write_function, + command_function, + program_function, + save_function, + controller, + &impl->widget, + host_features); + impl->lib_handle = lib; + result->pimpl = impl; + break; + } + } + } + + assert(result); + assert(slv2_plugin_get_num_ports(plugin) > 0); + + // Failed to instantiate + if (result->pimpl->lv2ui_handle == NULL) { + //printf("Failed to instantiate %s\n", plugin->plugin_uri); + free(result); + return NULL; + } + + // Failed to create a widget, but still got a handle - this means that + // the plugin is buggy + if (result->pimpl->widget == NULL) { + slv2_ui_instance_free(result); + return NULL; + } + + if (local_host_features) + free((LV2_Host_Feature**)host_features); + + return result; +} + + +void +slv2_ui_instance_free(SLV2UIInstance instance) +{ + struct _SLV2UIInstance* i = (struct _SLV2UIInstance*)instance; + i->pimpl->lv2ui_descriptor->cleanup(i->pimpl->lv2ui_handle); + i->pimpl->lv2ui_descriptor = NULL; + dlclose(i->pimpl->lib_handle); + i->pimpl->lib_handle = NULL; + free(i->pimpl); + i->pimpl = NULL; + free(i); +} + + +LV2UI_Widget +slv2_ui_instance_get_widget(SLV2UIInstance instance) { + return instance->pimpl->widget; +} + + +const LV2UI_Descriptor* +slv2_ui_instance_get_descriptor(SLV2UIInstance instance) { + return instance->pimpl->lv2ui_descriptor; +} + + +LV2_Handle +slv2_ui_instance_get_handle(SLV2UIInstance instance) { + return instance->pimpl->lv2ui_handle; +} + -- cgit v1.2.1