mixer align audio, track dump tweak, zwdw refresh edl fix, sketcher tweak
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / mixersalign.h
diff --git a/cinelerra-5.1/cinelerra/mixersalign.h b/cinelerra-5.1/cinelerra/mixersalign.h
new file mode 100644 (file)
index 0000000..86abbe6
--- /dev/null
@@ -0,0 +1,348 @@
+/*
+ * CINELERRA
+ * Copyright (C) 2008-2015 Adam Williams <broadcast at earthling dot net>
+ *
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#ifndef __MIXERSALIGN_H__
+#define __MIXERSALIGN_H__
+
+#include "edl.inc"
+#include "fourier.h"
+#include "guicast.h"
+#include "language.h"
+#include "loadbalance.h"
+#include "mainprogress.inc"
+#include "mixersalign.inc"
+#include "mwindow.inc"
+#include "renderengine.h"
+#include "samples.inc"
+#include "track.inc"
+#include "zwindow.inc"
+
+class MixersAlignMixer
+{
+public:
+       MixersAlignMixer(Mixer *mix);
+       Mixer *mixer;
+       double nudge;
+       double mx;
+       int64_t mi;
+       int aidx;
+};
+
+class MixersAlignMixers : public ArrayList<MixersAlignMixer*>
+{
+public:
+       MixersAlignMixers() {}
+       ~MixersAlignMixers() { remove_all_objects(); }
+};
+
+class MixersAlignMixerList : public BC_ListBox
+{
+       enum { MIX_MIXER, MIX_NUDGE, MIX_SZ };
+       static const char *mix_titles[MIX_SZ];
+       static int mix_widths[MIX_SZ];
+public:
+       MixersAlignMixerList(MixersAlignWindow *gui,
+               MixersAlign *dialog, int x, int y, int w, int h);
+       ~MixersAlignMixerList();
+
+       void clear();
+
+       void add_mixer(MixersAlignMixer *mixer);
+       void load_list();
+       void update();
+       int selection_changed();
+
+       MixersAlignWindow *gui;
+       MixersAlign *dialog;
+       MixersAlignMixers mixers;
+
+       const char *col_titles[MIX_SZ];
+       int col_widths[MIX_SZ];
+       ArrayList<BC_ListBoxItem*> cols[MIX_SZ];
+
+       void set_all_selected(int v) { BC_ListBox::set_all_selected(cols, v); }
+       void set_selected(int idx, int v) { BC_ListBox::set_selected(cols, idx, v); }
+       bool is_selected(int idx) { return cols[0][idx]->get_selected() != 0; }
+};
+
+
+class MixersAlignMTrack
+{
+public:
+       MixersAlignMTrack(Track *trk, int no);
+
+       Track *track;
+       int no;
+};
+
+class MixersAlignMTracks : public ArrayList<MixersAlignMTrack*>
+{
+public:
+       MixersAlignMTracks() {}
+       ~MixersAlignMTracks() { remove_all_objects(); }
+};
+
+
+class MixersAlignMTrackList : public BC_ListBox
+{
+       enum { MTK_NO, MTK_MIXER, MTK_TRACK, MTK_SZ };
+       static const char *mtk_titles[MTK_SZ];
+       static int mtk_widths[MTK_SZ];
+public:
+       MixersAlignMTrackList(MixersAlignWindow *gui,
+               MixersAlign *dialog, int x, int y, int w, int h);
+       ~MixersAlignMTrackList();
+
+       void clear();
+       void add_mtrack(MixersAlignMTrack *mtrk);
+       void load_list();
+       void update();
+
+       MixersAlignWindow *gui;
+       MixersAlign *dialog;
+
+       ArrayList<BC_ListBoxItem*> cols[MTK_SZ];
+       const char *col_titles[MTK_SZ];
+       int col_widths[MTK_SZ];
+
+       void set_all_selected(int v) { BC_ListBox::set_all_selected(cols, v); }
+       void set_selected(int idx, int v) { BC_ListBox::set_selected(cols, idx, v); }
+       bool is_selected(int idx) { return cols[0][idx]->get_selected() != 0; }
+};
+
+
+class MixersAlignATrack
+{
+public:
+       MixersAlignATrack(Track *trk, int no);
+       Track *track;
+       int no;
+       double nudge;
+       double mx;
+       int64_t mi;
+};
+
+class MixersAlignATracks : public ArrayList<MixersAlignATrack*>
+{
+public:
+       MixersAlignATracks() {}
+       ~MixersAlignATracks() { remove_all_objects(); }
+};
+
+class MixersAlignATrackList : public BC_ListBox
+{
+       enum { ATK_TRACK, ATK_AUDIO, ATK_NUDGE, ATK_MX, ATK_MI, ATK_SZ };
+       static const char *atk_titles[ATK_SZ];
+       static int atk_widths[ATK_SZ];
+public:
+       MixersAlignATrackList(MixersAlignWindow *gui,
+               MixersAlign *dialog, int x, int y, int w, int h);
+       ~MixersAlignATrackList();
+
+       void clear();
+       void add_atrack(MixersAlignATrack *track);
+       void load_list();
+       void update();
+       int selection_changed();
+
+       MixersAlignWindow *gui;
+       MixersAlign *dialog;
+
+       ArrayList<BC_ListBoxItem*> cols[ATK_SZ];
+       const char *col_titles[ATK_SZ];
+       int col_widths[ATK_SZ];
+
+       void set_all_selected(int v) { BC_ListBox::set_all_selected(cols, v); }
+       void set_selected(int idx, int v) { BC_ListBox::set_selected(cols, idx, v); }
+       bool is_selected(int idx) { return cols[0][idx]->get_selected() != 0; }
+};
+
+class MixersAlignReset : public BC_GenericButton
+{
+public:
+       MixersAlignReset(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y);
+       int handle_event();
+       static int calculate_width(BC_WindowBase *gui);
+
+       MixersAlign *dialog;
+       MixersAlignWindow *gui;
+};
+
+class MixersAlignThread : public Thread
+{
+public:
+       MixersAlignThread(MixersAlign *dialog);
+       ~MixersAlignThread();
+       void run();
+
+       MixersAlign *dialog;
+};
+
+class MixersAlignMatch : public BC_GenericButton
+{
+public:
+       MixersAlignMatch(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y);
+       int handle_event();
+
+       MixersAlign *dialog;
+       MixersAlignWindow *gui;
+};
+
+class MixersAlignApply : public BC_GenericButton
+{
+public:
+       MixersAlignApply(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y);
+       int handle_event();
+       static int calculate_width(BC_WindowBase *gui);
+
+       MixersAlign *dialog;
+       MixersAlignWindow *gui;
+};
+
+class MixersAlignUndo : public BC_GenericButton
+{
+public:
+       MixersAlignUndo(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y);
+       int handle_event();
+
+       MixersAlign *dialog;
+       MixersAlignWindow *gui;
+};
+
+
+class MixersAlignWindow : public BC_Window
+{
+public:
+       MixersAlignWindow(MixersAlign *dialog, int x, int y);
+       ~MixersAlignWindow();
+
+       void create_objects();
+       int resize_event(int w, int h);
+       void load_lists();
+       void default_selection();
+       void update_gui();
+
+       MixersAlign *dialog;
+       BC_Title *mixer_title, *mtrack_title, *atrack_title;
+
+       MixersAlignMixerList *mixer_list;
+       MixersAlignMTrackList *mtrack_list;
+       MixersAlignATrackList *atrack_list;
+       MixersAlignMatch *match;
+       MixersAlignReset *reset;
+       MixersAlignApply *apply;
+       MixersAlignUndo *undo;
+};
+
+
+class MixersAlignARender : public RenderEngine
+{
+public:
+       MixersAlignARender(MWindow *mwindow, EDL *edl);
+       ~MixersAlignARender();
+
+       int render(Samples **samples, int64_t len, int64_t pos);
+};
+
+class MixersAlignPackage : public LoadPackage
+{
+public:
+       MixersAlignPackage();
+       ~MixersAlignPackage();
+
+       MixersAlignMixer *mixer;
+};
+
+class MixersAlignClient : public LoadClient
+{
+public:
+       MixersAlignClient(MixersAlignFarm *farm);
+       ~MixersAlignClient();
+
+        void process_package(LoadPackage *pkg);
+};
+
+class MixersAlignFarm : public LoadServer
+{
+public:
+       MixersAlignFarm(MixersAlign *dialog, int n);
+       ~MixersAlignFarm();
+       void init_packages();
+       LoadClient *new_client();
+       LoadPackage *new_package();
+
+       MixersAlign *dialog;
+};
+
+class MixersAlign : public BC_DialogThread, public FFT
+{
+public:
+       MixersAlign(MWindow *mwindow);
+       ~MixersAlign();
+
+       void start_dialog(int wx, int wy);
+       BC_Window *new_gui();
+       void load_mixers();
+       void load_mtracks();
+       void load_atracks();
+       void handle_done_event(int result);
+       void handle_close_event(int result);
+
+       int mixer_of(Track *track, int &midx);
+       int mixer_of(Track *track) { int midx = -1; return mixer_of(track, midx); }
+       int mmixer_of(int mi) {
+               return mi>=0 && mi<mtracks.size() ? mixer_of(mtracks[mi]->track) : -1;
+       }
+       int amixer_of(int ai) {
+               return ai>=0 && ai<atracks.size() ? mixer_of(atracks[ai]->track) : -1;
+       }
+
+       EDL *mixer_audio_clip(Mixer *mixer);
+       EDL *mixer_master_clip(Track *track);
+       int64_t mixer_tracks_total();
+       void load_master_audio(Track *track);
+       void scan_mixer_audio();
+       void update_progress(int64_t len);
+       void update_match();
+       void update();
+       void process_package(MixersAlignFarm *farm, MixersAlignPackage *package);
+       void apply();
+
+       MixersAlignWindow *ma_gui;
+       int wx, wy;
+       MixersAlignMixers mixers;
+       MixersAlignMTracks mtracks;
+       MixersAlignATracks atracks;
+       MWindow *mwindow;
+
+       EDL *undo_edl;
+       Mutex *farming;
+       MainProgressBar *progress;
+       MixersAlignThread *thread;
+       Mutex *total_lock;
+       int64_t total_rendered;
+       int failed;
+       int64_t master_len;
+       double *master_r, *master_i;
+       double master_start, master_end, master_ss;
+       double audio_start, audio_end;
+};
+
+#endif