Credit Andrew - fix vorbis audio which was scratchy and ensure aging plugin does...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / tracks.C
index d904d5d6b330df4d660b61d6d05d24990a736f62..dc6bfc81d7420c2fa13d277d80846a3f6dad7213 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * CINELERRA
  * Copyright (C) 2010 Adam Williams <broadcast at earthling dot net>
+ * Copyright (C) 2003-2016 Cinelerra CV contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -126,6 +127,20 @@ void Tracks::get_selected_edits(ArrayList<Edit*> *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,
@@ -319,11 +334,10 @@ int Tracks::delete_track(Track *track, int gang)
 {
        if( !track ) return 0;
        if( gang < 0 )
-               gang = edl->session->gang_tracks != GANG_NONE ? 1 : 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;
        }
@@ -350,7 +364,7 @@ int Tracks::detach_shared_effects(int module)
 } 
 int Tracks::detach_ganged_effects(Plugin *plugin)
 {
-       if( edl->session->gang_tracks == GANG_NONE ) return 1;
+       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;
@@ -372,7 +386,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) ||
@@ -407,7 +421,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++;
                }
@@ -422,7 +436,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++;
                }
@@ -451,7 +465,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;
@@ -732,7 +746,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 ) {
@@ -769,7 +783,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 ) {
@@ -787,3 +801,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);
+       }
+}
+