r854: Merge 2.1:
[cinelerra_cv/ct.git] / cinelerra / vdeviceprefs.C
blob8a1c027e50abc96864790275da1f6babd9dd12f0
1 #include "bcsignals.h"
2 #include "channelpicker.h"
3 #ifdef HAVE_CONFIG_H
4 #include "config.h"
5 #endif
6 #include "edl.h"
7 #include "edlsession.h"
8 #include "language.h"
9 #include "mwindow.h"
10 #include "vdeviceprefs.h"
11 #include "videoconfig.h"
12 #include "videodevice.inc"
13 #include "playbackconfig.h"
14 #include "preferences.h"
15 #include "preferencesthread.h"
16 #include "recordconfig.h"
17 #include <string.h>
20 VDevicePrefs::VDevicePrefs(int x, 
21         int y, 
22         PreferencesWindow *pwindow, 
23         PreferencesDialog *dialog, 
24         VideoOutConfig *out_config,
25         VideoInConfig *in_config,
26         int mode)
28         this->pwindow = pwindow;
29         this->dialog = dialog;
30         this->driver = -1;
31         this->mode = mode;
32         this->out_config = out_config;
33         this->in_config = in_config;
34         this->x = x;
35         this->y = y;
36         menu = 0;
37         reset_objects();
41 VDevicePrefs::~VDevicePrefs()
43         delete_objects();
44         if(menu) delete menu;
48 void VDevicePrefs::reset_objects()
50         device_title = 0;
51         device_text = 0;
53         port_title = 0;
55         
57         channel_title = 0;
58         syt_title = 0;
60         firewire_port = 0;
61         firewire_channel = 0;
62         firewire_channels = 0;
63         firewire_syt = 0;
64         firewire_path = 0;
68 int VDevicePrefs::initialize()
70         int *driver = 0;
71         delete_objects();
73         switch(mode)
74         {
75                 case MODEPLAY:
76                         driver = &out_config->driver;
77                         break;
79                 case MODERECORD:
80                         driver = &in_config->driver;
81                         break;
82         }
83         this->driver = *driver;
85         if(!menu)
86         {
87                 dialog->add_subwindow(menu = new VDriverMenu(x,
88                         y + 10,
89                         this, 
90                         (mode == MODERECORD), 
91                         driver));
92                 menu->create_objects();
93         }
95         switch(this->driver)
96         {
97                 case VIDEO4LINUX:
98                         create_v4l_objs();
99                         break;
100                 case VIDEO4LINUX2:
101                         create_v4l2_objs();
102                         break;
103                 case VIDEO4LINUX2JPEG:
104                         create_v4l2jpeg_objs();
105                         break;
106                 case SCREENCAPTURE:
107                         create_screencap_objs();
108                         break;
109                 case CAPTURE_LML:
110                         create_lml_objs();
111                         break;
112                 case CAPTURE_BUZ:
113                 case PLAYBACK_BUZ:
114                         create_buz_objs();
115                         break;
116                 case PLAYBACK_X11:
117                 case PLAYBACK_X11_XV:
118                 case PLAYBACK_X11_GL:
119                         create_x11_objs();
120                         break;
121                 case PLAYBACK_DV1394:
122                 case PLAYBACK_FIREWIRE:
123                 case PLAYBACK_IEC61883:
124                 case CAPTURE_FIREWIRE:
125                 case CAPTURE_IEC61883:
126                         create_firewire_objs();
127                         break;
128         }
129         return 0;
135 int VDevicePrefs::delete_objects()
137 SET_TRACE
138         switch(driver)
139         {
140                 case PLAYBACK_LML:
141                 case PLAYBACK_BUZ:
142                         delete output_title;
143                         delete channel_picker;
144                         delete buz_swap_channels;
145                         break;
146         }
149         
150         if(device_text) delete device_text;
152         if(port_title) delete port_title;
153 SET_TRACE
154         if(firewire_port) delete firewire_port;
155 SET_TRACE
156         if(channel_title) delete channel_title;
157 SET_TRACE
158         if(firewire_channel) delete firewire_channel;
159 SET_TRACE
160 SET_TRACE
161         if(device_title) delete device_title;
162 SET_TRACE
163         if(firewire_path) delete firewire_path;
164 SET_TRACE
165         if(syt_title) delete syt_title;
166 SET_TRACE
167         if(firewire_syt) delete firewire_syt;
169 SET_TRACE
170         reset_objects();
171         driver = -1;
172         return 0;
175 int VDevicePrefs::create_lml_objs()
177         char *output_char;
178         int x1 = x + menu->get_w() + 5;
179         BC_Resources *resources = BC_WindowBase::get_resources();
181         switch(mode)
182         {
183                 case MODEPLAY: 
184                         output_char = out_config->lml_out_device;
185                         break;
186                 case MODERECORD:
187                         output_char = in_config->lml_in_device;
188                         break;
189         }
190         dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Device path:"), MEDIUMFONT, resources->text_default));
191         dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
192         return 0;
195 int VDevicePrefs::create_buz_objs()
197         char *output_char;
198         int x1 = x + menu->get_w() + 5;
199         int x2 = x1 + 210;
200         int y1 = y;
201         BC_Resources *resources = BC_WindowBase::get_resources();
203         switch(mode)
204         {
205                 case MODEPLAY: 
206                         output_char = out_config->buz_out_device;
207                         break;
208                 case MODERECORD:
209                         output_char = in_config->buz_in_device;
210                         break;
211         }
212         dialog->add_subwindow(device_title = new BC_Title(x1, y1, _("Device path:"), MEDIUMFONT, resources->text_default));
214         y1 += 20;
215         dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y1, output_char));
217         if(driver == PLAYBACK_BUZ)
218         {
219                 dialog->add_subwindow(buz_swap_channels = 
220                         new VDeviceCheckBox(x2, y1, &out_config->buz_swap_fields, _("Swap fields")));
221         }
222         y1 += 30;
223         if(driver == PLAYBACK_BUZ)
224         {
225                 dialog->add_subwindow(output_title = new BC_Title(x1, y1, _("Output channel:")));
226                 y1 += 20;
227                 channel_picker = new PrefsChannelPicker(pwindow->mwindow, 
228                         this, 
229                         pwindow->mwindow->channeldb_buz, 
230                         x1,
231                         y1);
232                 channel_picker->create_objects();
233         }
234         return 0;
237 int VDevicePrefs::create_firewire_objs()
239         int *output_int = 0;
240         char *output_char = 0;
241         int x1 = x + menu->get_w() + 5;
242         BC_Resources *resources = BC_WindowBase::get_resources();
244 // Firewire path
245         switch(mode)
246         {
247                 case MODEPLAY:
248                         if(driver == PLAYBACK_DV1394)
249                                 output_char = out_config->dv1394_path;
250                         else
251                         if(driver == PLAYBACK_FIREWIRE)
252                                 output_char = out_config->firewire_path;
253                         break;
254                 case MODERECORD:
255                         if(driver == CAPTURE_FIREWIRE)
256                                 output_char = in_config->firewire_path;
257                         break;
258         }
260         if(output_char)
261         {
262                 dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Device Path:"), MEDIUMFONT, resources->text_default));
263                 dialog->add_subwindow(firewire_path = new VDeviceTextBox(x1, y + 20, output_char));
264                 x1 += firewire_path->get_w() + 5;
265         }
267 // Firewire port
268         switch(mode)
269         {
270                 case MODEPLAY:
271                         if(driver == PLAYBACK_DV1394)
272                                 output_int = &out_config->dv1394_port;
273                         else
274                                 output_int = &out_config->firewire_port;
275                         break;
276                 case MODERECORD:
277                         output_int = &in_config->firewire_port;
278                         break;
279         }
280         dialog->add_subwindow(port_title = new BC_Title(x1, y, _("Port:"), MEDIUMFONT, resources->text_default));
281         dialog->add_subwindow(firewire_port = new VDeviceIntBox(x1, y + 20, output_int));
282         x1 += firewire_port->get_w() + 5;
284 // Firewire channel
285         switch(mode)
286         {
287                 case MODEPLAY:
288                         if(driver == PLAYBACK_DV1394)
289                                 output_int = &out_config->dv1394_channel;
290                         else
291                                 output_int = &out_config->firewire_channel;
292                         break;
293                 case MODERECORD:
294                         output_int = &in_config->firewire_channel;
295                         break;
296         }
298         dialog->add_subwindow(channel_title = new BC_Title(x1, y, _("Channel:"), MEDIUMFONT, resources->text_default));
299         dialog->add_subwindow(firewire_channel = new VDeviceIntBox(x1, y + 20, output_int));
300         x1 += firewire_channel->get_w() + 5;
303 // Firewire syt
304         switch(mode)
305         {
306                 case MODEPLAY:
307                         if(driver == PLAYBACK_DV1394)
308                                 output_int = &out_config->dv1394_syt;
309                         else
310                         if(driver == PLAYBACK_FIREWIRE)
311                                 output_int = &out_config->firewire_syt;
312                         else
313                                 output_int = 0;
314                         break;
315                 case MODERECORD:
316                         output_int = 0;
317                         break;
318         }
319         if(output_int)
320         {
321                 dialog->add_subwindow(syt_title = new BC_Title(x1, y, _("Syt Offset:"), MEDIUMFONT, resources->text_default));
322                 dialog->add_subwindow(firewire_syt = new VDeviceIntBox(x1, y + 20, output_int));
323         }
325         return 0;
328 int VDevicePrefs::create_v4l_objs()
330         char *output_char;
331         BC_Resources *resources = BC_WindowBase::get_resources();
332         int x1 = x + menu->get_w() + 5;
333         output_char = pwindow->thread->edl->session->vconfig_in->v4l_in_device;
334         dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Device path:"), MEDIUMFONT, resources->text_default));
335         dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
336         return 0;
339 int VDevicePrefs::create_v4l2_objs()
341         char *output_char;
342         BC_Resources *resources = BC_WindowBase::get_resources();
343         int x1 = x + menu->get_w() + 5;
344         output_char = pwindow->thread->edl->session->vconfig_in->v4l2_in_device;
345         dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Device path:"), MEDIUMFONT, resources->text_default));
346         dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
348         return 0;
351 int VDevicePrefs::create_v4l2jpeg_objs()
353         BC_Resources *resources = BC_WindowBase::get_resources();
354         char *output_char;
355         int x1 = x + menu->get_w() + 5;
356         output_char = pwindow->thread->edl->session->vconfig_in->v4l2jpeg_in_device;
357         dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Device path:"), MEDIUMFONT, resources->text_default));
358         dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
360         return 0;
365 int VDevicePrefs::create_screencap_objs()
367         char *output_char;
368         BC_Resources *resources = BC_WindowBase::get_resources();
369         int x1 = x + menu->get_w() + 5;
370         output_char = pwindow->thread->edl->session->vconfig_in->screencapture_display;
371         dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Display:"), MEDIUMFONT, resources->text_default));
372         dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
373         return 0;
376 int VDevicePrefs::create_x11_objs()
378         char *output_char;
379         BC_Resources *resources = BC_WindowBase::get_resources();
380         int x1 = x + menu->get_w() + 5;
381         output_char = out_config->x11_host;
382         dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Display for compositor:"), MEDIUMFONT, resources->text_default));
383         dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
384         return 0;
390 VDriverMenu::VDriverMenu(int x, 
391         int y, 
392         VDevicePrefs *device_prefs, 
393         int do_input, 
394         int *output)
395  : BC_PopupMenu(x, y, 200, driver_to_string(*output))
397         this->output = output;
398         this->do_input = do_input;
399         this->device_prefs = device_prefs;
402 VDriverMenu::~VDriverMenu()
406 char* VDriverMenu::driver_to_string(int driver)
408         switch(driver)
409         {
410                 case VIDEO4LINUX:
411                         sprintf(string, VIDEO4LINUX_TITLE);
412                         break;
413                 case VIDEO4LINUX2:
414                         sprintf(string, VIDEO4LINUX2_TITLE);
415                         break;
416                 case VIDEO4LINUX2JPEG:
417                         sprintf(string, VIDEO4LINUX2JPEG_TITLE);
418                         break;
419                 case SCREENCAPTURE:
420                         sprintf(string, SCREENCAPTURE_TITLE);
421                         break;
422                 case CAPTURE_BUZ:
423                         sprintf(string, CAPTURE_BUZ_TITLE);
424                         break;
425                 case CAPTURE_LML:
426                         sprintf(string, CAPTURE_LML_TITLE);
427                         break;
428 #ifdef HAVE_FIREWIRE
429                 case CAPTURE_FIREWIRE:
430                         sprintf(string, CAPTURE_FIREWIRE_TITLE);
431                         break;
432                 case CAPTURE_IEC61883:
433                         sprintf(string, CAPTURE_IEC61883_TITLE);
434                         break;
435 #endif
436                 case PLAYBACK_X11:
437                         sprintf(string, PLAYBACK_X11_TITLE);
438                         break;
439                 case PLAYBACK_X11_XV:
440                         sprintf(string, PLAYBACK_X11_XV_TITLE);
441                         break;
442                 case PLAYBACK_X11_GL:
443                         sprintf(string, PLAYBACK_X11_GL_TITLE);
444                         break;
445                 case PLAYBACK_LML:
446                         sprintf(string, PLAYBACK_LML_TITLE);
447                         break;
448                 case PLAYBACK_BUZ:
449                         sprintf(string, PLAYBACK_BUZ_TITLE);
450                         break;
451 #ifdef HAVE_FIREWIRE
452                 case PLAYBACK_FIREWIRE:
453                         sprintf(string, PLAYBACK_FIREWIRE_TITLE);
454                         break;
455                 case PLAYBACK_DV1394:
456                         sprintf(string, PLAYBACK_DV1394_TITLE);
457                         break;
458                 case PLAYBACK_IEC61883:
459                         sprintf(string, PLAYBACK_IEC61883_TITLE);
460                         break;
461 #endif
462                 default:
463                         sprintf(string, "");
464         }
465         return string;
468 int VDriverMenu::create_objects()
470         if(do_input)
471         {
472                 add_item(new VDriverItem(this, VIDEO4LINUX_TITLE, VIDEO4LINUX));
473 #ifdef HAVE_VIDEO4LINUX2
474                 add_item(new VDriverItem(this, VIDEO4LINUX2_TITLE, VIDEO4LINUX2));
475                 add_item(new VDriverItem(this, VIDEO4LINUX2JPEG_TITLE, VIDEO4LINUX2JPEG));
476 #endif
477                 add_item(new VDriverItem(this, SCREENCAPTURE_TITLE, SCREENCAPTURE));
478                 add_item(new VDriverItem(this, CAPTURE_BUZ_TITLE, CAPTURE_BUZ));
479 #ifdef HAVE_FIREWIRE
480                 add_item(new VDriverItem(this, CAPTURE_FIREWIRE_TITLE, CAPTURE_FIREWIRE));
481                 add_item(new VDriverItem(this, CAPTURE_IEC61883_TITLE, CAPTURE_IEC61883));
482 #endif
483         }
484         else
485         {
486                 add_item(new VDriverItem(this, PLAYBACK_X11_TITLE, PLAYBACK_X11));
487                 add_item(new VDriverItem(this, PLAYBACK_X11_XV_TITLE, PLAYBACK_X11_XV));
488 #ifdef HAVE_GL
489                 add_item(new VDriverItem(this, PLAYBACK_X11_GL_TITLE, PLAYBACK_X11_GL));
490 #endif
491                 add_item(new VDriverItem(this, PLAYBACK_BUZ_TITLE, PLAYBACK_BUZ));
492 #ifdef HAVE_FIREWIRE
493                 add_item(new VDriverItem(this, PLAYBACK_FIREWIRE_TITLE, PLAYBACK_FIREWIRE));
494                 add_item(new VDriverItem(this, PLAYBACK_DV1394_TITLE, PLAYBACK_DV1394));
495                 add_item(new VDriverItem(this, PLAYBACK_IEC61883_TITLE, PLAYBACK_IEC61883));
496 #endif
497         }
498         return 0;
502 VDriverItem::VDriverItem(VDriverMenu *popup, char *text, int driver)
503  : BC_MenuItem(text)
505         this->popup = popup;
506         this->driver = driver;
509 VDriverItem::~VDriverItem()
513 int VDriverItem::handle_event()
515         popup->set_text(get_text());
516         *(popup->output) = driver;
517         popup->device_prefs->initialize();
518         return 1;
524 VDeviceTextBox::VDeviceTextBox(int x, int y, char *output)
525  : BC_TextBox(x, y, 200, 1, output)
527         this->output = output; 
530 int VDeviceTextBox::handle_event() 
532         strcpy(output, get_text()); 
535 VDeviceIntBox::VDeviceIntBox(int x, int y, int *output)
536  : BC_TextBox(x, y, 60, 1, *output)
538         this->output = output; 
541 int VDeviceIntBox::handle_event() 
543         *output = atol(get_text()); 
544         return 1;
551 VDeviceCheckBox::VDeviceCheckBox(int x, int y, int *output, char *text)
552  : BC_CheckBox(x, y, *output, text)
554         this->output = output;
556 int VDeviceCheckBox::handle_event()
558         *output = get_value();
559         return 1;