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/pluginuiinstance.c | 175 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 src/pluginuiinstance.c (limited to 'src/pluginuiinstance.c') 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