r793: Small API addon, so plugins can 'see' camera and projector automation
[cinelerra_cv/mob.git] / cinelerra / vdeviceprefs.C
blob515334502b113469bb7d2cc8918bbee550f7f6b8
1 #include "channelpicker.h"
2 #ifdef HAVE_CONFIG_H
3 #include "config.h"
4 #endif
5 #include "edl.h"
6 #include "edlsession.h"
7 #include "language.h"
8 #include "mwindow.h"
9 #include "vdeviceprefs.h"
10 #include "videoconfig.h"
11 #include "videodevice.inc"
12 #include "playbackconfig.h"
13 #include "preferences.h"
14 #include "preferencesthread.h"
15 #include "recordconfig.h"
16 #include <string.h>
19 VDevicePrefs::VDevicePrefs(int x, 
20         int y, 
21         PreferencesWindow *pwindow, 
22         PreferencesDialog *dialog, 
23         VideoOutConfig *out_config,
24         VideoInConfig *in_config,
25         int mode)
27         this->pwindow = pwindow;
28         this->dialog = dialog;
29         this->driver = -1;
30         this->mode = mode;
31         this->out_config = out_config;
32         this->in_config = in_config;
33         this->x = x;
34         this->y = y;
35         menu = 0;
36         reset_objects();
40 VDevicePrefs::~VDevicePrefs()
42         delete_objects();
43         if(menu) delete menu;
47 void VDevicePrefs::reset_objects()
49         device_text = 0;
51         port_title = 0;
52         channel_title = 0;
53         device_title = 0;
54         syt_title = 0;
56         firewire_port = 0;
57         firewire_channel = 0;
58         firewire_channels = 0;
59         firewire_syt = 0;
60         firewire_path = 0;
63 int VDevicePrefs::initialize()
65         int *driver = 0;
66         delete_objects();
68         switch(mode)
69         {
70                 case MODEPLAY:
71                         driver = &out_config->driver;
72                         break;
74                 case MODERECORD:
75                         driver = &in_config->driver;
76                         break;
77         }
78         this->driver = *driver;
80         if(!menu)
81         {
82                 dialog->add_subwindow(menu = new VDriverMenu(x,
83                         y + 10,
84                         this, 
85                         (mode == MODERECORD), 
86                         driver));
87                 menu->create_objects();
88         }
90         switch(this->driver)
91         {
92                 case VIDEO4LINUX:
93                         create_v4l_objs();
94                         break;
95                 case VIDEO4LINUX2:
96                         create_v4l2_objs();
97                         break;
98                 case VIDEO4LINUX2JPEG:
99                         create_v4l2jpeg_objs();
100                         break;
101                 case SCREENCAPTURE:
102                         create_screencap_objs();
103                         break;
104                 case CAPTURE_LML:
105                         create_lml_objs();
106                         break;
107                 case CAPTURE_BUZ:
108                 case PLAYBACK_BUZ:
109                         create_buz_objs();
110                         break;
111                 case PLAYBACK_X11:
112                 case PLAYBACK_X11_XV:
113                         create_x11_objs();
114                         break;
115                 case PLAYBACK_DV1394:
116                 case PLAYBACK_FIREWIRE:
117                 case PLAYBACK_IEC61883:
118                 case CAPTURE_FIREWIRE:
119                 case CAPTURE_IEC61883:
120                         create_firewire_objs();
121                         break;
122         }
123         return 0;
126 int VDevicePrefs::delete_objects()
128         switch(driver)
129         {
130                 case PLAYBACK_LML:
131                 case PLAYBACK_BUZ:
132                         delete output_title;
133                         delete channel_picker;
134                         delete buz_swap_channels;
135                         break;
136         }
139         
140         if(device_text) delete device_text;
142         if(port_title) delete port_title;
143         if(firewire_port) delete firewire_port;
144         if(channel_title) delete channel_title;
145         if(firewire_channel) delete firewire_channel;
146         if(device_title) delete device_title;
147         if(firewire_path) delete firewire_path;
148         if(syt_title) delete syt_title;
149         if(firewire_syt) delete firewire_syt;
151         reset_objects();
152         driver = -1;
153         return 0;
156 int VDevicePrefs::create_lml_objs()
158         char *output_char;
159         int x1 = x + menu->get_w() + 5;
160         BC_Resources *resources = BC_WindowBase::get_resources();
162         switch(mode)
163         {
164                 case MODEPLAY: 
165                         output_char = out_config->lml_out_device;
166                         break;
167                 case MODERECORD:
168                         output_char = in_config->lml_in_device;
169                         break;
170         }
171         dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Device path:"), MEDIUMFONT, resources->text_default));
172         dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
173         return 0;
176 int VDevicePrefs::create_buz_objs()
178         char *output_char;
179         int x1 = x + menu->get_w() + 5;
180         int x2 = x1 + 210;
181         int y1 = y;
182         BC_Resources *resources = BC_WindowBase::get_resources();
184         switch(mode)
185         {
186                 case MODEPLAY: 
187                         output_char = out_config->buz_out_device;
188                         break;
189                 case MODERECORD:
190                         output_char = in_config->buz_in_device;
191                         break;
192         }
193         dialog->add_subwindow(device_title = new BC_Title(x1, y1, _("Device path:"), MEDIUMFONT, resources->text_default));
195         y1 += 20;
196         dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y1, output_char));
198         if(driver == PLAYBACK_BUZ)
199         {
200                 dialog->add_subwindow(buz_swap_channels = 
201                         new VDeviceCheckBox(x2, y1, &out_config->buz_swap_fields, _("Swap fields")));
202         }
203         y1 += 30;
204         if(driver == PLAYBACK_BUZ)
205         {
206                 dialog->add_subwindow(output_title = new BC_Title(x1, y1, _("Output channel:")));
207                 y1 += 20;
208                 channel_picker = new PrefsChannelPicker(pwindow->mwindow, 
209                         this, 
210                         pwindow->mwindow->channeldb_buz, 
211                         x1,
212                         y1);
213                 channel_picker->create_objects();
214         }
215         return 0;
218 int VDevicePrefs::create_firewire_objs()
220         int *output_int = 0;
221         char *output_char = 0;
222         int x1 = x + menu->get_w() + 5;
223         BC_Resources *resources = BC_WindowBase::get_resources();
225 // Firewire path
226         switch(mode)
227         {
228                 case MODEPLAY:
229                         if(driver == PLAYBACK_DV1394)
230                                 output_char = out_config->dv1394_path;
231                         else
232                         if(driver == PLAYBACK_FIREWIRE)
233                                 output_char = out_config->firewire_path;
234                         break;
235                 case MODERECORD:
236 // Our version of raw1394 doesn't support changing the input path
237                         output_char = 0;
238                         break;
239         }
241         if(output_char)
242         {
243                 dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Device Path:"), MEDIUMFONT, resources->text_default));
244                 dialog->add_subwindow(firewire_path = new VDeviceTextBox(x1, y + 20, output_char));
245                 x1 += firewire_path->get_w() + 5;
246         }
248 // Firewire port
249         switch(mode)
250         {
251                 case MODEPLAY:
252                         if(driver == PLAYBACK_DV1394)
253                                 output_int = &out_config->dv1394_port;
254                         else
255                                 output_int = &out_config->firewire_port;
256                         break;
257                 case MODERECORD:
258                         output_int = &in_config->firewire_port;
259                         break;
260         }
261         dialog->add_subwindow(port_title = new BC_Title(x1, y, _("Port:"), MEDIUMFONT, resources->text_default));
262         dialog->add_subwindow(firewire_port = new VDeviceIntBox(x1, y + 20, output_int));
263         x1 += firewire_port->get_w() + 5;
265 // Firewire channel
266         switch(mode)
267         {
268                 case MODEPLAY:
269                         if(driver == PLAYBACK_DV1394)
270                                 output_int = &out_config->dv1394_channel;
271                         else
272                                 output_int = &out_config->firewire_channel;
273                         break;
274                 case MODERECORD:
275                         output_int = &in_config->firewire_channel;
276                         break;
277         }
279         dialog->add_subwindow(channel_title = new BC_Title(x1, y, _("Channel:"), MEDIUMFONT, resources->text_default));
280         dialog->add_subwindow(firewire_channel = new VDeviceIntBox(x1, y + 20, output_int));
281         x1 += firewire_channel->get_w() + 5;
284 // Firewire syt
285         switch(mode)
286         {
287                 case MODEPLAY:
288                         if(driver == PLAYBACK_DV1394)
289                                 output_int = &out_config->dv1394_syt;
290                         else
291                         if(driver == PLAYBACK_FIREWIRE)
292                                 output_int = &out_config->firewire_syt;
293                         else
294                                 output_int = 0;
295                         break;
296                 case MODERECORD:
297                         output_int = 0;
298                         break;
299         }
300         if(output_int)
301         {
302                 dialog->add_subwindow(syt_title = new BC_Title(x1, y, _("Syt Offset:"), MEDIUMFONT, resources->text_default));
303                 dialog->add_subwindow(firewire_syt = new VDeviceIntBox(x1, y + 20, output_int));
304         }
306         return 0;
309 int VDevicePrefs::create_v4l_objs()
311         char *output_char;
312         BC_Resources *resources = BC_WindowBase::get_resources();
313         int x1 = x + menu->get_w() + 5;
314         output_char = pwindow->thread->edl->session->vconfig_in->v4l_in_device;
315         dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Device path:"), MEDIUMFONT, resources->text_default));
316         dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
317         return 0;
320 int VDevicePrefs::create_v4l2_objs()
322         char *output_char;
323         BC_Resources *resources = BC_WindowBase::get_resources();
324         int x1 = x + menu->get_w() + 5;
325         output_char = pwindow->thread->edl->session->vconfig_in->v4l2_in_device;
326         dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Device path:"), MEDIUMFONT, resources->text_default));
327         dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
328         return 0;
331 int VDevicePrefs::create_v4l2jpeg_objs()
333         BC_Resources *resources = BC_WindowBase::get_resources();
334         char *output_char;
335         int x1 = x + menu->get_w() + 5;
336         output_char = pwindow->thread->edl->session->vconfig_in->v4l2jpeg_in_device;
337         dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Device path:"), MEDIUMFONT, resources->text_default));
338         dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
339         return 0;
344 int VDevicePrefs::create_screencap_objs()
346         char *output_char;
347         BC_Resources *resources = BC_WindowBase::get_resources();
348         int x1 = x + menu->get_w() + 5;
349         output_char = pwindow->thread->edl->session->vconfig_in->screencapture_display;
350         dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Display:"), MEDIUMFONT, resources->text_default));
351         dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
352         return 0;
355 int VDevicePrefs::create_x11_objs()
357         char *output_char;
358         BC_Resources *resources = BC_WindowBase::get_resources();
359         int x1 = x + menu->get_w() + 5;
360         output_char = out_config->x11_host;
361         dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Display for compositor:"), MEDIUMFONT, resources->text_default));
362         dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
363         return 0;
369 VDriverMenu::VDriverMenu(int x, 
370         int y, 
371         VDevicePrefs *device_prefs, 
372         int do_input, 
373         int *output)
374  : BC_PopupMenu(x, y, 200, driver_to_string(*output))
376         this->output = output;
377         this->do_input = do_input;
378         this->device_prefs = device_prefs;
381 VDriverMenu::~VDriverMenu()
385 char* VDriverMenu::driver_to_string(int driver)
387         switch(driver)
388         {
389                 case VIDEO4LINUX:
390                         sprintf(string, VIDEO4LINUX_TITLE);
391                         break;
392                 case VIDEO4LINUX2:
393                         sprintf(string, VIDEO4LINUX2_TITLE);
394                         break;
395                 case VIDEO4LINUX2JPEG:
396                         sprintf(string, VIDEO4LINUX2JPEG_TITLE);
397                         break;
398                 case SCREENCAPTURE:
399                         sprintf(string, SCREENCAPTURE_TITLE);
400                         break;
401                 case CAPTURE_BUZ:
402                         sprintf(string, CAPTURE_BUZ_TITLE);
403                         break;
404                 case CAPTURE_LML:
405                         sprintf(string, CAPTURE_LML_TITLE);
406                         break;
407 #ifdef HAVE_FIREWIRE
408                 case CAPTURE_FIREWIRE:
409                         sprintf(string, CAPTURE_FIREWIRE_TITLE);
410                         break;
411                 case CAPTURE_IEC61883:
412                         sprintf(string, CAPTURE_IEC61883_TITLE);
413                         break;
414 #endif
415                 case PLAYBACK_X11:
416                         sprintf(string, PLAYBACK_X11_TITLE);
417                         break;
418                 case PLAYBACK_X11_XV:
419                         sprintf(string, PLAYBACK_X11_XV_TITLE);
420                         break;
421                 case PLAYBACK_LML:
422                         sprintf(string, PLAYBACK_LML_TITLE);
423                         break;
424                 case PLAYBACK_BUZ:
425                         sprintf(string, PLAYBACK_BUZ_TITLE);
426                         break;
427 #ifdef HAVE_FIREWIRE
428                 case PLAYBACK_FIREWIRE:
429                         sprintf(string, PLAYBACK_FIREWIRE_TITLE);
430                         break;
431                 case PLAYBACK_DV1394:
432                         sprintf(string, PLAYBACK_DV1394_TITLE);
433                         break;
434                 case PLAYBACK_IEC61883:
435                         sprintf(string, PLAYBACK_IEC61883_TITLE);
436                         break;
437 #endif
438                 default:
439                         sprintf(string, "");
440         }
441         return string;
444 int VDriverMenu::create_objects()
446         if(do_input)
447         {
448                 add_item(new VDriverItem(this, VIDEO4LINUX_TITLE, VIDEO4LINUX));
449 #ifdef HAVE_VIDEO4LINUX2
450                 add_item(new VDriverItem(this, VIDEO4LINUX2_TITLE, VIDEO4LINUX2));
451                 add_item(new VDriverItem(this, VIDEO4LINUX2JPEG_TITLE, VIDEO4LINUX2JPEG));
452 #endif
453                 add_item(new VDriverItem(this, SCREENCAPTURE_TITLE, SCREENCAPTURE));
454                 add_item(new VDriverItem(this, CAPTURE_BUZ_TITLE, CAPTURE_BUZ));
455 #ifdef HAVE_FIREWIRE
456                 add_item(new VDriverItem(this, CAPTURE_FIREWIRE_TITLE, CAPTURE_FIREWIRE));
457                 add_item(new VDriverItem(this, CAPTURE_IEC61883_TITLE, CAPTURE_IEC61883));
458 #endif
459         }
460         else
461         {
462                 add_item(new VDriverItem(this, PLAYBACK_X11_TITLE, PLAYBACK_X11));
463                 add_item(new VDriverItem(this, PLAYBACK_X11_XV_TITLE, PLAYBACK_X11_XV));
464                 add_item(new VDriverItem(this, PLAYBACK_BUZ_TITLE, PLAYBACK_BUZ));
465 #ifdef HAVE_FIREWIRE
466                 add_item(new VDriverItem(this, PLAYBACK_FIREWIRE_TITLE, PLAYBACK_FIREWIRE));
467                 add_item(new VDriverItem(this, PLAYBACK_DV1394_TITLE, PLAYBACK_DV1394));
468                 add_item(new VDriverItem(this, PLAYBACK_IEC61883_TITLE, PLAYBACK_IEC61883));
469 #endif
470         }
471         return 0;
475 VDriverItem::VDriverItem(VDriverMenu *popup, char *text, int driver)
476  : BC_MenuItem(text)
478         this->popup = popup;
479         this->driver = driver;
482 VDriverItem::~VDriverItem()
486 int VDriverItem::handle_event()
488         popup->set_text(get_text());
489         *(popup->output) = driver;
490         popup->device_prefs->initialize();
491         return 1;
497 VDeviceTextBox::VDeviceTextBox(int x, int y, char *output)
498  : BC_TextBox(x, y, 200, 1, output)
500         this->output = output; 
503 int VDeviceTextBox::handle_event() 
505         strcpy(output, get_text()); 
508 VDeviceIntBox::VDeviceIntBox(int x, int y, int *output)
509  : BC_TextBox(x, y, 60, 1, *output)
511         this->output = output; 
514 int VDeviceIntBox::handle_event() 
516         *output = atol(get_text()); 
517         return 1;
522 VDeviceCheckBox::VDeviceCheckBox(int x, int y, int *output, char *text)
523  : BC_CheckBox(x, y, *output, text)
525         this->output = output;
527 int VDeviceCheckBox::handle_event()
529         *output = get_value();
530         return 1;