// 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;
//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;
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;
}
}
+// trim edits before position 0
+ while( first && first->startproject+first->length < 0 )
+ delete first;
+ if( first && first->startproject < 0 ) {
+ first->length += first->startproject;
+ first->startproject = 0;
+ }
+
// Insert silence between edits which aren't consecutive
for(current = last; current; current = current->previous)
{
// 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;
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 &&
double delta = newposition - oldposition;
oldposition = track->from_units(current_edit->startproject);
if( group_id > 0 ) newposition = oldposition + delta;
- result = 1;
-// dont move stuff if media playback does not shift in time
- if( edit_mode != MOVE_MEDIA && edit_mode != MOVE_EDGE_MEDIA ) {
- edit_labels = 0;
- edit_plugins = 0;
- edit_autos = 0;
- }
current_edit->shift_start(edit_mode,
track->to_units(newposition, 0), track->to_units(oldposition, 0),
- 0, edit_labels, edit_plugins, edit_autos,
- trim_edits);
+ edit_labels, edit_autos, edit_plugins, trim_edits);
+ result = 1;
}
if(!result) current_edit = current_edit->next;
current_edit->shift_end(edit_mode,
track->to_units(newposition, 0), track->to_units(oldposition, 0),
- edit_edits, edit_labels, edit_plugins, edit_autos, trim_edits);
+ edit_labels, edit_autos, edit_plugins, trim_edits);
}
if(!result) current_edit = current_edit->next;