Merging from trunk
[ardour.git] / libs / ardour / audio_playlist.cc
index 0744f9c36ab890091a61f575bae7eae8eb7ea288..bbbaf42fef5f1b7e2677355c4ee122150b9089e8 100644 (file)
@@ -37,6 +37,7 @@
 using namespace ARDOUR;
 using namespace sigc;
 using namespace std;
+using namespace PBD;
 
 AudioPlaylist::State::~State ()
 {
@@ -203,7 +204,7 @@ AudioPlaylist::read (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, ch
           its OK to block (for short intervals).
        */
 
-       LockMonitor rm (region_lock, __LINE__, __FILE__);
+       Glib::Mutex::Lock rm (region_lock);
 
        end =  start + cnt - 1;
 
@@ -344,6 +345,46 @@ 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();) {
+               Crossfades::iterator tmp;
+               tmp = x;
+               ++tmp;
+
+               Crossfade *fade = 0;
+               
+               if ((*x)->_in == orig) {
+                       if (! (*x)->covers(right->position())) {
+                               fade = new Crossfade( *(*x), left, (*x)->_out);
+                       } else {
+                               // Overlap, the crossfade is copied on the left side of the right region instead
+                               fade = new Crossfade( *(*x), right, (*x)->_out);
+                       }
+               }
+               
+               if ((*x)->_out == orig) {
+                       if (! (*x)->covers(right->position())) {
+                               fade = new Crossfade( *(*x), (*x)->_in, right);
+                       } else {
+                               // Overlap, the crossfade is copied on the right side of the left region instead
+                               fade = new Crossfade( *(*x), (*x)->_in, left);
+                       }
+               }
+               
+               if (fade) {
+                       _crossfades.remove( (*x) );
+                       add_crossfade (*fade);
+               }
+               x = tmp;
+       }
+}
+
 void
 AudioPlaylist::check_dependents (Region& r, bool norefresh)
 {
@@ -464,7 +505,7 @@ AudioPlaylist::add_crossfade (Crossfade& xfade)
        
 void AudioPlaylist::notify_crossfade_added (Crossfade *x)
 {
-       if (atomic_read(&block_notifications)) {
+       if (g_atomic_int_get(&block_notifications)) {
                _pending_xfade_adds.insert (_pending_xfade_adds.end(), x);
        } else {
                NewCrossfade (x); /* EMIT SIGNAL */
@@ -846,8 +887,14 @@ AudioPlaylist::get_equivalent_regions (const AudioRegion& other, vector<AudioReg
 
                AudioRegion* ar = dynamic_cast<AudioRegion*> (*i);
 
-               if (ar && ar->equivalent (other)) {
-                       results.push_back (ar);
+               if (ar) {
+                       if (Config->get_use_overlap_equivalency()) {
+                               if (ar->overlap_equivalent (other)) {
+                                       results.push_back (ar);
+                               } else if (ar->equivalent (other)) {
+                                       results.push_back (ar);
+                               }
+                       }
                }
        }
 }