Merging from trunk
[ardour.git] / libs / ardour / playlist.cc
index feb0ad8bb5e7af257f7e854497c305b30b8e1292..7dee8667673a2a1bcd5ccebc24afff66cee8fd48 100644 (file)
@@ -41,7 +41,7 @@
 
 using namespace std;
 using namespace ARDOUR;
-//using namespace sigc;
+using namespace PBD;
 
 sigc::signal<void,Playlist*> Playlist::PlaylistCreated;
 
@@ -225,8 +225,8 @@ Playlist::copy_regions (RegionList& newlist) const
 void
 Playlist::init (bool hide)
 {
-       atomic_set (&block_notifications, 0);
-       atomic_set (&ignore_state_changes, 0);
+       g_atomic_int_set (&block_notifications, 0);
+       g_atomic_int_set (&ignore_state_changes, 0);
        pending_modified = false;
        pending_length = false;
        _refcnt = 0;
@@ -292,13 +292,13 @@ void
 Playlist::freeze ()
 {
        delay_notifications ();
-       atomic_inc (&ignore_state_changes);
+       g_atomic_int_inc (&ignore_state_changes);
 }
 
 void
 Playlist::thaw ()
 {
-       atomic_dec (&ignore_state_changes);
+       g_atomic_int_dec_and_test (&ignore_state_changes);
        release_notifications ();
 }
 
@@ -306,14 +306,14 @@ Playlist::thaw ()
 void
 Playlist::delay_notifications ()
 {
-       atomic_inc (&block_notifications);
+       g_atomic_int_inc (&block_notifications);
        freeze_length = _get_maximum_extent();
 }
 
 void
 Playlist::release_notifications ()
 {
-       if (atomic_dec_and_test(&block_notifications)) { 
+       if (g_atomic_int_dec_and_test (&block_notifications)) { 
                flush_notifications ();
        } 
 }
@@ -982,10 +982,6 @@ Playlist::split_region (Region& region, jack_nframes_t playlist_position)
                return;
        }
 
-       if (remove_region_internal (&region, true)) {
-               return;
-       }
-
        Region *left;
        Region *right;
        jack_nframes_t before;
@@ -996,14 +992,33 @@ Playlist::split_region (Region& region, jack_nframes_t playlist_position)
        before = playlist_position - region.position();
        after = region.length() - before;
        
+       
        _session.region_name (before_name, region.name(), false);
        left = createRegion (region, 0, before, before_name, region.layer(), Region::Flag (region.flags()|Region::LeftOfSplit));
 
        _session.region_name (after_name, region.name(), false);
        right = createRegion (region, before, after, after_name, region.layer(), Region::Flag (region.flags()|Region::RightOfSplit));
-       
+
        add_region_internal (left, region.position(), true);
        add_region_internal (right, region.position() + before);
+       
+       uint64_t orig_layer_op = region.last_layer_op();
+       for (RegionList::iterator i = regions.begin(); i != regions.end(); ++i) {
+               if ((*i)->last_layer_op() > orig_layer_op) {
+                       (*i)->set_last_layer_op( (*i)->last_layer_op() + 1 );
+               }
+       }
+       
+       left->set_last_layer_op ( orig_layer_op );
+       right->set_last_layer_op ( orig_layer_op + 1);
+
+       layer_op_counter++;
+
+       finalize_split_region (&region, left, right);
+       
+       if (remove_region_internal (&region, true)) {
+               return;
+       }
 
        maybe_save_state (_("split"));
 }