[beast: 2/5] BSE: move Track.list_parts[_uniq]() into bseapi.idl
- From: Tim Janik <timj src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [beast: 2/5] BSE: move Track.list_parts[_uniq]() into bseapi.idl
- Date: Fri, 20 Nov 2015 22:08:16 +0000 (UTC)
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]