root/sweep/trunk/src/driver.c

Revision 689, 22.8 kB (checked in by erikd, 2 years ago)

src/driver.c : Handle the case where the driver chosen in preferences isn't available.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1 /*
2  * Sweep, a sound wave editor.
3  *
4  * Copyright (C) 2000 Conrad Parker
5  *
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.
10  *
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.
15  *
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.
19  */
20
21 #ifdef HAVE_CONFIG_H
22 #  include <config.h>
23 #endif
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <sys/time.h>
29 #include <sys/types.h>
30 #include <sys/stat.h>
31 #include <unistd.h>
32 #include <fcntl.h>
33 #include <math.h>
34 #include <sys/ioctl.h>
35 #include <pthread.h>
36
37 #include <gtk/gtk.h>
38 #include <sweep/sweep_i18n.h>
39
40 #include <sweep/sweep_types.h>
41 #include <sweep/sweep_sample.h>
42
43 #include "driver.h"
44 #include "preferences.h"
45 #include "pcmio.h"
46
47 #define ARRAY_LEN(x) ((int) (sizeof (x)) / (sizeof (x [0])))
48
49 extern sw_driver * driver_alsa;
50 extern sw_driver * driver_oss;
51 extern sw_driver * driver_pulseaudio;
52 extern sw_driver * driver_solaris;
53
54 static sw_driver * driver_table [10];
55
56 /* preferred driver */
57 static sw_driver _driver_null = {
58   NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
59 };
60
61 /*
62 ** Always keep two pointers to the output driver. current_driver is the
63 ** one that is currently being used and dialog_driver is the one that
64 ** has been chosen in the dialog box.
65 ** This allows dialog_driver to be changed when current_driver is being
66 ** used, with the change from dialog_driver to current_driver occurring
67 ** next time the device_open() is called.
68 */
69 static sw_driver * current_driver = &_driver_null;
70 static sw_driver * dialog_driver = &_driver_null;
71
72 static char * prefs_driver_key = "driver";
73
74 char *
75 pcmio_get_default_main_dev (void)
76 {
77   GList * names = NULL, * gl;
78
79   if (dialog_driver->get_names)
80     names = dialog_driver->get_names ();
81
82   if ((gl = names) != NULL) {
83     return (char *)gl->data;
84   }
85
86   return "Default";
87 }
88
89 char *
90 pcmio_get_default_monitor_dev (void)
91 {
92   GList * names = NULL, * gl;
93
94   if (dialog_driver->get_names)
95     names = dialog_driver->get_names ();
96
97   if ((gl = names) != NULL) {
98     if ((gl = gl->next) != NULL) {
99       return (char *)gl->data;
100     }
101   }
102
103   return "Default";
104 }
105
106 char *
107 pcmio_get_main_dev (void)
108 {
109   char * main_dev;
110
111   main_dev = prefs_get_string (dialog_driver->primary_device_key);
112
113   if (main_dev == NULL) return pcmio_get_default_main_dev();
114  
115   return main_dev;
116 }
117
118 char *
119 pcmio_get_monitor_dev (void)
120 {
121   char * monitor_dev;
122
123   monitor_dev = prefs_get_string (dialog_driver->monitor_device_key);
124
125   if (monitor_dev == NULL) return pcmio_get_default_monitor_dev ();
126  
127   return monitor_dev;
128 }
129
130 gboolean
131 pcmio_get_use_monitor (void)
132 {
133   int * use_monitor;
134
135   use_monitor = prefs_get_int (USE_MONITOR_KEY);
136
137   if (use_monitor == NULL) return DEFAULT_USE_MONITOR;
138   else return (*use_monitor != 0);
139 }
140
141 int
142 pcmio_get_log_frags (void)
143 {
144   int * log_frags;
145
146   log_frags = prefs_get_int (dialog_driver->log_frags_key);
147   if (log_frags == NULL) return DEFAULT_LOG_FRAGS;
148   else return (*log_frags);
149 }
150
151 extern GtkStyle * style_bw;
152 static GtkWidget * dialog = NULL;
153 static GtkWidget * driver_combo;
154 static GtkWidget * main_combo;
155 static GtkWidget * monitor_combo;
156 static GtkObject * adj;
157
158
159 static gboolean
160 monitor_checked (GtkWidget * dialog)
161 {
162   GtkWidget * monitor_chb;
163
164   monitor_chb =
165     GTK_WIDGET(g_object_get_data (G_OBJECT(dialog), "monitor_chb"));
166
167   return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (monitor_chb));
168 }
169
170 static void
171 config_dev_dsp_dialog_ok_cb (GtkWidget * widget, gpointer data)
172 {
173   GtkWidget * dialog = GTK_WIDGET (data);
174   GtkAdjustment * adj;
175   G_CONST_RETURN gchar * main_dev, * monitor_dev;
176   int driver_index;
177
178   driver_index = gtk_combo_box_get_active (GTK_COMBO_BOX(driver_combo));
179   prefs_set_string (prefs_driver_key, (gchar *)driver_table [driver_index]->name);
180
181   adj = g_object_get_data (G_OBJECT(dialog), "buff_adj");
182
183   prefs_set_int (dialog_driver->log_frags_key, adj->value);
184
185   main_dev =
186     gtk_entry_get_text (GTK_ENTRY(GTK_COMBO(main_combo)->entry));
187
188   prefs_set_string (dialog_driver->primary_device_key, (gchar *)main_dev);
189
190   if (monitor_checked (dialog)) {
191     monitor_dev =
192       gtk_entry_get_text (GTK_ENTRY(GTK_COMBO(monitor_combo)->entry));
193     prefs_set_string (dialog_driver->monitor_device_key, (gchar *)monitor_dev);
194
195     prefs_set_int (USE_MONITOR_KEY, 1);
196   } else {
197     prefs_set_int (USE_MONITOR_KEY, 0);
198   }
199
200   gtk_widget_hide (dialog);
201 }
202
203 static void
204 update_pcmio_settings (void)
205 {
206   gtk_entry_set_text (GTK_ENTRY(GTK_COMBO(main_combo)->entry),
207                       pcmio_get_main_dev ());
208
209   gtk_entry_set_text (GTK_ENTRY(GTK_COMBO(monitor_combo)->entry),
210                       pcmio_get_monitor_dev ());
211
212   gtk_adjustment_set_value (GTK_ADJUSTMENT(adj), pcmio_get_log_frags ());
213 }
214
215 static void
216 config_dev_dsp_dialog_cancel_cb (GtkWidget * widget, gpointer data)
217 {
218   GtkWidget * dialog;
219   int k;
220
221   dialog = gtk_widget_get_toplevel (widget);
222   gtk_widget_hide (dialog);
223
224   dialog_driver = current_driver;
225
226   for (k = 0 ; driver_table [k] != NULL ; k++)
227     if (strcmp (current_driver->name, driver_table [k]->name) == 0) {
228           gtk_combo_box_set_active (GTK_COMBO_BOX (driver_combo), k);
229       break ;
230         }
231
232   update_pcmio_settings ();
233 }
234
235 static void
236 choose_driver_cb (GtkWidget * widget, gpointer data)
237 {
238   int driver_index;
239
240   driver_index = gtk_combo_box_get_active (GTK_COMBO_BOX(driver_combo));
241
242   /* Change the driver dialog, not the current_dialog. The change in
243   ** dialog_driver gets picked up and transfered to current_driver
244   ** at the next call to driver_open().
245   */
246   dialog_driver = driver_table [driver_index];
247
248   update_pcmio_settings ();
249 }
250
251 static void
252 update_ok_button (GtkWidget * widget, gpointer data)
253 {
254   GtkWidget * dialog = GTK_WIDGET(data);
255   GtkWidget * ok_button;
256   gchar * main_devname, * monitor_devname;
257   gboolean ok = FALSE;
258   int driver_index;
259
260   ok_button =
261     GTK_WIDGET(g_object_get_data (G_OBJECT(dialog), "ok_button"));
262
263   driver_index = gtk_combo_box_get_active (GTK_COMBO_BOX(driver_combo));
264
265   if (monitor_checked (dialog)) {
266     main_devname = (gchar *)
267       gtk_entry_get_text (GTK_ENTRY(GTK_COMBO(main_combo)->entry));
268     monitor_devname = (gchar *)
269       gtk_entry_get_text (GTK_ENTRY(GTK_COMBO(monitor_combo)->entry));
270
271     ok = (strcmp (main_devname, monitor_devname) != 0);
272   } else {
273     ok = TRUE;
274   }
275
276   gtk_widget_set_sensitive (ok_button, ok);
277 }
278
279 static void
280 set_monitor_widgets (GtkWidget * dialog, gboolean use_monitor)
281 {
282   GtkWidget * monitor_chb, * monitor_widget, * swap;
283
284   monitor_chb =
285     GTK_WIDGET(g_object_get_data (G_OBJECT(dialog), "monitor_chb"));
286   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(monitor_chb), use_monitor);
287
288   monitor_widget = g_object_get_data (G_OBJECT(dialog), "monitor_widget");
289   gtk_widget_set_sensitive (monitor_widget, use_monitor);
290
291   swap = g_object_get_data (G_OBJECT(dialog), "swap");
292   gtk_widget_set_sensitive (swap, use_monitor);
293
294 }
295
296 static void
297 set_buff_adj (GtkWidget * dialog, gint logfrags)
298 {
299   GtkAdjustment * adj;
300
301   adj = g_object_get_data (G_OBJECT(dialog), "buff_adj");
302   gtk_adjustment_set_value (adj, logfrags);
303 }
304
305 static void
306 pcmio_devname_swap_cb (GtkWidget * widget, gpointer data)
307 {
308   GtkWidget * dialog = GTK_WIDGET (data);
309   gchar * main_dev, * monitor_dev;
310
311   main_dev = (gchar *)gtk_entry_get_text (GTK_ENTRY(GTK_COMBO(main_combo)->entry));
312   monitor_dev = (gchar *)gtk_entry_get_text (GTK_ENTRY(GTK_COMBO(monitor_combo)->entry));
313
314   gtk_entry_set_text (GTK_ENTRY(GTK_COMBO(main_combo)->entry), monitor_dev);
315   gtk_entry_set_text (GTK_ENTRY(GTK_COMBO(monitor_combo)->entry), main_dev);
316
317   set_monitor_widgets (dialog, pcmio_get_use_monitor());
318
319   update_ok_button (widget, data);
320 }
321
322 static void
323 pcmio_devname_reset_cb (GtkWidget * widget, gpointer data)
324 {
325   GtkWidget * dialog = GTK_WIDGET (data);
326   char * main_dev, * monitor_dev;
327
328   main_dev = pcmio_get_main_dev ();
329   monitor_dev = pcmio_get_monitor_dev ();
330
331   gtk_entry_set_text (GTK_ENTRY(GTK_COMBO(main_combo)->entry), main_dev);
332   gtk_entry_set_text (GTK_ENTRY(GTK_COMBO(monitor_combo)->entry), monitor_dev);
333
334   set_monitor_widgets (dialog, pcmio_get_use_monitor());
335
336   update_ok_button (widget, data);
337 }
338
339 static void
340 pcmio_devname_default_cb (GtkWidget * widget, gpointer data)
341 {
342   GtkWidget * dialog = GTK_WIDGET (data);
343   char * name;
344
345   if ((name = pcmio_get_default_main_dev ()) != NULL) {
346     gtk_entry_set_text (GTK_ENTRY(GTK_COMBO(main_combo)->entry), name);
347   }
348
349   if ((name = pcmio_get_default_monitor_dev ()) != NULL) {
350     gtk_entry_set_text (GTK_ENTRY(GTK_COMBO(monitor_combo)->entry), name);
351   }
352
353   set_monitor_widgets (dialog, DEFAULT_USE_MONITOR);
354
355   update_ok_button (widget, data);
356 }
357
358 static void
359 monitor_enable_cb (GtkWidget * widget, gpointer data)
360 {
361   GtkWidget * dialog = GTK_WIDGET (data);
362   gboolean active;
363
364   active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget));
365
366   set_monitor_widgets (dialog, active);
367 }
368
369 static void
370 pcmio_buffering_reset_cb (GtkWidget * widget, gpointer data)
371 {
372   GtkWidget * dialog = GTK_WIDGET (data);
373
374   set_buff_adj (dialog, pcmio_get_log_frags());
375 }
376
377 static void
378 pcmio_buffering_default_cb (GtkWidget * widget, gpointer data)
379 {
380   GtkWidget * dialog = GTK_WIDGET (data);
381
382   set_buff_adj (dialog, DEFAULT_LOG_FRAGS);
383 }
384
385 static GtkWidget *
386 create_drivers_combo (void)
387 {
388   GtkWidget * combo;
389   int k, current=0;
390  
391   combo = gtk_combo_box_new_text ();
392
393   for (k = 0 ; k < ARRAY_LEN (driver_table) && driver_table [k] ; k++) {
394     gtk_combo_box_append_text (GTK_COMBO_BOX (combo), driver_table [k]->name) ;
395     if (strcmp (driver_table [k]->name,  dialog_driver->name) == 0)
396       current = k;
397   }
398
399   gtk_combo_box_set_active (GTK_COMBO_BOX (combo), current);
400
401   return combo;
402 }
403
404 static GtkWidget *
405 create_devices_combo (void)
406 {
407   GtkWidget * combo;
408   GList * cbitems = NULL;
409
410   if (dialog_driver->get_names)
411     cbitems = dialog_driver->get_names();
412  
413   combo = gtk_combo_new ();
414  
415   gtk_combo_set_popdown_strings (GTK_COMBO(combo), cbitems);
416
417   return combo;
418 }
419
420 void
421 device_config (void)
422 {
423   GtkWidget * ebox;
424   GtkWidget * notebook;
425   GtkWidget * separator;
426   GtkWidget * hbox, * hbox2;
427   GtkWidget * vbox;
428   GtkWidget * label;
429   GtkWidget * checkbutton;
430   GtkWidget * hscale;
431   GtkWidget * ok_button;
432   GtkWidget * button;
433
434   GtkTooltips * tooltips;
435
436   if (dialog == NULL) {
437
438     dialog = gtk_dialog_new ();
439                        
440                                  
441                 g_signal_connect ((gpointer) dialog, "destroy",
442                        G_CALLBACK(gtk_widget_destroyed),
443                                                                                         &dialog);
444
445     gtk_window_set_title (GTK_WINDOW(dialog), _("Sweep: audio device configuration"));
446     gtk_window_set_position (GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE);
447
448     /* OK */
449
450     ok_button = gtk_button_new_with_label (_("OK"));
451     GTK_WIDGET_SET_FLAGS (GTK_WIDGET (ok_button), GTK_CAN_DEFAULT);
452     gtk_box_pack_start (GTK_BOX (GTK_DIALOG(dialog)->action_area), ok_button,
453                         TRUE, TRUE, 0);
454     gtk_widget_show (ok_button);
455     g_signal_connect (G_OBJECT(ok_button), "clicked",
456                         G_CALLBACK (config_dev_dsp_dialog_ok_cb),
457                         dialog);
458
459     g_object_set_data (G_OBJECT (dialog), "ok_button", ok_button);
460
461     /* Cancel */
462
463     button = gtk_button_new_with_label (_("Cancel"));
464     GTK_WIDGET_SET_FLAGS (GTK_WIDGET (button), GTK_CAN_DEFAULT);
465     gtk_box_pack_start (GTK_BOX (GTK_DIALOG(dialog)->action_area), button,
466                         TRUE, TRUE, 0);
467     gtk_widget_show (button);
468     g_signal_connect (G_OBJECT(button), "clicked",
469                         G_CALLBACK (config_dev_dsp_dialog_cancel_cb),
470                         NULL);
471
472     gtk_widget_grab_default (ok_button);
473
474
475     ebox = gtk_event_box_new ();
476     gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), ebox,
477                         TRUE, TRUE, 0);
478     gtk_widget_set_style (ebox, style_bw);
479     gtk_widget_show (ebox);
480
481     vbox = gtk_vbox_new (FALSE, 0);
482     gtk_container_add (GTK_CONTAINER(ebox), vbox);
483     gtk_widget_show (vbox);
484
485     /* Changes ... info */
486     label = gtk_label_new (_("Changes to device settings will take effect on"
487                              " next playback."));
488     gtk_box_pack_start (GTK_BOX(vbox), label, TRUE, TRUE, 8);
489     gtk_widget_show (label);
490
491     /* Choose driver */
492     hbox = gtk_hbox_new (FALSE, 8);
493     gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, TRUE, 8);
494     gtk_container_set_border_width (GTK_CONTAINER(hbox), 12);
495     gtk_widget_show (hbox);
496
497     label = gtk_label_new (_("Driver:"));
498     gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
499     gtk_widget_show (label);
500
501     driver_combo = create_drivers_combo ();
502     gtk_box_pack_start (GTK_BOX(hbox), driver_combo, TRUE, TRUE, 0);
503     gtk_widget_show (driver_combo);
504
505     g_signal_connect (GTK_COMBO_BOX(driver_combo), "changed",
506                         G_CALLBACK(choose_driver_cb), dialog);
507
508     g_object_set_data (G_OBJECT (dialog), "driver_combo", driver_combo);
509
510     /* Notebook */
511     notebook = gtk_notebook_new ();
512     gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), notebook,
513                         TRUE, TRUE, 4);
514     gtk_widget_show (notebook);
515
516     /* Device name */
517     label = gtk_label_new (_("Device name"));
518     vbox = gtk_vbox_new (FALSE, 0);
519     gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
520     gtk_container_set_border_width (GTK_CONTAINER(vbox), 4);
521     gtk_widget_show (vbox);
522
523     label = gtk_label_new (_("Set the main device for playback and recording"));
524     gtk_box_pack_start (GTK_BOX(vbox), label, FALSE, FALSE, 4);
525     gtk_widget_show (label);
526
527     /* Main output */
528     hbox = gtk_hbox_new (FALSE, 8);
529     gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, TRUE, 8);
530     gtk_container_set_border_width (GTK_CONTAINER(hbox), 12);
531     gtk_widget_show (hbox);
532      
533     label = gtk_label_new (_("Main device:"));
534     gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
535     gtk_widget_show (label);
536      
537     main_combo = create_devices_combo ();
538     gtk_box_pack_start (GTK_BOX(hbox), main_combo, TRUE, TRUE, 0);
539     gtk_widget_show (main_combo);
540
541     g_signal_connect (G_OBJECT(GTK_COMBO(main_combo)->entry), "changed",
542                         G_CALLBACK(update_ok_button), dialog);
543
544     g_object_set_data (G_OBJECT (dialog), "main_combo", main_combo);
545
546     separator = gtk_hseparator_new ();
547     gtk_box_pack_start (GTK_BOX (vbox), separator, FALSE, FALSE, 8);
548     gtk_widget_show (separator);
549
550     /* Monitor */
551     checkbutton =
552       gtk_check_button_new_with_label (_("Use a different device for monitoring"));
553     gtk_box_pack_start (GTK_BOX(vbox), checkbutton, FALSE, FALSE, 4);
554     gtk_widget_show (checkbutton);
555
556     g_signal_connect (G_OBJECT(checkbutton), "toggled",
557                         G_CALLBACK(update_ok_button), dialog);
558
559     hbox = gtk_hbox_new (FALSE, 8);
560     gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, TRUE, 8);
561     gtk_container_set_border_width (GTK_CONTAINER(hbox), 12);
562     gtk_widget_show (hbox);
563      
564     label = gtk_label_new (_("Monitor output:"));
565     gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
566     gtk_widget_show (label);
567
568     monitor_combo = create_devices_combo ();
569     gtk_box_pack_start (GTK_BOX(hbox), monitor_combo, TRUE, TRUE, 0);
570     gtk_widget_show (monitor_combo);
571
572     g_signal_connect (G_OBJECT(GTK_COMBO(monitor_combo)->entry), "changed",
573                         G_CALLBACK(update_ok_button), dialog);
574
575     g_signal_connect (G_OBJECT(checkbutton), "toggled",
576                         G_CALLBACK(monitor_enable_cb), dialog);
577
578     g_object_set_data (G_OBJECT (dialog), "monitor_chb", checkbutton);
579     g_object_set_data (G_OBJECT (dialog), "monitor_widget", hbox);
580
581
582     /* Swap / Remember / Reset device names*/
583
584     hbox = gtk_hbox_new (FALSE, 4);
585     gtk_box_pack_end (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
586     gtk_container_set_border_width (GTK_CONTAINER(hbox), 12);
587     gtk_widget_show (hbox);
588
589     button = gtk_button_new_with_label (_("Swap"));
590     gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, TRUE, 4);
591     g_signal_connect (G_OBJECT(button), "clicked",
592                         G_CALLBACK(pcmio_devname_swap_cb), dialog);
593     gtk_widget_show (button);
594
595     tooltips = gtk_tooltips_new ();
596     gtk_tooltips_set_tip (tooltips, button,
597                           _("Swap main and monitor devices."),
598                           NULL);
599
600     g_object_set_data (G_OBJECT (dialog), "swap", button);
601
602     hbox2 = gtk_hbox_new (TRUE, 4);
603     gtk_box_pack_end (GTK_BOX (hbox), hbox2, FALSE, TRUE, 0);
604     gtk_widget_show (hbox2);
605
606     button = gtk_button_new_with_label (_("Reset"));
607     gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, TRUE, 4);
608     g_signal_connect (G_OBJECT(button), "clicked",
609                         G_CALLBACK(pcmio_devname_reset_cb), dialog);
610     gtk_widget_show (button);
611
612     tooltips = gtk_tooltips_new ();
613     gtk_tooltips_set_tip (tooltips, button,
614                           _("Reset to the last remembered device names."),
615                           NULL);
616
617     /* Call the reset callback now to set remembered options */
618     pcmio_devname_reset_cb (button, dialog);
619
620     button = gtk_button_new_with_label (_("Defaults"));
621     gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, TRUE, 4);
622     g_signal_connect (G_OBJECT(button), "clicked",
623                         G_CALLBACK(pcmio_devname_default_cb), dialog);
624     gtk_widget_show (button);
625
626     tooltips = gtk_tooltips_new ();
627     gtk_tooltips_set_tip (tooltips, button,
628                           _("Set to default device names."),
629                           NULL);
630
631
632     separator = gtk_hseparator_new ();
633     gtk_box_pack_end (GTK_BOX (vbox), separator, FALSE, FALSE, 8);
634     gtk_widget_show (separator);
635
636
637     /* Buffering */
638
639     label = gtk_label_new (_("Device buffering"));
640     vbox = gtk_vbox_new (FALSE, 0);
641     gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
642     gtk_container_set_border_width (GTK_CONTAINER(vbox), 4);
643     gtk_widget_show (vbox);
644
645     hbox = gtk_hbox_new (FALSE, 8);
646     gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 8);
647     gtk_widget_show (hbox);
648
649     label = gtk_label_new (_("Low latency /\nMore dropouts"));
650     gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 8);
651     gtk_widget_show (label);
652
653     adj = gtk_adjustment_new (pcmio_get_log_frags (), /* value */
654                               LOG_FRAGS_MIN, /* lower */
655                               LOG_FRAGS_MAX+1, /* upper */
656                               1, /* step incr */
657                               1, /* page incr */
658                               1  /* page size */
659                               );
660
661     g_object_set_data (G_OBJECT(dialog), "buff_adj", adj);
662
663     hscale = gtk_hscale_new (GTK_ADJUSTMENT(adj));
664     gtk_box_pack_start (GTK_BOX(hbox), hscale, TRUE, TRUE, 4);
665     gtk_scale_set_draw_value (GTK_SCALE(hscale), TRUE);
666     gtk_scale_set_digits (GTK_SCALE(hscale), 0);
667     gtk_range_set_update_policy (GTK_RANGE(hscale), GTK_UPDATE_CONTINUOUS);
668     gtk_widget_set_size_request(hscale, 160, -1);
669     gtk_widget_show (hscale);
670
671     label = gtk_label_new (_("High latency /\nFewer dropouts"));
672     gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 8);
673     gtk_widget_show (label);
674
675     label = gtk_label_new (_("Varying this slider controls the lag between "
676                              "cursor movements and playback. This is "
677                              "particularly noticeable when \"scrubbing\" "
678                              "during playback.\n\nLower values improve "
679                              "responsiveness but may degrade audio quality "
680                              "on heavily-loaded systems."));
681     gtk_label_set_line_wrap (GTK_LABEL(label), TRUE);
682     gtk_box_pack_start (GTK_BOX(vbox), label, FALSE, FALSE, 8);
683     gtk_widget_show (label);
684
685     /* Remember / Reset device buffering */
686
687     hbox = gtk_hbox_new (FALSE, 4);
688     gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
689     gtk_container_set_border_width (GTK_CONTAINER(hbox), 12);
690     gtk_widget_show (hbox);
691
692     hbox2 = gtk_hbox_new (TRUE, 4);
693     gtk_box_pack_end (GTK_BOX (hbox), hbox2, FALSE, TRUE, 0);
694     gtk_widget_show (hbox2);
695
696     button = gtk_button_new_with_label (_("Reset"));
697     gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, TRUE, 4);
698     g_signal_connect (G_OBJECT(button), "clicked",
699                         G_CALLBACK(pcmio_buffering_reset_cb), dialog);
700     gtk_widget_show (button);
701
702     tooltips = gtk_tooltips_new ();
703     gtk_tooltips_set_tip (tooltips, button,
704                           _("Reset to the last remembered device buffering."),
705                           NULL);
706
707     /* Call the reset callback now to set remembered options */
708     pcmio_buffering_reset_cb (button, dialog);
709
710     button = gtk_button_new_with_label (_("Default"));
711     gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, TRUE, 4);
712     g_signal_connect (G_OBJECT(button), "clicked",
713                         G_CALLBACK(pcmio_buffering_default_cb), dialog);
714     gtk_widget_show (button);
715
716     tooltips = gtk_tooltips_new ();
717     gtk_tooltips_set_tip (tooltips, button,
718                           _("Set to default device buffering."),
719                           NULL);
720   }
721
722   update_pcmio_settings ();
723
724   if (!GTK_WIDGET_VISIBLE(dialog)) {
725     gtk_widget_show(dialog);
726   } else {
727     gdk_window_raise(dialog->window);
728   }
729 }
730
731 sw_handle *
732 device_open (int cueing, int flags)
733 {
734   current_driver = dialog_driver;
735
736   if (current_driver->open)
737     return current_driver->open (cueing, flags);
738   else
739     return NULL;
740 }
741
742 void
743 device_setup (sw_handle * handle, sw_format * format)
744 {
745   if (current_driver->setup)
746     current_driver->setup (handle, format);
747 }
748
749 int
750 device_wait (sw_handle * handle)
751 {
752   if (current_driver->wait)
753     return current_driver->wait (handle);
754   else
755     return 0;
756 }
757
758 ssize_t
759 device_read (sw_handle * handle, sw_audio_t * buf, size_t count)
760 {
761   if (current_driver->read)
762     return current_driver->read (handle, buf, count);
763   else
764     return -1;
765 }
766
767 ssize_t
768 device_write (sw_handle * handle, sw_audio_t * buf, size_t count)
769 {
770 #ifdef DEBUG
771   printf ("device_write: %d from %d\n", count, offset);
772 #endif
773
774   if (current_driver->write)
775     return current_driver->write (handle, buf, count);
776   else
777     return -1;
778 }
779
780 sw_framecount_t
781 device_offset (sw_handle * handle)
782 {
783   if (current_driver->offset)
784     return current_driver->offset (handle);
785   else
786     return -1;
787 }
788
789 void
790 device_reset (sw_handle * handle)
791 {
792   if (current_driver->reset)
793     current_driver->reset (handle);
794 }
795
796 void
797 device_flush (sw_handle * handle)
798 {
799   if (current_driver->flush)
800     current_driver->flush (handle);
801 }
802
803 void
804 device_drain (sw_handle * handle)
805 {
806   if (current_driver->drain)
807     current_driver->drain (handle);
808 }
809
810 void
811 device_close (sw_handle * handle)
812 {
813   if (current_driver->close)
814     current_driver->close (handle);
815
816   handle->driver_fd = -1;
817 }
818
819 void
820 init_devices (void)
821 {
822   const char * driver;
823   int k = 0;
824
825   memset (driver_table, 0, sizeof (driver_table));
826
827   /* Populate the driver table, with all valid drivers (name field is non-NULL). */
828   if (driver_alsa->name != NULL)
829     driver_table [k++] = driver_alsa;
830   if (driver_oss->name != NULL)
831     driver_table [k++] = driver_oss;
832   if (driver_pulseaudio->name != NULL)
833     driver_table [k++] = driver_pulseaudio;
834   if (driver_solaris->name != NULL)
835     driver_table [k++] = driver_solaris;
836
837   driver = prefs_get_string (prefs_driver_key);
838
839   /* Set a default in case preferences driver doesn't exist. */
840   current_driver = driver_table [0];
841
842   /* Switch to driver from preferences if possible. */
843   if (driver != NULL)
844     for (k = 0 ; driver_table [k] != NULL ; k++)
845       if (strcmp (driver, driver_table [k]->name) == 0)
846         current_driver = driver_table [k];
847
848   dialog_driver = current_driver;
849 }
Note: See TracBrowser for help on using the browser.