add refresh_only to scopewindow, fix alsa prefs for capture source, add python to...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / edits.C
index ae7ab0c7d3ef8edf15119a71aeaa3728dc8a3e76..de93e5830d351d41ce3cd68e7a489f999e2c1312 100644 (file)
@@ -178,7 +178,7 @@ void Edits::insert_edits(Edits *source_edits,
 // Open destination area
                Edit *dest_edit = insert_new_edit(position + source_edit->startproject);
 
-               dest_edit->copy_from(source_edit);
+               dest_edit->clone_from(source_edit);
                dest_edit->asset = dest_asset;
                dest_edit->nested_edl = dest_nested_edl;
                dest_edit->startproject = position + source_edit->startproject;
@@ -223,9 +223,7 @@ Edit* Edits::insert_new_edit(int64_t position)
 
 //printf("Edits::insert_new_edit 1\n");
        Edit *new_edit = create_edit();
-       if( current ) new_edit->hard_right = current->hard_left;
        if( current ) current = PREVIOUS;
-       if( current ) new_edit->hard_left = current->hard_right;
 //printf("Edits::insert_new_edit 1\n");
        insert_after(current, new_edit);
        new_edit->startproject = position;
@@ -244,9 +242,17 @@ Edit* Edits::split_edit(int64_t position)
 
        Edit *new_edit = create_edit();
        insert_after(edit, new_edit);
-       new_edit->copy_from(edit);
+       new_edit->clone_from(edit);
        new_edit->length = new_edit->startproject + new_edit->length - position;
        edit->length = position - edit->startproject;
+       if( !new_edit->length || edit->silence() )
+               new_edit->hard_left = new_edit->hard_right = 0;
+       else if( !edit->length )
+               edit->hard_left = edit->hard_right = 0;
+       else {
+               new_edit->hard_right = edit->hard_right;
+               new_edit->hard_left = edit->hard_right = 0;
+       }
        new_edit->startproject = position;
        new_edit->startsource += edit->length;
 
@@ -367,13 +373,19 @@ int Edits::optimize()
 
 // delete 0 length edits
                for( current = first; !result && current; ) {
-                       Edit* next = current->next;
+                       Edit* prev = current->previous, *next = current->next;
                        if( current->length == 0 ) {
                                if( next && current->transition && !next->transition) {
                                        next->transition = current->transition;
                                        next->transition->edit = next;
                                        current->transition = 0;
                                }
+                               if( !current->silence() ) {
+                                       if( current->hard_left && next && !next->silence() )
+                                               next->hard_left = 1;
+                                       if( current->hard_right && prev && !prev->silence())
+                                               prev->hard_right = 1;
+                               }
                                delete current;
                                result = 1;
                                break;
@@ -394,13 +406,14 @@ int Edits::optimize()
                        Edit *next_edit = 0;
                        for( ; current && (next_edit=current->next); current=NEXT ) {
 // both edges are not hard edges
-                               if( current->hard_right || next_edit->hard_left ) continue;
+                               if( current->hard_right || next_edit->hard_left )
+                                       continue;
 // next edit is a glitch
                                if( is_glitch(next_edit) )
                                        break;
 // both edits are silence & not a plugin
-                               if( !current->is_plugin && current->silence() &&
-                                   !next_edit->is_plugin && next_edit->silence() )
+                               if( !current->is_plugin() && current->silence() &&
+                                   !next_edit->is_plugin() && next_edit->silence() )
                                        break;
 // source channels are identical & assets are identical
                                if( !result && current->channel == next_edit->channel &&