diff options
author | André Nusser <andre.nusser@googlemail.com> | 2015-11-26 17:25:13 +0100 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2015-12-02 14:59:43 -0500 |
commit | ba4db8f6cb30c3bf373a1261da0f9e49a598ccbc (patch) | |
tree | fc4faa84306ad4760d73959ec5bb7087611a3f41 /libs/ardour | |
parent | add37c6b96df3d859aaa69ffa32d39222acbe455 (diff) |
Add function to duplicate until a certain frame.
This excludes the 'end' frame.
Diffstat (limited to 'libs/ardour')
-rw-r--r-- | libs/ardour/ardour/playlist.h | 1 | ||||
-rw-r--r-- | libs/ardour/playlist.cc | 33 |
2 files changed, 34 insertions, 0 deletions
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<Region>, framepos_t position, float times); void duplicate (boost::shared_ptr<Region>, framepos_t position, framecnt_t gap, float times); + void duplicate_until (boost::shared_ptr<Region>, framepos_t position, framecnt_t gap, framepos_t end); void nudge_after (framepos_t start, framecnt_t distance, bool forwards); boost::shared_ptr<Region> combine (const RegionList&); void uncombine (boost::shared_ptr<Region>); 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> region, framepos_t position, framecnt_t gap, framepos_t end) +{ + RegionWriteLock rl (this); + + while (position + region->length() - 1 < end) { + boost::shared_ptr<Region> 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<Region> 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) { |