diff options
-rw-r--r-- | libs/ardour/audio_playlist.cc | 46 | ||||
-rw-r--r-- | libs/ardour/playlist.cc | 3 |
2 files changed, 47 insertions, 2 deletions
diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc index f73bbf17e5..06eca9fb92 100644 --- a/libs/ardour/audio_playlist.cc +++ b/libs/ardour/audio_playlist.cc @@ -1109,7 +1109,7 @@ AudioPlaylist::pre_combine (vector<boost::shared_ptr<Region> >& originals, boost ar->set_fade_in_active (false); } - ar = boost::dynamic_pointer_cast<AudioRegion> (originals.front()); + ar = boost::dynamic_pointer_cast<AudioRegion> (originals.back()); if (ar) { /* copy the fade out of the last into the compound region */ @@ -1122,4 +1122,48 @@ AudioPlaylist::pre_combine (vector<boost::shared_ptr<Region> >& originals, boost void AudioPlaylist::pre_uncombine (vector<boost::shared_ptr<Region> >& originals, boost::shared_ptr<Region> compound_region) { + boost::shared_ptr<AudioRegion> ar; + boost::shared_ptr<AudioRegion> cr = boost::dynamic_pointer_cast<AudioRegion>(compound_region); + + if (!cr) { + return; + } + + /* no need to call clear_changes() on the originals because that is + * done within Playlist::uncombine () + */ + + if ((ar = boost::dynamic_pointer_cast<AudioRegion> (originals.front())) != 0) { + + /* copy the compound region's fade in back into the first + original region. + */ + + if (cr->fade_in()->back()->when <= ar->length()) { + /* don't do this if the fade is longer than the + * region + */ + ar->set_fade_in (cr->fade_in()); + } + + ar->set_fade_in_active (true); + _session.add_command (new StatefulDiffCommand (originals.front())); + } + + if ((ar = boost::dynamic_pointer_cast<AudioRegion> (originals.back())) != 0) { + + /* copy the compound region's fade out back into the last + original region. + */ + + if (cr->fade_out()->back()->when <= ar->length()) { + /* don't do this if the fade is longer than the + * region + */ + ar->set_fade_out (cr->fade_out()); + } + + ar->set_fade_out_active (true); + _session.add_command (new StatefulDiffCommand (originals.back())); + } } diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 3ca4fddfb1..3c241cf846 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -3281,7 +3281,6 @@ Playlist::uncombine (boost::shared_ptr<Region> target) boost::shared_ptr<Region> current (*i); - RegionFactory::CompoundAssociations::iterator ca = cassocs.find (*i); if (ca == cassocs.end()) { @@ -3384,6 +3383,8 @@ Playlist::uncombine (boost::shared_ptr<Region> target) originals.push_back (original); } + pre_uncombine (originals, target); + in_partition = true; freeze (); |