3 * Copyright (C) 2008-2015 Adam Williams <broadcast at earthling dot net>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #ifndef __MIXERSALIGN_H__
22 #define __MIXERSALIGN_H__
29 #include "loadbalance.h"
30 #include "mainprogress.inc"
31 #include "mixersalign.inc"
32 #include "mwindow.inc"
33 #include "renderengine.h"
34 #include "samples.inc"
36 #include "zwindow.inc"
38 class MixersAlignMixer
41 MixersAlignMixer(Mixer *mix);
51 class MixersAlignMixers : public ArrayList<MixersAlignMixer*>
54 MixersAlignMixers() {}
55 ~MixersAlignMixers() { remove_all_objects(); }
58 class MixersAlignMixerList : public BC_ListBox
60 enum { MIX_MIXER, MIX_NUDGE, MIX_SZ };
61 static const char *mix_titles[MIX_SZ];
62 static int mix_widths[MIX_SZ];
64 MixersAlignMixerList(MixersAlignWindow *gui,
65 MixersAlign *dialog, int x, int y, int w, int h);
66 ~MixersAlignMixerList();
70 void add_mixer(MixersAlignMixer *mixer);
73 int selection_changed();
75 MixersAlignWindow *gui;
77 MixersAlignMixers mixers;
79 const char *col_titles[MIX_SZ];
80 int col_widths[MIX_SZ];
81 ArrayList<BC_ListBoxItem*> cols[MIX_SZ];
83 void set_all_selected(int v) { BC_ListBox::set_all_selected(cols, v); }
84 void set_selected(int idx, int v) { BC_ListBox::set_selected(cols, idx, v); }
85 bool is_selected(int idx) { return cols[0][idx]->get_selected() != 0; }
89 class MixersAlignMTrack
92 MixersAlignMTrack(Track *trk, int no);
98 class MixersAlignMTracks : public ArrayList<MixersAlignMTrack*>
101 MixersAlignMTracks() {}
102 ~MixersAlignMTracks() { remove_all_objects(); }
106 class MixersAlignMTrackList : public BC_ListBox
108 enum { MTK_NO, MTK_MIXER, MTK_TRACK, MTK_SZ };
109 static const char *mtk_titles[MTK_SZ];
110 static int mtk_widths[MTK_SZ];
112 MixersAlignMTrackList(MixersAlignWindow *gui,
113 MixersAlign *dialog, int x, int y, int w, int h);
114 ~MixersAlignMTrackList();
117 void add_mtrack(MixersAlignMTrack *mtrk);
121 MixersAlignWindow *gui;
124 ArrayList<BC_ListBoxItem*> cols[MTK_SZ];
125 const char *col_titles[MTK_SZ];
126 int col_widths[MTK_SZ];
128 void set_all_selected(int v) { BC_ListBox::set_all_selected(cols, v); }
129 void set_selected(int idx, int v) { BC_ListBox::set_selected(cols, idx, v); }
130 bool is_selected(int idx) { return cols[0][idx]->get_selected() != 0; }
134 class MixersAlignATrack
137 MixersAlignATrack(Track *trk, int no);
138 ~MixersAlignATrack();
148 class MixersAlignATracks : public ArrayList<MixersAlignATrack*>
151 MixersAlignATracks() {}
152 ~MixersAlignATracks() { remove_all_objects(); }
155 class MixersAlignATrackList : public BC_ListBox
157 enum { ATK_TRACK, ATK_AUDIO, ATK_NUDGE, ATK_MX, ATK_MI, ATK_SZ };
158 static const char *atk_titles[ATK_SZ];
159 static int atk_widths[ATK_SZ];
161 MixersAlignATrackList(MixersAlignWindow *gui,
162 MixersAlign *dialog, int x, int y, int w, int h);
163 ~MixersAlignATrackList();
166 void add_atrack(MixersAlignATrack *track);
169 int selection_changed();
171 MixersAlignWindow *gui;
174 ArrayList<BC_ListBoxItem*> cols[ATK_SZ];
175 const char *col_titles[ATK_SZ];
176 int col_widths[ATK_SZ];
178 void set_all_selected(int v) { BC_ListBox::set_all_selected(cols, v); }
179 void set_selected(int idx, int v) { BC_ListBox::set_selected(cols, idx, v); }
180 bool is_selected(int idx) { return cols[0][idx]->get_selected() != 0; }
183 class MixersAlignReset : public BC_GenericButton
186 MixersAlignReset(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y);
188 static int calculate_width(BC_WindowBase *gui);
191 MixersAlignWindow *gui;
194 class MixersAlignThread : public Thread
197 MixersAlignThread(MixersAlign *dialog);
198 ~MixersAlignThread();
206 class MixersAlignMatch : public BC_GenericButton
209 MixersAlignMatch(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y);
213 MixersAlignWindow *gui;
216 class MixersAlignMatchAll : public BC_GenericButton
219 MixersAlignMatchAll(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y);
223 MixersAlignWindow *gui;
226 class MixersAlignNudgeTracks : public BC_GenericButton
229 MixersAlignNudgeTracks(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y);
231 static int calculate_width(BC_WindowBase *gui);
234 MixersAlignWindow *gui;
237 class MixersAlignNudgeSelected : public BC_GenericButton
240 MixersAlignNudgeSelected(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y);
242 static int calculate_width(BC_WindowBase *gui);
245 MixersAlignWindow *gui;
248 class MixersAlignCheckPoint : public BC_GenericButton
251 MixersAlignCheckPoint(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y);
255 MixersAlignWindow *gui;
258 class MixersAlignUndoEDLs : public ArrayList<EDL *>
261 MixersAlignUndoEDLs() {}
262 ~MixersAlignUndoEDLs() {
263 for( int i=size(); --i>=0; ) get(i)->remove_user();
267 class MixersAlignUndoItem : public BC_MenuItem
270 MixersAlignUndoItem(const char *text, int no);
271 ~MixersAlignUndoItem();
277 class MixersAlignUndo : public BC_PopupMenu
280 MixersAlignUndo(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y);
282 void create_objects();
283 void add_undo_item(int no);
286 MixersAlignWindow *gui;
290 class MixersAlignWindow : public BC_Window
293 MixersAlignWindow(MixersAlign *dialog, int x, int y);
294 ~MixersAlignWindow();
296 void create_objects();
297 int resize_event(int w, int h);
299 void default_selection();
303 BC_Title *mixer_title, *mtrack_title, *atrack_title;
305 MixersAlignMixerList *mixer_list;
306 MixersAlignMTrackList *mtrack_list;
307 MixersAlignATrackList *atrack_list;
308 MixersAlignMatch *match;
309 MixersAlignMatchAll *match_all;
310 MixersAlignReset *reset;
311 MixersAlignNudgeTracks *nudge_tracks;
312 MixersAlignNudgeSelected *nudge_selected;
313 MixersAlignCheckPoint *check_point;
314 MixersAlignUndo *undo;
318 class MixersAlignARender : public RenderEngine
321 MixersAlignARender(MWindow *mwindow, EDL *edl);
322 ~MixersAlignARender();
324 int render(Samples **samples, int64_t len, int64_t pos);
328 class MixersAlignScanPackage : public LoadPackage
331 MixersAlignScanPackage(MixersAlignScanFarm *farm);
332 ~MixersAlignScanPackage();
334 MixersAlignMixer *mixer;
337 class MixersAlignScanClient : public LoadClient
340 MixersAlignScanClient(MixersAlignScanFarm *farm);
341 ~MixersAlignScanClient();
342 void process_package(LoadPackage *package);
344 MixersAlignScanFarm *farm;
345 MixersAlignScanPackage *pkg;
350 class MixersAlignScanFarm : public LoadServer
353 MixersAlignScanFarm(MixersAlign *dialog, int cpus, int n);
354 ~MixersAlignScanFarm();
355 void init_packages();
356 LoadClient *new_client();
357 LoadPackage *new_package();
365 class MixersAlignMatchFwdPackage : public LoadPackage
368 MixersAlignMatchFwdPackage();
369 ~MixersAlignMatchFwdPackage();
371 MixersAlignMixer *mixer;
374 class MixersAlignMatchFwdClient : public LoadClient
377 MixersAlignMatchFwdClient(MixersAlignMatchFwdFarm *farm);
378 ~MixersAlignMatchFwdClient();
380 void process_package(LoadPackage *package);
381 MixersAlignMatchFwdPackage *pkg;
384 class MixersAlignMatchFwdFarm : public LoadServer
387 MixersAlignMatchFwdFarm(MixersAlign *dialog, int n);
388 ~MixersAlignMatchFwdFarm();
389 void init_packages();
390 LoadClient *new_client();
391 LoadPackage *new_package();
397 class MixersAlignMatchRevPackage : public LoadPackage
400 MixersAlignMatchRevPackage();
401 ~MixersAlignMatchRevPackage();
403 MixersAlignMixer *mix;
406 class MixersAlignMatchRevClient : public LoadClient
409 MixersAlignMatchRevClient(MixersAlignMatchRevFarm *farm);
410 ~MixersAlignMatchRevClient();
412 void process_package(LoadPackage *package);
413 MixersAlignMatchRevPackage *pkg;
417 class MixersAlignMatchRevFarm : public LoadServer
420 MixersAlignMatchRevFarm(int n, int cpus,
421 MixersAlign *dialog, double *ar, double *ai, int len);
422 ~MixersAlignMatchRevFarm();
423 void init_packages();
424 LoadClient *new_client();
425 LoadPackage *new_package();
435 class MixersAlignTargetPackage : public LoadPackage
438 MixersAlignTargetPackage(MixersAlignTarget *pfft);
439 ~MixersAlignTargetPackage();
446 class MixersAlignTargetClient : public LoadClient
449 MixersAlignTargetClient();
450 ~MixersAlignTargetClient();
452 void process_package(LoadPackage *package);
453 MixersAlignTargetPackage *pkg;
456 class MixersAlignTarget : public LoadServer
459 MixersAlignTarget(int n, int cpus,
460 MixersAlignScanClient *scan, Samples **samples, int len);
461 ~MixersAlignTarget();
462 void init_packages();
463 LoadClient *new_client();
464 LoadPackage *new_package();
466 MixersAlignScanClient *scan;
472 class MixersAlign : public BC_DialogThread, public FFT
475 MixersAlign(MWindow *mwindow);
478 void start_dialog(int wx, int wy);
479 BC_Window *new_gui();
483 void handle_done_event(int result);
484 void handle_close_event(int result);
486 int atrack_of(MixersAlignMixer *mix, int ch);
487 int mixer_of(Track *track, int &midx);
488 int mixer_of(Track *track) { int midx = -1; return mixer_of(track, midx); }
489 int mmixer_of(int mi) {
490 return mi>=0 && mi<mtracks.size() ? mixer_of(mtracks[mi]->track) : -1;
492 int amixer_of(int ai) {
493 return ai>=0 && ai<atracks.size() ? mixer_of(atracks[ai]->track) : -1;
496 EDL *mixer_audio_clip(Mixer *mixer);
497 EDL *mixer_master_clip(Track *track);
498 int64_t mixer_tracks_total(int midx);
499 void load_master_audio(Track *track);
500 void scan_mixer_audio();
501 void start_progress(int64_t total_len);
502 void stop_progress(const char *msg);
503 void update_progress(int64_t len);
509 void apply_undo(int no);
511 void nudge_selected();
512 void clear_mixer_nudge();
514 void reset_targets();
516 void scan_master(Track *track);
518 MixersAlignWindow *ma_gui;
520 MixersAlignMixers mixers;
521 MixersAlignMTracks mtracks;
522 MixersAlignATracks atracks;
525 MixersAlignUndoEDLs undo_edls;
527 MainProgressBar *progress;
528 MixersAlignThread *thread;
530 int64_t total_rendered;
532 int64_t master_len, sample_len;
533 double *master_r, *master_i;
534 double master_start, master_end, master_ss;
535 double audio_start, audio_end;