lv2: A6 workaround, single output atom port

Previously, some `patch:Set` messages were directed to a distinct atom
port, when it was for notification purposes rather than automation.

Ardour does not support this, and the ports get assigned the same
buffer, producing corruption.

This commit returns to single-port behavior, and instead replaces
`patch:Set` notification messages with `sfizz:Notify` custom objects;
the UI processes these messages all the same, and they does not trigger
automation in the host.
This commit is contained in:
Jean Pierre Cimalando 2021-06-22 00:45:44 +02:00
parent 59706d84da
commit 5ed281c6a4
5 changed files with 62 additions and 76 deletions

View file

@ -123,6 +123,7 @@ sfizz_lv2_map_required_uris(sfizz_plugin_t *self)
self->sfizz_log_status_uri = map->map(map->handle, SFIZZ__logStatus); self->sfizz_log_status_uri = map->map(map->handle, SFIZZ__logStatus);
self->sfizz_check_modification_uri = map->map(map->handle, SFIZZ__checkModification); self->sfizz_check_modification_uri = map->map(map->handle, SFIZZ__checkModification);
self->sfizz_osc_blob_uri = map->map(map->handle, SFIZZ__OSCBlob); self->sfizz_osc_blob_uri = map->map(map->handle, SFIZZ__OSCBlob);
self->sfizz_notify_uri = map->map(map->handle, SFIZZ__Notify);
self->sfizz_audio_level_uri = map->map(map->handle, SFIZZ__AudioLevel); self->sfizz_audio_level_uri = map->map(map->handle, SFIZZ__AudioLevel);
self->time_position_uri = map->map(map->handle, LV2_TIME__Position); self->time_position_uri = map->map(map->handle, LV2_TIME__Position);
self->time_bar_uri = map->map(map->handle, LV2_TIME__bar); self->time_bar_uri = map->map(map->handle, LV2_TIME__bar);
@ -200,9 +201,6 @@ connect_port(LV2_Handle instance,
case SFIZZ_CONTROL: case SFIZZ_CONTROL:
self->control_port = (const LV2_Atom_Sequence *)data; self->control_port = (const LV2_Atom_Sequence *)data;
break; break;
case SFIZZ_NOTIFY:
self->notify_port = (LV2_Atom_Sequence *)data;
break;
case SFIZZ_AUTOMATE: case SFIZZ_AUTOMATE:
self->automate_port = (LV2_Atom_Sequence *)data; self->automate_port = (LV2_Atom_Sequence *)data;
break; break;
@ -331,7 +329,7 @@ sfizz_lv2_receive_message(void* data, int delay, const char* path, const char* s
if (osc_size > OSC_TEMP_SIZE) if (osc_size > OSC_TEMP_SIZE)
return; return;
LV2_Atom_Forge* forge = &self->forge_notify; LV2_Atom_Forge* forge = &self->forge_automate;
bool write_ok = bool write_ok =
lv2_atom_forge_frame_time(forge, 0) && lv2_atom_forge_frame_time(forge, 0) &&
lv2_atom_forge_atom(forge, osc_size, self->sfizz_osc_blob_uri) && lv2_atom_forge_atom(forge, osc_size, self->sfizz_osc_blob_uri) &&
@ -439,7 +437,6 @@ instantiate(const LV2_Descriptor *descriptor,
sfizz_lv2_map_required_uris(self); sfizz_lv2_map_required_uris(self);
// Initialize the forge // Initialize the forge
lv2_atom_forge_init(&self->forge_notify, self->map);
lv2_atom_forge_init(&self->forge_automate, self->map); lv2_atom_forge_init(&self->forge_automate, self->map);
lv2_atom_forge_init(&self->forge_secondary, self->map); lv2_atom_forge_init(&self->forge_secondary, self->map);
@ -545,13 +542,14 @@ deactivate(LV2_Handle instance)
} }
static void static void
sfizz_lv2_send_file_path(sfizz_plugin_t *self, LV2_Atom_Forge* forge, LV2_URID urid, const char *path) sfizz_lv2_send_file_path(sfizz_plugin_t *self, LV2_URID verb_uri, LV2_URID urid, const char *path)
{ {
LV2_Atom_Forge_Frame frame; LV2_Atom_Forge_Frame frame;
LV2_Atom_Forge* forge = &self->forge_automate;
bool write_ok = bool write_ok =
lv2_atom_forge_frame_time(forge, 0) && lv2_atom_forge_frame_time(forge, 0) &&
lv2_atom_forge_object(forge, &frame, 0, self->patch_set_uri) && lv2_atom_forge_object(forge, &frame, 0, verb_uri) &&
lv2_atom_forge_key(forge, self->patch_property_uri) && lv2_atom_forge_key(forge, self->patch_property_uri) &&
lv2_atom_forge_urid(forge, urid) && lv2_atom_forge_urid(forge, urid) &&
lv2_atom_forge_key(forge, self->patch_value_uri) && lv2_atom_forge_key(forge, self->patch_value_uri) &&
@ -562,14 +560,15 @@ sfizz_lv2_send_file_path(sfizz_plugin_t *self, LV2_Atom_Forge* forge, LV2_URID u
} }
static void static void
sfizz_lv2_send_controller(sfizz_plugin_t *self, LV2_Atom_Forge* forge, unsigned cc, float value) sfizz_lv2_send_controller(sfizz_plugin_t *self, LV2_URID verb_uri, unsigned cc, float value)
{ {
LV2_URID urid = sfizz_lv2_ccmap_map(self->ccmap, int(cc)); LV2_URID urid = sfizz_lv2_ccmap_map(self->ccmap, int(cc));
LV2_Atom_Forge_Frame frame; LV2_Atom_Forge_Frame frame;
LV2_Atom_Forge* forge = &self->forge_automate;
bool write_ok = bool write_ok =
lv2_atom_forge_frame_time(forge, 0) && lv2_atom_forge_frame_time(forge, 0) &&
lv2_atom_forge_object(forge, &frame, 0, self->patch_set_uri) && lv2_atom_forge_object(forge, &frame, 0, verb_uri) &&
lv2_atom_forge_key(forge, self->patch_property_uri) && lv2_atom_forge_key(forge, self->patch_property_uri) &&
lv2_atom_forge_urid(forge, urid) && lv2_atom_forge_urid(forge, urid) &&
lv2_atom_forge_key(forge, self->patch_value_uri) && lv2_atom_forge_key(forge, self->patch_value_uri) &&
@ -581,11 +580,12 @@ sfizz_lv2_send_controller(sfizz_plugin_t *self, LV2_Atom_Forge* forge, unsigned
#if defined(SFIZZ_LV2_UI) #if defined(SFIZZ_LV2_UI)
static void static void
sfizz_lv2_send_levels(sfizz_plugin_t *self, LV2_Atom_Forge* forge, float left, float right) sfizz_lv2_send_levels(sfizz_plugin_t *self, float left, float right)
{ {
const float levels[] = {left, right}; const float levels[] = {left, right};
uint32_t num_levels = sizeof(levels) / sizeof(levels[0]); uint32_t num_levels = sizeof(levels) / sizeof(levels[0]);
LV2_Atom_Forge* forge = &self->forge_automate;
bool write_ok = lv2_atom_forge_frame_time(forge, 0); bool write_ok = lv2_atom_forge_frame_time(forge, 0);
LV2_Atom_Vector *vector = nullptr; LV2_Atom_Vector *vector = nullptr;
@ -871,7 +871,7 @@ static void
run(LV2_Handle instance, uint32_t sample_count) run(LV2_Handle instance, uint32_t sample_count)
{ {
sfizz_plugin_t *self = (sfizz_plugin_t *)instance; sfizz_plugin_t *self = (sfizz_plugin_t *)instance;
assert(self->control_port && self->notify_port && self->automate_port); assert(self->control_port && self->automate_port);
if (!spin_mutex_trylock(self->synth_mutex)) if (!spin_mutex_trylock(self->synth_mutex))
{ {
@ -881,15 +881,10 @@ run(LV2_Handle instance, uint32_t sample_count)
} }
// Set up dedicated forges to write on their respective ports. // Set up dedicated forges to write on their respective ports.
const size_t notify_capacity = self->notify_port->atom.size;
lv2_atom_forge_set_buffer(&self->forge_notify, (uint8_t *)self->notify_port, notify_capacity);
const size_t automate_capacity = self->automate_port->atom.size; const size_t automate_capacity = self->automate_port->atom.size;
lv2_atom_forge_set_buffer(&self->forge_automate, (uint8_t *)self->automate_port, automate_capacity); lv2_atom_forge_set_buffer(&self->forge_automate, (uint8_t *)self->automate_port, automate_capacity);
// Start sequences in the respective output ports. // Start sequences in the respective output ports.
LV2_Atom_Forge_Frame notify_frame;
if (!lv2_atom_forge_sequence_head(&self->forge_notify, &notify_frame, 0))
assert(false);
LV2_Atom_Forge_Frame automate_frame; LV2_Atom_Forge_Frame automate_frame;
if (!lv2_atom_forge_sequence_head(&self->forge_automate, &automate_frame, 0)) if (!lv2_atom_forge_sequence_head(&self->forge_automate, &automate_frame, 0))
assert(false); assert(false);
@ -913,25 +908,25 @@ run(LV2_Handle instance, uint32_t sample_count)
lv2_atom_object_get(obj, self->patch_property_uri, &property, 0); lv2_atom_object_get(obj, self->patch_property_uri, &property, 0);
if (!property) // Send the full state if (!property) // Send the full state
{ {
sfizz_lv2_send_file_path(self, &self->forge_notify, self->sfizz_sfz_file_uri, self->sfz_file_path); sfizz_lv2_send_file_path(self, self->sfizz_notify_uri, self->sfizz_sfz_file_uri, self->sfz_file_path);
sfizz_lv2_send_file_path(self, &self->forge_notify, self->sfizz_scala_file_uri, self->scala_file_path); sfizz_lv2_send_file_path(self, self->sfizz_notify_uri, self->sfizz_scala_file_uri, self->scala_file_path);
for (unsigned cc = 0; cc < sfz::config::numCCs; ++cc) for (unsigned cc = 0; cc < sfz::config::numCCs; ++cc)
sfizz_lv2_send_controller(self, &self->forge_notify, cc, self->cc_current[cc]); sfizz_lv2_send_controller(self, self->sfizz_notify_uri, cc, self->cc_current[cc]);
} }
else if (property->body == self->sfizz_sfz_file_uri) else if (property->body == self->sfizz_sfz_file_uri)
{ {
sfizz_lv2_send_file_path(self, &self->forge_notify, self->sfizz_sfz_file_uri, self->sfz_file_path); sfizz_lv2_send_file_path(self, self->sfizz_notify_uri, self->sfizz_sfz_file_uri, self->sfz_file_path);
} }
else if (property->body == self->sfizz_scala_file_uri) else if (property->body == self->sfizz_scala_file_uri)
{ {
sfizz_lv2_send_file_path(self, &self->forge_notify, self->sfizz_scala_file_uri, self->scala_file_path); sfizz_lv2_send_file_path(self, self->sfizz_notify_uri, self->sfizz_scala_file_uri, self->scala_file_path);
} }
else else
{ {
int cc = sfizz_lv2_ccmap_unmap(self->ccmap, property->body); int cc = sfizz_lv2_ccmap_unmap(self->ccmap, property->body);
if (cc != -1) if (cc != -1)
sfizz_lv2_send_controller(self, &self->forge_notify, unsigned(cc), self->cc_current[cc]); sfizz_lv2_send_controller(self, self->sfizz_notify_uri, unsigned(cc), self->cc_current[cc]);
} }
} }
else if (obj->body.otype == self->time_position_uri) else if (obj->body.otype == self->time_position_uri)
@ -1079,7 +1074,7 @@ run(LV2_Handle instance, uint32_t sample_count)
for (unsigned cc = 0; cc < sfz::config::numCCs; ++cc) { for (unsigned cc = 0; cc < sfz::config::numCCs; ++cc) {
absl::optional<float> value = self->ccauto[cc]; absl::optional<float> value = self->ccauto[cc];
if (value) { if (value) {
sfizz_lv2_send_controller(self, &self->forge_automate, cc, *value); sfizz_lv2_send_controller(self, self->patch_set_uri, cc, *value);
self->ccauto[cc] = absl::nullopt; self->ccauto[cc] = absl::nullopt;
} }
} }
@ -1094,7 +1089,7 @@ run(LV2_Handle instance, uint32_t sample_count)
self->rms_follower.process(self->output_buffers[0], self->output_buffers[1], sample_count); self->rms_follower.process(self->output_buffers[0], self->output_buffers[1], sample_count);
const simde__m128 rms = self->rms_follower.getRMS(); const simde__m128 rms = self->rms_follower.getRMS();
const float *levels = (const float *)&rms; const float *levels = (const float *)&rms;
sfizz_lv2_send_levels(self, &self->forge_notify, levels[0], levels[1]); sfizz_lv2_send_levels(self, levels[0], levels[1]);
} }
else else
{ {
@ -1102,7 +1097,6 @@ run(LV2_Handle instance, uint32_t sample_count)
} }
#endif #endif
lv2_atom_forge_pop(&self->forge_notify, &notify_frame);
lv2_atom_forge_pop(&self->forge_automate, &automate_frame); lv2_atom_forge_pop(&self->forge_automate, &automate_frame);
} }

View file

@ -102,7 +102,7 @@ midnam:update a lv2:Feature .
lv2:port [ lv2:port [
a lv2:InputPort, atom:AtomPort ; a lv2:InputPort, atom:AtomPort ;
atom:bufferType atom:Sequence ; atom:bufferType atom:Sequence ;
atom:supports patch:Message, midi:MidiEvent, time:Position, <@LV2PLUGIN_URI@:OSCBlob> ; atom:supports patch:Message, midi:MidiEvent, time:Position, <@LV2PLUGIN_URI@:OSCBlob>, <@LV2PLUGIN_URI@:Notify> ;
lv2:designation lv2:control ; lv2:designation lv2:control ;
lv2:index 0 ; lv2:index 0 ;
lv2:symbol "control" ; lv2:symbol "control" ;
@ -113,24 +113,15 @@ midnam:update a lv2:Feature .
a lv2:OutputPort, atom:AtomPort ; a lv2:OutputPort, atom:AtomPort ;
atom:bufferType atom:Sequence ; atom:bufferType atom:Sequence ;
atom:supports patch:Message, <@LV2PLUGIN_URI@:OSCBlob> ; atom:supports patch:Message, <@LV2PLUGIN_URI@:OSCBlob> ;
lv2:index 1 ;
lv2:symbol "notify" ;
lv2:name "Notify",
"Notification"@fr ;
rsz:minimumSize 524288 ;
] , [
a lv2:OutputPort, atom:AtomPort ;
atom:bufferType atom:Sequence ;
atom:supports patch:Message ;
lv2:designation lv2:control ; lv2:designation lv2:control ;
lv2:index 2 ; lv2:index 1 ;
lv2:symbol "automate" ; lv2:symbol "automate" ;
lv2:name "Automate", lv2:name "Automate",
"Automatisation"@fr ; "Automatisation"@fr ;
rsz:minimumSize 524288 ; rsz:minimumSize 524288 ;
] , [ ] , [
a lv2:AudioPort, lv2:OutputPort ; a lv2:AudioPort, lv2:OutputPort ;
lv2:index 3 ; lv2:index 2 ;
lv2:symbol "out_left" ; lv2:symbol "out_left" ;
lv2:name "Left Output", lv2:name "Left Output",
"Sortie gauche"@fr , "Sortie gauche"@fr ,
@ -139,7 +130,7 @@ midnam:update a lv2:Feature .
lv2:designation pg:left lv2:designation pg:left
] , [ ] , [
a lv2:AudioPort, lv2:OutputPort ; a lv2:AudioPort, lv2:OutputPort ;
lv2:index 4 ; lv2:index 3 ;
lv2:symbol "out_right" ; lv2:symbol "out_right" ;
lv2:name "Right Output", lv2:name "Right Output",
"Sortie droite"@fr , "Sortie droite"@fr ,
@ -148,7 +139,7 @@ midnam:update a lv2:Feature .
lv2:designation pg:right lv2:designation pg:right
] , [ ] , [
a lv2:InputPort, lv2:ControlPort ; a lv2:InputPort, lv2:ControlPort ;
lv2:index 5 ; lv2:index 4 ;
lv2:symbol "volume" ; lv2:symbol "volume" ;
lv2:name "Volume" ; lv2:name "Volume" ;
lv2:default 0.0 ; lv2:default 0.0 ;
@ -157,7 +148,7 @@ midnam:update a lv2:Feature .
units:unit units:db units:unit units:db
] , [ ] , [
a lv2:InputPort, lv2:ControlPort ; a lv2:InputPort, lv2:ControlPort ;
lv2:index 6 ; lv2:index 5 ;
lv2:symbol "num_voices" ; lv2:symbol "num_voices" ;
lv2:name "Polyphony", lv2:name "Polyphony",
"Polyphonie"@fr , "Polyphonie"@fr ,
@ -202,7 +193,7 @@ midnam:update a lv2:Feature .
] ; ] ;
] , [ ] , [
a lv2:InputPort, lv2:ControlPort ; a lv2:InputPort, lv2:ControlPort ;
lv2:index 7 ; lv2:index 6 ;
lv2:symbol "oversampling" ; lv2:symbol "oversampling" ;
lv2:name "Oversampling factor", lv2:name "Oversampling factor",
"Facteur de suréchantillonnage"@fr , "Facteur de suréchantillonnage"@fr ,
@ -237,7 +228,7 @@ midnam:update a lv2:Feature .
] ; ] ;
] , [ ] , [
a lv2:InputPort, lv2:ControlPort ; a lv2:InputPort, lv2:ControlPort ;
lv2:index 8 ; lv2:index 7 ;
lv2:symbol "preload_size" ; lv2:symbol "preload_size" ;
lv2:name "Preload size", lv2:name "Preload size",
"Taille préchargée"@fr , "Taille préchargée"@fr ,
@ -280,7 +271,7 @@ midnam:update a lv2:Feature .
] ; ] ;
] , [ ] , [
a lv2:InputPort, lv2:ControlPort ; a lv2:InputPort, lv2:ControlPort ;
lv2:index 9 ; lv2:index 8 ;
lv2:symbol "freewheeling" ; lv2:symbol "freewheeling" ;
lv2:name "Freewheeling", lv2:name "Freewheeling",
"En roue libre (freewheeling)"@fr , "En roue libre (freewheeling)"@fr ,
@ -292,7 +283,7 @@ midnam:update a lv2:Feature .
lv2:maximum 1 ; lv2:maximum 1 ;
] , [ ] , [
a lv2:InputPort, lv2:ControlPort ; a lv2:InputPort, lv2:ControlPort ;
lv2:index 10 ; lv2:index 9 ;
lv2:symbol "scala_root_key" ; lv2:symbol "scala_root_key" ;
lv2:name "Scala root key", lv2:name "Scala root key",
"Tonalité de base Scala"@fr , "Tonalité de base Scala"@fr ,
@ -305,7 +296,7 @@ midnam:update a lv2:Feature .
units:unit units:midiNote units:unit units:midiNote
] , [ ] , [
a lv2:InputPort, lv2:ControlPort ; a lv2:InputPort, lv2:ControlPort ;
lv2:index 11 ; lv2:index 10 ;
lv2:symbol "tuning_frequency" ; lv2:symbol "tuning_frequency" ;
lv2:name "Tuning frequency", lv2:name "Tuning frequency",
"Fréquence d'accordage"@fr , "Fréquence d'accordage"@fr ,
@ -317,7 +308,7 @@ midnam:update a lv2:Feature .
units:unit units:hz units:unit units:hz
] , [ ] , [
a lv2:InputPort, lv2:ControlPort ; a lv2:InputPort, lv2:ControlPort ;
lv2:index 12 ; lv2:index 11 ;
lv2:symbol "stretched_tuning" ; lv2:symbol "stretched_tuning" ;
lv2:name "Stretched tuning", lv2:name "Stretched tuning",
"Accordage étiré"@fr , "Accordage étiré"@fr ,
@ -329,7 +320,7 @@ midnam:update a lv2:Feature .
units:unit units:coef units:unit units:coef
] , [ ] , [
a lv2:InputPort, lv2:ControlPort ; a lv2:InputPort, lv2:ControlPort ;
lv2:index 13 ; lv2:index 12 ;
lv2:symbol "sample_quality" ; lv2:symbol "sample_quality" ;
lv2:name "Sample quality", lv2:name "Sample quality",
"Qualité des échantillons"@fr , "Qualité des échantillons"@fr ,
@ -340,7 +331,7 @@ midnam:update a lv2:Feature .
lv2:maximum 10.0 lv2:maximum 10.0
] , [ ] , [
a lv2:InputPort, lv2:ControlPort ; a lv2:InputPort, lv2:ControlPort ;
lv2:index 14 ; lv2:index 13 ;
lv2:symbol "oscillator_quality" ; lv2:symbol "oscillator_quality" ;
lv2:name "Oscillator quality", lv2:name "Oscillator quality",
"Qualité des oscillateurs"@fr , "Qualité des oscillateurs"@fr ,
@ -351,7 +342,7 @@ midnam:update a lv2:Feature .
lv2:maximum 3.0 lv2:maximum 3.0
] , [ ] , [
a lv2:OutputPort, lv2:ControlPort ; a lv2:OutputPort, lv2:ControlPort ;
lv2:index 15 ; lv2:index 14 ;
lv2:symbol "active_voices" ; lv2:symbol "active_voices" ;
lv2:name "Active voices", lv2:name "Active voices",
"Voix utilisées"@fr ; "Voix utilisées"@fr ;
@ -362,7 +353,7 @@ midnam:update a lv2:Feature .
lv2:maximum 256 ; lv2:maximum 256 ;
] , [ ] , [
a lv2:OutputPort, lv2:ControlPort ; a lv2:OutputPort, lv2:ControlPort ;
lv2:index 16 ; lv2:index 15 ;
lv2:symbol "num_curves" ; lv2:symbol "num_curves" ;
lv2:name "Number of curves", lv2:name "Number of curves",
"Nombre de courbes"@fr ; "Nombre de courbes"@fr ;
@ -373,7 +364,7 @@ midnam:update a lv2:Feature .
lv2:maximum 65535 ; lv2:maximum 65535 ;
] , [ ] , [
a lv2:OutputPort, lv2:ControlPort ; a lv2:OutputPort, lv2:ControlPort ;
lv2:index 17 ; lv2:index 16 ;
lv2:symbol "num_masters" ; lv2:symbol "num_masters" ;
lv2:name "Number of masters", lv2:name "Number of masters",
"Nombre de maîtres"@fr ; "Nombre de maîtres"@fr ;
@ -384,7 +375,7 @@ midnam:update a lv2:Feature .
lv2:maximum 65535 ; lv2:maximum 65535 ;
] , [ ] , [
a lv2:OutputPort, lv2:ControlPort ; a lv2:OutputPort, lv2:ControlPort ;
lv2:index 18 ; lv2:index 17 ;
lv2:symbol "num_groups" ; lv2:symbol "num_groups" ;
lv2:name "Number of groups", lv2:name "Number of groups",
"Nombre de groupes"@fr ; "Nombre de groupes"@fr ;
@ -395,7 +386,7 @@ midnam:update a lv2:Feature .
lv2:maximum 65535 ; lv2:maximum 65535 ;
] , [ ] , [
a lv2:OutputPort, lv2:ControlPort ; a lv2:OutputPort, lv2:ControlPort ;
lv2:index 19 ; lv2:index 18 ;
lv2:symbol "num_regions" ; lv2:symbol "num_regions" ;
lv2:name "Number of regions", lv2:name "Number of regions",
"Nombre de régions"@fr ; "Nombre de régions"@fr ;
@ -406,7 +397,7 @@ midnam:update a lv2:Feature .
lv2:maximum 65535 ; lv2:maximum 65535 ;
] , [ ] , [
a lv2:OutputPort, lv2:ControlPort ; a lv2:OutputPort, lv2:ControlPort ;
lv2:index 20 ; lv2:index 19 ;
lv2:symbol "num_samples" ; lv2:symbol "num_samples" ;
lv2:name "Number of samples", lv2:name "Number of samples",
"Nombre d'échantillons"@fr ; "Nombre d'échantillons"@fr ;

View file

@ -44,32 +44,32 @@
#define SFIZZ__checkModification SFIZZ_URI ":" "check_modification" #define SFIZZ__checkModification SFIZZ_URI ":" "check_modification"
// OSC atoms // OSC atoms
#define SFIZZ__OSCBlob SFIZZ_URI ":" "OSCBlob" #define SFIZZ__OSCBlob SFIZZ_URI ":" "OSCBlob"
#define SFIZZ__Notify SFIZZ_URI ":" "Notify"
// Level atoms // Level atoms
#define SFIZZ__AudioLevel SFIZZ_URI ":" "AudioLevel" #define SFIZZ__AudioLevel SFIZZ_URI ":" "AudioLevel"
enum enum
{ {
SFIZZ_CONTROL = 0, SFIZZ_CONTROL = 0,
SFIZZ_NOTIFY = 1, SFIZZ_AUTOMATE = 1,
SFIZZ_AUTOMATE = 2, SFIZZ_LEFT = 2,
SFIZZ_LEFT = 3, SFIZZ_RIGHT = 3,
SFIZZ_RIGHT = 4, SFIZZ_VOLUME = 4,
SFIZZ_VOLUME = 5, SFIZZ_POLYPHONY = 5,
SFIZZ_POLYPHONY = 6, SFIZZ_OVERSAMPLING = 6,
SFIZZ_OVERSAMPLING = 7, SFIZZ_PRELOAD = 7,
SFIZZ_PRELOAD = 8, SFIZZ_FREEWHEELING = 8,
SFIZZ_FREEWHEELING = 9, SFIZZ_SCALA_ROOT_KEY = 9,
SFIZZ_SCALA_ROOT_KEY = 10, SFIZZ_TUNING_FREQUENCY = 10,
SFIZZ_TUNING_FREQUENCY = 11, SFIZZ_STRETCH_TUNING = 11,
SFIZZ_STRETCH_TUNING = 12, SFIZZ_SAMPLE_QUALITY = 12,
SFIZZ_SAMPLE_QUALITY = 13, SFIZZ_OSCILLATOR_QUALITY = 13,
SFIZZ_OSCILLATOR_QUALITY = 14, SFIZZ_ACTIVE_VOICES = 14,
SFIZZ_ACTIVE_VOICES = 15, SFIZZ_NUM_CURVES = 15,
SFIZZ_NUM_CURVES = 16, SFIZZ_NUM_MASTERS = 16,
SFIZZ_NUM_MASTERS = 17, SFIZZ_NUM_GROUPS = 17,
SFIZZ_NUM_GROUPS = 18, SFIZZ_NUM_REGIONS = 18,
SFIZZ_NUM_REGIONS = 19, SFIZZ_NUM_SAMPLES = 19,
SFIZZ_NUM_SAMPLES = 20,
}; };
// For use with instance-access // For use with instance-access

View file

@ -34,7 +34,6 @@ struct sfizz_plugin_t
// Ports // Ports
const LV2_Atom_Sequence *control_port {}; const LV2_Atom_Sequence *control_port {};
LV2_Atom_Sequence *notify_port {};
LV2_Atom_Sequence *automate_port {}; LV2_Atom_Sequence *automate_port {};
float *output_buffers[2] {}; float *output_buffers[2] {};
const float *volume_port {}; const float *volume_port {};
@ -55,7 +54,6 @@ struct sfizz_plugin_t
float *num_samples_port {}; float *num_samples_port {};
// Atom forge // Atom forge
LV2_Atom_Forge forge_notify {}; ///< Forge for writing notification atoms in run thread
LV2_Atom_Forge forge_automate {}; ///< Forge for writing automation atoms in run thread LV2_Atom_Forge forge_automate {}; ///< Forge for writing automation atoms in run thread
LV2_Atom_Forge forge_secondary {}; ///< Forge for writing into other buffers LV2_Atom_Forge forge_secondary {}; ///< Forge for writing into other buffers
@ -92,6 +90,7 @@ struct sfizz_plugin_t
LV2_URID sfizz_check_modification_uri {}; LV2_URID sfizz_check_modification_uri {};
LV2_URID sfizz_active_voices_uri {}; LV2_URID sfizz_active_voices_uri {};
LV2_URID sfizz_osc_blob_uri {}; LV2_URID sfizz_osc_blob_uri {};
LV2_URID sfizz_notify_uri {};
LV2_URID sfizz_audio_level_uri {}; LV2_URID sfizz_audio_level_uri {};
LV2_URID time_position_uri {}; LV2_URID time_position_uri {};
LV2_URID time_bar_uri {}; LV2_URID time_bar_uri {};

View file

@ -116,6 +116,7 @@ struct sfizz_ui_t : EditorController, VSTGUIEditorInterface {
LV2_URID sfizz_sfz_file_uri; LV2_URID sfizz_sfz_file_uri;
LV2_URID sfizz_scala_file_uri; LV2_URID sfizz_scala_file_uri;
LV2_URID sfizz_osc_blob_uri; LV2_URID sfizz_osc_blob_uri;
LV2_URID sfizz_notify_uri;
LV2_URID sfizz_audio_level_uri; LV2_URID sfizz_audio_level_uri;
std::unique_ptr<sfizz_lv2_ccmap, sfizz_lv2_ccmap_delete> ccmap; std::unique_ptr<sfizz_lv2_ccmap, sfizz_lv2_ccmap_delete> ccmap;
@ -218,6 +219,7 @@ instantiate(const LV2UI_Descriptor *descriptor,
self->sfizz_sfz_file_uri = map->map(map->handle, SFIZZ__sfzFile); self->sfizz_sfz_file_uri = map->map(map->handle, SFIZZ__sfzFile);
self->sfizz_scala_file_uri = map->map(map->handle, SFIZZ__tuningfile); self->sfizz_scala_file_uri = map->map(map->handle, SFIZZ__tuningfile);
self->sfizz_osc_blob_uri = map->map(map->handle, SFIZZ__OSCBlob); self->sfizz_osc_blob_uri = map->map(map->handle, SFIZZ__OSCBlob);
self->sfizz_notify_uri = map->map(map->handle, SFIZZ__Notify);
self->sfizz_audio_level_uri = map->map(map->handle, SFIZZ__AudioLevel); self->sfizz_audio_level_uri = map->map(map->handle, SFIZZ__AudioLevel);
self->ccmap.reset(sfizz_lv2_ccmap_create(map)); self->ccmap.reset(sfizz_lv2_ccmap_create(map));