diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2012-05-10 12:14:26 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2012-05-10 12:14:26 +0000 |
commit | da7215e1ad6ebcf99cf5874cf676c460dcbb7ee7 (patch) | |
tree | 1baf1513a7040706cebf8acd80a7d8dace35d0ff /libs | |
parent | bed955b40935cf7765829e260b70258b79803890 (diff) |
if an xfade involves only 2 regions, clamp its length to the overlap between them
git-svn-id: svn://localhost/ardour2/branches/3.0@12238 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/ardour/audioregion.h | 2 | ||||
-rw-r--r-- | libs/ardour/audioregion.cc | 53 |
2 files changed, 55 insertions, 0 deletions
diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h index fe9f991ed0..fd6c3a8528 100644 --- a/libs/ardour/ardour/audioregion.h +++ b/libs/ardour/ardour/audioregion.h @@ -142,6 +142,8 @@ class AudioRegion : public Region void set_default_fade_in (); void set_default_fade_out (); + + framecnt_t verify_xfade_bounds (framecnt_t, bool start); void set_envelope_active (bool yn); void set_default_envelope (); diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index e217783760..4ba383b37e 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -1801,6 +1801,59 @@ AudioRegion::set_fade_out_is_xfade (bool yn) _fade_out_is_xfade = yn; } +framecnt_t +AudioRegion::verify_xfade_bounds (framecnt_t len, bool start) +{ + boost::shared_ptr<Playlist> pl (playlist()); + + if (!pl) { + /* not currently in a playlist - xfade length is unbounded + (and irrelevant) + */ + return len; + } + + boost::shared_ptr<RegionList> rl; + framecnt_t maxlen; + + if (start) { + rl = pl->regions_at (position()); + } else { + rl = pl->regions_at (last_frame()); + } + + RegionList::iterator i; + boost::shared_ptr<Region> other; + uint32_t n = 0; + + /* count and find the other region in a single pass through the list */ + + for (i = rl->begin(); i != rl->end(); ++i) { + if ((*i).get() != this) { + other = *i; + } + ++n; + } + + if (n != 2) { + /* zero or multiple regions stacked here - don't care about xfades */ + return len; + } + + /* we overlap a single region. clamp the length of an xfade to + the duration of the overlap. + */ + + if (start) { + maxlen = other->last_frame() - position(); + } else { + maxlen = last_frame() - other->position(); + } + + return min (maxlen, len); + +} + extern "C" { int region_read_peaks_from_c (void *arg, uint32_t npeaks, uint32_t start, uint32_t cnt, intptr_t data, uint32_t n_chan, double samples_per_unit) |