X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Fedl.C;h=6f2b7e5865f784b8b30fd580b3b63553ca83ced6;hp=5f23b1b1cd945c4ecc045a627495074b9bc140cf;hb=9999347f8546c8b7d030c7938da54716f0ee695a;hpb=0c086b3e7b552e0f6b06c8696d7682d9d4bd91db diff --git a/cinelerra-5.1/cinelerra/edl.C b/cinelerra-5.1/cinelerra/edl.C index 5f23b1b1..6f2b7e58 100644 --- a/cinelerra-5.1/cinelerra/edl.C +++ b/cinelerra-5.1/cinelerra/edl.C @@ -49,6 +49,7 @@ #include "playbackconfig.h" #include "playabletracks.h" #include "plugin.h" +#include "pluginset.h" #include "preferences.h" #include "recordconfig.h" #include "recordlabel.h" @@ -794,22 +795,42 @@ int EDL::clear(double start, double end, return 0; } +static int dead_edit_cmp(Edit**ap, Edit**bp) +{ + Edit *a = *ap, *b = *bp; + if( a->track != b->track ) return 0; + return a->startproject > b->startproject ? -1 : 1; +} + void EDL::delete_edits(ArrayList *edits, int collapse) { + edits->sort(dead_edit_cmp); if( session->labels_follow_edits ) delete_edit_labels(edits, collapse); for( int i=0; isize(); ++i ) { Edit *edit = edits->get(i); Track *track = edit->track; int64_t start = edit->startproject; - int end = start + edit->length; - track->clear(start, end, 1, 0, - session->plugins_follow_edits, - session->autos_follow_edits, 0); - if( !collapse ) - track->paste_silence(start, end, - session->plugins_follow_edits, - session->autos_follow_edits); + int64_t length = edit->length; + int64_t end = start + length; + if( session->autos_follow_edits ) { + track->automation->clear(start, end, 0, collapse); + } + if( session->plugins_follow_edits ) { + for( int k=0; kplugin_set.size(); ++k ) { + PluginSet *plugin_set = track->plugin_set[k]; + plugin_set->clear(start, end, 1); + if( !collapse ) + plugin_set->paste_silence(start, end); + } + } + Edit *dead_edit = edit; + if( collapse ) { + while( (edit=edit->next) ) + edit->startproject -= length; + } + delete dead_edit; + track->optimize(); } optimize(); } @@ -1276,13 +1297,15 @@ void EDL::get_shared_tracks(Track *track, } } -// aligned frame time +// aligned frame time, account for sample truncation double EDL::frame_align(double position, int round) { - double frame_pos = position * session->frame_rate; - frame_pos = (int64_t)(frame_pos + (round ? 0.5 : 1e-6)); - position = frame_pos / session->frame_rate; - return position; + if( !round && session->sample_rate > 0 ) { + int64_t sample_pos = position * session->sample_rate; + position = (sample_pos+2.) / session->sample_rate; + } + int64_t frame_pos = (position * session->frame_rate + (round ? 0.5 : 1e-6)); + return frame_pos / session->frame_rate; } // Convert position to frames if alignment is enabled.