inter-view tweaks, add clip preview, fix for dupl proxy vicon refs, fix track drag...
[goodguy/cinelerra.git] / cinelerra-5.1 / cinelerra / recordgui.h
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2008-2017 Adam Williams <broadcast at earthling dot net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  */
21
22 #ifndef RECORDGUI_H
23 #define RECORDGUI_H
24
25
26 class RecordGUIBatches;
27 class RecordBatch;
28 class RecordStartType;
29 class RecordStart;
30 class RecordPath;
31 class BrowseButton;
32 class RecordDuration;
33 class RecordSource;
34 class RecordNews;
35 class RecordGUISave;
36 class RecordGUIStartOver;
37 class RecordGUICancel;
38 class RecordGUIMonitorVideo;
39 class RecordGUIMonitorAudio;
40 class RecordGUIAudioMeters;
41 class RecordGUINewBatch;
42 class RecordGUIDeleteBatch;
43 class RecordGUIStartBatches;
44 class RecordGUIStopBatches;
45 class RecordGUIActivateBatch;
46 class RecordStatusThread;
47 class RecordGUIFlash;
48
49 class RecordGUIDCOffset;
50 class RecordGUIDropFrames;
51 class RecordGUIFillFrames;
52 class RecordGUIPowerOff;
53 class RecordGUICommCheck;
54 class RecordGUILabel;
55 class RecordGUIClearLabels;
56 class RecordGUILoop;
57 class RecordGUILoopHr;
58 class RecordGUILoopMin;
59 class RecordGUILoopSec;
60 class RecordGUIModeMenu;
61 class RecordGUIMode;
62 class RecordGUIOK;
63 class RecordGUIReset;
64 class RecordStartoverThread;
65 class EndRecordThread;
66
67 #include "browsebutton.inc"
68 #include "condition.inc"
69 #include "guicast.h"
70 #include "loadmode.inc"
71 #include "maxchannels.h"
72 #include "mutex.inc"
73 #include "mwindow.inc"
74 #include "question.inc"
75 #include "recordgui.inc"
76 #include "record.inc"
77 #include "recordbatches.h"
78 #include "recordmonitor.inc"
79 #include "recordtransport.inc"
80 #include "timeentry.h"
81
82 class RecordGUIBatches : public RecordBatchesGUI
83 {
84 public:
85         RecordGUI *gui;
86
87         int handle_event();
88         int selection_changed();
89
90         RecordGUIBatches(RecordGUI *gui, int x, int y, int w, int h);
91 };
92
93 class RecordGUI : public BC_Window
94 {
95         static int max(int a,int b) { return a>b ? a : b; }
96 public:
97         RecordGUI(MWindow *mwindow, Record *record);
98         ~RecordGUI();
99
100         void create_objects();
101         int resize_event(int w, int h);
102         int translation_event();
103
104         BC_Title *current_operation;
105         BC_Title *position_title;
106         BC_Title *prev_label_title;
107         BC_Title *frames_behind;
108         BC_Title *frames_dropped;
109         BC_Title *framerate;
110         BC_Title *samples_clipped;
111         BC_Title *cron_status;
112         MWindow *mwindow;
113         Record *record;
114         RecordGUIBatches *batch_bay;
115         RecordPath *batch_path;
116         RecordStatusThread *status_thread;
117         TimeEntry *batch_start;
118         TimeEntry *batch_duration;
119         RecordStartType *start_type;
120         RecordTransport *record_transport;
121         BrowseButton *batch_browse;
122         RecordSource *batch_source;
123         RecordGUIModeMenu *batch_mode;
124         RecordGUINewBatch *new_batch;
125         RecordGUIDeleteBatch *delete_batch;
126         RecordGUIStartBatches *start_batches;
127         RecordGUIStopBatches *stop_batches;
128         RecordGUIActivateBatch *activate_batch;
129         RecordGUILabel *label_button;
130         RecordGUIClearLabels *clrlbls_button;
131         RecordGUIDropFrames *drop_frames;
132         RecordGUIFillFrames *fill_frames;
133         RecordGUIPowerOff *power_off;
134         RecordGUICommCheck *commercial_check;
135         RecordGUIMonitorVideo *monitor_video;
136         RecordGUIMonitorAudio *monitor_audio;
137         RecordGUIAudioMeters *meter_audio;
138         RecordGUIFlash *batch_flash;
139         RecordStartoverThread *startover_thread;
140         EndRecordThread *interrupt_thread;
141         LoadMode *load_mode;
142         int flash_color;
143
144         RecordGUILoopHr *loop_hr;
145         RecordGUILoopMin *loop_min;
146         RecordGUILoopSec *loop_sec;
147         RecordGUIReset *reset;
148         RecordGUIDCOffset *dc_offset_button;
149         RecordGUIDCOffsetText *dc_offset_text[MAXCHANNELS];
150         RecordMonitor *monitor_video_window;
151         BC_Meter *meter[MAXCHANNELS];
152         int total_dropped_frames;
153         int total_clipped_samples;
154
155         int set_loop_status(int value);
156         int keypress_event();
157         int set_translation(int x, int y, float z);
158
159         void update_batches();
160         Batch *get_current_batch();
161         Batch *get_editing_batch();
162         void start_flash_batch();
163         void stop_flash_batch();
164         void flash_batch();
165 // Update the batch channel table when edited
166         void update_batch_sources();
167 // Update the batch editing tools
168         void update_batch_tools();
169         void enable_batch_buttons();
170         void disable_batch_buttons();
171
172         void reset_audio();
173         void reset_video();
174         void update_frames_behind(long value);
175         void update_dropped_frames(long value);
176         void update_position(double value);
177         void update_clipped_samples(long value);
178         void update_framerate(double value);
179         void update_video(int dropped, int behind);
180         void update_audio(int channels, double *max, int *over);
181         void update_cron_status(const char *status);
182         void update_power_off(int value);
183         void update_labels(double new_position);
184         int update_prev_label(long new_position);
185         int update_title(BC_Title *title, double position);
186 };
187
188 class RecordGUISave : public BC_Button
189 {
190 public:
191         RecordGUISave(RecordGUI *gui);
192         int handle_event();
193         int keypress_event();
194         RecordGUI *gui;
195 };
196
197
198 class RecordGUICancel : public BC_CancelButton
199 {
200 public:
201         RecordGUICancel(RecordGUI *record_gui);
202         int handle_event();
203         int keypress_event();
204         RecordGUI *gui;
205         Record *record;
206 };
207
208 class RecordGUIOK : public BC_OKButton
209 {
210 public:
211         RecordGUIOK(RecordGUI *record_gui);
212         int handle_event();
213         RecordGUI *gui;
214 };
215
216 class RecordGUIStartBatches : public RecordBatchesGUI::StartBatches
217 {
218 public:
219         RecordGUI *gui;
220         int handle_event();
221         RecordGUIStartBatches(RecordGUI *gui, int x, int y);
222 };
223
224
225 class RecordGUIStopBatches : public RecordBatchesGUI::StopBatches
226 {
227 public:
228         RecordGUI *gui;
229         int handle_event();
230         RecordGUIStopBatches(RecordGUI *gui, int x, int y);
231 };
232
233 class RecordGUIActivateBatch : public RecordBatchesGUI::ActivateBatch
234 {
235 public:
236         RecordGUIActivateBatch(RecordGUI *gui, int x, int y);
237         int handle_event();
238         RecordGUI *gui;
239 };
240
241
242 class RecordGUIStartOver : public BC_GenericButton
243 {
244 public:
245         RecordGUIStartOver(RecordGUI *gui, int x, int y);
246         ~RecordGUIStartOver();
247
248         int handle_event();
249
250         RecordGUI *gui;
251 };
252
253 class EndRecordThread : public Thread
254 {
255 public:
256         EndRecordThread(RecordGUI *record_gui);
257         ~EndRecordThread();
258
259         void start(int is_ok);
260         void run();
261
262         RecordGUI *gui;
263         QuestionWindow *window;
264 // OK Button was pressed
265         int is_ok;
266 };
267
268 class RecordStartoverThread : public Thread
269 {
270 public:
271         RecordStartoverThread(RecordGUI *record_gui);
272         ~RecordStartoverThread();
273         void run();
274
275         RecordGUI *gui;
276         QuestionWindow *window;
277 };
278
279 class RecordBatch : public BC_PopupTextBox
280 {
281 public:
282         RecordBatch(RecordGUI *gui, int x, int y);
283         int handle_event();
284         RecordGUI *gui;
285 };
286
287 class RecordPath : public RecordBatchesGUI::Path
288 {
289 public:
290         RecordGUI *gui;
291         int handle_event();
292         RecordPath(RecordGUI *gui, int x, int y);
293 };
294
295 class RecordStart : public RecordBatchesGUI::StartTime
296 {
297 public:
298         RecordGUI *gui;
299         int handle_event();
300         RecordStart(RecordGUI *gui, int x, int y);
301 };
302
303 class RecordDuration : public RecordBatchesGUI::Duration
304 {
305 public:
306         RecordGUI *gui;
307         int handle_event();
308         RecordDuration(RecordGUI *gui, int x, int y);
309 };
310
311 class RecordSource : public RecordBatchesGUI::Source
312 {
313 public:
314         RecordGUI *gui;
315         int handle_event();
316         RecordSource(RecordGUI *gui, int x, int y);
317 };
318
319 class RecordNews : public RecordBatchesGUI::News
320 {
321 public:
322         RecordNews(RecordGUI *gui, int x, int y);
323         int handle_event();
324         RecordGUI *gui;
325 };
326
327 class RecordGUIDropFrames : public BC_CheckBox
328 {
329 public:
330         RecordGUIDropFrames(RecordGUI *gui, int x, int y);
331         int handle_event();
332         int keypress_event();
333         RecordGUI *gui;
334 };
335
336 class RecordGUIFillFrames : public BC_CheckBox
337 {
338 public:
339         RecordGUIFillFrames(RecordGUI *gui, int x, int y);
340         int handle_event();
341         int keypress_event();
342         RecordGUI *gui;
343 };
344
345 class RecordGUIPowerOff : public BC_CheckBox
346 {
347 public:
348         RecordGUIPowerOff(RecordGUI *gui, int x, int y);
349         int handle_event();
350         int keypress_event();
351         RecordGUI *gui;
352 };
353
354 class RecordGUICommCheck : public BC_CheckBox
355 {
356 public:
357         RecordGUICommCheck(RecordGUI *gui, int x, int y);
358         int handle_event();
359         int keypress_event();
360         RecordGUI *gui;
361 };
362
363 class RecordGUIMonitorVideo : public BC_CheckBox
364 {
365 public:
366         RecordGUIMonitorVideo(RecordGUI *gui, int x, int y);
367         int handle_event();
368         int keypress_event();
369         RecordGUI *gui;
370 };
371
372 class RecordGUIMonitorAudio : public BC_CheckBox
373 {
374 public:
375         RecordGUIMonitorAudio(RecordGUI *gui, int x, int y);
376         int handle_event();
377         int keypress_event();
378         RecordGUI *gui;
379 };
380
381 class RecordGUIAudioMeters : public BC_CheckBox
382 {
383 public:
384         RecordGUIAudioMeters(RecordGUI *gui, int x, int y);
385         int handle_event();
386         int keypress_event();
387         RecordGUI *gui;
388 };
389
390 class RecordGUINewBatch : public RecordBatchesGUI::NewBatch
391 {
392 public:
393         RecordGUI *gui;
394         int handle_event();
395         RecordGUINewBatch(RecordGUI *gui, int x, int y);
396 };
397
398
399 class RecordGUIDeleteBatch : public RecordBatchesGUI::DeleteBatch
400 {
401 public:
402         RecordGUI *gui;
403         int handle_event();
404         RecordGUIDeleteBatch(RecordGUI *gui, int x, int y);
405 };
406
407 class RecordGUILabel : public BC_GenericButton
408 {
409 public:
410         RecordGUILabel(RecordGUI *gui, int x, int y);
411         ~RecordGUILabel();
412
413         int handle_event();
414         int keypress_event();
415         RecordGUI *gui;
416 };
417
418 class RecordGUIClearLabels : public BC_GenericButton
419 {
420 public:
421         RecordGUIClearLabels(RecordGUI *gui, int x, int y);
422         ~RecordGUIClearLabels();
423
424         int handle_event();
425         RecordGUI *gui;
426 };
427
428 // Stop GUI blocking the recording when X11 is busy
429 class RecordStatusThread : public Thread
430 {
431 public:
432         RecordStatusThread(MWindow *mwindow, RecordGUI *gui);
433         ~RecordStatusThread();
434
435         void reset_video();
436         void reset_audio();
437         void update_frames_behind(long value);
438         void update_dropped_frames(long value);
439         void update_position(double value);
440         void update_clipped_samples(long value);
441         void update_framerate(double value);
442         void get_window_lock();
443         template<class T>
444         void update_status_string(const char *fmt,T &new_value,T &displayed_value,BC_Title *widgit);
445         void run();
446
447         MWindow *mwindow;
448         RecordGUI *gui;
449         long new_dropped_frames, displayed_dropped_frames;
450         long new_frames_behind, displayed_frames_behind;
451         double new_framerate, displayed_framerate;
452         long new_clipped_samples, displayed_clipped_samples;
453         double new_position;
454         int window_locked;
455         int done;
456         Condition *input_lock;
457 };
458
459 class RecordGUIFlash : public Thread
460 {
461 public:
462         RecordGUI *record_gui;
463         Condition *flash_lock;
464         int done;
465
466         void run();
467         RecordGUIFlash(RecordGUI *gui);
468         ~RecordGUIFlash();
469 };
470
471 class RecordGUIModeMenu;
472
473 class RecordGUIModeTextBox : public BC_TextBox
474 {
475 public:
476         RecordGUIModeTextBox(RecordGUIModeMenu *mode_menu,
477                 int x, int y, int w,const char *text);
478         ~RecordGUIModeTextBox();
479         RecordGUI *record_gui;
480         RecordGUIModeMenu *mode_menu;
481         int handle_event();
482 };
483
484 class RecordGUIModeListBox : public BC_ListBox
485 {
486 public:
487         RecordGUIModeListBox(RecordGUIModeMenu *mode_menu);
488         ~RecordGUIModeListBox();
489         RecordGUI *record_gui;
490         RecordGUIModeMenu *mode_menu;
491         int handle_event();
492 };
493
494 class RecordGUIModeMenu
495 {
496 public:
497         RecordGUIModeMenu(RecordGUI *record_gui,int x, int y, int w, const char *text);
498         ~RecordGUIModeMenu();
499
500         int handle_event();
501         void create_objects();
502         void update(int value);
503         int get_w();
504         int get_h();
505
506         RecordGUI *record_gui;
507         RecordGUIModeTextBox *textbox;
508         RecordGUIModeListBox *listbox;
509         ArrayList<BC_ListBoxItem*> modes;
510         int value;
511 };
512
513
514 class RecordGUIDCOffset : public BC_Button
515 {
516 public:
517         RecordGUIDCOffset(MWindow *mwindow, int y);
518         ~RecordGUIDCOffset();
519
520         int handle_event();
521         int keypress_event();
522 };
523
524 class RecordGUIDCOffsetText : public BC_TextBox
525 {
526 public:
527         RecordGUIDCOffsetText(char *text, int y, int number);
528         ~RecordGUIDCOffsetText();
529
530         int handle_event();
531         int number;
532 };
533
534 class RecordGUIReset : public BC_Button
535 {
536 public:
537         RecordGUIReset(MWindow *mwindow, RecordGUI *gui, int y);
538         ~RecordGUIReset();
539
540         int handle_event();
541         RecordGUI *gui;
542 };
543
544 class RecordGUIResetTranslation : public BC_Button
545 {
546 public:
547         RecordGUIResetTranslation(MWindow *mwindow, RecordGUI *gui, int y);
548         ~RecordGUIResetTranslation();
549
550         int handle_event();
551         RecordGUI *gui;
552 };
553
554
555
556
557
558
559
560 #endif