aboutsummaryrefslogtreecommitdiffstats
path: root/src/control.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/control.h')
-rw-r--r--src/control.h56
1 files changed, 55 insertions, 1 deletions
diff --git a/src/control.h b/src/control.h
index 037ef31..e638d10 100644
--- a/src/control.h
+++ b/src/control.h
@@ -4,13 +4,14 @@
#ifndef JALV_CONTROL_H
#define JALV_CONTROL_H
-#include "jalv_internal.h"
#include "nodes.h"
#include "lilv/lilv.h"
#include "lv2/atom/forge.h"
#include "lv2/urid/urid.h"
+#include <stdbool.h>
+#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
@@ -19,10 +20,62 @@ extern "C" {
// Plugin control utilities
+/// Type of plugin control
+typedef enum {
+ PORT, ///< Control port
+ PROPERTY ///< Property (set via atom message)
+} ControlType;
+
+// "Interesting" value in a control's value range
+typedef struct {
+ float value;
+ char* label;
+} ScalePoint;
+
+/// Plugin control
+typedef struct {
+ ControlType type; ///< Type of control
+ LilvNode* node; ///< Port or property
+ LilvNode* symbol; ///< Symbol
+ LilvNode* label; ///< Human readable label
+ LV2_Atom_Forge* forge; ///< Forge (for URIDs)
+ LV2_URID property; ///< Iff type == PROPERTY
+ uint32_t index; ///< Iff type == PORT
+ LilvNode* group; ///< Port/control group, or NULL
+ void* widget; ///< Control Widget
+ size_t n_points; ///< Number of scale points
+ ScalePoint* points; ///< Scale points
+ LV2_URID value_type; ///< Type of control value
+ LilvNode* min; ///< Minimum value
+ LilvNode* max; ///< Maximum value
+ LilvNode* def; ///< Default value
+ bool is_toggle; ///< Boolean (0 and 1 only)
+ bool is_integer; ///< Integer values only
+ bool is_enumeration; ///< Point values only
+ bool is_logarithmic; ///< Logarithmic scale
+ bool is_writable; ///< Writable (input)
+ bool is_readable; ///< Readable (output)
+} ControlID;
+
+/// Set of plugin controls
+typedef struct {
+ size_t n_controls;
+ ControlID** controls;
+} Controls;
+
+/// Control change event, sent through ring buffers for UI updates
+typedef struct {
+ uint32_t index;
+ uint32_t protocol;
+ uint32_t size;
+ // Followed immediately by size bytes of data
+} ControlChange;
+
/// Order scale points by value
int
scale_point_cmp(const ScalePoint* a, const ScalePoint* b);
+/// Create a new ID for a control port
ControlID*
new_port_control(LilvWorld* world,
const LilvPlugin* plugin,
@@ -32,6 +85,7 @@ new_port_control(LilvWorld* world,
const JalvNodes* nodes,
LV2_Atom_Forge* forge);
+/// Create a new ID for a property-based parameter
ControlID*
new_property_control(LilvWorld* world,
const LilvNode* property,