[beast: 2/5] BSE: move Track.list_parts[_uniq]() into bseapi.idl



commit f5025e43e24050764e53532fedb18339b726448d
Author: Tim Janik <timj gnu org>
Date:   Thu Nov 5 22:21:20 2015 +0100

    BSE: move Track.list_parts[_uniq]() into bseapi.idl
    
    Signed-off-by: Tim Janik <timj gnu org>

 beast-gtk/bsttrackroll.cc     |   11 +++---
 beast-gtk/bsttrackrollctrl.cc |   26 +++++++--------
 beast-gtk/bsttrackview.cc     |   11 +++---
 bse/Makefile.am               |    2 +-
 bse/bseapi.idl                |   23 ++++++++++++-
 bse/bsebasics.idl             |    9 -----
 bse/bsepart.cc                |   11 +++---
 bse/bsetrack.cc               |   46 ++++++++++++++++++--------
 bse/bsetrack.hh               |    6 ++-
 bse/bsetrack.proc             |   72 -----------------------------------------
 10 files changed, 85 insertions(+), 132 deletions(-)
---
diff --git a/beast-gtk/bsttrackroll.cc b/beast-gtk/bsttrackroll.cc
index a40dd3c..a438ff6 100644
--- a/beast-gtk/bsttrackroll.cc
+++ b/beast-gtk/bsttrackroll.cc
@@ -616,15 +616,14 @@ bst_track_roll_draw_canvas (GxkScrollCanvas *scc,
                          0, ry, width, rheight);
       if (track)
        {
-         BseTrackPartSeq *tps = bse_track_list_parts (track.proxy_id());
-         for (uint i = 0; i < tps->n_tparts; i++)
+          Bse::TrackPartSeq tps = track.list_parts();
+          for (auto &tp : tps)
            {
               static const int ENTRY_INNER_BORDER = 2;      /* sigh, no way around this */
               PangoRectangle rect = { 0 };
-             guint tick = tps->tparts[i]->tick;
-             SfiProxy part = tps->tparts[i]->part;
-             guint duration = tps->tparts[i]->duration;
-             const gchar *name = bse_item_get_name (part);
+             guint tick = tp.tick;
+             guint duration = tp.duration;
+             const gchar *name = bse_item_get_name (tp.part.proxy_id());
              GdkRectangle area, carea;
              carea.x = tick_to_coord (self, tick);
               carea.width = ticks_to_pixels (self, duration);
diff --git a/beast-gtk/bsttrackrollctrl.cc b/beast-gtk/bsttrackrollctrl.cc
index 854b19d..f7358b4 100644
--- a/beast-gtk/bsttrackrollctrl.cc
+++ b/beast-gtk/bsttrackrollctrl.cc
@@ -625,10 +625,8 @@ controller_drag (BstTrackRollController *self,
   if (drag->type == GXK_DRAG_START)
     {
       BstCommonRollTool obj_tool, tool;
-      BseTrackPart *tpart = NULL;
       const BstTrackRollUtil *tool_table;
       guint i, n_tools;
-      BseTrackPartSeq *tps;
 
       self->current_tool = NULL;       /* paranoid */
 
@@ -653,19 +651,19 @@ controller_drag (BstTrackRollController *self,
       /* setup drag data */
       if (!drag->start_valid)
        drag->start_track = Bse::TrackH();
-      tps = drag->start_track ? bse_track_list_parts (drag->start_track.proxy_id()) : NULL;
-      if (tps && tps->n_tparts)        /* FIXME: BSE should have a convenience function to find a part */
-       {
-         for (size_t j = 0; j < tps->n_tparts; j++)
-           if (tps->tparts[j]->tick <= int (drag->start_tick) &&
-               tps->tparts[j]->tick + tps->tparts[j]->duration > int (drag->start_tick))
-             {
-               tpart = tps->tparts[j];
-               break;
-             }
-       }
+      Bse::TrackPartSeq tps;
+      if (drag->start_track)
+        tps = drag->start_track.list_parts();
+      const Bse::TrackPart *tpart = NULL;
+      for (const auto &tp : tps) // FIXME: BSE could have a convenience function to find a part
+        if (tp.tick <= int (drag->start_tick) &&
+            tp.tick + tp.duration > int (drag->start_tick))
+          {
+            tpart = &tp;
+            break;
+          }
       self->obj_track = drag->start_track;
-      self->obj_part = Bse::PartH::down_cast (bse_server.from_proxy (tpart ? tpart->part : 0));
+      self->obj_part = tpart ? Bse::PartH (tpart->part) : Bse::PartH();
       self->obj_tick = tpart ? tpart->tick : 0;
       self->obj_duration = tpart ? tpart->duration : 0;
       self->xoffset = 0;
diff --git a/beast-gtk/bsttrackview.cc b/beast-gtk/bsttrackview.cc
index 6feddc4..f9c4383 100644
--- a/beast-gtk/bsttrackview.cc
+++ b/beast-gtk/bsttrackview.cc
@@ -711,7 +711,6 @@ track_view_action_exec (gpointer data,
   switch (action)
     {
       SfiProxy item;
-      guint i;
     case ACTION_ADD_TRACK:
       bse_item_group_undo (song.proxy_id(), "Add Track");
       track = song.create_track();
@@ -729,13 +728,13 @@ track_view_action_exec (gpointer data,
       item = bst_item_view_get_current (item_view);
       track = Bse::TrackH::down_cast (bse_server.from_proxy (item));
       bse_item_group_undo (song.proxy_id(), "Delete Track");
-      BseIt3mSeq *iseq = bse_track_list_parts_uniq (item);
+      Bse::PartSeq pseq = track.list_parts_uniq();
       song.remove_track (track);
-      for (i = 0; i < iseq->n_items; i++)
+      for (const auto &part : pseq)
         {
-          Bse::PartH part = Bse::PartH::down_cast (bse_server.from_proxy (iseq->items[i]));
-          if (!song.find_any_track_for_part (part))
-            song.remove_part (part);
+          Bse::PartH p = part;
+          if (!song.find_any_track_for_part (p))
+            song.remove_part (p);
         }
       bse_item_ungroup_undo (song.proxy_id());
       break;
diff --git a/bse/Makefile.am b/bse/Makefile.am
index f2eac38..7a51e55 100644
--- a/bse/Makefile.am
+++ b/bse/Makefile.am
@@ -118,7 +118,7 @@ bse_proc_sources = $(strip \
        bsecategories.proc      bsecontainer.proc                               bseeditablesample.proc  \
        bsejanitor.proc                                 bseprocedure.proc       bseproject.proc         \
                                bsesong.proc                                    bsesource.proc          \
-       bsetrack.proc           bseitem.proc            bsewave.proc            bsewaveosc.proc         
bsewaverepo.proc \
+                               bseitem.proc            bsewave.proc            bsewaveosc.proc         
bsewaverepo.proc \
 )
 bse_proc_gen_sources = $(bse_proc_sources:.proc=.genprc.cc)
 # non-compile and non-install sources required
diff --git a/bse/bseapi.idl b/bse/bseapi.idl
index 39de56d..5519010 100644
--- a/bse/bseapi.idl
+++ b/bse/bseapi.idl
@@ -364,6 +364,8 @@ record SongTiming {
 // Forward declarations.
 record PartLink;
 sequence PartLinkSeq;
+record TrackPart;
+sequence TrackPartSeq;
 
 /// Fundamental base type for all BSE objects.
 interface Object {
@@ -448,6 +450,11 @@ interface Part : Item {
   // property int32 last_tick;
 };
 
+/// A list of Part or derived types.
+sequence PartSeq {
+  Part part;
+};
+
 /// Base interface type for synthesis modules with input or output streams.
 interface Source : Item {
   Source ichannel_get_osource (int32 input_channel, int32 input_joint); ///< Retrieve output module 
connected to a specific joint of an input channel.
@@ -513,8 +520,8 @@ interface Track : ContextMerger {
   void       remove_tick (int32 tick);            ///< Remove Part at specified @a tick from a track.
   void       remove_link (int32 id);              ///< Remove a specific part link by ID from a track.
 
-  // ItemSeq      list_parts_uniq ();              ///< List all parts contained in a track.
-  // TrackPartSeq list_parts ();                   ///< List parts scheduled in a track, sorted by tick.
+  PartSeq      list_parts_uniq ();              ///< List all parts contained in a track.
+  TrackPartSeq list_parts ();                   ///< List parts scheduled in a track, sorted by tick.
   Part         get_part (int32 tick);           ///< Get the part starting at a specific tick position.
   int32        get_last_tick ();                ///< Retrieve the last tick for this track.
   ErrorType    ensure_output ();                ///< Ensure the track has an output connection to a bus.
@@ -545,6 +552,18 @@ sequence PartLinkSeq {
   PartLink plinks;
 };
 
+/// Structure linking to a Track from within a Part.
+record TrackPart {
+  int32 tick     = Range ("Tick", "", STANDARD, 0, MAXINT31, 384);
+  Part  part;
+  int32 duration = Range ("Duration", "", STANDARD, 0, MAXINT31, 384);
+};
+
+/// Sequence of TrackPart records.
+sequence TrackPartSeq {
+  TrackPart parts;
+};
+
 /// Interface for effect stacks and per-track audio signal routing to the master output.
 interface Bus : SubSynth {
   ErrorType ensure_output    ();            ///< Ensure that a bus has an output connection.
diff --git a/bse/bsebasics.idl b/bse/bsebasics.idl
index 1188c64..4a9c30f 100644
--- a/bse/bsebasics.idl
+++ b/bse/bsebasics.idl
@@ -379,15 +379,6 @@ sequence CategorySeq {
 /* BSE Part structures */
 interface Part;
 interface Track;
-/* BSE Track structures */
-record TrackPart {
-  Int           tick     = SfiInt ("Tick", "", 0, 0, G_MAXINT, 384, STANDARD);
-  Part          part;
-  Int           duration = SfiInt ("Duration", "", 0, 0, G_MAXINT, 384, STANDARD);
-};
-sequence TrackPartSeq {
-  TrackPart tparts;
-};
 interface Janitor;
 
 // == BSE Global Config ==
diff --git a/bse/bsepart.cc b/bse/bsepart.cc
index c66f491..addc7f1 100644
--- a/bse/bsepart.cc
+++ b/bse/bsepart.cc
@@ -478,18 +478,17 @@ bse_part_list_links (BsePart *self)
       for (ring = song->tracks_SL; ring; ring = sfi_ring_walk (ring, song->tracks_SL))
         {
           BseTrack *track = (BseTrack*) ring->data;
-          BseTrackPartSeq *tps = bse_track_list_part (track, self);
-          for (size_t i = 0; i < tps->n_tparts; i++)
+          const Bse::TrackPartSeq &tps = bse_track_list_part (track, self);
+          for (size_t i = 0; i < tps.size(); i++)
             {
-              BseTrackPart *tp = tps->tparts[i];
+              const Bse::TrackPart &tp = tps[i];
               Bse::PartLink pl;
               pl.track = track->as<Bse::TrackIfaceP>();
-              pl.tick = tp->tick;
+              pl.tick = tp.tick;
               pl.part = self->as<Bse::PartIfaceP>();
-              pl.duration = tp->duration;
+              pl.duration = tp.duration;
               pls.push_back (pl);
             }
-          bse_track_part_seq_free (tps);
         }
       stable_sort (pls.begin(), pls.end(), part_link_lesser);
     }
diff --git a/bse/bsetrack.cc b/bse/bsetrack.cc
index 6566ba9..e77644e 100644
--- a/bse/bsetrack.cc
+++ b/bse/bsetrack.cc
@@ -614,9 +614,8 @@ bse_track_remove_tick (BseTrack *self,
     }
 }
 
-static BseTrackPartSeq*
-bse_track_list_parts_intern (BseTrack *self,
-                             BsePart  *part)
+static Bse::TrackPartSeq
+bse_track_list_parts_intern (BseTrack *self, BsePart *part)
 {
   BseItem *item = BSE_ITEM (self);
   BseSong *song = NULL;
@@ -624,40 +623,39 @@ bse_track_list_parts_intern (BseTrack *self,
     song = BSE_SONG (item->parent);
   Bse::SongTiming timing;
   bse_song_timing_get_default (&timing);
-  BseTrackPartSeq *tps = bse_track_part_seq_new ();
+  Bse::TrackPartSeq tps;
   gint i;
   for (i = 0; i < self->n_entries_SL; i++)
     {
       BseTrackEntry *entry = self->entries_SL + i;
       if (entry->part && (entry->part == part || !part))
        {
-         BseTrackPart tp = { 0, };
+          Bse::TrackPart tp;
          tp.tick = entry->tick;
-         tp.part = entry->part;
+         tp.part = entry->part->as<Bse::PartIfaceP>();
          if (song)
            bse_song_get_timing (song, tp.tick, &timing);
          tp.duration = MAX (uint (timing.tpt), entry->part->last_tick_SL);
          if (i + 1 < self->n_entries_SL)
            tp.duration = MIN (uint (tp.duration), entry[1].tick - entry->tick);
-         bse_track_part_seq_append (tps, &tp);
+         tps.push_back (tp);
        }
     }
   return tps;
 }
 
-BseTrackPartSeq*
+Bse::TrackPartSeq
 bse_track_list_parts (BseTrack *self)
 {
-  assert_return (BSE_IS_TRACK (self), NULL);
+  assert_return (BSE_IS_TRACK (self), Bse::TrackPartSeq());
   return bse_track_list_parts_intern (self, NULL);
 }
 
-BseTrackPartSeq*
-bse_track_list_part (BseTrack *self,
-                     BsePart  *part)
+Bse::TrackPartSeq
+bse_track_list_part (BseTrack *self, BsePart *part)
 {
-  assert_return (BSE_IS_TRACK (self), NULL);
-  assert_return (BSE_IS_PART (part), NULL);
+  assert_return (BSE_IS_TRACK (self), Bse::TrackPartSeq());
+  assert_return (BSE_IS_PART (part), Bse::TrackPartSeq());
   return bse_track_list_parts_intern (self, part);
 }
 
@@ -1124,6 +1122,26 @@ TrackImpl::remove_link (int link_id)
     remove_tick (entry->tick);
 }
 
+PartSeq
+TrackImpl::list_parts_uniq ()
+{
+  BseTrack *self = as<BseTrack*>();
+  const TrackPartSeq &tpseq = bse_track_list_parts (self);
+  PartSeq parts;
+  for (const auto &tp : tpseq)
+    parts.push_back (tp.part);
+  std::sort (parts.begin(), parts.end());
+  parts.erase (std::unique (parts.begin(), parts.end()), parts.end());
+  return parts;
+}
+
+TrackPartSeq
+TrackImpl::list_parts ()
+{
+  BseTrack *self = as<BseTrack*>();
+  return bse_track_list_parts (self);
+}
+
 PartIfaceP
 TrackImpl::get_part (int tick)
 {
diff --git a/bse/bsetrack.hh b/bse/bsetrack.hh
index ae8d222..925f09d 100644
--- a/bse/bsetrack.hh
+++ b/bse/bsetrack.hh
@@ -63,8 +63,8 @@ guint          bse_track_insert_part  (BseTrack               *self,
                                         BsePart                *part);
 void            bse_track_remove_tick  (BseTrack               *self,
                                         guint                   tick);
-BseTrackPartSeq* bse_track_list_parts  (BseTrack               *self);
-BseTrackPartSeq* bse_track_list_part   (BseTrack               *self,
+Bse::TrackPartSeq bse_track_list_parts (BseTrack               *self);
+Bse::TrackPartSeq bse_track_list_part  (BseTrack               *self,
                                          BsePart                *part);
 gboolean        bse_track_find_part    (BseTrack               *self,
                                         BsePart                *part,
@@ -90,6 +90,8 @@ public:
   virtual int          insert_part       (int tick, PartIface &part) override;
   virtual void         remove_tick       (int tick) override;
   virtual void         remove_link       (int id) override;
+  virtual PartSeq      list_parts_uniq   () override;
+  virtual TrackPartSeq list_parts        () override;
   virtual PartIfaceP   get_part          (int tick) override;
   virtual int          get_last_tick     () override;
   virtual ErrorType    ensure_output     () override;


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