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__
28 #include "loadbalance.h"
29 #include "mainprogress.inc"
30 #include "mixersalign.inc"
31 #include "mwindow.inc"
32 #include "renderengine.h"
33 #include "samples.inc"
35 #include "zwindow.inc"
37 class MixersAlignMixer
40 MixersAlignMixer(Mixer *mix);
48 class MixersAlignMixers : public ArrayList<MixersAlignMixer*>
51 MixersAlignMixers() {}
52 ~MixersAlignMixers() { remove_all_objects(); }
55 class MixersAlignMixerList : public BC_ListBox
57 enum { MIX_MIXER, MIX_NUDGE, MIX_SZ };
58 static const char *mix_titles[MIX_SZ];
59 static int mix_widths[MIX_SZ];
61 MixersAlignMixerList(MixersAlignWindow *gui,
62 MixersAlign *dialog, int x, int y, int w, int h);
63 ~MixersAlignMixerList();
67 void add_mixer(MixersAlignMixer *mixer);
70 int selection_changed();
72 MixersAlignWindow *gui;
74 MixersAlignMixers mixers;
76 const char *col_titles[MIX_SZ];
77 int col_widths[MIX_SZ];
78 ArrayList<BC_ListBoxItem*> cols[MIX_SZ];
80 void set_all_selected(int v) { BC_ListBox::set_all_selected(cols, v); }
81 void set_selected(int idx, int v) { BC_ListBox::set_selected(cols, idx, v); }
82 bool is_selected(int idx) { return cols[0][idx]->get_selected() != 0; }
86 class MixersAlignMTrack
89 MixersAlignMTrack(Track *trk, int no);
95 class MixersAlignMTracks : public ArrayList<MixersAlignMTrack*>
98 MixersAlignMTracks() {}
99 ~MixersAlignMTracks() { remove_all_objects(); }
103 class MixersAlignMTrackList : public BC_ListBox
105 enum { MTK_NO, MTK_MIXER, MTK_TRACK, MTK_SZ };
106 static const char *mtk_titles[MTK_SZ];
107 static int mtk_widths[MTK_SZ];
109 MixersAlignMTrackList(MixersAlignWindow *gui,
110 MixersAlign *dialog, int x, int y, int w, int h);
111 ~MixersAlignMTrackList();
114 void add_mtrack(MixersAlignMTrack *mtrk);
118 MixersAlignWindow *gui;
121 ArrayList<BC_ListBoxItem*> cols[MTK_SZ];
122 const char *col_titles[MTK_SZ];
123 int col_widths[MTK_SZ];
125 void set_all_selected(int v) { BC_ListBox::set_all_selected(cols, v); }
126 void set_selected(int idx, int v) { BC_ListBox::set_selected(cols, idx, v); }
127 bool is_selected(int idx) { return cols[0][idx]->get_selected() != 0; }
131 class MixersAlignATrack
134 MixersAlignATrack(Track *trk, int no);
142 class MixersAlignATracks : public ArrayList<MixersAlignATrack*>
145 MixersAlignATracks() {}
146 ~MixersAlignATracks() { remove_all_objects(); }
149 class MixersAlignATrackList : public BC_ListBox
151 enum { ATK_TRACK, ATK_AUDIO, ATK_NUDGE, ATK_MX, ATK_MI, ATK_SZ };
152 static const char *atk_titles[ATK_SZ];
153 static int atk_widths[ATK_SZ];
155 MixersAlignATrackList(MixersAlignWindow *gui,
156 MixersAlign *dialog, int x, int y, int w, int h);
157 ~MixersAlignATrackList();
160 void add_atrack(MixersAlignATrack *track);
163 int selection_changed();
165 MixersAlignWindow *gui;
168 ArrayList<BC_ListBoxItem*> cols[ATK_SZ];
169 const char *col_titles[ATK_SZ];
170 int col_widths[ATK_SZ];
172 void set_all_selected(int v) { BC_ListBox::set_all_selected(cols, v); }
173 void set_selected(int idx, int v) { BC_ListBox::set_selected(cols, idx, v); }
174 bool is_selected(int idx) { return cols[0][idx]->get_selected() != 0; }
177 class MixersAlignReset : public BC_GenericButton
180 MixersAlignReset(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y);
182 static int calculate_width(BC_WindowBase *gui);
185 MixersAlignWindow *gui;
188 class MixersAlignThread : public Thread
191 MixersAlignThread(MixersAlign *dialog);
192 ~MixersAlignThread();
198 class MixersAlignMatch : public BC_GenericButton
201 MixersAlignMatch(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y);
205 MixersAlignWindow *gui;
208 class MixersAlignApply : public BC_GenericButton
211 MixersAlignApply(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y);
213 static int calculate_width(BC_WindowBase *gui);
216 MixersAlignWindow *gui;
219 class MixersAlignUndo : public BC_GenericButton
222 MixersAlignUndo(MixersAlignWindow *gui, MixersAlign *dialog, int x, int y);
226 MixersAlignWindow *gui;
230 class MixersAlignWindow : public BC_Window
233 MixersAlignWindow(MixersAlign *dialog, int x, int y);
234 ~MixersAlignWindow();
236 void create_objects();
237 int resize_event(int w, int h);
239 void default_selection();
243 BC_Title *mixer_title, *mtrack_title, *atrack_title;
245 MixersAlignMixerList *mixer_list;
246 MixersAlignMTrackList *mtrack_list;
247 MixersAlignATrackList *atrack_list;
248 MixersAlignMatch *match;
249 MixersAlignReset *reset;
250 MixersAlignApply *apply;
251 MixersAlignUndo *undo;
255 class MixersAlignARender : public RenderEngine
258 MixersAlignARender(MWindow *mwindow, EDL *edl);
259 ~MixersAlignARender();
261 int render(Samples **samples, int64_t len, int64_t pos);
264 class MixersAlignPackage : public LoadPackage
267 MixersAlignPackage();
268 ~MixersAlignPackage();
270 MixersAlignMixer *mixer;
273 class MixersAlignClient : public LoadClient
276 MixersAlignClient(MixersAlignFarm *farm);
277 ~MixersAlignClient();
279 void process_package(LoadPackage *pkg);
282 class MixersAlignFarm : public LoadServer
285 MixersAlignFarm(MixersAlign *dialog, int n);
287 void init_packages();
288 LoadClient *new_client();
289 LoadPackage *new_package();
294 class MixersAlign : public BC_DialogThread, public FFT
297 MixersAlign(MWindow *mwindow);
300 void start_dialog(int wx, int wy);
301 BC_Window *new_gui();
305 void handle_done_event(int result);
306 void handle_close_event(int result);
308 int mixer_of(Track *track, int &midx);
309 int mixer_of(Track *track) { int midx = -1; return mixer_of(track, midx); }
310 int mmixer_of(int mi) {
311 return mi>=0 && mi<mtracks.size() ? mixer_of(mtracks[mi]->track) : -1;
313 int amixer_of(int ai) {
314 return ai>=0 && ai<atracks.size() ? mixer_of(atracks[ai]->track) : -1;
317 EDL *mixer_audio_clip(Mixer *mixer);
318 EDL *mixer_master_clip(Track *track);
319 int64_t mixer_tracks_total();
320 void load_master_audio(Track *track);
321 void scan_mixer_audio();
322 void update_progress(int64_t len);
325 void process_package(MixersAlignFarm *farm, MixersAlignPackage *package);
328 MixersAlignWindow *ma_gui;
330 MixersAlignMixers mixers;
331 MixersAlignMTracks mtracks;
332 MixersAlignATracks atracks;
337 MainProgressBar *progress;
338 MixersAlignThread *thread;
340 int64_t total_rendered;
343 double *master_r, *master_i;
344 double master_start, master_end, master_ss;
345 double audio_start, audio_end;