X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fcinelerra.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ftracks.C;h=862bde2d06925511dc8ed5f04823213cc0c3245c;hp=71aee8fcfbaf7f8755d2acbbd241baacd95ac008;hb=b384d47608e07b9f5b6ce5fe1d0d76d9bda38202;hpb=48a6854a1ca58aa291ffc6fe3a48807492dfbef7 diff --git a/cinelerra-5.1/cinelerra/tracks.C b/cinelerra-5.1/cinelerra/tracks.C index 71aee8fc..862bde2d 100644 --- a/cinelerra-5.1/cinelerra/tracks.C +++ b/cinelerra-5.1/cinelerra/tracks.C @@ -35,6 +35,7 @@ #include "panauto.h" #include "panautos.h" #include "patchbay.h" +#include "plugin.h" #include "mainsession.h" #include "strack.h" #include "theme.h" @@ -125,6 +126,20 @@ void Tracks::get_selected_edits(ArrayList *drag_edits) } } +void Tracks::select_edits(double start, double end, int v) +{ + for( Track *track=first; track; track=track->next ) { + if( !track->is_armed() ) continue; + int64_t start_pos = track->to_units(start, 0); + int64_t end_pos = track->to_units(end, 0); + for( Edit *edit=track->edits->first; edit; edit=edit->next ) { + if( start_pos >= edit->startproject+edit->length ) continue; + if( edit->startproject >= end_pos ) continue; + edit->is_selected = v > 1 ? 1 : v < 0 ? 0 : !edit->is_selected ; + } + } +} + void Tracks::get_automation_extents(float *min, float *max, double start, @@ -314,14 +329,14 @@ Track* Tracks::add_subttl_track(int above, Track *dst_track) } -int Tracks::delete_track(Track *track) +int Tracks::delete_track(Track *track, int gang) { if( !track ) return 0; - int gang = edl->session->gang_tracks != GANG_NONE ? 1 : 0; + if( gang < 0 ) + gang = edl->local_session->gang_tracks != GANG_NONE ? 1 : 0; Track *nxt = track->next; if( gang ) { - while( track && !track->master && track->previous ) - track = track->previous; + track = track->gang_master(); while( nxt && !nxt->master ) nxt = nxt->next; } @@ -341,13 +356,21 @@ int Tracks::delete_track(Track *track) int Tracks::detach_shared_effects(int module) { - for(Track *current = first; current; current = NEXT) - { + for( Track *current=first; current; current=NEXT ) { current->detach_shared_effects(module); } - return 0; - } +} +int Tracks::detach_ganged_effects(Plugin *plugin) +{ + if( edl->local_session->gang_tracks == GANG_NONE ) return 1; + for( Track *current=first; current; current=NEXT ) { + if( current == plugin->track ) continue; + if( !current->armed_gang(plugin->track) ) continue; + current->detach_ganged_effects(plugin); + } + return 0; +} int Tracks::total_of(int type) { @@ -362,7 +385,7 @@ int Tracks::total_of(int type) IntAuto *mute_auto = (IntAuto *)mute_keyframe; result += - (current->play && type == PLAY) || + (current->plays() && type == PLAY) || (current->is_armed() && type == RECORD) || (current->is_ganged() && type == GANG) || (current->draw && type == DRAW) || @@ -397,7 +420,7 @@ int Tracks::playable_audio_tracks() for(Track *current = first; current; current = NEXT) { - if(current->data_type == TRACK_AUDIO && current->play) + if(current->data_type == TRACK_AUDIO && current->plays()) { result++; } @@ -412,7 +435,7 @@ int Tracks::playable_video_tracks() for(Track *current = first; current; current = NEXT) { - if(current->data_type == TRACK_VIDEO && current->play) + if(current->data_type == TRACK_VIDEO && current->plays()) { result++; } @@ -441,7 +464,7 @@ double Tracks::total_playable_length() double total = 0; for(Track *current = first; current; current = NEXT) { - if( current->play ) + if( current->plays() ) { double length = current->get_length(); if(length > total) total = length; @@ -722,7 +745,7 @@ int Tracks::new_group(int id) int Tracks::set_group_selected(int id, int v) { int count = 0; - int gang = edl->session->gang_tracks != GANG_NONE ? 1 : 0; + int gang = edl->local_session->gang_tracks != GANG_NONE ? 1 : 0; for( Track *track=first; track; track=track->next ) { if( track->is_hidden() ) continue; for( Edit *edit=track->edits->first; edit; edit=edit->next ) { @@ -759,7 +782,7 @@ Track *Tracks::get(int idx, int data_type) return 0; } -void Tracks::move_tracks(Track *src, Track *dst, int n) +void Tracks::roll_tracks(Track *src, Track *dst, int n) { if( src == dst ) return; while( --n >= 0 && src ) { @@ -777,3 +800,39 @@ void Tracks::move_tracks(Track *src, Track *dst, int n) } } +double Tracks::align_timecodes() +{ + double offset = -1; + for( Track *track=first; track; track=track->next ) { + if( !track->is_armed() ) continue; + double early_offset = track->edits->early_timecode(); + if( offset < 0 || offset > early_offset ) + offset = early_offset; + } + if( offset >= 0 ) { + for( Track *track=first; track; track=track->next ) { + if( !track->is_armed() ) continue; + track->edits->align_timecodes(offset); + } + } + return offset; +} + +void Tracks::update_idxbl_length(int id, double dt) +{ + for( Track *track=first; track; track=track->next ) { + if( !track->is_armed() ) continue; + int64_t du = track->to_units(dt,0); + track->edits->update_idxbl_length(id, du); + track->optimize(); + } +} + +void Tracks::create_keyframes(double position, int mask, int mode) +{ + for( Track *track=first; track; track=track->next ) { + if( !track->is_armed() ) continue; + track->create_keyframes(position, mask, mode); + } +} +