cut with active speed auto correction, add locale pref, mod prores dft profile to...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / track.C
index 264bd95f829da34765232284043c585bd2e55f9b..1cf0f69dbcd6a51c14251977759d64ca3445a189 100644 (file)
@@ -271,6 +271,13 @@ int Track::has_speed()
        return 0;
 }
 
+int64_t Track::speed_length(int64_t start, int64_t end)
+{
+       if( !has_speed() ) return end - start;
+       FloatAutos *speeds = (FloatAutos *) automation->autos[AUTOMATION_SPEED];
+       return speeds->automation_integral(start, end-start, PLAY_FORWARD);
+}
+
 int Track::show_assets()
 {
        return expand_view || edl->session->show_assets ? 1 : 0;
@@ -1055,6 +1062,8 @@ int Track::clear(int64_t start, int64_t end,
        int edit_edits, int edit_labels, int edit_plugins,
        int edit_autos, Edits *trim_edits)
 {
+       if( edit_edits )
+               edits->clear(start, end);
 //printf("Track::clear 1 %d %d %d\n", edit_edits, edit_labels, edit_plugins);
        if( edit_autos )
                automation->clear(start, end, 0, 1);
@@ -1065,8 +1074,6 @@ int Track::clear(int64_t start, int64_t end,
                                plugin_set.values[i]->clear(start, end, edit_keyframes);
                }
        }
-       if( edit_edits )
-               edits->clear(start, end);
        return 0;
 }
 
@@ -1793,10 +1800,25 @@ void Track::set_camera(float x, float y, float z)
 
 Track *Track::gang_master()
 {
-       if( edl->session->gang_tracks == GANG_NONE ) return this;
        Track *track = this;
-       while( track && !track->master ) track = track->previous;
-       return !track ? tracks->first : track;
+       switch( edl->session->gang_tracks ) {
+       case GANG_NONE:
+               return track;
+       case GANG_CHANNELS: {
+               Track *current = track;
+               int data_type = track->data_type;
+               while( current && !track->master ) {
+                       if( !(current = current->previous) ) break;
+                       if( current->data_type == data_type ) track = current;
+                       if( track->master ) break;
+               }
+               break; }
+       case GANG_MEDIA: {
+               while( track && !track->master ) track = track->previous;
+               break; }
+       }
+       if( !track ) track = tracks->first;
+       return track;
 }
 
 int Track::is_hidden()
@@ -1815,6 +1837,7 @@ int Track::is_armed()
 {
        return gang_master()->armed;
 }
+
 int Track::is_ganged()
 {
        return gang_master()->ganged;