[beast: 49/73] BSE: SF2: use std::vector for oscs|channel_map instead of manual allocation



commit fc0b11c9cc75f4ce201ec81dc12d56eee6263adb
Author: Stefan Westerfeld <stefan space twc de>
Date:   Mon Dec 5 15:25:37 2016 +0100

    BSE: SF2: use std::vector for oscs|channel_map instead of manual allocation

 bse/bsesoundfontosc.cc  |   24 ++++++++++++++----------
 bse/bsesoundfontrepo.cc |   36 ++++++++++++++----------------------
 bse/bsesoundfontrepo.hh |   10 ++++++----
 3 files changed, 34 insertions(+), 36 deletions(-)
---
diff --git a/bse/bsesoundfontosc.cc b/bse/bsesoundfontosc.cc
index 8bdbeb1..4d565b8 100644
--- a/bse/bsesoundfontosc.cc
+++ b/bse/bsesoundfontosc.cc
@@ -440,10 +440,9 @@ sound_font_osc_process (BseModule *module,
   Bse::SoundFontRepoImpl *sfrepo_impl = sfrepo->as<Bse::SoundFontRepoImpl *>();
 
   fluid_synth_t *fluid_synth = bse_sound_font_repo_lock_fluid_synth (sfrepo);
-  guint i;
   if (flmod->config.update_preset != flmod->last_update_preset)
     {
-      fluid_synth_program_select (fluid_synth, flmod->config.sfrepo->channel_map[flmod->config.osc_id],
+      fluid_synth_program_select (fluid_synth, sfrepo_impl->oscs[flmod->config.osc_id].channel,
                                                flmod->config.sfont_id, flmod->config.bank, 
flmod->config.program);
       flmod->last_update_preset = flmod->config.update_preset;
     }
@@ -451,8 +450,9 @@ sound_font_osc_process (BseModule *module,
   if (sfrepo->channel_values_tick_stamp != now_tick_stamp)
     process_fluid_L (sfrepo, fluid_synth, now_tick_stamp);
 
-  float *left_output = &sfrepo_impl->channel_state[sfrepo->channel_map[flmod->config.osc_id]].values_left[0];
-  float *right_output = 
&sfrepo_impl->channel_state[sfrepo->channel_map[flmod->config.osc_id]].values_right[0];
+  auto& cstate = sfrepo_impl->channel_state[sfrepo_impl->oscs[flmod->config.osc_id].channel];
+  float *left_output = &cstate.values_left[0];
+  float *right_output = &cstate.values_right[0];
 
   int delta = bse_module_tick_stamp (module) - now_tick_stamp;
   if (delta + n_values <= bse_engine_block_size())    /* paranoid check, should always pass */
@@ -468,13 +468,14 @@ sound_font_osc_process (BseModule *module,
     }
   if (BSE_MODULE_OSTREAM (module, BSE_SOUND_FONT_OSC_OCHANNEL_DONE_OUT).connected)
     {
+      guint i;
       for (i = 0; i < n_values && left_output[i] == 0.0 && right_output[i] == 0.0; i++)
        ;
       if (i == n_values)
-       sfrepo_impl->channel_state[sfrepo->channel_map[flmod->config.osc_id]].n_silence_samples += n_values;
+       cstate.n_silence_samples += n_values;
       else
-       sfrepo_impl->channel_state[sfrepo->channel_map[flmod->config.osc_id]].n_silence_samples = 0;
-      float done = (sfrepo_impl->channel_state[sfrepo->channel_map[flmod->config.osc_id]].n_silence_samples 
flmod->config.silence_bound && sfrepo->fluid_events == NULL) ? 1.0 : 0.0;
+       cstate.n_silence_samples = 0;
+      float done = (cstate.n_silence_samples > flmod->config.silence_bound && sfrepo->fluid_events == NULL) 
? 1.0 : 0.0;
       BSE_MODULE_OSTREAM (module, BSE_SOUND_FONT_OSC_OCHANNEL_DONE_OUT).values = bse_engine_const_values 
(done);
     }
 
@@ -502,6 +503,7 @@ sound_font_osc_process_midi (gpointer            null,
 {
   SoundFontOscModule *flmod = (SoundFontOscModule *) module->user_data;
   bse_sound_font_repo_lock_fluid_synth (flmod->config.sfrepo);
+  Bse::SoundFontRepoImpl *sfrepo_impl = flmod->config.sfrepo->as<Bse::SoundFontRepoImpl *>();
   int note = bse_note_from_freq (Bse::MusicalTuning::OD_12_TET, event->data.note.frequency);
   BseFluidEvent *fluid_event = NULL;
   switch (event->status)
@@ -553,7 +555,7 @@ sound_font_osc_process_midi (gpointer            null,
   if (fluid_event)
     {
       fluid_event->tick_stamp = event->delta_time;
-      fluid_event->channel = flmod->config.sfrepo->channel_map[flmod->config.osc_id];
+      fluid_event->channel = sfrepo_impl->oscs[flmod->config.osc_id].channel;
       flmod->config.sfrepo->fluid_events = sfi_ring_insert_sorted (flmod->config.sfrepo->fluid_events, 
fluid_event, event_cmp, NULL);
     }
   bse_sound_font_repo_unlock_fluid_synth (flmod->config.sfrepo);
@@ -579,10 +581,11 @@ event_handler_setup_func (BseModule *module,
 
   /* setup program before first midi event */
   SoundFontOscModule *flmod = (SoundFontOscModule *) module->user_data;
+  Bse::SoundFontRepoImpl *sfrepo_impl = flmod->config.sfrepo->as<Bse::SoundFontRepoImpl *>();
 
   BseFluidEvent *fluid_event = g_new0 (BseFluidEvent, 1);
   fluid_event->command = BSE_FLUID_SYNTH_PROGRAM_SELECT;
-  fluid_event->channel = flmod->config.sfrepo->channel_map[flmod->config.osc_id];
+  fluid_event->channel = sfrepo_impl->oscs[flmod->config.osc_id].channel;
   fluid_event->arg1 = flmod->config.bank;
   fluid_event->arg2 = flmod->config.program;
   fluid_event->sfont_id = flmod->config.sfont_id;
@@ -645,6 +648,7 @@ bse_sound_font_osc_context_dismiss (BseSource                *source,
                                    BseTrans             *trans)
 {
   BseSoundFontOsc *self = BSE_SOUND_FONT_OSC (source);
+  Bse::SoundFontRepoImpl *sfrepo_impl = self->config.sfrepo->as<Bse::SoundFontRepoImpl *>();
   BseModule *module = bse_source_get_context_omodule (source, context_handle);
   BseMidiContext mc = bse_snet_get_midi_context (bse_item_get_snet (BSE_ITEM (source)), context_handle);
   bse_midi_receiver_remove_event_handler (mc.midi_receiver,
@@ -660,7 +664,7 @@ bse_sound_font_osc_context_dismiss (BseSource                *source,
     {
       SfiRing *next_node = sfi_ring_walk (node, fluid_events);
       BseFluidEvent *event = (BseFluidEvent *) node->data;
-      if (event->channel == self->config.sfrepo->channel_map[self->config.osc_id])
+      if (event->channel == sfrepo_impl->oscs[self->config.osc_id].channel)
        {
          g_free (event);
          fluid_events = sfi_ring_remove_node (fluid_events, node);
diff --git a/bse/bsesoundfontrepo.cc b/bse/bsesoundfontrepo.cc
index 1686b44..ba7d99b 100644
--- a/bse/bsesoundfontrepo.cc
+++ b/bse/bsesoundfontrepo.cc
@@ -102,10 +102,6 @@ bse_sound_font_repo_init (BseSoundFontRepo *sfrepo)
 {
   new (&sfrepo->fluid_synth_mutex) Bse::Mutex();
 
-  sfrepo->n_oscs = 0;
-  sfrepo->oscs = NULL;
-  sfrepo->channel_map = NULL;
-
   sfrepo->fluid_settings = new_fluid_settings();
   sfrepo->fluid_synth = new_fluid_synth (sfrepo->fluid_settings);
   sfrepo->fluid_events = NULL;
@@ -142,11 +138,11 @@ bse_sound_font_repo_prepare (BseSource *source)
   BseSoundFontRepo *sfrepo = BSE_SOUND_FONT_REPO (source);
   Bse::SoundFontRepoImpl *sfrepo_impl = sfrepo->as<Bse::SoundFontRepoImpl *>();
 
-  guint i, channels_required = 0;
-  for (i = 0; i < sfrepo->n_oscs; i++)
+  guint channels_required = 0;
+  for (auto& o : sfrepo_impl->oscs)
     {
-      if (sfrepo->oscs[i])
-       sfrepo->channel_map[i] = channels_required++;
+      if (o.osc)
+       o.channel = channels_required++;
     }
   guint mix_freq = bse_engine_sample_freq();
   if (sfrepo->n_fluid_channels != channels_required || sfrepo->fluid_mix_freq != mix_freq)
@@ -213,10 +209,6 @@ bse_sound_font_repo_dispose (GObject *object)
       delete_fluid_settings (sfrepo->fluid_settings);
       sfrepo->fluid_settings = NULL;
     }
-  g_free (sfrepo->channel_map);
-  sfrepo->channel_map = NULL;
-  g_free (sfrepo->oscs);
-  sfrepo->oscs = NULL;
   sfrepo->n_fluid_channels = 0;
 
   if (sfrepo->fluid_events != NULL)
@@ -346,28 +338,28 @@ int
 bse_sound_font_repo_add_osc (BseSoundFontRepo *sfrepo,
                              BseSoundFontOsc  *osc)
 {
-  guint i;
-  for (i = 0; i < sfrepo->n_oscs; i++)
+  Bse::SoundFontRepoImpl *sfrepo_impl = sfrepo->as<Bse::SoundFontRepoImpl *>();
+  for (guint i = 0; i < sfrepo_impl->oscs.size(); i++)
     {
-      if (sfrepo->oscs[i] == 0)
+      if (!sfrepo_impl->oscs[i].osc)
        {
-         sfrepo->oscs[i] = osc;
+         sfrepo_impl->oscs[i].osc = osc;
          return i;
        }
     }
-  sfrepo->oscs = (BseSoundFontOsc **)g_realloc (sfrepo->oscs, sizeof (BseSoundFontOsc *) * (i + 1));
-  sfrepo->oscs[i] = osc;
-  sfrepo->channel_map = (guint *) g_realloc (sfrepo->channel_map, sizeof (guint) * (i + 1));
-  return sfrepo->n_oscs++;
+  sfrepo_impl->oscs.push_back ({ osc, 0 });
+  return sfrepo_impl->oscs.size() - 1;
 }
 
 void
 bse_sound_font_repo_remove_osc (BseSoundFontRepo *sfrepo,
                                 guint             osc_id)
 {
-  g_return_if_fail (osc_id < sfrepo->n_oscs);
+  Bse::SoundFontRepoImpl *sfrepo_impl = sfrepo->as<Bse::SoundFontRepoImpl *>();
+
+  g_return_if_fail (osc_id < sfrepo_impl->oscs.size());
 
-  sfrepo->oscs[osc_id] = 0;
+  sfrepo_impl->oscs[osc_id].osc = nullptr;
 }
 
 namespace Bse {
diff --git a/bse/bsesoundfontrepo.hh b/bse/bsesoundfontrepo.hh
index 5bb5aaf..58ed04b 100644
--- a/bse/bsesoundfontrepo.hh
+++ b/bse/bsesoundfontrepo.hh
@@ -35,10 +35,6 @@ struct BseSoundFontRepo : BseSuper {
   guint              n_fluid_channels;
   guint64           channel_values_tick_stamp;
 
-  guint              n_oscs;
-  BseSoundFontOsc  **oscs;                   /* [0..n_oscs-1] */
-  guint                    *channel_map;             /* [0..n_oscs-1] */
-
   int               n_channel_oscs_active;       /* SoundFontOscs with an active module in the engine thread 
*/
 
   GList             *sound_fonts;
@@ -69,6 +65,12 @@ public:
   };
   std::vector<ChannelState> channel_state; /* [0..n_fluid_channels-1] */
 
+  struct Osc {
+    BseSoundFontOsc *osc;
+    guint            channel;
+  };
+  std::vector<Osc> oscs;
+
 protected:
 
   virtual  ~SoundFontRepoImpl ();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]