00001 #include "bcsignals.h"
00002 #include "channeldb.h"
00003 #include "channelpicker.h"
00004 #ifdef HAVE_CONFIG_H
00005 #include "config.h"
00006 #endif
00007 #include "edl.h"
00008 #include "edlsession.h"
00009 #include "formattools.h"
00010 #include "language.h"
00011 #include "mwindow.h"
00012 #include "vdeviceprefs.h"
00013 #include "videoconfig.h"
00014 #include "videodevice.inc"
00015 #include "playbackconfig.h"
00016 #include "preferences.h"
00017 #include "preferencesthread.h"
00018 #include "recordconfig.h"
00019 #include "recordprefs.h"
00020 #include <string.h>
00021
00022
00023 VDevicePrefs::VDevicePrefs(int x,
00024 int y,
00025 PreferencesWindow *pwindow,
00026 PreferencesDialog *dialog,
00027 VideoOutConfig *out_config,
00028 VideoInConfig *in_config,
00029 int mode)
00030 {
00031 this->pwindow = pwindow;
00032 this->dialog = dialog;
00033 this->driver = -1;
00034 this->mode = mode;
00035 this->out_config = out_config;
00036 this->in_config = in_config;
00037 this->x = x;
00038 this->y = y;
00039 menu = 0;
00040 reset_objects();
00041
00042 }
00043
00044 VDevicePrefs::~VDevicePrefs()
00045 {
00046 delete_objects();
00047 if(menu) delete menu;
00048 pwindow->mwindow->channeldb_buz->save("channeldb_buz");
00049 }
00050
00051
00052 void VDevicePrefs::reset_objects()
00053 {
00054 device_title = 0;
00055 device_text = 0;
00056
00057 port_title = 0;
00058 device_port = 0;
00059
00060 number_title = 0;
00061 device_number = 0;
00062
00063
00064 channel_title = 0;
00065 syt_title = 0;
00066
00067 firewire_port = 0;
00068 firewire_channel = 0;
00069 firewire_channels = 0;
00070 firewire_syt = 0;
00071 firewire_path = 0;
00072
00073 buz_swap_channels = 0;
00074 output_title = 0;
00075 channel_picker = 0;
00076 }
00077
00078 int VDevicePrefs::initialize(int creation)
00079 {
00080 int *driver = 0;
00081 delete_objects();
00082
00083 switch(mode)
00084 {
00085 case MODEPLAY:
00086 driver = &out_config->driver;
00087 break;
00088
00089 case MODERECORD:
00090 driver = &in_config->driver;
00091 break;
00092 }
00093 this->driver = *driver;
00094
00095 if(!menu)
00096 {
00097 dialog->add_subwindow(menu = new VDriverMenu(x,
00098 y + 10,
00099 this,
00100 (mode == MODERECORD),
00101 driver));
00102 menu->create_objects();
00103 }
00104
00105 switch(this->driver)
00106 {
00107 case VIDEO4LINUX:
00108 create_v4l_objs();
00109 break;
00110 case VIDEO4LINUX2:
00111 create_v4l2_objs();
00112 break;
00113 case VIDEO4LINUX2JPEG:
00114 create_v4l2jpeg_objs();
00115 break;
00116 case SCREENCAPTURE:
00117 create_screencap_objs();
00118 break;
00119 case CAPTURE_LML:
00120 create_lml_objs();
00121 break;
00122 case CAPTURE_BUZ:
00123 case PLAYBACK_BUZ:
00124 create_buz_objs();
00125 break;
00126 case PLAYBACK_X11:
00127 case PLAYBACK_X11_XV:
00128 case PLAYBACK_X11_GL:
00129 create_x11_objs();
00130 break;
00131 case PLAYBACK_DV1394:
00132 case PLAYBACK_FIREWIRE:
00133 case PLAYBACK_IEC61883:
00134 case CAPTURE_FIREWIRE:
00135 case CAPTURE_IEC61883:
00136 create_firewire_objs();
00137 break;
00138 case CAPTURE_DVB:
00139 create_dvb_objs();
00140 break;
00141 }
00142
00143
00144
00145
00146 if(mode == MODERECORD && dialog && !creation)
00147 {
00148 RecordPrefs *record_prefs = (RecordPrefs*)dialog;
00149 record_prefs->recording_format->update_driver(this->driver);
00150 }
00151
00152 return 0;
00153 }
00154
00155 int VDevicePrefs::delete_objects()
00156 {
00157 SET_TRACE
00158 delete output_title;
00159 SET_TRACE
00160 delete channel_picker;
00161 SET_TRACE
00162 delete buz_swap_channels;
00163 SET_TRACE
00164 delete device_title;
00165 delete device_text;
00166
00167 delete port_title;
00168 delete device_port;
00169
00170 delete number_title;
00171 delete device_number;
00172
00173 SET_TRACE
00174 SET_TRACE
00175 if(firewire_port) delete firewire_port;
00176 SET_TRACE
00177 if(channel_title) delete channel_title;
00178 SET_TRACE
00179 if(firewire_channel) delete firewire_channel;
00180 SET_TRACE
00181 SET_TRACE
00182 if(firewire_path) delete firewire_path;
00183 SET_TRACE
00184 if(syt_title) delete syt_title;
00185 SET_TRACE
00186 if(firewire_syt) delete firewire_syt;
00187
00188 SET_TRACE
00189 reset_objects();
00190 driver = -1;
00191 return 0;
00192 }
00193
00194 int VDevicePrefs::create_dvb_objs()
00195 {
00196 int x1 = x + menu->get_w() + 5;
00197 dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Host:")));
00198 dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, in_config->dvb_in_host));
00199 x1 += device_text->get_w() + 10;
00200 dialog->add_subwindow(port_title = new BC_Title(x1, y, _("Port:")));
00201 device_port = new VDeviceTumbleBox(this, x1, y + 20, &in_config->dvb_in_port, 1, 65536);
00202 device_port->create_objects();
00203 x1 += device_port->get_w() + 10;
00204 dialog->add_subwindow(number_title = new BC_Title(x1, y, _("Adaptor:")));
00205 device_number = new VDeviceTumbleBox(this, x1, y + 20, &in_config->dvb_in_number, 0, 16);
00206 device_number->create_objects();
00207 }
00208
00209 int VDevicePrefs::create_lml_objs()
00210 {
00211 char *output_char;
00212 int x1 = x + menu->get_w() + 5;
00213 BC_Resources *resources = BC_WindowBase::get_resources();
00214
00215 switch(mode)
00216 {
00217 case MODEPLAY:
00218 output_char = out_config->lml_out_device;
00219 break;
00220 case MODERECORD:
00221 output_char = in_config->lml_in_device;
00222 break;
00223 }
00224 dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Device path:"), MEDIUMFONT, resources->text_default));
00225 x1 += device_title->get_w() + 10;
00226 dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
00227 return 0;
00228 }
00229
00230 int VDevicePrefs::create_buz_objs()
00231 {
00232 char *output_char;
00233 int x1 = x + menu->get_w() + 5;
00234 int x2 = x1 + 210;
00235 int y1 = y;
00236 BC_Resources *resources = BC_WindowBase::get_resources();
00237
00238 switch(mode)
00239 {
00240 case MODEPLAY:
00241 output_char = out_config->buz_out_device;
00242 break;
00243 case MODERECORD:
00244 output_char = in_config->buz_in_device;
00245 break;
00246 }
00247 dialog->add_subwindow(device_title = new BC_Title(x1, y1, _("Device path:"), MEDIUMFONT, resources->text_default));
00248
00249 y1 += 20;
00250 dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y1, output_char));
00251
00252 if(driver == PLAYBACK_BUZ)
00253 {
00254 dialog->add_subwindow(buz_swap_channels =
00255 new VDeviceCheckBox(x2, y1, &out_config->buz_swap_fields, _("Swap fields")));
00256 }
00257 y1 += 30;
00258 if(driver == PLAYBACK_BUZ)
00259 {
00260 dialog->add_subwindow(output_title = new BC_Title(x1, y1, _("Output channel:")));
00261 y1 += 20;
00262 channel_picker = new PrefsChannelPicker(pwindow->mwindow,
00263 this,
00264 pwindow->mwindow->channeldb_buz,
00265 x1,
00266 y1);
00267 channel_picker->create_objects();
00268 }
00269 return 0;
00270 }
00271
00272 int VDevicePrefs::create_firewire_objs()
00273 {
00274 int *output_int = 0;
00275 char *output_char = 0;
00276 int x1 = x + menu->get_w() + 5;
00277 BC_Resources *resources = BC_WindowBase::get_resources();
00278
00279
00280 switch(mode)
00281 {
00282 case MODEPLAY:
00283 if(driver == PLAYBACK_DV1394)
00284 output_char = out_config->dv1394_path;
00285 else
00286 if(driver == PLAYBACK_FIREWIRE)
00287 output_char = out_config->firewire_path;
00288 break;
00289 case MODERECORD:
00290 if(driver == CAPTURE_FIREWIRE)
00291 output_char = in_config->firewire_path;
00292 break;
00293 }
00294
00295 if(output_char)
00296 {
00297 dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Device Path:"), MEDIUMFONT, resources->text_default));
00298 dialog->add_subwindow(firewire_path = new VDeviceTextBox(x1, y + 20, output_char));
00299 x1 += firewire_path->get_w() + 5;
00300 }
00301
00302
00303 switch(mode)
00304 {
00305 case MODEPLAY:
00306 if(driver == PLAYBACK_DV1394)
00307 output_int = &out_config->dv1394_port;
00308 else
00309 output_int = &out_config->firewire_port;
00310 break;
00311 case MODERECORD:
00312 output_int = &in_config->firewire_port;
00313 break;
00314 }
00315 dialog->add_subwindow(port_title = new BC_Title(x1, y, _("Port:"), MEDIUMFONT, resources->text_default));
00316 dialog->add_subwindow(firewire_port = new VDeviceIntBox(x1, y + 20, output_int));
00317 x1 += firewire_port->get_w() + 5;
00318
00319
00320 switch(mode)
00321 {
00322 case MODEPLAY:
00323 if(driver == PLAYBACK_DV1394)
00324 output_int = &out_config->dv1394_channel;
00325 else
00326 output_int = &out_config->firewire_channel;
00327 break;
00328 case MODERECORD:
00329 output_int = &in_config->firewire_channel;
00330 break;
00331 }
00332
00333 dialog->add_subwindow(channel_title = new BC_Title(x1, y, _("Channel:"), MEDIUMFONT, resources->text_default));
00334 dialog->add_subwindow(firewire_channel = new VDeviceIntBox(x1, y + 20, output_int));
00335 x1 += firewire_channel->get_w() + 5;
00336
00337
00338
00339 switch(mode)
00340 {
00341 case MODEPLAY:
00342 if(driver == PLAYBACK_DV1394)
00343 output_int = &out_config->dv1394_syt;
00344 else
00345 if(driver == PLAYBACK_FIREWIRE)
00346 output_int = &out_config->firewire_syt;
00347 else
00348 output_int = 0;
00349 break;
00350 case MODERECORD:
00351 output_int = 0;
00352 break;
00353 }
00354 if(output_int)
00355 {
00356 dialog->add_subwindow(syt_title = new BC_Title(x1, y, _("Syt Offset:"), MEDIUMFONT, resources->text_default));
00357 dialog->add_subwindow(firewire_syt = new VDeviceIntBox(x1, y + 20, output_int));
00358 }
00359
00360 return 0;
00361 }
00362
00363 int VDevicePrefs::create_v4l_objs()
00364 {
00365 char *output_char;
00366 BC_Resources *resources = BC_WindowBase::get_resources();
00367 int x1 = x + menu->get_w() + 5;
00368 output_char = pwindow->thread->edl->session->vconfig_in->v4l_in_device;
00369 dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Device path:"), MEDIUMFONT, resources->text_default));
00370 dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
00371 return 0;
00372 }
00373
00374 int VDevicePrefs::create_v4l2_objs()
00375 {
00376 char *output_char;
00377 BC_Resources *resources = BC_WindowBase::get_resources();
00378 int x1 = x + menu->get_w() + 5;
00379 output_char = pwindow->thread->edl->session->vconfig_in->v4l2_in_device;
00380 dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Device path:"), MEDIUMFONT, resources->text_default));
00381 dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
00382
00383 return 0;
00384 }
00385
00386 int VDevicePrefs::create_v4l2jpeg_objs()
00387 {
00388 BC_Resources *resources = BC_WindowBase::get_resources();
00389 char *output_char;
00390 int x1 = x + menu->get_w() + 5;
00391 output_char = pwindow->thread->edl->session->vconfig_in->v4l2jpeg_in_device;
00392 dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Device path:"), MEDIUMFONT, resources->text_default));
00393 dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
00394
00395 return 0;
00396 }
00397
00398
00399
00400 int VDevicePrefs::create_screencap_objs()
00401 {
00402 char *output_char;
00403 BC_Resources *resources = BC_WindowBase::get_resources();
00404 int x1 = x + menu->get_w() + 5;
00405 output_char = pwindow->thread->edl->session->vconfig_in->screencapture_display;
00406 dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Display:"), MEDIUMFONT, resources->text_default));
00407 dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
00408 return 0;
00409 }
00410
00411 int VDevicePrefs::create_x11_objs()
00412 {
00413 char *output_char;
00414 BC_Resources *resources = BC_WindowBase::get_resources();
00415 int x1 = x + menu->get_w() + 5;
00416 output_char = out_config->x11_host;
00417 dialog->add_subwindow(device_title = new BC_Title(x1, y, _("Display for compositor:"), MEDIUMFONT, resources->text_default));
00418 dialog->add_subwindow(device_text = new VDeviceTextBox(x1, y + 20, output_char));
00419 return 0;
00420 }
00421
00422
00423
00424
00425 VDriverMenu::VDriverMenu(int x,
00426 int y,
00427 VDevicePrefs *device_prefs,
00428 int do_input,
00429 int *output)
00430 : BC_PopupMenu(x, y, 200, driver_to_string(*output))
00431 {
00432 this->output = output;
00433 this->do_input = do_input;
00434 this->device_prefs = device_prefs;
00435 }
00436
00437 VDriverMenu::~VDriverMenu()
00438 {
00439 }
00440
00441 char* VDriverMenu::driver_to_string(int driver)
00442 {
00443 switch(driver)
00444 {
00445 case VIDEO4LINUX:
00446 sprintf(string, VIDEO4LINUX_TITLE);
00447 break;
00448 case VIDEO4LINUX2:
00449 sprintf(string, VIDEO4LINUX2_TITLE);
00450 break;
00451 case VIDEO4LINUX2JPEG:
00452 sprintf(string, VIDEO4LINUX2JPEG_TITLE);
00453 break;
00454 case SCREENCAPTURE:
00455 sprintf(string, SCREENCAPTURE_TITLE);
00456 break;
00457 case CAPTURE_BUZ:
00458 sprintf(string, CAPTURE_BUZ_TITLE);
00459 break;
00460 case CAPTURE_LML:
00461 sprintf(string, CAPTURE_LML_TITLE);
00462 break;
00463 #ifdef HAVE_FIREWIRE
00464 case CAPTURE_FIREWIRE:
00465 sprintf(string, CAPTURE_FIREWIRE_TITLE);
00466 break;
00467 case CAPTURE_IEC61883:
00468 sprintf(string, CAPTURE_IEC61883_TITLE);
00469 break;
00470 #endif
00471 case CAPTURE_DVB:
00472 sprintf(string, CAPTURE_DVB_TITLE);
00473 break;
00474 case PLAYBACK_X11:
00475 sprintf(string, PLAYBACK_X11_TITLE);
00476 break;
00477 case PLAYBACK_X11_XV:
00478 sprintf(string, PLAYBACK_X11_XV_TITLE);
00479 break;
00480 case PLAYBACK_X11_GL:
00481 sprintf(string, PLAYBACK_X11_GL_TITLE);
00482 break;
00483 case PLAYBACK_LML:
00484 sprintf(string, PLAYBACK_LML_TITLE);
00485 break;
00486 case PLAYBACK_BUZ:
00487 sprintf(string, PLAYBACK_BUZ_TITLE);
00488 break;
00489 #ifdef HAVE_FIREWIRE
00490 case PLAYBACK_FIREWIRE:
00491 sprintf(string, PLAYBACK_FIREWIRE_TITLE);
00492 break;
00493 case PLAYBACK_DV1394:
00494 sprintf(string, PLAYBACK_DV1394_TITLE);
00495 break;
00496 case PLAYBACK_IEC61883:
00497 sprintf(string, PLAYBACK_IEC61883_TITLE);
00498 break;
00499 #endif
00500 default:
00501 sprintf(string, "");
00502 }
00503 return string;
00504 }
00505
00506 int VDriverMenu::create_objects()
00507 {
00508 if(do_input)
00509 {
00510 add_item(new VDriverItem(this, VIDEO4LINUX_TITLE, VIDEO4LINUX));
00511 #ifdef HAVE_VIDEO4LINUX2
00512 add_item(new VDriverItem(this, VIDEO4LINUX2_TITLE, VIDEO4LINUX2));
00513 add_item(new VDriverItem(this, VIDEO4LINUX2JPEG_TITLE, VIDEO4LINUX2JPEG));
00514 #endif
00515 add_item(new VDriverItem(this, SCREENCAPTURE_TITLE, SCREENCAPTURE));
00516 add_item(new VDriverItem(this, CAPTURE_BUZ_TITLE, CAPTURE_BUZ));
00517 #ifdef HAVE_FIREWIRE
00518 add_item(new VDriverItem(this, CAPTURE_FIREWIRE_TITLE, CAPTURE_FIREWIRE));
00519 add_item(new VDriverItem(this, CAPTURE_IEC61883_TITLE, CAPTURE_IEC61883));
00520 #endif
00521 add_item(new VDriverItem(this, CAPTURE_DVB_TITLE, CAPTURE_DVB));
00522 }
00523 else
00524 {
00525 add_item(new VDriverItem(this, PLAYBACK_X11_TITLE, PLAYBACK_X11));
00526 add_item(new VDriverItem(this, PLAYBACK_X11_XV_TITLE, PLAYBACK_X11_XV));
00527 #ifdef HAVE_GL
00528 add_item(new VDriverItem(this, PLAYBACK_X11_GL_TITLE, PLAYBACK_X11_GL));
00529 #endif
00530 add_item(new VDriverItem(this, PLAYBACK_BUZ_TITLE, PLAYBACK_BUZ));
00531 #ifdef HAVE_FIREWIRE
00532 add_item(new VDriverItem(this, PLAYBACK_FIREWIRE_TITLE, PLAYBACK_FIREWIRE));
00533 add_item(new VDriverItem(this, PLAYBACK_DV1394_TITLE, PLAYBACK_DV1394));
00534 add_item(new VDriverItem(this, PLAYBACK_IEC61883_TITLE, PLAYBACK_IEC61883));
00535 #endif
00536 }
00537 return 0;
00538 }
00539
00540
00541 VDriverItem::VDriverItem(VDriverMenu *popup, char *text, int driver)
00542 : BC_MenuItem(text)
00543 {
00544 this->popup = popup;
00545 this->driver = driver;
00546 }
00547
00548 VDriverItem::~VDriverItem()
00549 {
00550 }
00551
00552 int VDriverItem::handle_event()
00553 {
00554 popup->set_text(get_text());
00555 *(popup->output) = driver;
00556 popup->device_prefs->initialize();
00557 return 1;
00558 }
00559
00560
00561
00562
00563 VDeviceTextBox::VDeviceTextBox(int x, int y, char *output)
00564 : BC_TextBox(x, y, 200, 1, output)
00565 {
00566 this->output = output;
00567 }
00568
00569 int VDeviceTextBox::handle_event()
00570 {
00571 strcpy(output, get_text());
00572 }
00573
00574 VDeviceTumbleBox::VDeviceTumbleBox(VDevicePrefs *prefs,
00575 int x,
00576 int y,
00577 int *output,
00578 int min,
00579 int max)
00580 : BC_TumbleTextBox(prefs->dialog,
00581 *output,
00582 min,
00583 max,
00584 x,
00585 y,
00586 60)
00587 {
00588 this->output = output;
00589 }
00590
00591 int VDeviceTumbleBox::handle_event()
00592 {
00593 *output = atol(get_text());
00594 return 1;
00595 }
00596
00597
00598
00599
00600
00601
00602 VDeviceIntBox::VDeviceIntBox(int x, int y, int *output)
00603 : BC_TextBox(x, y, 60, 1, *output)
00604 {
00605 this->output = output;
00606 }
00607
00608 int VDeviceIntBox::handle_event()
00609 {
00610 *output = atol(get_text());
00611 return 1;
00612 }
00613
00614
00615
00616
00617
00618 VDeviceCheckBox::VDeviceCheckBox(int x, int y, int *output, char *text)
00619 : BC_CheckBox(x, y, *output, text)
00620 {
00621 this->output = output;
00622 }
00623 int VDeviceCheckBox::handle_event()
00624 {
00625 *output = get_value();
00626 return 1;
00627 }
00628