summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-07-10 08:16:55 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2014-07-10 08:16:55 -0400
commit0622a0cc3068a06d328119e90b7d9c5f5a84df32 (patch)
tree7f1a03a03df6e47cad3c358ceb1de60a1033c96e /libs
parent94c8b672c4e294384348f405d179f13e33e72ee5 (diff)
add libardour infrastructure for "fade range" edit operation
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/audioregion.h2
-rw-r--r--libs/ardour/ardour/playlist.h1
-rw-r--r--libs/ardour/ardour/region.h2
-rw-r--r--libs/ardour/audioregion.cc28
-rw-r--r--libs/ardour/playlist.cc10
5 files changed, 43 insertions, 0 deletions
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<Region> combine (const RegionList&);
void uncombine (boost::shared_ptr<Region>);
+ void fade_range (std::list<AudioRange>&);
void shuffle (boost::shared_ptr<Region>, 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
@@ -958,6 +958,34 @@ AudioRegion::set_state (const XMLNode& node, int version)
}
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)
{
set_fade_in (shape, (framecnt_t) _fade_in->back()->when);
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<Region> target)
thaw ();
}
+void
+Playlist::fade_range (list<AudioRange>& ranges)
+{
+ for (list<AudioRange>::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
{