From c8fd1d26eb6a1a47f3a4507b4e32263623ac84cf Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 16 Jun 2014 00:51:45 +0200 Subject: fix region un/combine, based on a patch by Tom Brand --- libs/ardour/ardour/region_sorters.h | 13 +++++++++++++ libs/ardour/playlist.cc | 10 +++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) (limited to 'libs/ardour') diff --git a/libs/ardour/ardour/region_sorters.h b/libs/ardour/ardour/region_sorters.h index 9fd739a4da..3afd66bf3c 100644 --- a/libs/ardour/ardour/region_sorters.h +++ b/libs/ardour/ardour/region_sorters.h @@ -36,6 +36,19 @@ struct LIBARDOUR_API RegionSortByLayer { } }; +/* sort by RegionSortByLayerAndPosition() + * is equivalent to + * stable_sort by RegionSortByPosition(); + * stable_sort by RegionSortByLayer(); + */ +struct LIBARDOUR_API RegionSortByLayerAndPosition { + bool operator() (boost::shared_ptr a, boost::shared_ptr b) { + return + (a->layer() < b->layer() && a->position() < b->position()) + || (a->layer() == b->layer() && a->position() < b->position()); + } +}; + } // namespace #endif /* __libardour_region_sorters_h__ */ diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 47462a3575..d0720b985d 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -2809,7 +2809,14 @@ Playlist::combine (const RegionList& r) pl->in_partition = true; - for (RegionList::const_iterator i = r.begin(); i != r.end(); ++i) { + /* sort by position then layer. + * route_time_axis passes 'selected_regions' - which is not sorted. + * here we need the top-most first, then every layer's region softed by position. + */ + RegionList sorted(r); + sorted.sort(RegionSortByLayerAndPosition()); + + for (RegionList::const_iterator i = sorted.begin(); i != sorted.end(); ++i) { /* copy the region */ @@ -3050,6 +3057,7 @@ Playlist::uncombine (boost::shared_ptr target) for (vector >::iterator i = originals.begin(); i != originals.end(); ++i) { add_region ((*i), (*i)->position()); + set_layer((*i), (*i)->layer()); } in_partition = false; -- cgit v1.2.3