histogram fix, use_thumbnails fix, zoom popup width tweak, cut/paste for mixer apply...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / mixersalign.C
index 34f230e95e85d914fb09030c0ee4f1d3393bdc4d..188782c1a09e3c69c8d85bb821c7c9ff4ff58240 100644 (file)
  */
 
 #include "mixersalign.h"
+#include "auto.h"
+#include "autos.h"
 #include "arender.h"
 #include "clip.h"
 #include "edit.h"
 #include "edits.h"
 #include "edl.h"
+#include "edlsession.h"
 #include "localsession.h"
 #include "mainerror.h"
 #include "mainprogress.h"
 #include "mwindow.h"
 #include "mwindowgui.h"
+#include "panauto.h"
+#include "panautos.h"
 #include "preferences.h"
 #include "track.h"
 #include "tracks.h"
@@ -576,6 +581,7 @@ void MixersAlign::apply()
 {
        int idx = ma_gui->mtrack_list->get_selection_number(0, 0);
        int midx = -1, mid = mixer_of(mtracks[idx]->track, midx);
+       EDL *edl = mwindow->edl;
        
        for( int m, i=0; (m=ma_gui->mixer_list->get_selection_number(0,i))>=0; ++i ) {
                if( m == mid ) continue;  // master does not move
@@ -583,15 +589,27 @@ void MixersAlign::apply()
                Mixer *mixer = mix->mixer;
                for( int i=0; i<mixer->mixer_ids.size(); ++i ) {
                        int id = mixer->mixer_ids[i];
-                       Track *track = mwindow->edl->tracks->first;
+                       Track *track = edl->tracks->first;
                        while( track && track->mixer_id != id ) track = track->next;
                        if( !track ) continue;
-                       int64_t dt = track->to_units(mix->nudge, 0);
-                       for( Edit *edit=track->edits->first; edit; edit=edit->next )
-                               edit->startproject += dt;
-                       track->optimize();
+                       double nudge = mix->nudge;
+                       int record = track->record;  track->record = 1;
+                       if( nudge < 0 ) {
+                               edl->clear(0, -nudge,
+                                       edl->session->labels_follow_edits,
+                                       edl->session->plugins_follow_edits,
+                                       edl->session->autos_follow_edits);
+                       }
+                       else if( nudge > 0 ) {
+                               edl->paste_silence(0, nudge,
+                                       edl->session->labels_follow_edits,
+                                       edl->session->plugins_follow_edits,
+                                       edl->session->autos_follow_edits);
+                       }
+                       track->record = record;
                }
        }
+       edl->optimize();
 
        mwindow->gui->lock_window("MixersAlign::handle_done_event");
        mwindow->update_gui(1);
@@ -624,6 +642,11 @@ void MixersAlignThread::run()
 
 void MixersAlign::handle_done_event(int result)
 {
+       if( thread->running() ) {
+               failed = -1;
+               thread->join();
+               return;
+       }
        if( !result ) {
                EDL *edl = mwindow->edl;
                mwindow->edl = undo_edl;
@@ -631,10 +654,6 @@ void MixersAlign::handle_done_event(int result)
                mwindow->edl = edl;
                mwindow->undo_after(_("align mixers"), LOAD_ALL);
        }
-       else if( thread->running() ) {
-               failed = -1;
-               thread->join();
-       }
 }
 
 void MixersAlign::handle_close_event(int result)
@@ -688,13 +707,17 @@ EDL *MixersAlign::mixer_audio_clip(Mixer *mixer)
        EDL *edl = new EDL(mwindow->edl);
        edl->create_objects();
        Track *track = mwindow->edl->tracks->first;
-       for( ; track; track=track->next ) {
+       for( int ch=0; track && ch<MAX_CHANNELS; track=track->next ) {
                int id = track->mixer_id;
                if( track->data_type != TRACK_AUDIO ) continue;
                if( mixer->mixer_ids.number_of(id) < 0 ) continue;
                Track *mixer_audio = edl->tracks->add_audio_track(0, 0);
-               mixer_audio->copy_from(track);
+               mixer_audio->copy_settings(track);
                mixer_audio->play = 1;
+               mixer_audio->edits->copy_from(track->edits);
+               PanAuto* pan_auto = (PanAuto*)mixer_audio->automation->
+                               autos[AUTOMATION_PAN]->default_auto;
+               pan_auto->values[ch++] = 1.0;
        }
        return edl;
 }
@@ -704,8 +727,12 @@ EDL *MixersAlign::mixer_master_clip(Track *track)
        EDL *edl = new EDL(mwindow->edl);
        edl->create_objects();
        Track *master_audio = edl->tracks->add_audio_track(0, 0);
-       master_audio->copy_from(track);
+       master_audio->copy_settings(track);
        master_audio->play = 1;
+       master_audio->edits->copy_from(track->edits);
+       PanAuto* pan_auto = (PanAuto*)master_audio->automation->
+                       autos[AUTOMATION_PAN]->default_auto;
+       pan_auto->values[0] = 1.0;
        return edl;
 }