Move ccmap in common LV2

This commit is contained in:
Jean Pierre Cimalando 2021-04-05 02:31:46 +02:00
parent f827f86a25
commit 67b08f6663
4 changed files with 90 additions and 67 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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;
}

View file

@ -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 {};