From d2d01b73b37a915d48f174f32aab755566bbb315 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Mon, 5 Apr 2021 19:01:36 +0200 Subject: [PATCH] Structure for storage of CC automation --- plugins/lv2/sfizz.cpp | 40 +++++++++++++++++----------------- plugins/lv2/sfizz_lv2_plugin.h | 8 +++---- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/plugins/lv2/sfizz.cpp b/plugins/lv2/sfizz.cpp index 53647a28..d9e278dc 100644 --- a/plugins/lv2/sfizz.cpp +++ b/plugins/lv2/sfizz.cpp @@ -478,6 +478,8 @@ instantiate(const LV2_Descriptor *descriptor, self->ccmap = sfizz_lv2_ccmap_create(self->map); + self->ccauto = new absl::optional[sfz::config::numCCs]; + self->synth = sfizz_create_synth(); self->client = sfizz_create_client(self); self->synth_mutex = spin_mutex_create(); @@ -485,7 +487,6 @@ instantiate(const LV2_Descriptor *descriptor, sfizz_set_receive_callback(self->client, &sfizz_lv2_receive_message); self->sfz_blob_mutex = new std::mutex; - self->sfz_desc_mutex = new std::mutex; sfizz_lv2_load_file(self, self->sfz_file_path); sfizz_lv2_load_scala_file(self, self->scala_file_path); @@ -501,11 +502,10 @@ cleanup(LV2_Handle instance) sfizz_plugin_t *self = (sfizz_plugin_t *)instance; delete[] self->sfz_blob_data; delete self->sfz_blob_mutex; - delete self->sfz_desc; - delete self->sfz_desc_mutex; spin_mutex_destroy(self->synth_mutex); sfizz_delete_client(self->client); sfizz_free(self->synth); + delete[] self->ccauto; sfizz_lv2_ccmap_free(self->ccmap); delete self; } @@ -985,26 +985,25 @@ run(LV2_Handle instance, uint32_t sample_count) // Request OSC updates sfizz_send_message(self->synth, self->client, 0, "/sw/last/current", "", nullptr); - spin_mutex_unlock(self->synth_mutex); - if (self->midnam && self->must_update_midnam.exchange(0)) { self->midnam->update(self->midnam->handle); } - if (self->must_automate_cc && self->sfz_desc_mutex->try_lock()) + if (self->have_ccauto) { - if (self->must_automate_cc) { - const InstrumentDescription* desc = self->sfz_desc; - for (unsigned cc = 0; cc < sfz::config::numCCs; ++cc) { - if (desc->ccUsed.test(cc)) - sfizz_lv2_send_controller(self, cc, desc->ccDefault[cc]); + for (unsigned cc = 0; cc < sfz::config::numCCs; ++cc) { + absl::optional value = self->ccauto[cc]; + if (value) { + sfizz_lv2_send_controller(self, cc, *value); + self->ccauto[cc] = absl::nullopt; } - self->must_automate_cc = false; } - self->sfz_desc_mutex->unlock(); + self->have_ccauto = false; } + spin_mutex_unlock(self->synth_mutex); + lv2_atom_forge_pop(&self->forge, ¬ify_frame); } @@ -1123,13 +1122,14 @@ sfizz_lv2_update_sfz_info(sfizz_plugin_t *self) delete[] old_data; - // Keep a copy of the instrument description - const InstrumentDescription* desc = new InstrumentDescription(parseDescriptionBlob(blob)); - self->sfz_desc_mutex->lock(); - delete self->sfz_desc; - self->sfz_desc = desc; - self->must_automate_cc = true; // mark all CC for automation - self->sfz_desc_mutex->unlock(); + // Mark all the used CCs for automation with default values + const InstrumentDescription desc = parseDescriptionBlob(blob); + for (unsigned cc = 0; cc < sfz::config::numCCs; ++cc) { + if (desc.ccUsed.test(cc)) { + self->ccauto[cc] = desc.ccDefault[cc]; + self->have_ccauto = true; + } + } } static bool diff --git a/plugins/lv2/sfizz_lv2_plugin.h b/plugins/lv2/sfizz_lv2_plugin.h index 179b95bc..c7487f47 100644 --- a/plugins/lv2/sfizz_lv2_plugin.h +++ b/plugins/lv2/sfizz_lv2_plugin.h @@ -11,11 +11,10 @@ #include #include #include +#include #include #include -struct InstrumentDescription; - #define DEFAULT_SCALA_FILE "Contents/Resources/DefaultScale.scl" #define DEFAULT_SFZ_FILE "Contents/Resources/DefaultInstrument.sfz" // This assumes that the longest path is the default sfz file; if not, change it @@ -121,8 +120,9 @@ struct sfizz_plugin_t const uint8_t *volatile sfz_blob_data {}; volatile uint32_t sfz_blob_size {}; - std::mutex *sfz_desc_mutex {}; - const InstrumentDescription* sfz_desc {}; + // CC queued for automation on next run(). (synchronized by `synth_mutex`) + absl::optional* ccauto {}; + volatile bool have_ccauto {}; // Timing data int bar {};