[beast: 63/73] BSE: SF2: move sound_fonts GList to SoundFontRepoImpl and use std::vector



commit e68f761fb015d5a8d155e6cbdf2a43f8855008bf
Author: Stefan Westerfeld <stefan space twc de>
Date:   Mon Feb 13 16:42:42 2017 +0100

    BSE: SF2: move sound_fonts GList to SoundFontRepoImpl and use std::vector
    
    Signed-off-by: Stefan Westerfeld <stefan space twc de>

 bse/bsesoundfontrepo.cc |   51 +++++++++++++++++++++++++++-------------------
 bse/bsesoundfontrepo.hh |    5 +--
 2 files changed, 32 insertions(+), 24 deletions(-)
---
diff --git a/bse/bsesoundfontrepo.cc b/bse/bsesoundfontrepo.cc
index b54c260..f06470d 100644
--- a/bse/bsesoundfontrepo.cc
+++ b/bse/bsesoundfontrepo.cc
@@ -101,7 +101,6 @@ bse_sound_font_repo_init (BseSoundFontRepo *sfrepo)
   sfrepo->fluid_settings = new_fluid_settings();
   sfrepo->fluid_synth = new_fluid_synth (sfrepo->fluid_settings);
   sfrepo->fluid_events = NULL;
-  sfrepo->sound_fonts = NULL;
   sfrepo->fluid_mix_freq = 0;
 
   sfrepo->n_fluid_channels = 0;
@@ -179,10 +178,7 @@ bse_sound_font_repo_prepare (BseSource *source)
 static void
 bse_sound_font_repo_release_children (BseContainer *container)
 {
-  BseSoundFontRepo *sfrepo = BSE_SOUND_FONT_REPO (container);
-
-  while (sfrepo->sound_fonts)
-    bse_container_remove_item (container, BSE_ITEM (sfrepo->sound_fonts->data));
+  /* real release children: done in ~SoundFontRepoImpl() */
 
   /* chain parent class' handler */
   BSE_CONTAINER_CLASS (parent_class)->release_children (container);
@@ -193,8 +189,6 @@ bse_sound_font_repo_dispose (GObject *object)
 {
   BseSoundFontRepo *sfrepo = BSE_SOUND_FONT_REPO (object);
 
-  bse_sound_font_repo_forall_items (BSE_CONTAINER (sfrepo), unload_sound_font, sfrepo);
-
   if (sfrepo->fluid_synth)
     {
       delete_fluid_synth (sfrepo->fluid_synth);
@@ -248,10 +242,11 @@ static void
 bse_sound_font_repo_add_item (BseContainer *container,
                              BseItem      *item)
 {
-  BseSoundFontRepo *sfrepo = BSE_SOUND_FONT_REPO (container);
+  BseSoundFontRepo       *sfrepo      = BSE_SOUND_FONT_REPO (container);
+  Bse::SoundFontRepoImpl *sfrepo_impl = sfrepo->as<Bse::SoundFontRepoImpl *>();
 
   if (g_type_is_a (BSE_OBJECT_TYPE (item), BSE_TYPE_SOUND_FONT))
-    sfrepo->sound_fonts = g_list_append (sfrepo->sound_fonts, item);
+    sfrepo_impl->sound_fonts.push_back (BSE_SOUND_FONT (item));
   else
     g_warning ("BseSoundFontRepo: cannot hold non-sound-font item type `%s'",
               BSE_OBJECT_TYPE_NAME (item));
@@ -265,17 +260,12 @@ bse_sound_font_repo_forall_items (BseContainer      *container,
                                  BseForallItemsFunc func,
                                  gpointer           data)
 {
-  BseSoundFontRepo *sfrepo = BSE_SOUND_FONT_REPO (container);
-  GList *list;
+  BseSoundFontRepo       *sfrepo      = BSE_SOUND_FONT_REPO (container);
+  Bse::SoundFontRepoImpl *sfrepo_impl = sfrepo->as<Bse::SoundFontRepoImpl *>();
 
-  list = sfrepo->sound_fonts;
-  while (list)
+  for (auto sound_font : sfrepo_impl->sound_fonts)
     {
-      BseItem *item;
-
-      item = BSE_ITEM (list->data);
-      list = list->next;
-      if (!func (item, data))
+      if (!func (sound_font, data))
        return;
     }
 }
@@ -284,10 +274,20 @@ static void
 bse_sound_font_repo_remove_item (BseContainer *container,
                                 BseItem      *item)
 {
-  BseSoundFontRepo *sfrepo = BSE_SOUND_FONT_REPO (container);
+  BseSoundFontRepo       *sfrepo      = BSE_SOUND_FONT_REPO (container);
+  Bse::SoundFontRepoImpl *sfrepo_impl = sfrepo->as<Bse::SoundFontRepoImpl *>();
 
   if (g_type_is_a (BSE_OBJECT_TYPE (item), BSE_TYPE_SOUND_FONT))
-    sfrepo->sound_fonts = g_list_remove (sfrepo->sound_fonts, item);
+    {
+      for (auto it = sfrepo_impl->sound_fonts.begin(); it != sfrepo_impl->sound_fonts.end(); it++)
+        {
+          if (*it == item)
+            {
+              sfrepo_impl->sound_fonts.erase (it);
+              break;
+            }
+        }
+    }
   else
     g_warning ("BseSoundFontRepo: cannot hold non-sound-font item type `%s'",
               BSE_OBJECT_TYPE_NAME (item));
@@ -365,7 +365,16 @@ SoundFontRepoImpl::SoundFontRepoImpl (BseObject *bobj) :
 {}
 
 SoundFontRepoImpl::~SoundFontRepoImpl ()
-{}
+{
+  BseSoundFontRepo *sfrepo = as<BseSoundFontRepo *>();
+
+  /* unload all sound fonts */
+  bse_sound_font_repo_forall_items (BSE_CONTAINER (sfrepo), unload_sound_font, sfrepo);
+
+  /* release children */
+  while (!sound_fonts.empty())
+    bse_container_remove_item (BSE_CONTAINER (sfrepo), sound_fonts.front());
+}
 
 static Error
 repo_load_file (BseSoundFontRepo *sfrepo, const String &file_name, BseSoundFont **sound_font_p)
diff --git a/bse/bsesoundfontrepo.hh b/bse/bsesoundfontrepo.hh
index ca3e74c..df5e03d 100644
--- a/bse/bsesoundfontrepo.hh
+++ b/bse/bsesoundfontrepo.hh
@@ -35,8 +35,6 @@ struct BseSoundFontRepo : BseSuper {
   guint64           channel_values_tick_stamp;
 
   int               n_channel_oscs_active;       /* SoundFontOscs with an active module in the engine thread 
*/
-
-  GList             *sound_fonts;
 };
 
 struct BseSoundFontRepoClass : BseSuperClass
@@ -69,7 +67,8 @@ public:
     BseSoundFontOsc *osc;
     guint            channel;
   };
-  std::vector<Osc> oscs;
+  std::vector<Osc>            oscs;
+  std::vector<BseSoundFont *> sound_fonts;
 
 protected:
 


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