From 0622a0cc3068a06d328119e90b7d9c5f5a84df32 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 10 Jul 2014 08:16:55 -0400 Subject: [PATCH] add libardour infrastructure for "fade range" edit operation --- libs/ardour/ardour/audioregion.h | 2 ++ libs/ardour/ardour/playlist.h | 1 + libs/ardour/ardour/region.h | 2 ++ libs/ardour/audioregion.cc | 28 ++++++++++++++++++++++++++++ libs/ardour/playlist.cc | 10 ++++++++++ 5 files changed, 43 insertions(+) diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h index b3bed8d5fd..8e510b3e43 100644 --- a/libs/ardour/ardour/audioregion.h +++ b/libs/ardour/ardour/audioregion.h @@ -115,6 +115,8 @@ class LIBARDOUR_API AudioRegion : public Region XMLNode& get_basic_state (); int set_state (const XMLNode&, int version); + void fade_range (framepos_t, framepos_t); + bool fade_in_is_default () const; bool fade_out_is_default () const; diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index ababa60063..0cb68cd805 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -142,6 +142,7 @@ public: void nudge_after (framepos_t start, framecnt_t distance, bool forwards); boost::shared_ptr combine (const RegionList&); void uncombine (boost::shared_ptr); + void fade_range (std::list&); void shuffle (boost::shared_ptr, int dir); void ripple (framepos_t at, framecnt_t distance, RegionList *exclude); diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h index a66047a02a..a77d92fd9e 100644 --- a/libs/ardour/ardour/region.h +++ b/libs/ardour/ardour/region.h @@ -224,6 +224,8 @@ class LIBARDOUR_API Region void trim_end (framepos_t new_position); void trim_to (framepos_t position, framecnt_t length); + virtual void fade_range (framepos_t, framepos_t) {} + void cut_front (framepos_t new_position); void cut_end (framepos_t new_position); diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index 2eb09ae192..630819d7c1 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -957,6 +957,34 @@ AudioRegion::set_state (const XMLNode& node, int version) return _set_state (node, version, what_changed, true); } +void +AudioRegion::fade_range (framepos_t start, framepos_t end) +{ + framepos_t s, e; + + switch (coverage (start, end)) { + case Evoral::OverlapStart: + s = _position; + e = end; + set_fade_in (FadeConstantPower, e - s); + break; + case Evoral::OverlapEnd: + s = start; + e = _position + _length; + set_fade_out (FadeConstantPower, e - s); + break; + case Evoral::OverlapInternal: + /* needs addressing, perhaps. Difficult to do if we can't + * control one edge of the fade relative to the relevant edge + * of the region, which we cannot - fades are currently assumed + * to start/end at the start/end of the region + */ + break; + default: + return; + } +} + void AudioRegion::set_fade_in_shape (FadeShape shape) { diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 266535da20..4214e9031d 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -3123,6 +3123,16 @@ Playlist::uncombine (boost::shared_ptr target) thaw (); } +void +Playlist::fade_range (list& ranges) +{ + for (list::iterator r = ranges.begin(); r != ranges.end(); ++r) { + for (RegionList::const_iterator i = regions.begin(); i != regions.end(); ++i) { + (*i)->fade_range ((*r).start, (*r).end); + } + } +} + uint32_t Playlist::max_source_level () const { -- 2.30.2