Zrythm
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
suil.h
Go to the documentation of this file.
1/*
2 Copyright 2011-2017 David Robillard <http://drobilla.net>
3
4 Permission to use, copy, modify, and/or distribute this software for any
5 purpose with or without fee is hereby granted, provided that the above
6 copyright notice and this permission notice appear in all copies.
7
8 THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
16 SPDX-License-Identifier: ISC
17*/
18
23#include "zrythm-config.h"
24
25#ifndef HAVE_SUIL
26
27#ifndef SUIL_SUIL_H
28#define SUIL_SUIL_H
29
30#include <assert.h>
31#include <stdio.h>
32#include <stdlib.h>
33#include <string.h>
34#include <stdbool.h>
35#include <stdint.h>
36
37#include "lv2/core/lv2.h"
38#include "lv2/ui/ui.h"
39
40#ifdef _WOE32
41#include <windows.h>
42#endif
43#include <dlfcn.h>
44
45#include <gtk/gtk.h>
46
47#define GTK2_UI_URI LV2_UI__GtkUI
48#define GTK3_UI_URI LV2_UI__Gtk3UI
49#define GTK4_UI_URI LV2_UI__Gtk4UI
50#define QT4_UI_URI LV2_UI__Qt4UI
51#define QT5_UI_URI LV2_UI__Qt5UI
52#define X11_UI_URI LV2_UI__X11UI
53#define WIN_UI_URI LV2_UI_PREFIX "WindowsUI"
54#define COCOA_UI_URI LV2_UI__CocoaUI
55
56#ifdef __cplusplus
57extern "C" {
58#endif
59
81typedef struct SuilHostImpl SuilHost;
82
84typedef struct SuilInstanceImpl SuilInstance;
85
87typedef void* SuilHandle;
88
90typedef void* SuilWidget;
91
100typedef void* SuilController;
101
103typedef void (*SuilPortWriteFunc)(
104 SuilController controller,
105 uint32_t port_index,
106 uint32_t buffer_size,
107 uint32_t protocol,
108 void const* buffer);
109
111typedef uint32_t (*SuilPortIndexFunc)(
112 SuilController controller,
113 const char* port_symbol);
114
116typedef uint32_t (*SuilPortSubscribeFunc)(
117 SuilController controller,
118 uint32_t port_index,
119 uint32_t protocol,
120 const LV2_Feature* const* features);
121
123typedef uint32_t (*SuilPortUnsubscribeFunc)(
124 SuilController controller,
125 uint32_t port_index,
126 uint32_t protocol,
127 const LV2_Feature* const* features);
128
130typedef void (*SuilTouchFunc)(
131 SuilController controller,
132 uint32_t port_index,
133 bool grabbed);
134
136typedef enum {
137 SUIL_ARG_NONE
138} SuilArg;
139
148void
149suil_init(int* argc, char*** argv, SuilArg key, ...);
150
158SuilHost*
160 SuilPortIndexFunc index_func,
161 SuilPortSubscribeFunc subscribe_func,
162 SuilPortUnsubscribeFunc unsubscribe_func);
163
169void
171 SuilTouchFunc touch_func);
172
176void
177suil_host_free(SuilHost* host);
178
188unsigned
189suil_ui_supported(const char* host_type_uri,
190 const char* ui_type_uri);
191
216SuilInstance*
217suil_instance_new(SuilHost* host,
218 SuilController controller,
219 const char* container_type_uri,
220 const char* plugin_uri,
221 const char* ui_uri,
222 const char* ui_type_uri,
223 const char* ui_bundle_path,
224 const char* ui_binary_path,
225 const LV2_Feature* const* features);
226
233void
234suil_instance_free(SuilInstance* instance);
235
246suil_instance_get_handle(SuilInstance* instance);
247
257suil_instance_get_widget(SuilInstance* instance);
258
275void
276suil_instance_port_event(SuilInstance* instance,
277 uint32_t port_index,
278 uint32_t buffer_size,
279 uint32_t format,
280 const void* buffer);
281
285const void*
286suil_instance_extension_data(SuilInstance* instance,
287 const char* uri);
288
292#ifdef __cplusplus
293} /* extern "C" */
294#endif
295
296#include "lv2/ui/ui.h"
297
298#define SUIL_ERRORF(fmt, ...) g_warning("suil error: " fmt, __VA_ARGS__)
299
301 SuilPortWriteFunc write_func;
302 SuilPortIndexFunc index_func;
303 SuilPortSubscribeFunc subscribe_func;
304 SuilPortUnsubscribeFunc unsubscribe_func;
305 SuilTouchFunc touch_func;
306 void* gtk_lib;
307 int argc;
308 char** argv;
309};
310
311struct _SuilWrapper;
312
313typedef void (*SuilWrapperFreeFunc)(struct _SuilWrapper*);
314
315typedef int (*SuilWrapperWrapFunc)(struct _SuilWrapper* wrapper,
316 SuilInstance* instance);
317
318typedef struct _SuilWrapper {
319 SuilWrapperWrapFunc wrap;
320 SuilWrapperFreeFunc free;
321 void* impl;
322 LV2UI_Resize resize;
324
326 void* lib_handle;
327 const LV2UI_Descriptor* descriptor;
328 LV2UI_Handle handle;
329 SuilWrapper* wrapper;
330 LV2_Feature** features;
331 LV2UI_Port_Map port_map;
332 LV2UI_Port_Subscribe port_subscribe;
333 LV2UI_Touch touch;
334 SuilWidget ui_widget;
335 SuilWidget host_widget;
336};
337
345typedef SuilWrapper* (*SuilWrapperNewFunc)(SuilHost* host,
346 const char* host_type_uri,
347 const char* ui_type_uri,
348 LV2_Feature*** features,
349 unsigned n_features);
350
353suil_wrapper_new_x11 (SuilHost* host,
354 const char* host_type_uri,
355 const char* ui_type_uri,
356 LV2_Feature*** features,
357 unsigned n_features);
358
359#ifdef __cplusplus
360extern "C" {
361#endif
364suil_wrapper_new_qt5 (SuilHost* host,
365 const char* host_type_uri,
366 const char* ui_type_uri,
367 LV2_Feature*** features,
368 unsigned n_features);
369
373 SuilHost* host,
374 const char* host_type_uri,
375 const char* ui_type_uri,
376 LV2_Feature*** features,
377 unsigned n_features);
378
382 SuilHost* host,
383 const char* host_type_uri,
384 const char* ui_type_uri,
385 LV2_Feature*** features,
386 unsigned n_features);
387#ifdef __cplusplus
388} // end extern "C"
389#endif
390
392void
394
395
396typedef void (*SuilVoidFunc)(void);
397
399static inline SuilVoidFunc
400suil_dlfunc(void* handle, const char* symbol)
401{
402#ifdef _WOE32
403 return (SuilVoidFunc)GetProcAddress((HMODULE)handle, (LPCSTR) symbol);
404#else
405 typedef SuilVoidFunc (*VoidFuncGetter)(void*, const char*);
406 VoidFuncGetter dlfunc = (VoidFuncGetter)dlsym;
407 return dlfunc(handle, symbol);
408#endif
409}
410
412static inline void
413suil_add_feature(LV2_Feature*** features,
414 unsigned* n,
415 const char* uri,
416 void* data)
417{
418 for (unsigned i = 0; i < *n && (*features)[i]; ++i) {
419 if (!strcmp((*features)[i]->URI, uri)) {
420 (*features)[i]->data = data;
421 return;
422 }
423 }
424
425 *features = (LV2_Feature**)realloc(*features,
426 sizeof(LV2_Feature*) * (*n + 2));
427
428 (*features)[*n] = (LV2_Feature*)malloc(sizeof(LV2_Feature));
429 (*features)[*n]->URI = uri;
430 (*features)[*n]->data = data;
431 (*features)[*n + 1] = NULL;
432 *n += 1;
433}
434
435#endif /* SUIL_SUIL_H */
436
437#endif /* ifndef HAVE_SUIL */
SuilHandle suil_instance_get_handle(SuilInstance *instance)
Get the handle for a UI instance.
SuilArg
Initialization argument.
Definition suil.h:136
void * SuilWidget
Opaque pointer to a UI widget.
Definition suil.h:90
void suil_init(int *argc, char ***argv, SuilArg key,...)
Initialize suil.
SuilHost * suil_host_new(SuilPortWriteFunc write_func, SuilPortIndexFunc index_func, SuilPortSubscribeFunc subscribe_func, SuilPortUnsubscribeFunc unsubscribe_func)
Create a new UI host descriptor.
void suil_host_set_touch_func(SuilHost *host, SuilTouchFunc touch_func)
Set a touch function for a host descriptor.
void suil_host_free(SuilHost *host)
Free host.
uint32_t(* SuilPortIndexFunc)(SuilController controller, const char *port_symbol)
Function to return the index for a port by symbol.
Definition suil.h:111
uint32_t(* SuilPortUnsubscribeFunc)(SuilController controller, uint32_t port_index, uint32_t protocol, const LV2_Feature *const *features)
Function to unsubscribe from notifications for a port.
Definition suil.h:123
void suil_instance_free(SuilInstance *instance)
Free a plugin UI instance.
unsigned suil_ui_supported(const char *host_type_uri, const char *ui_type_uri)
Check if suil can wrap a UI type.
SuilInstance * suil_instance_new(SuilHost *host, SuilController controller, const char *container_type_uri, const char *plugin_uri, const char *ui_uri, const char *ui_type_uri, const char *ui_bundle_path, const char *ui_binary_path, const LV2_Feature *const *features)
Instantiate a UI for an LV2 plugin.
void * SuilHandle
Opaque pointer to a UI handle.
Definition suil.h:87
SuilWidget suil_instance_get_widget(SuilInstance *instance)
Get the widget for a UI instance.
void * SuilController
UI controller.
Definition suil.h:100
void suil_instance_port_event(SuilInstance *instance, uint32_t port_index, uint32_t buffer_size, uint32_t format, const void *buffer)
Notify the UI about a change in a plugin port.
uint32_t(* SuilPortSubscribeFunc)(SuilController controller, uint32_t port_index, uint32_t protocol, const LV2_Feature *const *features)
Function to subscribe to notifications for a port.
Definition suil.h:116
const void * suil_instance_extension_data(SuilInstance *instance, const char *uri)
Return a data structure defined by some LV2 extension URI.
void(* SuilPortWriteFunc)(SuilController controller, uint32_t port_index, uint32_t buffer_size, uint32_t protocol, void const *buffer)
Function to write/send a value to a port.
Definition suil.h:103
void(* SuilTouchFunc)(SuilController controller, uint32_t port_index, bool grabbed)
Function called when a control is grabbed or released.
Definition suil.h:130
String utilities.
UI host descriptor.
Definition suil.h:300
An instance of an LV2 plugin UI.
Definition suil.h:325
SuilWrapper * suil_wrapper_new_cocoa(SuilHost *host, const char *host_type_uri, const char *ui_type_uri, LV2_Feature ***features, unsigned n_features)
Prototype for suil_wrapper_new in each wrapper module.
void suil_host_init(void)
Prototype for suil_host_init in each init module.
SuilWrapper * suil_wrapper_new_qt5(SuilHost *host, const char *host_type_uri, const char *ui_type_uri, LV2_Feature ***features, unsigned n_features)
Prototype for suil_wrapper_new in each wrapper module.
SuilWrapper * suil_wrapper_new_woe(SuilHost *host, const char *host_type_uri, const char *ui_type_uri, LV2_Feature ***features, unsigned n_features)
Prototype for suil_wrapper_new in each wrapper module.
SuilWrapper * suil_wrapper_new_x11(SuilHost *host, const char *host_type_uri, const char *ui_type_uri, LV2_Feature ***features, unsigned n_features)
Prototype for suil_wrapper_new in each wrapper module.