aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/eg-params.lv2/state_map.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/eg-params.lv2/state_map.h')
-rw-r--r--plugins/eg-params.lv2/state_map.h102
1 files changed, 0 insertions, 102 deletions
diff --git a/plugins/eg-params.lv2/state_map.h b/plugins/eg-params.lv2/state_map.h
deleted file mode 100644
index c81ea29..0000000
--- a/plugins/eg-params.lv2/state_map.h
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2016 David Robillard <d@drobilla.net>
-// SPDX-License-Identifier: ISC
-
-#include <lv2/atom/atom.h>
-#include <lv2/urid/urid.h>
-
-#include <stdarg.h>
-#include <stdint.h>
-#include <stdlib.h>
-
-/** Entry in an array that serves as a dictionary of properties. */
-typedef struct {
- const char* uri;
- LV2_URID urid;
- LV2_Atom* value;
-} StateMapItem;
-
-/** Comparator for StateMapItems sorted by URID. */
-static int
-state_map_cmp(const void* a, const void* b)
-{
- const StateMapItem* ka = (const StateMapItem*)a;
- const StateMapItem* kb = (const StateMapItem*)b;
- if (ka->urid < kb->urid) {
- return -1;
- }
-
- if (kb->urid < ka->urid) {
- return 1;
- }
-
- return 0;
-}
-
-/** Helper macro for terse state map initialisation. */
-#define STATE_MAP_INIT(type, ptr) \
- (LV2_ATOM__##type), (sizeof(*(ptr)) - sizeof(LV2_Atom)), (ptr)
-
-/**
- Initialise a state map.
-
- The variable parameters list must be NULL terminated, and is a sequence of
- const char* uri, const char* type, uint32_t size, LV2_Atom* value. The
- value must point to a valid atom that resides elsewhere, the state map is
- only an index and does not contain actual state values. The macro
- STATE_MAP_INIT can be used to make simpler code when state is composed of
- standard atom types, for example:
-
- struct Plugin {
- LV2_URID_Map* map;
- StateMapItem props[3];
- // ...
- };
-
- state_map_init(
- self->props, self->map, self->map->handle,
- PLUG_URI "#gain", STATE_MAP_INIT(Float, &state->gain),
- PLUG_URI "#offset", STATE_MAP_INIT(Int, &state->offset),
- PLUG_URI "#file", STATE_MAP_INIT(Path, &state->file),
- NULL);
-*/
-static void
-state_map_init(
- StateMapItem dict[],
- LV2_URID_Map* map,
- LV2_URID_Map_Handle handle,
- /* const char* uri, const char* type, uint32_t size, LV2_Atom* value */...)
-{
- // Set dict entries from parameters
- unsigned i = 0;
- va_list args; // NOLINT(cppcoreguidelines-init-variables)
- va_start(args, handle);
- for (const char* uri = NULL; (uri = va_arg(args, const char*)); ++i) {
- const char* type = va_arg(args, const char*);
- const uint32_t size = va_arg(args, uint32_t);
- LV2_Atom* const value = va_arg(args, LV2_Atom*);
- dict[i].uri = uri;
- dict[i].urid = map->map(map->handle, uri);
- dict[i].value = value;
- dict[i].value->size = size;
- dict[i].value->type = map->map(map->handle, type);
- }
- va_end(args);
-
- // Sort for fast lookup by URID by state_map_find()
- qsort(dict, i, sizeof(StateMapItem), state_map_cmp);
-}
-
-/**
- Retrieve an item from a state map by URID.
-
- This takes O(lg(n)) time, and is useful for implementing generic property
- access with little code, for example to respond to patch:Get messages for a
- specific property.
-*/
-static StateMapItem*
-state_map_find(StateMapItem dict[], uint32_t n_entries, LV2_URID urid)
-{
- const StateMapItem key = {NULL, urid, NULL};
- return (StateMapItem*)bsearch(
- &key, dict, n_entries, sizeof(StateMapItem), state_map_cmp);
-}