From ba4db8f6cb30c3bf373a1261da0f9e49a598ccbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Nusser?= Date: Thu, 26 Nov 2015 17:25:13 +0100 Subject: [PATCH] Add function to duplicate until a certain frame. This excludes the 'end' frame. --- libs/ardour/ardour/playlist.h | 1 + libs/ardour/playlist.cc | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index de5a5dcb05..4ebec8d424 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -141,6 +141,7 @@ public: void partition (framepos_t start, framepos_t end, bool cut = false); void duplicate (boost::shared_ptr, framepos_t position, float times); void duplicate (boost::shared_ptr, framepos_t position, framecnt_t gap, float times); + void duplicate_until (boost::shared_ptr, framepos_t position, framecnt_t gap, framepos_t end); void nudge_after (framepos_t start, framecnt_t distance, bool forwards); boost::shared_ptr combine (const RegionList&); void uncombine (boost::shared_ptr); diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 842ff8f394..a4860eba99 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -1283,6 +1283,39 @@ Playlist::flush_notifications (bool from_undo) } } +/** @param gap from the beginning of the region to the next beginning */ +/** @param end the first frame that does _not_ contain a duplicated frame */ +void +Playlist::duplicate_until (boost::shared_ptr region, framepos_t position, framecnt_t gap, framepos_t end) +{ + RegionWriteLock rl (this); + + while (position + region->length() - 1 < end) { + boost::shared_ptr copy = RegionFactory::create (region, true); + add_region_internal (copy, position); + set_layer (copy, DBL_MAX); + position += gap; + } + + if (position < end) { + framecnt_t length = min (region->length(), end - position); + string name; + RegionFactory::region_name (name, region->name(), false); + + { + PropertyList plist; + + plist.add (Properties::start, region->start()); + plist.add (Properties::length, length); + plist.add (Properties::name, name); + + boost::shared_ptr sub = RegionFactory::create (region, plist); + add_region_internal (sub, position); + set_layer (sub, DBL_MAX); + } + } +} + void Playlist::shift (framepos_t at, frameoffset_t distance, bool move_intersected, bool ignore_music_glue) {