00001 #include "adeviceprefs.h"
00002 #include "audioalsa.h"
00003 #include "audiodevice.inc"
00004 #include "bitspopup.h"
00005 #include "edl.h"
00006 #include "language.h"
00007 #include "playbackconfig.h"
00008 #include "preferences.h"
00009 #include "preferencesthread.h"
00010 #include "recordconfig.h"
00011 #include <string.h>
00012
00013 #define DEVICE_H 50
00014
00015 ADevicePrefs::ADevicePrefs(int x,
00016 int y,
00017 PreferencesWindow *pwindow,
00018 PreferencesDialog *dialog,
00019 AudioOutConfig *out_config,
00020 AudioInConfig *in_config,
00021 int mode)
00022 {
00023 reset();
00024 this->pwindow = pwindow;
00025 this->dialog = dialog;
00026 this->driver = -1;
00027 this->mode = mode;
00028 this->out_config = out_config;
00029 this->in_config = in_config;
00030 this->x = x;
00031 this->y = y;
00032 }
00033
00034 ADevicePrefs::~ADevicePrefs()
00035 {
00036 delete_objects();
00037 if(menu) delete menu;
00038 }
00039
00040 void ADevicePrefs::reset()
00041 {
00042 menu = 0;
00043 firewire_path = 0;
00044 firewire_syt = 0;
00045 syt_title = 0;
00046 path_title = 0;
00047
00048 alsa_drivers = 0;
00049 path_title = 0;
00050 bits_title = 0;
00051 alsa_device = 0;
00052 alsa_bits = 0;
00053 alsa_workaround = 0;
00054
00055 cine_bits = 0;
00056 cine_path = 0;
00057 }
00058
00059 int ADevicePrefs::initialize(int creation)
00060 {
00061 int *driver;
00062 delete_objects();
00063
00064 switch(mode)
00065 {
00066 case MODEPLAY:
00067 driver = &out_config->driver;
00068 break;
00069 case MODERECORD:
00070 driver = &in_config->driver;
00071 break;
00072 case MODEDUPLEX:
00073 driver = &out_config->driver;
00074 break;
00075 }
00076 this->driver = *driver;
00077
00078 if(!menu)
00079 {
00080 dialog->add_subwindow(menu = new ADriverMenu(x,
00081 y + 10,
00082 this,
00083 (mode == MODERECORD),
00084 driver));
00085 menu->create_objects();
00086 }
00087
00088 switch(*driver)
00089 {
00090 case AUDIO_OSS:
00091 case AUDIO_OSS_ENVY24:
00092 create_oss_objs();
00093 break;
00094 case AUDIO_ALSA:
00095 create_alsa_objs();
00096 break;
00097 case AUDIO_ESOUND:
00098 create_esound_objs();
00099 break;
00100 case AUDIO_1394:
00101 case AUDIO_DV1394:
00102 case AUDIO_IEC61883:
00103 create_firewire_objs();
00104 break;
00105 case AUDIO_CINE:
00106 create_cine_objs();
00107 break;
00108 }
00109 return 0;
00110 }
00111
00112 int ADevicePrefs::get_h(int recording)
00113 {
00114 if(!recording)
00115 return DEVICE_H + 30;
00116 else
00117 return DEVICE_H;
00118 }
00119
00120 int ADevicePrefs::delete_objects()
00121 {
00122 switch(driver)
00123 {
00124 case AUDIO_OSS:
00125 case AUDIO_OSS_ENVY24:
00126 delete_oss_objs();
00127 break;
00128 case AUDIO_ALSA:
00129 delete_alsa_objs();
00130 break;
00131 case AUDIO_ESOUND:
00132 delete_esound_objs();
00133 break;
00134 case AUDIO_1394:
00135 case AUDIO_DV1394:
00136 case AUDIO_IEC61883:
00137 delete_firewire_objs();
00138 break;
00139 }
00140
00141 delete cine_bits;
00142 delete cine_path;
00143
00144 reset();
00145 driver = -1;
00146 return 0;
00147 }
00148
00149 int ADevicePrefs::delete_oss_objs()
00150 {
00151 delete path_title;
00152 delete bits_title;
00153 delete oss_bits;
00154 for(int i = 0; i < MAXDEVICES; i++)
00155 {
00156 delete oss_path[i];
00157 break;
00158 }
00159 return 0;
00160 }
00161
00162 int ADevicePrefs::delete_esound_objs()
00163 {
00164 delete server_title;
00165 delete port_title;
00166 delete esound_server;
00167 delete esound_port;
00168 return 0;
00169 }
00170
00171 int ADevicePrefs::delete_firewire_objs()
00172 {
00173 delete port_title;
00174 delete channel_title;
00175 delete firewire_port;
00176 delete firewire_channel;
00177 if(firewire_path)
00178 {
00179 delete path_title;
00180 delete firewire_path;
00181 }
00182 firewire_path = 0;
00183 if(firewire_syt)
00184 {
00185 delete firewire_syt;
00186 delete syt_title;
00187 }
00188 firewire_syt = 0;
00189 return 0;
00190 }
00191
00192 int ADevicePrefs::delete_alsa_objs()
00193 {
00194 #ifdef HAVE_ALSA
00195 alsa_drivers->remove_all_objects();
00196 delete alsa_drivers;
00197 delete path_title;
00198 delete bits_title;
00199 delete alsa_device;
00200 delete alsa_bits;
00201 delete alsa_workaround;
00202 #endif
00203 return 0;
00204 }
00205
00206
00207 int ADevicePrefs::create_oss_objs()
00208 {
00209 char *output_char;
00210 int *output_int;
00211 int y1 = y;
00212 BC_Resources *resources = BC_WindowBase::get_resources();
00213
00214 for(int i = 0; i < MAXDEVICES; i++)
00215 {
00216 int x1 = x + menu->get_w() + 5;
00217 switch(mode)
00218 {
00219 case MODEPLAY:
00220
00221 break;
00222 case MODERECORD:
00223
00224 break;
00225 case MODEDUPLEX:
00226
00227 break;
00228 }
00229
00230
00231 switch(mode)
00232 {
00233 case MODEPLAY:
00234 output_char = out_config->oss_out_device[i];
00235 break;
00236 case MODERECORD:
00237 output_char = in_config->oss_in_device[i];
00238 break;
00239 case MODEDUPLEX:
00240 output_char = out_config->oss_out_device[i];
00241 break;
00242 }
00243 if(i == 0) dialog->add_subwindow(path_title = new BC_Title(x1,
00244 y,
00245 _("Device path:"),
00246 MEDIUMFONT,
00247 resources->text_default));
00248 dialog->add_subwindow(oss_path[i] = new ADeviceTextBox(x1,
00249 y1 + 20,
00250 output_char));
00251
00252 x1 += oss_path[i]->get_w() + 5;
00253 if(i == 0)
00254 {
00255 switch(mode)
00256 {
00257 case MODEPLAY:
00258 output_int = &out_config->oss_out_bits;
00259 break;
00260 case MODERECORD:
00261 output_int = &in_config->oss_in_bits;
00262 break;
00263 case MODEDUPLEX:
00264 output_int = &out_config->oss_out_bits;
00265 break;
00266 }
00267 if(i == 0) dialog->add_subwindow(bits_title = new BC_Title(x1, y, _("Bits:"), MEDIUMFONT, resources->text_default));
00268 oss_bits = new BitsPopup(dialog,
00269 x1,
00270 y1 + 20,
00271 output_int,
00272 0,
00273 0,
00274 0,
00275 0,
00276 1);
00277 oss_bits->create_objects();
00278 }
00279
00280 x1 += oss_bits->get_w() + 5;
00281 y1 += DEVICE_H;
00282 break;
00283 }
00284
00285 return 0;
00286 }
00287
00288 int ADevicePrefs::create_alsa_objs()
00289 {
00290 #ifdef HAVE_ALSA
00291 char *output_char;
00292 int *output_int;
00293 int y1 = y;
00294 BC_Resources *resources = BC_WindowBase::get_resources();
00295
00296 int x1 = x + menu->get_w() + 5;
00297
00298 ArrayList<char*> *alsa_titles = new ArrayList<char*>;
00299 AudioALSA::list_devices(alsa_titles, 0, mode);
00300
00301 alsa_drivers = new ArrayList<BC_ListBoxItem*>;
00302 for(int i = 0; i < alsa_titles->total; i++)
00303 alsa_drivers->append(new BC_ListBoxItem(alsa_titles->values[i]));
00304 alsa_titles->remove_all_objects();
00305 delete alsa_titles;
00306
00307 switch(mode)
00308 {
00309 case MODEPLAY:
00310 output_char = out_config->alsa_out_device;
00311 break;
00312 case MODERECORD:
00313 output_char = in_config->alsa_in_device;
00314 break;
00315 case MODEDUPLEX:
00316 output_char = out_config->alsa_out_device;
00317 break;
00318 }
00319 dialog->add_subwindow(path_title = new BC_Title(x1, y, _("Device:"), MEDIUMFONT, resources->text_default));
00320 alsa_device = new ALSADevice(dialog,
00321 x1,
00322 y1 + 20,
00323 output_char,
00324 alsa_drivers);
00325 alsa_device->create_objects();
00326 int x2 = x1;
00327
00328 x1 += alsa_device->get_w() + 5;
00329 switch(mode)
00330 {
00331 case MODEPLAY:
00332 output_int = &out_config->alsa_out_bits;
00333 break;
00334 case MODERECORD:
00335 output_int = &in_config->alsa_in_bits;
00336 break;
00337 case MODEDUPLEX:
00338 output_int = &out_config->alsa_out_bits;
00339 break;
00340 }
00341 dialog->add_subwindow(bits_title = new BC_Title(x1, y, _("Bits:"), MEDIUMFONT, resources->text_default));
00342 alsa_bits = new BitsPopup(dialog,
00343 x1,
00344 y1 + 20,
00345 output_int,
00346 0,
00347 0,
00348 0,
00349 0,
00350 1);
00351 alsa_bits->create_objects();
00352
00353 y1 += alsa_bits->get_h() + 20 + 5;
00354 x1 = x2;
00355
00356 if(mode == MODEPLAY)
00357 {
00358 dialog->add_subwindow(alsa_workaround =
00359 new BC_CheckBox(x1,
00360 y1,
00361 &out_config->interrupt_workaround,
00362 _("Stop playback locks up.")));
00363 }
00364
00365
00366 #endif
00367
00368 return 0;
00369 }
00370
00371 int ADevicePrefs::create_esound_objs()
00372 {
00373 int x1 = x + menu->get_w() + 5;
00374 char *output_char;
00375 int *output_int;
00376 BC_Resources *resources = BC_WindowBase::get_resources();
00377
00378 switch(mode)
00379 {
00380 case MODEPLAY:
00381 output_char = out_config->esound_out_server;
00382 break;
00383 case MODERECORD:
00384 output_char = in_config->esound_in_server;
00385 break;
00386 case MODEDUPLEX:
00387 output_char = out_config->esound_out_server;
00388 break;
00389 }
00390 dialog->add_subwindow(server_title = new BC_Title(x1, y, _("Server:"), MEDIUMFONT, resources->text_default));
00391 dialog->add_subwindow(esound_server = new ADeviceTextBox(x1, y + 20, output_char));
00392
00393 switch(mode)
00394 {
00395 case MODEPLAY:
00396 output_int = &out_config->esound_out_port;
00397 break;
00398 case MODERECORD:
00399 output_int = &in_config->esound_in_port;
00400 break;
00401 case MODEDUPLEX:
00402 output_int = &out_config->esound_out_port;
00403 break;
00404 }
00405 x1 += esound_server->get_w() + 5;
00406 dialog->add_subwindow(port_title = new BC_Title(x1, y, _("Port:"), MEDIUMFONT, resources->text_default));
00407 dialog->add_subwindow(esound_port = new ADeviceIntBox(x1, y + 20, output_int));
00408 return 0;
00409 }
00410
00411 int ADevicePrefs::create_firewire_objs()
00412 {
00413 int x1 = x + menu->get_w() + 5;
00414 int *output_int = 0;
00415 char *output_char = 0;
00416 BC_Resources *resources = BC_WindowBase::get_resources();
00417
00418
00419 switch(mode)
00420 {
00421 case MODEPLAY:
00422 if(driver == AUDIO_DV1394)
00423 output_char = out_config->dv1394_path;
00424 else
00425 if(driver == AUDIO_1394)
00426 output_char = out_config->firewire_path;
00427 break;
00428 case MODERECORD:
00429 if(driver == AUDIO_DV1394 || driver == AUDIO_1394)
00430 output_char = in_config->firewire_path;
00431 break;
00432 }
00433
00434 if(output_char)
00435 {
00436 dialog->add_subwindow(path_title = new BC_Title(x1, y, _("Device Path:"), MEDIUMFONT, resources->text_default));
00437 dialog->add_subwindow(firewire_path = new ADeviceTextBox(x1, y + 20, output_char));
00438 x1 += firewire_path->get_w() + 5;
00439 }
00440
00441
00442 switch(mode)
00443 {
00444 case MODEPLAY:
00445 if(driver == AUDIO_DV1394)
00446 output_int = &out_config->dv1394_port;
00447 else
00448 output_int = &out_config->firewire_port;
00449 break;
00450 case MODERECORD:
00451 output_int = &in_config->firewire_port;
00452 break;
00453 case MODEDUPLEX:
00454
00455 break;
00456 }
00457 dialog->add_subwindow(port_title = new BC_Title(x1, y, _("Port:"), MEDIUMFONT, resources->text_default));
00458 dialog->add_subwindow(firewire_port = new ADeviceIntBox(x1, y + 20, output_int));
00459
00460 x1 += firewire_port->get_w() + 5;
00461
00462
00463 switch(mode)
00464 {
00465 case MODEPLAY:
00466 if(driver == AUDIO_DV1394)
00467 output_int = &out_config->dv1394_channel;
00468 else
00469 output_int = &out_config->firewire_channel;
00470 break;
00471 case MODERECORD:
00472 output_int = &in_config->firewire_channel;
00473 break;
00474 }
00475 dialog->add_subwindow(channel_title = new BC_Title(x1, y, _("Channel:"), MEDIUMFONT, resources->text_default));
00476 dialog->add_subwindow(firewire_channel = new ADeviceIntBox(x1, y + 20, output_int));
00477 x1 += firewire_channel->get_w() + 5;
00478
00479
00480 switch(mode)
00481 {
00482 case MODEPLAY:
00483 if(driver == AUDIO_DV1394)
00484 output_int = &out_config->dv1394_syt;
00485 else
00486 if(driver == AUDIO_1394)
00487 output_int = &out_config->firewire_syt;
00488 else
00489 output_int = 0;
00490 break;
00491 case MODERECORD:
00492 output_int = 0;
00493 break;
00494 }
00495
00496 if(output_int)
00497 {
00498 dialog->add_subwindow(syt_title = new BC_Title(x1, y, _("Syt Offset:"), MEDIUMFONT, resources->text_default));
00499 dialog->add_subwindow(firewire_syt = new ADeviceIntBox(x1, y + 20, output_int));
00500 x1 += firewire_syt->get_w() + 5;
00501 }
00502
00503 return 0;
00504 }
00505
00506
00507
00508 int ADevicePrefs::create_cine_objs()
00509 {
00510 BC_Resources *resources = BC_WindowBase::get_resources();
00511 int x1 = x + menu->get_w() + 5;
00512
00513 }
00514
00515
00516
00517 ADriverMenu::ADriverMenu(int x,
00518 int y,
00519 ADevicePrefs *device_prefs,
00520 int do_input,
00521 int *output)
00522 : BC_PopupMenu(x, y, 125, adriver_to_string(*output), 1)
00523 {
00524 this->output = output;
00525 this->do_input = do_input;
00526 this->device_prefs = device_prefs;
00527 }
00528
00529 ADriverMenu::~ADriverMenu()
00530 {
00531 }
00532
00533 void ADriverMenu::create_objects()
00534 {
00535 add_item(new ADriverItem(this, AUDIO_OSS_TITLE, AUDIO_OSS));
00536 add_item(new ADriverItem(this, AUDIO_OSS_ENVY24_TITLE, AUDIO_OSS_ENVY24));
00537
00538 #ifdef HAVE_ALSA
00539 add_item(new ADriverItem(this, AUDIO_ALSA_TITLE, AUDIO_ALSA));
00540 #endif
00541
00542 if(!do_input) add_item(new ADriverItem(this, AUDIO_ESOUND_TITLE, AUDIO_ESOUND));
00543
00544 #ifdef HAVE_FIREWIRE
00545 if(!do_input) add_item(new ADriverItem(this, AUDIO_1394_TITLE, AUDIO_1394));
00546 add_item(new ADriverItem(this, AUDIO_DV1394_TITLE, AUDIO_DV1394));
00547 add_item(new ADriverItem(this, AUDIO_IEC61883_TITLE, AUDIO_IEC61883));
00548 #endif
00549 add_item(new ADriverItem(this, AUDIO_DVB_TITLE, AUDIO_DVB));
00550 }
00551
00552 char* ADriverMenu::adriver_to_string(int driver)
00553 {
00554 switch(driver)
00555 {
00556 case AUDIO_OSS:
00557 sprintf(string, AUDIO_OSS_TITLE);
00558 break;
00559 case AUDIO_OSS_ENVY24:
00560 sprintf(string, AUDIO_OSS_ENVY24_TITLE);
00561 break;
00562 case AUDIO_ESOUND:
00563 sprintf(string, AUDIO_ESOUND_TITLE);
00564 break;
00565 case AUDIO_NAS:
00566 sprintf(string, AUDIO_NAS_TITLE);
00567 break;
00568 case AUDIO_ALSA:
00569 sprintf(string, AUDIO_ALSA_TITLE);
00570 break;
00571 #ifdef HAVE_FIREWIRE
00572 case AUDIO_1394:
00573 sprintf(string, AUDIO_1394_TITLE);
00574 break;
00575 case AUDIO_DV1394:
00576 sprintf(string, AUDIO_DV1394_TITLE);
00577 break;
00578 case AUDIO_IEC61883:
00579 sprintf(string, AUDIO_IEC61883_TITLE);
00580 break;
00581 #endif
00582 case AUDIO_DVB:
00583 sprintf(string, AUDIO_DVB_TITLE);
00584 break;
00585 }
00586 return string;
00587 }
00588
00589 ADriverItem::ADriverItem(ADriverMenu *popup, char *text, int driver)
00590 : BC_MenuItem(text)
00591 {
00592 this->popup = popup;
00593 this->driver = driver;
00594 }
00595
00596 ADriverItem::~ADriverItem()
00597 {
00598 }
00599
00600 int ADriverItem::handle_event()
00601 {
00602 popup->set_text(get_text());
00603 *(popup->output) = driver;
00604 popup->device_prefs->initialize();
00605 return 1;
00606 }
00607
00608
00609
00610
00611 OSSEnable::OSSEnable(int x, int y, int *output)
00612 : BC_CheckBox(x, y, *output)
00613 {
00614 this->output = output;
00615 }
00616 int OSSEnable::handle_event()
00617 {
00618 *output = get_value();
00619 return 1;
00620 }
00621
00622
00623
00624
00625 ADeviceTextBox::ADeviceTextBox(int x, int y, char *output)
00626 : BC_TextBox(x, y, 150, 1, output)
00627 {
00628 this->output = output;
00629 }
00630
00631 int ADeviceTextBox::handle_event()
00632 {
00633 strcpy(output, get_text());
00634 return 1;
00635 }
00636
00637 ADeviceIntBox::ADeviceIntBox(int x, int y, int *output)
00638 : BC_TextBox(x, y, 80, 1, *output)
00639 {
00640 this->output = output;
00641 }
00642
00643 int ADeviceIntBox::handle_event()
00644 {
00645 *output = atol(get_text());
00646 return 1;
00647 }
00648
00649
00650 ALSADevice::ALSADevice(PreferencesDialog *dialog,
00651 int x,
00652 int y,
00653 char *output,
00654 ArrayList<BC_ListBoxItem*> *devices)
00655 : BC_PopupTextBox(dialog,
00656 devices,
00657 output,
00658 x,
00659 y,
00660 200,
00661 200)
00662 {
00663 this->output = output;
00664 }
00665
00666 ALSADevice::~ALSADevice()
00667 {
00668 }
00669
00670 int ALSADevice::handle_event()
00671 {
00672 strcpy(output, get_text());
00673 return 1;
00674 }
00675