aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/eg-sampler.lv2/sampler_ui.c181
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;
+ }
+}