X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ftracksedit.C;h=e84fe07b4b483ec94d09358e612a47cfb7362190;hb=8b9bf13ecb7f40eddc9155ac87bedce58c5942ed;hp=849d6942cb24ebd7a058d534cf77d25448421c2d;hpb=48a6854a1ca58aa291ffc6fe3a48807492dfbef7;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/tracksedit.C b/cinelerra-5.1/cinelerra/tracksedit.C index 849d6942..e84fe07b 100644 --- a/cinelerra-5.1/cinelerra/tracksedit.C +++ b/cinelerra-5.1/cinelerra/tracksedit.C @@ -372,27 +372,41 @@ void Tracks::set_transition_length(double start, double end, double length) void Tracks::set_transition_length(Transition *transition, double length) { // Must verify existence of transition - int done = 0; - if(!transition) return; - for(Track *current_track = first; - current_track && !done; - current_track = current_track->next) - { - for(Edit *current_edit = current_track->edits->first; - current_edit && !done; - current_edit = current_edit->next) - { - if(current_edit->transition == transition) - { - transition->length = current_track->to_units(length, 1); - if( current_edit == current_track->edits->last && - current_edit->silence() ) { - current_edit->length = current_edit->transition->length; + int found = 0; + if( !transition ) return; + for( Track *track=first; track && !found; track=track->next ) { + for( Edit *edit=track->edits->first; edit && !found; edit = edit->next ) { + if( edit->transition == transition ) { + transition->length = track->to_units(length, 1); + if( edit == track->edits->last && edit->silence() ) { + edit->length = edit->transition->length; } - done = 1; + found = 1; } } } + if( !found ) return; + if( edl->local_session->gang_tracks == GANG_NONE ) return; + Track *track = transition->edit->track; + double pos = track->from_units(transition->edit->startproject); + Track *current = edl->tracks->first; + for( ; current; current=current->next ) { + if( current == track ) continue; + if( current->data_type != track->data_type ) continue; + if( !current->armed_gang(track) ) continue; + int64_t track_pos = current->to_units(pos, 1); + Edit *edit = current->edits->editof(track_pos, PLAY_FORWARD, 0); + if( !edit || !edit->transition ) continue; + double edit_pos = track->from_units(edit->startproject); + if( !edl->equivalent(pos, edit_pos) ) continue; +// modify gang same transitions at same position + if( edit->transition->Plugin::identical(transition) ) { + edit->transition->length = transition->length; + } + if( edit == track->edits->last && edit->silence() ) { + edit->length = edit->transition->length; + } + } } void Tracks::paste_transitions(double start, double end, int track_type, char* title) @@ -544,7 +558,7 @@ int Tracks::delete_tracks() { int total_deleted = 0; int done = 0; - int gang = edl->session->gang_tracks != GANG_NONE ? 1 : 0; + int gang = edl->local_session->gang_tracks != GANG_NONE ? 1 : 0; while( !done ) { done = 1; @@ -683,6 +697,7 @@ void Tracks::move_effect(Plugin *plugin, Track *track, int64_t position) start, length, plugin->plugin_type); result->copy_from(plugin); result->shift(position - plugin->startproject); + result->gui_id = plugin->gui_id; // Clear new plugin from old set plugin->plugin_set->clear(plugin->startproject, @@ -742,7 +757,7 @@ int Tracks::concatenate_tracks(int edit_plugins, int edit_autos) input_track = input_track->next) { if(input_track->data_type == data_type && - input_track->play && + input_track->plays() && !input_track->is_armed()) break; } @@ -768,7 +783,7 @@ int Tracks::concatenate_tracks(int edit_plugins, int edit_autos) if(input_track->data_type == data_type && !input_track->is_armed() && - input_track->play) break; + input_track->plays()) break; } for(output_track = output_track->next; @@ -836,12 +851,12 @@ int Tracks::copy(int copy_flags, double start, double end, -int Tracks::move_track_up(Track *track) +int Tracks::roll_track_up(Track *track) { if( first == last ) return 1; int n = 1; Track *src = track, *dst = src->previous; - if( edl->session->gang_tracks != GANG_NONE ) { + if( edl->local_session->gang_tracks != GANG_NONE ) { while( src && !src->master ) src = src->previous; if( !src ) src = first; Track *nxt = src->next; @@ -850,16 +865,16 @@ int Tracks::move_track_up(Track *track) while( dst && !dst->master ) { dst = dst->previous; } } if( src == dst ) return 1; - move_tracks(src, dst, n); + roll_tracks(src, dst, n); return 0; } -int Tracks::move_track_down(Track *track) +int Tracks::roll_track_down(Track *track) { if( first == last ) return 1; int n = 1; Track *src = track, *dst = src->next; - if( edl->session->gang_tracks != GANG_NONE ) { + if( edl->local_session->gang_tracks != GANG_NONE ) { while( src && !src->master ) src = src->previous; if( !src ) src = first; Track *nxt = src->next; @@ -875,39 +890,94 @@ int Tracks::move_track_down(Track *track) else dst = !dst ? first : dst->next; if( src == dst ) return 1; - move_tracks(src, dst, n); + roll_tracks(src, dst, n); return 0; } -int Tracks::move_tracks_up() +int Tracks::roll_tracks_up() { if( first == last ) return 1; int n = 1; Track *src = first, *dst = 0; - if( edl->session->gang_tracks != GANG_NONE ) { + if( edl->local_session->gang_tracks != GANG_NONE ) { Track *nxt = src->next; while( nxt && !nxt->master ) { ++n; nxt = nxt->next; } } if( src == dst ) return 1; - move_tracks(src, dst, n); + roll_tracks(src, dst, n); return 0; } -int Tracks::move_tracks_down() +int Tracks::roll_tracks_down() { if( first == last ) return 1; int n = 1; Track *src = last, *dst = first; - if( edl->session->gang_tracks != GANG_NONE ) { + if( edl->local_session->gang_tracks != GANG_NONE ) { while( src && !src->master ) { ++n; src = src->previous; } } if( src == dst ) return 1; - move_tracks(src, dst, n); + roll_tracks(src, dst, n); + return 0; +} + + +int Tracks::move_track_up(Track *track) +{ + Track *next_track = track->previous; + if(!next_track) next_track = last; + + change_modules(number_of(track), number_of(next_track), 1); + swap(track, next_track); + return 0; +} + +int Tracks::move_track_down(Track *track) +{ + Track *next_track = track->next; + if(!next_track) next_track = first; + + change_modules(number_of(track), number_of(next_track), 1); + swap(track, next_track); return 0; } +int Tracks::move_tracks_up() +{ + int result = 0; + Track *next = first; + while( next ) { + Track *track = next; next = track->next; + if( !track->armed ) continue; + if( track->previous ) { + change_modules(number_of(track->previous), number_of(track), 1); + swap(track->previous, track); + result = 1; + } + } + + return result; +} + +int Tracks::move_tracks_down() +{ + int result = 0; + Track *prev = last; + while( prev ) { + Track *track = prev; prev = track->previous; + if( !track->armed ) continue; + if( track->next ) { + change_modules(number_of(track), number_of(track->next), 1); + swap(track, track->next); + result = 1; + } + } + + return result; +} + void Tracks::paste_audio_transition(PluginServer *server) { for(Track *current = first; current; current = NEXT) @@ -943,7 +1013,6 @@ void Tracks::paste_automation(double selectionstart, Track* current_atrack = 0; Track* current_vtrack = 0; Track* dst_track = 0; - int src_type; int result = 0; double length; double frame_rate = edl->session->frame_rate; @@ -952,10 +1021,9 @@ void Tracks::paste_automation(double selectionstart, string[0] = 0; // Search for start - do{ - result = file->read_tag(); - }while(!result && - !file->tag.title_is("AUTO_CLIPBOARD")); + do { + result = file->read_tag(); + } while(!result && !file->tag.title_is("AUTO_CLIPBOARD")); if(!result) { @@ -963,7 +1031,6 @@ void Tracks::paste_automation(double selectionstart, frame_rate = file->tag.get_property("FRAMERATE", frame_rate); sample_rate = file->tag.get_property("SAMPLERATE", sample_rate); - do { result = file->read_tag(); @@ -978,15 +1045,9 @@ void Tracks::paste_automation(double selectionstart, if(file->tag.title_is("TRACK")) { file->tag.get_property("TYPE", string); - if(!strcmp(string, "AUDIO")) - { - src_type = TRACK_AUDIO; - } - else - { - src_type = TRACK_VIDEO; - } - + double src_rate = !strcmp(string, "AUDIO") ? + sample_rate : frame_rate; + double src_length = length / src_rate; // paste to any media type if(typeless) { @@ -1028,22 +1089,9 @@ void Tracks::paste_automation(double selectionstart, if(dst_track) { - double frame_rate2 = frame_rate; - double sample_rate2 = sample_rate; - - if(src_type != dst_track->data_type) - { - frame_rate2 = sample_rate; - sample_rate2 = frame_rate; - } - - dst_track->paste_automation(selectionstart, - length, - frame_rate2, - sample_rate2, - file, - default_only, - active_only); + dst_track->paste_automation(file, + selectionstart, src_length, src_rate, + default_only, active_only); } } } @@ -1060,6 +1108,20 @@ void Tracks::paste_automation(double selectionstart, void Tracks::paste_transition(PluginServer *server, Edit *dest_edit) { dest_edit->insert_transition(server->title); + if( edl->local_session->gang_tracks == GANG_NONE ) return; + Track *track = dest_edit->track; + double pos = track->from_units(dest_edit->startproject); + for( Track *current=first; current; current=current->next ) { + if( current == track ) continue; + if( current->data_type != track->data_type ) continue; + if( !current->armed_gang(track) ) continue; + int64_t track_pos = current->to_units(pos, 1); + Edit *edit = current->edits->editof(track_pos, PLAY_FORWARD, 0); + if( !edit ) continue; + double edit_pos = track->from_units(edit->startproject); + if( !edl->equivalent(pos, edit_pos) ) continue; + edit->insert_transition(server->title); + } } void Tracks::paste_video_transition(PluginServer *server, int first_track)