r802: Remove renderframfsclient and renderfarmfsserver .h and .C from Makefile.am...
[cinelerra_cv/mob.git] / cinelerra / adeviceprefs.C
blob091bd40373f9448d4f83c293cde154938d519631
1 #include "adeviceprefs.h"
2 #include "audioalsa.h"
3 #include "audiodevice.inc"
4 #include "bitspopup.h"
5 #include "edl.h"
6 #include "language.h"
7 #include "playbackconfig.h"
8 #include "preferences.h"
9 #include "preferencesthread.h"
10 #include "recordconfig.h"
11 #include <string.h>
13 #define DEVICE_H 50
15 ADevicePrefs::ADevicePrefs(int x, 
16         int y, 
17         PreferencesWindow *pwindow, 
18         PreferencesDialog *dialog, 
19         AudioOutConfig *out_config, 
20         AudioInConfig *in_config, 
21         int mode)
23         reset();
24         this->pwindow = pwindow;
25         this->dialog = dialog;
26         this->driver = -1;
27         this->mode = mode;
28         this->out_config = out_config;
29         this->in_config = in_config;
30         this->x = x;
31         this->y = y;
34 ADevicePrefs::~ADevicePrefs()
36         delete_objects();
37         if(menu) delete menu;
40 void ADevicePrefs::reset()
42         menu = 0;
43         firewire_channels = 0;
44         firewire_path = 0;
45         firewire_syt = 0;
46         syt_title = 0;
47         channels_title = 0;
48         path_title = 0;
50         alsa_drivers = 0;
51         path_title = 0;
52         bits_title = 0;
53         channels_title = 0;
54         alsa_device = 0;
55         alsa_bits = 0;
56         alsa_channels = 0;
57         alsa_workaround = 0;
60 int ADevicePrefs::initialize()
62         int *driver;
63         delete_objects();
65         switch(mode)
66         {
67                 case MODEPLAY:
68                         driver = &out_config->driver;
69                         break;
70                 case MODERECORD:
71                         driver = &in_config->driver;
72                         break;
73                 case MODEDUPLEX:
74                         driver = &out_config->driver;
75                         break;
76         }
77         this->driver = *driver;
79         if(!menu)
80         {
81                 dialog->add_subwindow(menu = new ADriverMenu(x, 
82                         y + 10, 
83                         this, 
84                         (mode == MODERECORD),
85                         driver));
86                 menu->create_objects();
87         }
89         switch(*driver)
90         {
91                 case AUDIO_OSS:
92                 case AUDIO_OSS_ENVY24:
93                         create_oss_objs();
94                         break;
95                 case AUDIO_ALSA:
96                         create_alsa_objs();
97                         break;
98                 case AUDIO_ESOUND:
99                         create_esound_objs();
100                         break;
101                 case AUDIO_1394:
102                 case AUDIO_DV1394:
103                 case AUDIO_IEC61883:
104                         create_firewire_objs();
105                         break;
106         }
107         return 0;
110 int ADevicePrefs::get_h()
112         return DEVICE_H + 25;
115 int ADevicePrefs::delete_objects()
117         switch(driver)
118         {
119                 case AUDIO_OSS:
120                 case AUDIO_OSS_ENVY24:
121                         delete_oss_objs();
122                         break;
123                 case AUDIO_ALSA:
124                         delete_alsa_objs();
125                         break;
126                 case AUDIO_ESOUND:
127                         delete_esound_objs();
128                         break;
129                 case AUDIO_1394:
130                 case AUDIO_DV1394:
131                 case AUDIO_IEC61883:
132                         delete_firewire_objs();
133                         break;
134         }
135         reset();
136         driver = -1;
137         return 0;
140 int ADevicePrefs::delete_oss_objs()
142         delete path_title;
143         delete bits_title;
144         delete channels_title;
145         delete oss_bits;
146         for(int i = 0; i < MAXDEVICES; i++)
147         {
148 //                              delete oss_enable[i];
149                 delete oss_path[i];
150                 delete oss_channels[i];
151 break;
152         }
153         return 0;
156 int ADevicePrefs::delete_esound_objs()
158         delete server_title;
159         delete port_title;
160         delete esound_server;
161         delete esound_port;
162         return 0;
165 int ADevicePrefs::delete_firewire_objs()
167         delete port_title;
168         delete channel_title;
169         delete firewire_port;
170         delete firewire_channel;
171         if(firewire_path)
172         {
173                 delete path_title;
174                 delete firewire_path;
175         }
176         firewire_path = 0;
177         if(firewire_syt)
178         {
179                 delete firewire_syt;
180                 delete syt_title;
181         }
182         firewire_syt = 0;
183         if(firewire_channels)
184         {
185                 delete firewire_channels;
186                 delete channels_title;
187         }
188         firewire_channels = 0;
189         return 0;
192 int ADevicePrefs::delete_alsa_objs()
194 #ifdef HAVE_ALSA
195         alsa_drivers->remove_all_objects();
196         delete alsa_drivers;
197         delete path_title;
198         delete bits_title;
199         delete channels_title;
200         delete alsa_device;
201         delete alsa_bits;
202         delete alsa_channels;
203         delete alsa_workaround;
204 #endif
205         return 0;
209 int ADevicePrefs::create_oss_objs()
211         char *output_char;
212         int *output_int;
213         int y1 = y;
214         BC_Resources *resources = BC_WindowBase::get_resources();
216         for(int i = 0; i < MAXDEVICES; i++)
217         {
218                 int x1 = x + menu->get_w() + 5;
219                 switch(mode)
220                 {
221                         case MODEPLAY: 
222 //                              output_int = &out_config->oss_enable[i];
223                                 break;
224                         case MODERECORD:
225 //                              output_int = &in_config->oss_enable[i];
226                                 break;
227                         case MODEDUPLEX:
228 //                              output_int = &out_config->oss_enable[i];
229                                 break;
230                 }
231 //              dialog->add_subwindow(oss_enable[i] = new OSSEnable(x1, y1 + 20, output_int));
232 //              x1 += oss_enable[i]->get_w() + 5;
233                 switch(mode)
234                 {
235                         case MODEPLAY: 
236                                 output_char = out_config->oss_out_device[i];
237                                 break;
238                         case MODERECORD:
239                                 output_char = in_config->oss_in_device[i];
240                                 break;
241                         case MODEDUPLEX:
242                                 output_char = out_config->oss_out_device[i];
243                                 break;
244                 }
245                 if(i == 0) dialog->add_subwindow(path_title = new BC_Title(x1, 
246                         y, 
247                         _("Device path:"), 
248                         MEDIUMFONT, 
249                         resources->text_default));
250                 dialog->add_subwindow(oss_path[i] = new ADeviceTextBox(x1, 
251                         y1 + 20, 
252                         output_char));
254                 x1 += oss_path[i]->get_w() + 5;
255                 if(i == 0)
256                 {
257                         switch(mode)
258                         {
259                                 case MODEPLAY: 
260                                         output_int = &out_config->oss_out_bits;
261                                         break;
262                                 case MODERECORD:
263                                         output_int = &in_config->oss_in_bits;
264                                         break;
265                                 case MODEDUPLEX:
266                                         output_int = &out_config->oss_out_bits;
267                                         break;
268                         }
269                         if(i == 0) dialog->add_subwindow(bits_title = new BC_Title(x1, y, _("Bits:"), MEDIUMFONT, resources->text_default));
270                         oss_bits = new BitsPopup(dialog, 
271                                 x1, 
272                                 y1 + 20, 
273                                 output_int, 
274                                 0, 
275                                 0, 
276                                 0,
277                                 0,
278                                 1);
279                         oss_bits->create_objects();
280                 }
282                 x1 += oss_bits->get_w() + 5;
283                 switch(mode)
284                 {
285                         case MODEPLAY: 
286                                 output_int = &out_config->oss_out_channels[i];
287                                 break;
288                         case MODERECORD:
289                                 output_int = &in_config->oss_in_channels[i];
290                                 break;
291                         case MODEDUPLEX:
292                                 output_int = &out_config->oss_out_channels[i];
293                                 break;
294                 }
295                 if(i == 0) dialog->add_subwindow(channels_title = new BC_Title(x1, y1, _("Channels:"), MEDIUMFONT, resources->text_default));
296                 dialog->add_subwindow(oss_channels[i] = new ADeviceIntBox(x1, y1 + 20, output_int));
297                 y1 += DEVICE_H;
298 break;
299         }
301         return 0;
304 int ADevicePrefs::create_alsa_objs()
306 #ifdef HAVE_ALSA
307         char *output_char;
308         int *output_int;
309         int y1 = y;
310         BC_Resources *resources = BC_WindowBase::get_resources();
312         int x1 = x + menu->get_w() + 5;
314         ArrayList<char*> *alsa_titles = new ArrayList<char*>;
315         AudioALSA::list_devices(alsa_titles);
317         alsa_drivers = new ArrayList<BC_ListBoxItem*>;
318         for(int i = 0; i < alsa_titles->total; i++)
319                 alsa_drivers->append(new BC_ListBoxItem(alsa_titles->values[i]));
320         alsa_titles->remove_all_objects();
321         delete alsa_titles;
323         switch(mode)
324         {
325                 case MODEPLAY: 
326                         output_char = out_config->alsa_out_device;
327                         break;
328                 case MODERECORD:
329                         output_char = in_config->alsa_in_device;
330                         break;
331                 case MODEDUPLEX:
332                         output_char = out_config->alsa_out_device;
333                         break;
334         }
335         dialog->add_subwindow(path_title = new BC_Title(x1, y, _("Device:"), MEDIUMFONT, resources->text_default));
336         alsa_device = new ALSADevice(dialog,
337                 x1, 
338                 y1 + 20, 
339                 output_char,
340                 alsa_drivers);
341         alsa_device->create_objects();
342         int x2 = x1;
344         x1 += alsa_device->get_w() + 5;
345         switch(mode)
346         {
347                 case MODEPLAY: 
348                         output_int = &out_config->alsa_out_bits;
349                         break;
350                 case MODERECORD:
351                         output_int = &in_config->alsa_in_bits;
352                         break;
353                 case MODEDUPLEX:
354                         output_int = &out_config->alsa_out_bits;
355                         break;
356         }
357         dialog->add_subwindow(bits_title = new BC_Title(x1, y, _("Bits:"), MEDIUMFONT, resources->text_default));
358         alsa_bits = new BitsPopup(dialog, 
359                 x1, 
360                 y1 + 20, 
361                 output_int, 
362                 0, 
363                 0, 
364                 0,
365                 0,
366                 1);
367         alsa_bits->create_objects();
369         x1 += alsa_bits->get_w() + 5;
370         switch(mode)
371         {
372                 case MODEPLAY: 
373                         output_int = &out_config->alsa_out_channels;
374                         break;
375                 case MODERECORD:
376                         output_int = &in_config->alsa_in_channels;
377                         break;
378                 case MODEDUPLEX:
379                         output_int = &out_config->alsa_out_channels;
380                         break;
381         }
382         dialog->add_subwindow(channels_title = new BC_Title(x1, y, _("Channels:"), MEDIUMFONT, resources->text_default));
383         dialog->add_subwindow(alsa_channels = new ADeviceIntBox(x1, y1 + 20, output_int));
384         y1 += alsa_channels->get_h() + 20 + 5;
385         x1 = x2;
387         if(mode == MODEPLAY)
388         {
389                 dialog->add_subwindow(alsa_workaround = 
390                         new BC_CheckBox(x1, 
391                                 y1, 
392                                 &out_config->interrupt_workaround,
393                                 _("Stop playback locks up.")));
394         }
397 #endif
399         return 0;
402 int ADevicePrefs::create_esound_objs()
404         int x1 = x + menu->get_w() + 5;
405         char *output_char;
406         int *output_int;
407         BC_Resources *resources = BC_WindowBase::get_resources();
409         switch(mode)
410         {
411                 case MODEPLAY: 
412                         output_char = out_config->esound_out_server;
413                         break;
414                 case MODERECORD:
415                         output_char = in_config->esound_in_server;
416                         break;
417                 case MODEDUPLEX:
418                         output_char = out_config->esound_out_server;
419                         break;
420         }
421         dialog->add_subwindow(server_title = new BC_Title(x1, y, _("Server:"), MEDIUMFONT, resources->text_default));
422         dialog->add_subwindow(esound_server = new ADeviceTextBox(x1, y + 20, output_char));
424         switch(mode)
425         {
426                 case MODEPLAY: 
427                         output_int = &out_config->esound_out_port;
428                         break;
429                 case MODERECORD:
430                         output_int = &in_config->esound_in_port;
431                         break;
432                 case MODEDUPLEX:
433                         output_int = &out_config->esound_out_port;
434                         break;
435         }
436         x1 += esound_server->get_w() + 5;
437         dialog->add_subwindow(port_title = new BC_Title(x1, y, _("Port:"), MEDIUMFONT, resources->text_default));
438         dialog->add_subwindow(esound_port = new ADeviceIntBox(x1, y + 20, output_int));
439         return 0;
442 int ADevicePrefs::create_firewire_objs()
444         int x1 = x + menu->get_w() + 5;
445         int *output_int = 0;
446         char *output_char = 0;
447         BC_Resources *resources = BC_WindowBase::get_resources();
449 // Firewire path
450         switch(mode)
451         {
452                 case MODEPLAY:
453                         if(driver == AUDIO_DV1394)
454                                 output_char = out_config->dv1394_path;
455                         else
456                         if(driver == AUDIO_1394)
457                                 output_char = out_config->firewire_path;
458                         break;
459 // Our version of raw1394 doesn't support changing the path
460                 case MODERECORD:
461                         output_char = 0;
462                         break;
463         }
465         if(output_char)
466         {
467                 dialog->add_subwindow(path_title = new BC_Title(x1, y, _("Device Path:"), MEDIUMFONT, resources->text_default));
468                 dialog->add_subwindow(firewire_path = new ADeviceTextBox(x1, y + 20, output_char));
469                 x1 += firewire_path->get_w() + 5;
470         }
472 // Firewire port
473         switch(mode)
474         {
475                 case MODEPLAY: 
476                         if(driver == AUDIO_DV1394)
477                                 output_int = &out_config->dv1394_port;
478                         else
479                                 output_int = &out_config->firewire_port;
480                         break;
481                 case MODERECORD:
482                         output_int = &in_config->firewire_port;
483                         break;
484                 case MODEDUPLEX:
485 //                      output_int = &out_config->afirewire_out_port;
486                         break;
487         }
488         dialog->add_subwindow(port_title = new BC_Title(x1, y, _("Port:"), MEDIUMFONT, resources->text_default));
489         dialog->add_subwindow(firewire_port = new ADeviceIntBox(x1, y + 20, output_int));
491         x1 += firewire_port->get_w() + 5;
493 // Firewire channel
494         switch(mode)
495         {
496                 case MODEPLAY: 
497                         if(driver == AUDIO_DV1394)
498                                 output_int = &out_config->dv1394_channel;
499                         else
500                                 output_int = &out_config->firewire_channel;
501                         break;
502                 case MODERECORD:
503                         output_int = &in_config->firewire_channel;
504                         break;
505         }
506         dialog->add_subwindow(channel_title = new BC_Title(x1, y, _("Channel:"), MEDIUMFONT, resources->text_default));
507         dialog->add_subwindow(firewire_channel = new ADeviceIntBox(x1, y + 20, output_int));
508         x1 += firewire_channel->get_w() + 5;
510 // Playback channels
511         switch(mode)
512         {
513                 case MODEPLAY:
514                         if(driver == AUDIO_DV1394)
515                                 output_int = &out_config->dv1394_channels;
516                         else
517                                 output_int = &out_config->firewire_channels;
518                         break;
519                 case MODERECORD:
520                         output_int = 0;
521                         break;
522         }
524         if(output_int)
525         {
526                 dialog->add_subwindow(channels_title = new BC_Title(x1, y, _("Channels:"), MEDIUMFONT, resources->text_default));
527                 dialog->add_subwindow(firewire_channels = new ADeviceIntBox(x1, y + 20, output_int));
528                 x1 += firewire_channels->get_w() + 5;
529         }
531 // Syt offset
532         switch(mode)
533         {
534                 case MODEPLAY:
535                         if(driver == AUDIO_DV1394)
536                                 output_int = &out_config->dv1394_syt;
537                         else
538                         if(driver == AUDIO_1394)
539                                 output_int = &out_config->firewire_syt;
540                         else
541                                 output_int = 0;
542                         break;
543                 case MODERECORD:
544                         output_int = 0;
545                         break;
546         }
548         if(output_int)
549         {
550                 dialog->add_subwindow(syt_title = new BC_Title(x1, y, _("Syt Offset:"), MEDIUMFONT, resources->text_default));
551                 dialog->add_subwindow(firewire_syt = new ADeviceIntBox(x1, y + 20, output_int));
552                 x1 += firewire_syt->get_w() + 5;
553         }
555         return 0;
558 ADriverMenu::ADriverMenu(int x, 
559         int y, 
560         ADevicePrefs *device_prefs, 
561         int do_input,
562         int *output)
563  : BC_PopupMenu(x, y, 125, adriver_to_string(*output), 1)
565         this->output = output;
566         this->do_input = do_input;
567         this->device_prefs = device_prefs;
570 ADriverMenu::~ADriverMenu()
574 void ADriverMenu::create_objects()
576         add_item(new ADriverItem(this, AUDIO_OSS_TITLE, AUDIO_OSS));
577         add_item(new ADriverItem(this, AUDIO_OSS_ENVY24_TITLE, AUDIO_OSS_ENVY24));
579 #ifdef HAVE_ALSA
580         add_item(new ADriverItem(this, AUDIO_ALSA_TITLE, AUDIO_ALSA));
581 #endif
583         if(!do_input) add_item(new ADriverItem(this, AUDIO_ESOUND_TITLE, AUDIO_ESOUND));
584 //      add_item(new ADriverItem(this, AUDIO_NAS_TITLE, AUDIO_NAS));
585 #ifdef HAVE_FIREWIRE
586         if(!do_input) add_item(new ADriverItem(this, AUDIO_1394_TITLE, AUDIO_1394));
587         add_item(new ADriverItem(this, AUDIO_DV1394_TITLE, AUDIO_DV1394));
588         add_item(new ADriverItem(this, AUDIO_IEC61883_TITLE, AUDIO_IEC61883));
589 #endif
592 char* ADriverMenu::adriver_to_string(int driver)
594         switch(driver)
595         {
596                 case AUDIO_OSS:
597                         sprintf(string, AUDIO_OSS_TITLE);
598                         break;
599                 case AUDIO_OSS_ENVY24:
600                         sprintf(string, AUDIO_OSS_ENVY24_TITLE);
601                         break;
602                 case AUDIO_ESOUND:
603                         sprintf(string, AUDIO_ESOUND_TITLE);
604                         break;
605                 case AUDIO_NAS:
606                         sprintf(string, AUDIO_NAS_TITLE);
607                         break;
608                 case AUDIO_ALSA:
609                         sprintf(string, AUDIO_ALSA_TITLE);
610                         break;
611 #ifdef HAVE_FIREWIRE
612                 case AUDIO_1394:
613                         sprintf(string, AUDIO_1394_TITLE);
614                         break;
615                 case AUDIO_DV1394:
616                         sprintf(string, AUDIO_DV1394_TITLE);
617                         break;
618                 case AUDIO_IEC61883:
619                         sprintf(string, AUDIO_IEC61883_TITLE);
620                         break;
621 #endif
622         }
623         return string;
626 ADriverItem::ADriverItem(ADriverMenu *popup, char *text, int driver)
627  : BC_MenuItem(text)
629         this->popup = popup;
630         this->driver = driver;
633 ADriverItem::~ADriverItem()
637 int ADriverItem::handle_event()
639         popup->set_text(get_text());
640         *(popup->output) = driver;
641         popup->device_prefs->initialize();
642         return 1;
648 OSSEnable::OSSEnable(int x, int y, int *output)
649  : BC_CheckBox(x, y, *output)
651         this->output = output;
653 int OSSEnable::handle_event()
655         *output = get_value();
656         return 1;
662 ADeviceTextBox::ADeviceTextBox(int x, int y, char *output)
663  : BC_TextBox(x, y, 150, 1, output)
665         this->output = output; 
668 int ADeviceTextBox::handle_event() 
670         strcpy(output, get_text());
671         return 1;
674 ADeviceIntBox::ADeviceIntBox(int x, int y, int *output)
675  : BC_TextBox(x, y, 80, 1, *output)
677         this->output = output;
680 int ADeviceIntBox::handle_event() 
682         *output = atol(get_text()); 
683         return 1;
687 ALSADevice::ALSADevice(PreferencesDialog *dialog, 
688         int x, 
689         int y, 
690         char *output, 
691         ArrayList<BC_ListBoxItem*> *devices)
692  : BC_PopupTextBox(dialog,
693         devices,
694         output,
695         x, 
696         y, 
697         200,
698         200)
700         this->output = output;
703 ALSADevice::~ALSADevice()
707 int ALSADevice::handle_event()
709         strcpy(output, get_text());
710         return 1;