add bump floatautos, add time_references for align timecodes, add menuitem create_key...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / tracks.C
index 71aee8fcfbaf7f8755d2acbbd241baacd95ac008..101e7cdb8dbd9e274df7336381164901d9b8795b 100644 (file)
@@ -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"
@@ -314,10 +315,11 @@ 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->session->gang_tracks != GANG_NONE ? 1 : 0;
        Track *nxt = track->next;
        if( gang ) {
                while( track && !track->master && track->previous )
@@ -341,13 +343,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->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)
 {
@@ -777,3 +787,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);
+       }
+}
+