summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorSampo Savolainen <v2@iki.fi>2006-03-20 22:14:12 +0000
committerSampo Savolainen <v2@iki.fi>2006-03-20 22:14:12 +0000
commita873bbb14e5f60afac6a2fb38be447d5b00e1c10 (patch)
tree7a423435370d991b9989d69890cf239ff9bdd8ea /libs
parent9ae5dfa1cb08736f4ee7a38184db03796986151d (diff)
Fix for #1179. Crossfades are not lost anymore when regions are split.
git-svn-id: svn://localhost/trunk/ardour2@410 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/audioplaylist.h2
-rw-r--r--libs/ardour/ardour/crossfade.h1
-rw-r--r--libs/ardour/ardour/playlist.h3
-rw-r--r--libs/ardour/audio_playlist.cc21
-rw-r--r--libs/ardour/playlist.cc6
5 files changed, 33 insertions, 0 deletions
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
@@ -345,6 +345,27 @@ AudioPlaylist::refresh_dependents (Region& r)
}
void
+AudioPlaylist::finalize_split_region (Region *o, Region *l, Region *r)
+{
+ AudioRegion *orig = dynamic_cast<AudioRegion*>(o);
+ AudioRegion *left = dynamic_cast<AudioRegion*>(l);
+ AudioRegion *right = dynamic_cast<AudioRegion*>(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)
{
AudioRegion* other;
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 (&region, left, right);
+
+ in_set_state = false;
+
maybe_save_state (_("split"));
}