From 67b08f666392146574b443e7b2f448e4ddad2f19 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Mon, 5 Apr 2021 02:31:46 +0200 Subject: [PATCH] Move ccmap in common LV2 --- plugins/lv2/sfizz.cpp | 66 ++------------------------ plugins/lv2/sfizz_lv2.h | 7 +++ plugins/lv2/sfizz_lv2_common.cpp | 79 ++++++++++++++++++++++++++++++++ plugins/lv2/sfizz_lv2_plugin.h | 5 +- 4 files changed, 90 insertions(+), 67 deletions(-) diff --git a/plugins/lv2/sfizz.cpp b/plugins/lv2/sfizz.cpp index deb6ee73..5c159587 100644 --- a/plugins/lv2/sfizz.cpp +++ b/plugins/lv2/sfizz.cpp @@ -329,65 +329,6 @@ sfizz_lv2_receive_message(void* data, int delay, const char* path, const char* s (void)write_ok; } -static void -sfizz_lv2_setup_cc_parameters(sfizz_plugin_t* self) -{ - // store the associations between CC number and parameter URID - // construct it trivially in the form of a tabulated perfect hash function - - LV2_URID* cc_to_urid = new LV2_URID[sfz::config::numCCs]; - int* urid_to_cc; - int urid_to_cc_size; - - LV2_URID min_cc_urid {}; - LV2_URID max_cc_urid {}; - for (int cc = 0; cc < sfz::config::numCCs; ++cc) { - char name[256]; - sprintf(name, SFIZZ_URI "#cc%03d", cc); - LV2_URID urid = self->map->map(self->map->handle, name); - if (cc == 0) { - min_cc_urid = urid; - max_cc_urid = urid; - } - else { - min_cc_urid = (urid < min_cc_urid) ? urid : min_cc_urid; - max_cc_urid = (urid > max_cc_urid) ? urid : max_cc_urid; - } - cc_to_urid[cc] = urid; - } - - urid_to_cc_size = max_cc_urid - min_cc_urid + 1; - urid_to_cc = new int[urid_to_cc_size]; - - for (int i = 0; i < urid_to_cc_size; ++i) - urid_to_cc[i] = -1; - - for (int cc = 0; cc < sfz::config::numCCs; ++cc) { - LV2_URID urid = cc_to_urid[cc]; - urid_to_cc[urid - min_cc_urid] = cc; - } - - self->cc_to_urid = cc_to_urid; - self->urid_to_cc = urid_to_cc; - self->min_cc_urid = min_cc_urid; - self->max_cc_urid = max_cc_urid; -} - -static int -sfizz_lv2_get_cc_from_parameter_urid(const sfizz_plugin_t* self, LV2_URID urid) -{ - int cc = -1; - if (urid >= self->min_cc_urid && urid <= self->max_cc_urid) - cc = self->urid_to_cc[urid - self->min_cc_urid]; - return cc; -} - -static LV2_URID -sfizz_lv2_get_parameter_urid_from_cc(const sfizz_plugin_t* self, int cc) -{ - return self->cc_to_urid[cc]; -} - static LV2_Handle instantiate(const LV2_Descriptor *descriptor, double rate, @@ -535,7 +476,7 @@ instantiate(const LV2_Descriptor *descriptor, return NULL; } - sfizz_lv2_setup_cc_parameters(self); + self->ccmap = sfizz_lv2_ccmap_create(self->map); self->synth = sfizz_create_synth(); self->client = sfizz_create_client(self); @@ -562,8 +503,7 @@ cleanup(LV2_Handle instance) spin_mutex_destroy(self->synth_mutex); sfizz_delete_client(self->client); sfizz_free(self->synth); - delete[] self->cc_to_urid; - delete[] self->urid_to_cc; + sfizz_lv2_ccmap_free(self->ccmap); delete self; } @@ -638,7 +578,7 @@ sfizz_lv2_handle_atom_object(sfizz_plugin_t *self, const LV2_Atom_Object *obj) char body[MAX_PATH_SIZE]; } sfizz_path_atom_buffer_t; - int cc = sfizz_lv2_get_cc_from_parameter_urid(self, key); + int cc = sfizz_lv2_ccmap_unmap(self->ccmap, key); if (cc != -1) { if (atom->type == self->atom_float_uri && atom->size == sizeof(float)) { float value = *(const float *)LV2_ATOM_BODY_CONST(atom); diff --git a/plugins/lv2/sfizz_lv2.h b/plugins/lv2/sfizz_lv2.h index 68cb03be..5d82be52 100644 --- a/plugins/lv2/sfizz_lv2.h +++ b/plugins/lv2/sfizz_lv2.h @@ -85,3 +85,10 @@ struct sfizz_plugin_t; bool sfizz_lv2_fetch_description( sfizz_plugin_t *self, const int *serial, uint8_t **descp, uint32_t *sizep, int *serialp); + +// Mapping URID to CC and vice-versa +struct sfizz_lv2_ccmap; +sfizz_lv2_ccmap *sfizz_lv2_ccmap_create(LV2_URID_Map* map); +void sfizz_lv2_ccmap_free(sfizz_lv2_ccmap *ccmap); +LV2_URID sfizz_lv2_ccmap_map(const sfizz_lv2_ccmap *ccmap, int cc); +int sfizz_lv2_ccmap_unmap(const sfizz_lv2_ccmap *ccmap, LV2_URID urid); diff --git a/plugins/lv2/sfizz_lv2_common.cpp b/plugins/lv2/sfizz_lv2_common.cpp index ea6562bb..702557b7 100644 --- a/plugins/lv2/sfizz_lv2_common.cpp +++ b/plugins/lv2/sfizz_lv2_common.cpp @@ -6,6 +6,7 @@ #include "sfizz_lv2.h" #include "sfizz_lv2_plugin.h" +#include "sfizz/Config.h" bool sfizz_lv2_fetch_description( sfizz_plugin_t *self, const int *serial, @@ -29,3 +30,81 @@ bool sfizz_lv2_fetch_description( return true; } + +struct sfizz_lv2_ccmap { + LV2_URID *cc_to_urid; + int *urid_to_cc; + LV2_URID min_cc_urid; + LV2_URID max_cc_urid; +}; + +sfizz_lv2_ccmap * +sfizz_lv2_ccmap_create(LV2_URID_Map* map) +{ + // store the associations between CC number and parameter URID + // construct it trivially in the form of a tabulated perfect hash function + + LV2_URID* cc_to_urid = new LV2_URID[sfz::config::numCCs]; + int* urid_to_cc; + int urid_to_cc_size; + + LV2_URID min_cc_urid {}; + LV2_URID max_cc_urid {}; + for (int cc = 0; cc < sfz::config::numCCs; ++cc) { + char name[256]; + sprintf(name, SFIZZ_URI "#cc%03d", cc); + LV2_URID urid = map->map(map->handle, name); + if (cc == 0) { + min_cc_urid = urid; + max_cc_urid = urid; + } + else { + min_cc_urid = (urid < min_cc_urid) ? urid : min_cc_urid; + max_cc_urid = (urid > max_cc_urid) ? urid : max_cc_urid; + } + cc_to_urid[cc] = urid; + } + + urid_to_cc_size = max_cc_urid - min_cc_urid + 1; + urid_to_cc = new int[urid_to_cc_size]; + + for (int i = 0; i < urid_to_cc_size; ++i) + urid_to_cc[i] = -1; + + for (int cc = 0; cc < sfz::config::numCCs; ++cc) { + LV2_URID urid = cc_to_urid[cc]; + urid_to_cc[urid - min_cc_urid] = cc; + } + + sfizz_lv2_ccmap *self = new sfizz_lv2_ccmap; + self->cc_to_urid = cc_to_urid; + self->urid_to_cc = urid_to_cc; + self->min_cc_urid = min_cc_urid; + self->max_cc_urid = max_cc_urid; + return self; +} + +void sfizz_lv2_ccmap_free(sfizz_lv2_ccmap *ccmap) +{ + if (ccmap) { + delete[] ccmap->cc_to_urid; + delete[] ccmap->urid_to_cc; + delete ccmap; + } +} + +LV2_URID sfizz_lv2_ccmap_map(sfizz_lv2_ccmap *ccmap, int cc) +{ + LV2_URID urid = 0; + if (cc >= 0 && cc < sfz::config::numCCs) + urid = ccmap->cc_to_urid[cc]; + return urid; +} + +int sfizz_lv2_ccmap_unmap(const sfizz_lv2_ccmap *ccmap, LV2_URID urid) +{ + int cc = -1; + if (urid >= ccmap->min_cc_urid && urid <= ccmap->max_cc_urid) + cc = ccmap->urid_to_cc[urid - ccmap->min_cc_urid]; + return cc; +} diff --git a/plugins/lv2/sfizz_lv2_plugin.h b/plugins/lv2/sfizz_lv2_plugin.h index 638fb106..ff4fd23b 100644 --- a/plugins/lv2/sfizz_lv2_plugin.h +++ b/plugins/lv2/sfizz_lv2_plugin.h @@ -93,10 +93,7 @@ struct sfizz_plugin_t LV2_URID time_speed_uri {}; // CC parameters - LV2_URID* cc_to_urid {}; - int* urid_to_cc {}; - LV2_URID min_cc_urid {}; - LV2_URID max_cc_urid {}; + sfizz_lv2_ccmap* ccmap {}; // Sfizz related data sfizz_synth_t *synth {};