diff options
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/eg-sampler.lv2/sampler_ui.c | 181 | 
1 files changed, 181 insertions, 0 deletions
diff --git a/plugins/eg-sampler.lv2/sampler_ui.c b/plugins/eg-sampler.lv2/sampler_ui.c new file mode 100644 index 0000000..1895f22 --- /dev/null +++ b/plugins/eg-sampler.lv2/sampler_ui.c @@ -0,0 +1,181 @@ +/* +  LV2 Sampler Example Plugin UI +  Copyright 2011 David Robillard <d@drobilla.net> + +  Permission to use, copy, modify, and/or distribute this software for any +  purpose with or without fee is hereby granted, provided that the above +  copyright notice and this permission notice appear in all copies. + +  THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** +   @file ui.c Sampler Plugin UI +*/ + +#include <stdlib.h> + +#include <gtk/gtk.h> + +#include "lv2/lv2plug.in/ns/ext/atom/atom-helpers.h" +#include "lv2/lv2plug.in/ns/ext/atom/atom.h" +#include "lv2/lv2plug.in/ns/ext/uri-map/uri-map.h" +#include "lv2/lv2plug.in/ns/extensions/ui/ui.h" + +#define NS_ATOM "http://lv2plug.in/ns/ext/atom#" + +#define SAMPLER_URI    "http://lv2plug.in/plugins/eg-sampler" +#define SAMPLER_UI_URI "http://lv2plug.in/plugins/eg-sampler#ui" +#define MIDI_EVENT_URI "http://lv2plug.in/ns/ext/midi#MidiEvent" +#define FILENAME_URI   SAMPLER_URI "#filename" +#define STRING_BUF     8192 + +typedef struct { +	LV2_URI_Map_Feature* uri_map; + +	LV2UI_Write_Function write; +	LV2UI_Controller     controller; + +	GtkWidget*           button; +} SamplerUI; + +static uint32_t +uri_to_id(SamplerUI* ui, const char* uri) +{ +	return ui->uri_map->uri_to_id(ui->uri_map->callback_data, +	                              NULL, uri); +} + +static void +on_load_clicked(GtkWidget* widget, +                void*      handle) +{ +	SamplerUI* ui = (SamplerUI*)handle; + +	GtkWidget* dialog = gtk_file_chooser_dialog_new( +		"Load Sample", +		NULL, +		GTK_FILE_CHOOSER_ACTION_OPEN, +		GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, +		GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, +		NULL); + +	if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { +		char* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); +		const size_t filename_len = strlen(filename); +		fprintf(stderr, "LOAD SAMPLE %s\n", filename); +		const size_t msg_size = sizeof(LV2_Atom) +			+ sizeof(LV2_Object) +			+ sizeof(LV2_Atom_Property) +			+ filename_len + 1;; + +		uint8_t buf[msg_size]; +		LV2_Atom* msg = (LV2_Atom*)buf; + +		msg->type = uri_to_id(ui, NS_ATOM "Blank"); +		msg->size = 0; +		LV2_Object* obj = (LV2_Object*)msg->body; +		obj->context = 0; +		obj->id = 0; + +		lv2_atom_append_property(msg, +		                         uri_to_id(ui, FILENAME_URI), +		                         uri_to_id(ui, NS_ATOM "String"), +		                         filename_len + 1, +		                         (const uint8_t*)filename); + +		//ui->write(ui->controller, +		//          0, +		           +		                                    +		                          +	} +} + +static LV2UI_Handle +instantiate(const LV2UI_Descriptor*   descriptor, +            const char*               plugin_uri, +            const char*               bundle_path, +            LV2UI_Write_Function      write_function, +            LV2UI_Controller          controller, +            LV2UI_Widget*             widget, +            const LV2_Feature* const* features) +{ +	SamplerUI* ui = (SamplerUI*)malloc(sizeof(SamplerUI)); +	ui->uri_map    = NULL; +	ui->write      = write_function; +	ui->controller = controller; +	ui->button     = NULL; + +	*widget = NULL; + +	for (int i = 0; features[i]; ++i) { +		if (strcmp(features[i]->URI, LV2_URI_MAP_URI) == 0) { +			ui->uri_map = (LV2_URI_Map_Feature*)features[i]->data; +		} +	} + +	if (!ui->uri_map) { +		fprintf(stderr, "sampler_ui: Host does not support uri-map\n"); +		free(ui); +		return NULL; +	} + +	ui->button = gtk_button_new_with_label("Load Sample"); +	g_signal_connect(ui->button, "clicked", +	                 G_CALLBACK(on_load_clicked), +	                 ui); + +	*widget = ui->button; + +	return ui; +} + +static void +cleanup(LV2UI_Handle handle) +{ +	SamplerUI* ui = (SamplerUI*)handle; +	gtk_widget_destroy(ui->button); +	free(ui); +} + +static void +port_event(LV2UI_Handle handle, +           uint32_t     port_index, +           uint32_t     buffer_size, +           uint32_t     format, +           const void*  buffer) +{ +} + +const void* +extension_data(const char* uri) +{ +	return NULL; +} + +static const LV2UI_Descriptor descriptor = { +	SAMPLER_UI_URI, +	instantiate, +	cleanup, +	port_event, +	extension_data +}; + +LV2_SYMBOL_EXPORT +const LV2UI_Descriptor* +lv2ui_descriptor(uint32_t index) +{ +	switch (index) { +	case 0: +		return &descriptor; +	default: +		return NULL; +	} +}  |