4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
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.
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.
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
22 #include "adeviceprefs.h"
23 #include "audioalsa.h"
24 #include "audiodevice.inc"
25 #include "bitspopup.h"
28 #include "playbackconfig.h"
29 #include "preferences.h"
30 #include "preferencesthread.h"
31 #include "recordconfig.h"
36 ADevicePrefs::ADevicePrefs(int x, int y, PreferencesWindow *pwindow, PreferencesDialog *dialog,
37 AudioOutConfig *out_config, AudioInConfig *in_config, int mode)
40 this->pwindow = pwindow;
41 this->dialog = dialog;
44 this->out_config = out_config;
45 this->in_config = in_config;
50 ADevicePrefs::~ADevicePrefs()
56 void ADevicePrefs::reset()
59 follow_audio_config = 0;
76 for(int i = 0; i < MAXDEVICES; i++)
79 dvb_adapter_title = 0;
82 dvb_adapter_device = 0;
88 int ADevicePrefs::initialize(int creation)
95 driver = &out_config->driver;
98 driver = &in_config->driver;
101 driver = &out_config->driver;
104 this->driver = *driver;
107 dialog->add_subwindow(menu = new ADriverMenu(x,
110 (mode == MODERECORD),
112 menu->create_objects();
117 case AUDIO_OSS_ENVY24:
124 create_esound_objs();
129 create_firewire_objs();
135 create_v4l2mpeg_objs();
142 int ADevicePrefs::get_h(int recording)
144 return !recording ? DEVICE_H + 30 : DEVICE_H;
147 int ADevicePrefs::delete_objects()
151 case AUDIO_OSS_ENVY24:
158 delete_esound_objs();
163 delete_firewire_objs();
169 delete_v4l2mpeg_objs();
181 int ADevicePrefs::delete_oss_objs()
189 for(int i = 0; i < MAXDEVICES; i++)
198 int ADevicePrefs::delete_esound_objs()
202 delete esound_server;
207 int ADevicePrefs::delete_firewire_objs()
210 delete channel_title;
211 delete firewire_port;
212 delete firewire_channel;
216 delete firewire_path;
228 int ADevicePrefs::delete_alsa_objs()
231 if(alsa_drivers) alsa_drivers->remove_all_objects();
237 delete alsa_workaround;
242 int ADevicePrefs::delete_dvb_objs()
244 delete dvb_adapter_title;
245 delete dvb_adapter_path;
246 delete dvb_device_title;
247 delete dvb_adapter_device;
249 delete follow_audio_config;
253 int ADevicePrefs::delete_v4l2mpeg_objs()
255 delete follow_audio_config;
260 int ADevicePrefs::create_oss_objs()
262 char *output_char = 0;
265 BC_Resources *resources = BC_WindowBase::get_resources();
267 for(int i = 0; i < MAXDEVICES; i++) {
268 int x1 = x + menu->get_w() + 5;
272 output_int = &out_config->oss_enable[i];
275 output_int = &in_config->oss_enable[i];
278 output_int = &out_config->oss_enable[i];
281 dialog->add_subwindow(oss_enable[i] = new OSSEnable(x1, y1 + 20, output_int));
282 x1 += oss_enable[i]->get_w() + 5;
286 output_char = out_config->oss_out_device[i];
289 output_char = in_config->oss_in_device[i];
292 output_char = out_config->oss_out_device[i];
297 path_title = new BC_Title(x1, y, _("Device path:"),
298 MEDIUMFONT, resources->text_default);
299 dialog->add_subwindow(path_title);
302 oss_path[i] = new ADeviceTextBox(x1, y1 + 20, output_char);
303 dialog->add_subwindow(oss_path[i]);
305 x1 += oss_path[i]->get_w() + 5;
309 output_int = &out_config->oss_out_bits;
312 output_int = &in_config->oss_in_bits;
315 output_int = &out_config->oss_out_bits;
318 bits_title = new BC_Title(x1, y, _("Bits:"),
319 MEDIUMFONT, resources->text_default);
320 dialog->add_subwindow(bits_title);
321 oss_bits = new BitsPopup(dialog, x1, y1 + 20, output_int,
323 oss_bits->create_objects();
326 x1 += oss_bits->get_w() + 5;
328 break; // apparently, 'i' must be zero
334 int ADevicePrefs::create_alsa_objs()
337 char *output_char = 0;
340 BC_Resources *resources = BC_WindowBase::get_resources();
342 int x1 = x + menu->get_w() + 5;
344 ArrayList<char*> *alsa_titles = new ArrayList<char*>;
345 AudioALSA::list_devices(alsa_titles, 0, mode);
348 alsa_drivers = new ArrayList<BC_ListBoxItem*>;
349 for(int i = 0; i < alsa_titles->total; i++)
350 alsa_drivers->append(new BC_ListBoxItem(alsa_titles->values[i]));
351 alsa_titles->remove_all_objects();
356 output_char = out_config->alsa_out_device;
359 output_char = in_config->alsa_in_device;
362 output_char = out_config->alsa_out_device;
365 path_title = new BC_Title(x1, y, _("Device:"),
366 MEDIUMFONT, resources->text_default);
367 dialog->add_subwindow(path_title);
368 alsa_device = new ALSADevice(dialog, x1, y1 + 20, output_char, alsa_drivers);
369 alsa_device->create_objects();
372 x1 += alsa_device->get_w() + 5;
375 output_int = &out_config->alsa_out_bits;
378 output_int = &in_config->alsa_in_bits;
381 output_int = &out_config->alsa_out_bits;
384 bits_title = new BC_Title(x1, y, _("Bits:"),
385 MEDIUMFONT, resources->text_default);
386 dialog->add_subwindow(bits_title);
387 alsa_bits = new BitsPopup(dialog, x1, y1 + 20, output_int, 0, 0, 0, 0, 1);
388 alsa_bits->create_objects();
390 y1 += alsa_bits->get_h() + 20 + 5;
393 if(mode == MODEPLAY) {
394 alsa_workaround = new BC_CheckBox(x1, y1,
395 &out_config->interrupt_workaround,
396 _("Stop playback locks up."));
397 dialog->add_subwindow(alsa_workaround);
405 int ADevicePrefs::create_esound_objs()
407 int x1 = x + menu->get_w() + 5;
408 char *output_char = 0;
410 BC_Resources *resources = BC_WindowBase::get_resources();
414 output_char = out_config->esound_out_server;
417 output_char = in_config->esound_in_server;
420 output_char = out_config->esound_out_server;
423 server_title = new BC_Title(x1, y, _("Server:"),
424 MEDIUMFONT, resources->text_default);
425 dialog->add_subwindow(server_title);
426 esound_server = new ADeviceTextBox(x1, y + 20, output_char);
427 dialog->add_subwindow(esound_server);
431 output_int = &out_config->esound_out_port;
434 output_int = &in_config->esound_in_port;
437 output_int = &out_config->esound_out_port;
440 x1 += esound_server->get_w() + 5;
441 port_title = new BC_Title(x1, y, _("Port:"),
442 MEDIUMFONT, resources->text_default);
443 dialog->add_subwindow(port_title);
444 esound_port = new ADeviceIntBox(x1, y + 20, output_int);
445 dialog->add_subwindow(esound_port);
449 int ADevicePrefs::create_firewire_objs()
451 int x1 = x + menu->get_w() + 5;
453 char *output_char = 0;
454 BC_Resources *resources = BC_WindowBase::get_resources();
459 if(driver == AUDIO_DV1394)
460 output_char = out_config->dv1394_path;
462 if(driver == AUDIO_1394)
463 output_char = out_config->firewire_path;
466 if(driver == AUDIO_DV1394 || driver == AUDIO_1394)
467 output_char = in_config->firewire_path;
472 dialog->add_subwindow(path_title = new BC_Title(x1, y, _("Device Path:"), MEDIUMFONT, resources->text_default));
473 dialog->add_subwindow(firewire_path = new ADeviceTextBox(x1, y + 20, output_char));
474 x1 += firewire_path->get_w() + 5;
480 if(driver == AUDIO_DV1394)
481 output_int = &out_config->dv1394_port;
483 output_int = &out_config->firewire_port;
486 output_int = &in_config->firewire_port;
489 // output_int = &out_config->afirewire_out_port;
492 port_title = new BC_Title(x1, y, _("Port:"),
493 MEDIUMFONT, resources->text_default);
494 dialog->add_subwindow(port_title);
495 firewire_port = new ADeviceIntBox(x1, y + 20, output_int);
496 dialog->add_subwindow(firewire_port);
498 x1 += firewire_port->get_w() + 5;
503 if(driver == AUDIO_DV1394)
504 output_int = &out_config->dv1394_channel;
506 output_int = &out_config->firewire_channel;
509 output_int = &in_config->firewire_channel;
512 channel_title = new BC_Title(x1, y, _("Channel:"),
513 MEDIUMFONT, resources->text_default);
514 dialog->add_subwindow(channel_title);
515 firewire_channel = new ADeviceIntBox(x1, y + 20, output_int);
516 dialog->add_subwindow(firewire_channel);
517 x1 += firewire_channel->get_w() + 5;
522 if(driver == AUDIO_DV1394)
523 output_int = &out_config->dv1394_syt;
525 if(driver == AUDIO_1394)
526 output_int = &out_config->firewire_syt;
536 syt_title = new BC_Title(x1, y, _("Syt Offset:"),
537 MEDIUMFONT, resources->text_default);
538 dialog->add_subwindow(syt_title);
539 firewire_syt = new ADeviceIntBox(x1, y + 20, output_int);
540 dialog->add_subwindow(firewire_syt);
541 x1 += firewire_syt->get_w() + 5;
549 int ADevicePrefs::create_dvb_objs()
551 int x1 = x + menu->get_w() + 30;
553 char *output_char = in_config->dvb_in_adapter;
554 int y2 = y1 - BC_Title::calculate_h(dialog, _("DVB Adapter:"), MEDIUMFONT) - 5;
555 BC_Resources *resources = BC_WindowBase::get_resources();
556 dvb_adapter_title = new BC_Title(x1, y2, _("DVB Adapter:"),
557 MEDIUMFONT, resources->text_default);
558 dialog->add_subwindow(dvb_adapter_title);
559 dvb_adapter_path = new ADeviceTextBox(x1, y1, output_char);
560 dialog->add_subwindow(dvb_adapter_path);
561 int x2 = x1 + dvb_adapter_path->get_w() + 5;
562 dvb_device_title = new BC_Title(x2, y2, _("dev:"),
563 MEDIUMFONT, resources->text_default);
564 dialog->add_subwindow(dvb_device_title);
565 int *output_int = &in_config->dvb_in_device;
566 dvb_adapter_device = new ADeviceTumbleBox(this, x2, y1, output_int, 0, 9, 20);
567 dvb_adapter_device->create_objects();
568 x2 += dvb_device_title->get_w() + 30;
569 bits_title = new BC_Title(x2, y2, _("Bits:"),
570 MEDIUMFONT, resources->text_default);
571 dialog->add_subwindow(bits_title);
572 output_int = &in_config->dvb_in_bits;
573 dvb_bits = new BitsPopup(dialog, x2, y1, output_int, 0, 0, 0, 0, 1);
574 dvb_bits->create_objects();
575 x1 += 100; y1 += dvb_adapter_path->get_h() + 5;
576 output_int = &in_config->follow_audio;
577 follow_audio_config = new BC_CheckBox(x1, y1, output_int, _("Follow audio config"));
578 dialog->add_subwindow(follow_audio_config);
582 int ADevicePrefs::create_v4l2mpeg_objs()
584 int x1 = x + menu->get_w() + 30;
586 int y2 = y1 - BC_Title::calculate_h(dialog, _("Bits:"), MEDIUMFONT) - 5;
587 BC_Resources *resources = BC_WindowBase::get_resources();
588 bits_title = new BC_Title(x1, y2, _("Bits:"),
589 MEDIUMFONT, resources->text_default);
590 dialog->add_subwindow(bits_title);
591 int *output_int = &in_config->v4l2_in_bits;
592 v4l2_bits = new BitsPopup(dialog, x1, y1, output_int, 0, 0, 0, 0, 1);
593 v4l2_bits->create_objects();
594 x1 += v4l2_bits->get_w() + 10;
595 follow_audio_config = new BC_CheckBox(x1, y1,
596 &in_config->follow_audio, _("Follow audio config"));
597 dialog->add_subwindow(follow_audio_config);
602 ADriverMenu::ADriverMenu(int x, int y, ADevicePrefs *device_prefs,
603 int do_input, int *output)
604 : BC_PopupMenu(x, y, 125, adriver_to_string(*output), 1)
606 this->output = output;
607 this->do_input = do_input;
608 this->device_prefs = device_prefs;
611 ADriverMenu::~ADriverMenu()
615 void ADriverMenu::create_objects()
617 add_item(new ADriverItem(this, AUDIO_OSS_TITLE, AUDIO_OSS));
618 add_item(new ADriverItem(this, AUDIO_OSS_ENVY24_TITLE, AUDIO_OSS_ENVY24));
621 add_item(new ADriverItem(this, AUDIO_ALSA_TITLE, AUDIO_ALSA));
624 if(!do_input) add_item(new ADriverItem(this, AUDIO_ESOUND_TITLE, AUDIO_ESOUND));
625 // add_item(new ADriverItem(this, AUDIO_NAS_TITLE, AUDIO_NAS));
627 if(!do_input) add_item(new ADriverItem(this, AUDIO_1394_TITLE, AUDIO_1394));
628 add_item(new ADriverItem(this, AUDIO_DV1394_TITLE, AUDIO_DV1394));
629 add_item(new ADriverItem(this, AUDIO_IEC61883_TITLE, AUDIO_IEC61883));
631 if(do_input) add_item(new ADriverItem(this, AUDIO_DVB_TITLE, AUDIO_DVB));
632 if(do_input) add_item(new ADriverItem(this, AUDIO_V4L2MPEG_TITLE, AUDIO_V4L2MPEG));
635 char* ADriverMenu::adriver_to_string(int driver)
639 sprintf(string, AUDIO_OSS_TITLE);
641 case AUDIO_OSS_ENVY24:
642 sprintf(string, AUDIO_OSS_ENVY24_TITLE);
645 sprintf(string, AUDIO_ESOUND_TITLE);
648 sprintf(string, AUDIO_NAS_TITLE);
651 sprintf(string, AUDIO_ALSA_TITLE);
655 sprintf(string, AUDIO_1394_TITLE);
658 sprintf(string, AUDIO_DV1394_TITLE);
661 sprintf(string, AUDIO_IEC61883_TITLE);
665 sprintf(string, AUDIO_DVB_TITLE);
668 sprintf(string, AUDIO_V4L2MPEG_TITLE);
674 ADriverItem::ADriverItem(ADriverMenu *popup, const char *text, int driver)
678 this->driver = driver;
681 ADriverItem::~ADriverItem()
685 int ADriverItem::handle_event()
687 popup->set_text(get_text());
688 *(popup->output) = driver;
689 popup->device_prefs->initialize(0);
690 popup->device_prefs->pwindow->show_dialog();
697 OSSEnable::OSSEnable(int x, int y, int *output)
698 : BC_CheckBox(x, y, *output)
700 this->output = output;
702 int OSSEnable::handle_event()
704 *output = get_value();
711 ADeviceTextBox::ADeviceTextBox(int x, int y, char *output)
712 : BC_TextBox(x, y, 150, 1, output)
714 this->output = output;
717 int ADeviceTextBox::handle_event()
719 strcpy(output, get_text());
723 ADeviceIntBox::ADeviceIntBox(int x, int y, int *output)
724 : BC_TextBox(x, y, 80, 1, *output)
726 this->output = output;
729 int ADeviceIntBox::handle_event()
731 *output = atol(get_text());
737 ADeviceTumbleBox::ADeviceTumbleBox(ADevicePrefs *prefs,
738 int x, int y, int *output, int min, int max, int text_w)
739 : BC_TumbleTextBox(prefs->dialog, *output, min, max, x, y, text_w)
741 this->output = output;
744 int ADeviceTumbleBox::handle_event()
746 *output = atol(get_text());
752 ALSADevice::ALSADevice(PreferencesDialog *dialog,
756 ArrayList<BC_ListBoxItem*> *devices)
757 : BC_PopupTextBox(dialog, devices, output, x, y, 200, 200)
759 this->output = output;
762 ALSADevice::~ALSADevice()
766 int ALSADevice::handle_event()
768 strcpy(output, get_text());