summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2009-08-26 02:19:36 +0000
committerCarl Hetherington <carl@carlh.net>2009-08-26 02:19:36 +0000
commitc6be9b688802198e04a07dc902c49d1d6b66340e (patch)
treec912543110517ddcbda171d8922a61f3e87d6aa7 /libs
parent8934ff78678cafeb03c398e7add299f2bc1a730d (diff)
Make stacked region coverage frames correctly respect regions being muted.
git-svn-id: svn://localhost/ardour2/branches/3.0@5595 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/playlist.h1
-rw-r--r--libs/ardour/playlist.cc33
2 files changed, 33 insertions, 1 deletions
diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h
index 1018419c26..6778a70f53 100644
--- a/libs/ardour/ardour/playlist.h
+++ b/libs/ardour/ardour/playlist.h
@@ -114,6 +114,7 @@ class Playlist : public SessionObject,
RegionList* regions_to_read (nframes_t start, nframes_t end);
boost::shared_ptr<Region> find_region (const PBD::ID&) const;
boost::shared_ptr<Region> top_region_at (nframes_t frame);
+ boost::shared_ptr<Region> top_unmuted_region_at (nframes_t frame);
boost::shared_ptr<Region> find_next_region (nframes_t frame, RegionPoint point, int dir);
nframes64_t find_next_region_boundary (nframes64_t frame, int dir);
bool region_is_shuffle_constrained (boost::shared_ptr<Region>);
diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc
index f74eb1001f..94e6e421bd 100644
--- a/libs/ardour/playlist.cc
+++ b/libs/ardour/playlist.cc
@@ -1418,7 +1418,38 @@ Playlist::top_region_at (nframes_t frame)
delete rlist;
return region;
-}
+}
+
+boost::shared_ptr<Region>
+Playlist::top_unmuted_region_at (nframes_t frame)
+
+{
+ RegionLock rlock (this);
+ RegionList *rlist = find_regions_at (frame);
+
+ for (RegionList::iterator i = rlist->begin(); i != rlist->end(); ) {
+
+ RegionList::iterator tmp = i;
+ ++tmp;
+
+ if ((*i)->muted()) {
+ rlist->erase (i);
+ }
+
+ i = tmp;
+ }
+
+ boost::shared_ptr<Region> region;
+
+ if (rlist->size()) {
+ RegionSortByLayer cmp;
+ rlist->sort (cmp);
+ region = rlist->back();
+ }
+
+ delete rlist;
+ return region;
+}
Playlist::RegionList*
Playlist::regions_to_read (nframes_t start, nframes_t end)