# HG changeset patch # User Michal Lipski # Date 1240055998 -7200 # Node ID 9ec8a613a1d68255893f7177077996055f7b9c01 # Parent c269a0351b533ae465d2c0bd4d492e592de4987e More OSS4 plugin changes diff -r c269a0351b53 -r 9ec8a613a1d6 src/OSS4/OSS4.c --- a/src/OSS4/OSS4.c Fri Apr 17 17:31:14 2009 +0200 +++ b/src/OSS4/OSS4.c Sat Apr 18 13:59:58 2009 +0200 @@ -107,7 +107,6 @@ g_free(oss_cfg.alt_audio_device); oss_cfg.alt_audio_device = NULL; } - } static OutputPlugin oss4_op = { diff -r c269a0351b53 -r 9ec8a613a1d6 src/OSS4/OSS4.h --- a/src/OSS4/OSS4.h Fri Apr 17 17:31:14 2009 +0200 +++ b/src/OSS4/OSS4.h Sat Apr 18 13:59:58 2009 +0200 @@ -34,6 +34,7 @@ #include #define IS_BIG_ENDIAN (G_BYTE_ORDER == G_BIG_ENDIAN) +#define DEFAULT_MIXER "/dev/mixer" extern OutputPlugin op; @@ -50,6 +51,7 @@ int vol; void oss_configure(void); int oss_hardware_present(void); +void oss_describe_error(); void oss_get_volume(int *l, int *r); void oss_set_volume(int l, int r); diff -r c269a0351b53 -r 9ec8a613a1d6 src/OSS4/audio.c --- a/src/OSS4/audio.c Fri Apr 17 17:31:14 2009 +0200 +++ b/src/OSS4/audio.c Sat Apr 18 13:59:58 2009 +0200 @@ -19,9 +19,6 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -static void oss_describe_error(); -static void close_mixer_device(); - #include #include @@ -36,8 +33,7 @@ #define NFRAGS 32 -static gint fd = -1, mixerfd = -1; -static oss_sysinfo sysinfo; +static gint fd = -1; static char *buffer; static gboolean going, prebuffer, paused, unpause, do_pause, remove_prebuffer; static gint device_buffer_used, buffer_size, prebuffer_size, blk_size; @@ -85,17 +81,18 @@ */ struct format_info output; -int oss_hardware_present() +gint oss_hardware_present() { + gint mixerfd; + oss_sysinfo sysinfo; + /* - * Open the mixer device used for calling SNDCTL_SYSINFO and - * SNDCTL_AUDIOINFO. + * Open the mixer device used for calling SNDCTL_SYSINFO */ - if ((mixerfd = open("/dev/mixer", O_RDWR, 0)) == -1) + if ((mixerfd = open(DEFAULT_MIXER, O_RDWR, 0)) == -1) { - perror("/dev/mixer"); + perror(DEFAULT_MIXER); oss_describe_error(); - close_mixer_device(); return 0; } @@ -104,13 +101,13 @@ { perror("SNDCTL_SYSINFO"); oss_describe_error(); - close_mixer_device(); + close(mixerfd); return 0; } else { - close_mixer_device(); + close(mixerfd); if (sysinfo.numaudios > 0) { @@ -123,7 +120,7 @@ } } -static void +void oss_describe_error() { switch (errno) @@ -574,7 +571,11 @@ wr_index = 0; rd_index = 0; - close_mixer_device(); + if (fd != -1) + { + close(fd); + fd = -1; + } } void @@ -808,19 +809,3 @@ vol = (r << 8) | l; ioctl(fd, cmd, &vol); } - -void -close_mixer_device() -{ - if (fd != -1) - { - close(fd); - fd = -1; - } - - if (mixerfd != -1) - { - close(mixerfd); - mixerfd = -1; - } -} diff -r c269a0351b53 -r 9ec8a613a1d6 src/OSS4/configure.c --- a/src/OSS4/configure.c Fri Apr 17 17:31:14 2009 +0200 +++ b/src/OSS4/configure.c Sat Apr 18 13:59:58 2009 +0200 @@ -27,7 +27,7 @@ #include #include #include - +#include static GtkWidget *configure_win = NULL; static GtkWidget *mixer_save_check,*buffer_size_spin, *buffer_pre_spin; @@ -75,9 +75,9 @@ } static void -configure_win_audio_dev_cb(GtkWidget * widget, gint device) +configure_win_audio_dev_cb(GtkWidget * widget, gpointer data) { - audio_device = device; + audio_device = GPOINTER_TO_INT(data); } static void @@ -92,53 +92,76 @@ scan_devices(gchar * type, GtkWidget * option_menu, GtkSignalFunc sigfunc) { GtkWidget *menu, *item; - VFSFile *file; - gchar buffer[256], *temp, *tmp2; - gboolean found = FALSE; - gint index = 0; - + oss_sysinfo sysinfo; + gint mixerfd = -1; + gint i, acc; + menu = gtk_menu_new(); - - if ((file = aud_vfs_fopen("/dev/sndstat", "r"))) { - while (aud_vfs_fgets(buffer, 255, file)) { - if (found && buffer[0] == '\n') - break; - if (buffer[strlen(buffer) - 1] == '\n') - buffer[strlen(buffer) - 1] = '\0'; - if (found) { - if (index == 0) { - tmp2 = strchr(buffer, ':'); - if (tmp2) { - tmp2++; - while (*tmp2 == ' ') - tmp2++; - } - else - tmp2 = buffer; - temp = g_strdup_printf(_("Default (%s)"), tmp2); - item = gtk_menu_item_new_with_label(temp); - g_free(temp); + + /* + * Open the mixer device used for calling SNDCTL_SYSINFO and + * SNDCTL_AUDIOINFO. + */ + if ((mixerfd = open(DEFAULT_MIXER, O_RDWR, 0)) == -1) + { + perror(DEFAULT_MIXER); + oss_describe_error(); + } + else + { + if (ioctl(mixerfd, SNDCTL_SYSINFO, &sysinfo) == -1) + { + perror("SNDCTL_SYSINFO"); + oss_describe_error(); + close(mixerfd); + } + else + { + for (i = 0; i < sysinfo.numaudios; i++) + { + oss_audioinfo ainfo; + ainfo.dev = i; + + if (ioctl(mixerfd, SNDCTL_AUDIOINFO, &ainfo) == -1) + { + perror("SNDCTL_AUDIOINFO"); + oss_describe_error(); + close(mixerfd); } else - item = gtk_menu_item_new_with_label(buffer); - g_signal_connect(G_OBJECT(item), "activate", - G_CALLBACK(sigfunc), (gpointer)(long)(index++)); - gtk_widget_show(item); - gtk_menu_append(GTK_MENU(menu), item); + { + acc = ainfo.caps & (PCM_CAP_INPUT | PCM_CAP_OUTPUT); + + switch (acc) + { + case PCM_CAP_OUTPUT: + item = gtk_menu_item_new_with_label(g_strdup_printf("%d. %s (OUTPUT)", i, ainfo.name)); + break; + + case PCM_CAP_INPUT | PCM_CAP_OUTPUT: + item = gtk_menu_item_new_with_label(g_strdup_printf("%d. %s (INPUT/OUTPUT)", i, ainfo.name)); + break; + + case PCM_CAP_INPUT: + item = gtk_menu_item_new_with_label(g_strdup_printf("%d. %s (INPUT)", i, ainfo.name)); + break; + + default: + continue; + } + + gtk_widget_show(item); + gtk_menu_append(GTK_MENU(menu), item); + + g_signal_connect(G_OBJECT(item), "activate", + G_CALLBACK(sigfunc), GINT_TO_POINTER(i)); + } } - if (!strcasecmp(buffer, type)) - found = 1; + close(mixerfd); } - aud_vfs_fclose(file); } - else { - item = gtk_menu_item_new_with_label(_("Default")); - g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(sigfunc), - (gpointer) 0); - gtk_widget_show(item); - gtk_menu_append(GTK_MENU(menu), item); - } + gtk_option_menu_set_menu(GTK_OPTION_MENU(option_menu), menu); }