Move ccmap in common LV2
This commit is contained in:
parent
f827f86a25
commit
67b08f6663
4 changed files with 90 additions and 67 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {};
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue