diff --git a/libs/ardour/ardour/audioplaylist.h b/libs/ardour/ardour/audioplaylist.h index fa2aa94471..1b60cf185d 100644 --- a/libs/ardour/ardour/audioplaylist.h +++ b/libs/ardour/ardour/audioplaylist.h @@ -93,6 +93,8 @@ class AudioPlaylist : public ARDOUR::Playlist /* playlist "callbacks" */ void notify_crossfade_added (Crossfade *); void flush_notifications (); + + void finalize_split_region (Region *orig, Region *left, Region *right); void refresh_dependents (Region& region); void check_dependents (Region& region, bool norefresh); diff --git a/libs/ardour/ardour/crossfade.h b/libs/ardour/ardour/crossfade.h index b2d5b18566..ebafa0e8cc 100644 --- a/libs/ardour/ardour/crossfade.h +++ b/libs/ardour/ardour/crossfade.h @@ -151,6 +151,7 @@ class Crossfade : public Stateful, public StateManager private: friend struct CrossfadeComparePtr; + friend class AudioPlaylist; static jack_nframes_t _short_xfade_length; diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index b0ac956d5c..c6cb65efc5 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -233,6 +233,9 @@ class Playlist : public Stateful, public StateManager { void splice_locked (); void splice_unlocked (); + + virtual void finalize_split_region (Region *original, Region *left, Region *right) {} + virtual void check_dependents (Region& region, bool norefresh) {} virtual void refresh_dependents (Region& region) {} virtual void remove_dependents (Region& region) {} diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc index 0744f9c36a..6f4217c3ec 100644 --- a/libs/ardour/audio_playlist.cc +++ b/libs/ardour/audio_playlist.cc @@ -344,6 +344,27 @@ AudioPlaylist::refresh_dependents (Region& r) } } +void +AudioPlaylist::finalize_split_region (Region *o, Region *l, Region *r) +{ + AudioRegion *orig = dynamic_cast(o); + AudioRegion *left = dynamic_cast(l); + AudioRegion *right = dynamic_cast(r); + + for (Crossfades::iterator x = _crossfades.begin(); x != _crossfades.end(); ++x) { + Crossfades::iterator tmp; + + if ((*x)->_in == orig) { + (*x)->_in = left; + } + + if ((*x)->_out == orig) { + (*x)->_out = right; + } + + } +} + void AudioPlaylist::check_dependents (Region& r, bool norefresh) { diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index feb0ad8bb5..a0b6cedde4 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -996,6 +996,8 @@ Playlist::split_region (Region& region, jack_nframes_t playlist_position) before = playlist_position - region.position(); after = region.length() - before; + in_set_state = true; + _session.region_name (before_name, region.name(), false); left = createRegion (region, 0, before, before_name, region.layer(), Region::Flag (region.flags()|Region::LeftOfSplit)); @@ -1005,6 +1007,10 @@ Playlist::split_region (Region& region, jack_nframes_t playlist_position) add_region_internal (left, region.position(), true); add_region_internal (right, region.position() + before); + finalize_split_region (®ion, left, right); + + in_set_state = false; + maybe_save_state (_("split")); }