Update of /cvsroot/alsa/alsa-tools/envy24control
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29803

Modified Files:
        Makefile.am configure.in configure.in-gtk2 envy24control.1 
        envy24control.c envy24control.h 
Log Message:
<[EMAIL PROTECTED]>
profiles management in envy24control


Index: Makefile.am
===================================================================
RCS file: /cvsroot/alsa/alsa-tools/envy24control/Makefile.am,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- Makefile.am 26 Feb 2004 17:55:30 -0000      1.10
+++ Makefile.am 16 May 2004 13:36:30 -0000      1.11
@@ -2,7 +2,7 @@
 bin_PROGRAMS = envy24control
 man_MANS = envy24control.1
 envy24control_SOURCES = envy24control.c envy24control.h levelmeters.c \
-                        mixer.c patchbay.c hardware.c driverevents.c volume.c
+                        mixer.c patchbay.c hardware.c driverevents.c volume.c 
profiles.c
 envy24control_LDFLAGS = @ENVY24CONTROL_LIBS@
 EXTRA_DIST = envy24control.1 depcomp configure.in-gtk2
 AUTOMAKE_OPTIONS = foreign

Index: configure.in
===================================================================
RCS file: /cvsroot/alsa/alsa-tools/envy24control/configure.in,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- configure.in        25 Nov 2003 17:13:39 -0000      1.5
+++ configure.in        16 May 2004 13:36:30 -0000      1.6
@@ -1,5 +1,5 @@
 AC_INIT(envy24control.c)
-AM_INIT_AUTOMAKE(envy24control, 0.1.0)
+AM_INIT_AUTOMAKE(envy24control, 0.5.0)
 AC_PROG_CC
 AC_PROG_INSTALL
 AC_HEADER_STDC
@@ -10,5 +10,33 @@
 ENVY24CONTROL_LIBS="$LIBS $ALSA_LIBS $GTK_LIBS"
 AC_SUBST(ENVY24CONTROL_CFLAGS)
 AC_SUBST(ENVY24CONTROL_LIBS)
+#AC_SUBST(ALSACTL)
+
+dnl add the mkdir program 
+AC_ARG_WITH(mkdir-prog,
+[  --with-mkdir-prog=PROG  Complete path and name from mkdir(optional)],
+[mkdir_prog="$withval"], [mkdir_prog=""])
+AC_MSG_CHECKING(for MKDIR)
+if test "$mkdir_prog" != "" ; then
+       MKDIR="$mkdir_prog"
+else
+       if test -x "/bin/mkdir" ; then
+               MKDIR="/bin/mkdir"
+       elif test -x "${bindir}/mkdir" ; then
+               MKDIR="${bindir}/mkdir"
+       elif test -x "${sbindir}/mkdir" ; then
+               MKDIR="${sbindir}/mkdir" 
+       elif test -x "/sbin/mkdir" ; then
+               MKDIR="/sbin/mkdir"
+       elif test -x "/usr/bin/mkdir" ; then
+               MKDIR="/usr/bin/mkdir"
+       elif test -x "/usr/sbin/mkdir" ; then
+               MKDIR="/usr/sbin/mkdir"
+       else
+               MKDIR="not found."
+       fi
+fi
+AC_MSG_RESULT($MKDIR)
+AC_SUBST(MKDIR)
 
 AC_OUTPUT(Makefile)

Index: configure.in-gtk2
===================================================================
RCS file: /cvsroot/alsa/alsa-tools/envy24control/configure.in-gtk2,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- configure.in-gtk2   2 Jul 2003 10:23:27 -0000       1.1
+++ configure.in-gtk2   16 May 2004 13:36:30 -0000      1.2
@@ -1,5 +1,5 @@
 AC_INIT(envy24control.c)
-AM_INIT_AUTOMAKE(envy24control, 0.1.0)
+AM_INIT_AUTOMAKE(envy24control, 0.5.0)
 AC_PROG_CC
 AC_PROG_INSTALL
 AC_HEADER_STDC

Index: envy24control.1
===================================================================
RCS file: /cvsroot/alsa/alsa-tools/envy24control/envy24control.1,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- envy24control.1     6 Mar 2004 12:55:17 -0000       1.6
+++ envy24control.1     16 May 2004 13:36:30 -0000      1.7
@@ -1,10 +1,10 @@
-.TH "envy24control" 1 "6 Mar 2004"
+.TH "envy24control" 1 "16 May 2004"
 .SH NAME
 envy24control \- GUI control tool for Envy24 (ice1712) based
 soundcards, under ALSA.
 
 .SH SYNOPSIS
-\fBenvy24control\fP [\fI-c\fP card-number] [\fI-D\fP control-name] [\fI-o\fP 0-num 
DACs max 8] [\fI-i\fP 0-num ADCs max 8] [\fI-p\fP 0-8] [\fI-s\fP 0-2] [\fI-v\fP 0 or 1]
+\fBenvy24control\fP [\fI-c\fP card-number] [\fI-D\fP control-name] [\fI-o\fP 0-num 
DACs max 8] [\fI-i\fP 0-num ADCs max 8] [\fI-p\fP 0-8] [\fI-s\fP 0-2] [\fI-f\fP 
<profiles file name>] [\fI-v\fP] [<profile number>|<profile name>]
 
 .SH DESCRIPTION
 \fBenvy24control\fP allows control of the digital mixer, channel gains
@@ -14,7 +14,7 @@
 
 .SH INVOKING
 
-\fBenvy24control\fP [\fI-c\fP card-number] [\fI-D\fP control-name] [\fI-o\fP 0-num 
DACs max 8] [\fI-i\fP 0-num ADCs max 8] [\fI-p\fP 0-8] [\fI-s\fP 0-2] [\fI-v\fP 0 or 1]
+\fBenvy24control\fP [\fI-c\fP card-number] [\fI-D\fP control-name] [\fI-o\fP 0-num 
DACs max 8] [\fI-i\fP 0-num ADCs max 8] [\fI-p\fP 0-8] [\fI-s\fP 0-2] [\fI-f\fP 
<profiles file name>] [\fI-v\fP] [<profile number>|<profile name>]
 .TP
 If no control-name is given, then the first sound card is used.
 
@@ -49,10 +49,15 @@
 \fI-s\fP spdif inputs/outputs
 Limit number of SPDIF inputs/outputs to display.  Default is 2.
 .TP
+\fI-f\fP name and path of the profiles file name.
+From/to this file will envy24control read/write the alsactl settings.
+If is not given DEFAULT_PROFILERC or for restore if DEFAULT_PROFILERC
+doesn't exists SYS_PROFILERC will be used.
+.TP
 \fI-v\fP view spdif playback channels in the mixer.
 It is not possible to manage something (muting, volume levels).
 It is only to view the levelmeters.
-Default is '0' - no view. Set to other than '0' to view.
+Default is no view of spdif playback channels in the mixer.
 
 .SH SEE ALSO
 \fB

Index: envy24control.c
===================================================================
RCS file: /cvsroot/alsa/alsa-tools/envy24control/envy24control.c,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -r1.25 -r1.26
--- envy24control.c     16 Apr 2004 13:09:35 -0000      1.25
+++ envy24control.c     16 May 2004 13:36:30 -0000      1.26
@@ -24,7 +24,9 @@
 #define _GNU_SOURCE
 #include <getopt.h>
 
-int input_channels, output_channels, pcm_output_channels, spdif_channels, 
view_spdif_playback;
+int input_channels, output_channels, pcm_output_channels, spdif_channels, 
view_spdif_playback, card_number;
+char *profiles_file_name, *default_profile;
+
 ice1712_eeprom_t card_eeprom;
 snd_ctl_t *ctl;
 
@@ -117,6 +119,14 @@
 GtkWidget *av_dac_sense_radio[10][4];
 GtkWidget *av_adc_sense_radio[10][4];
 
+struct profile_button {
+       GtkWidget *toggle_button;
+       GtkWidget *entry;
+} profiles_toggle_buttons[MAX_PROFILES];
+
+GtkWidget *active_button = NULL;
+GtkObject *card_number_adj;
+
 
 static void create_mixer_frame(GtkWidget *box, int stream)
 {
@@ -1656,10 +1666,267 @@
        }
 }
 
+int index_active_profile()
+{
+       gint index;
+       gboolean found;
+
+       found = FALSE;
+       for (index = 0; index < MAX_PROFILES; index++)
+       {
+               if (active_button == profiles_toggle_buttons[index].toggle_button) {
+                       found = TRUE;
+                       break;
+               }
+       }
+
+       if (found)
+               return index;
+
+       return NOTFOUND;
+}
+
+int delete_card_number(GtkWidget *delete_button)
+{
+       gint res;
+       gint card_nr;
+       gint index;
+
+       if (!(GTK_TOGGLE_BUTTON (delete_button)->active))
+               return EXIT_SUCCESS;
+
+       card_nr = GTK_ADJUSTMENT (card_number_adj)->value;
+       if ((card_nr < 0) || (card_nr > MAX_CARD_NUMBERS)) {
+               fprintf(stderr, "card number not in [0 ... %d]\n", MAX_CARD_NUMBERS);
+               gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (delete_button), FALSE);
+               return -EINVAL;
+       }
+
+       res = delete_card(card_number, profiles_file_name);
+       if (res < 0) {
+               gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (delete_button), FALSE);
+               return res;
+       }
+       if (card_nr == card_number) {
+               for (index = 0; index < MAX_PROFILES; index++)
+               {
+                       gtk_entry_set_text(GTK_ENTRY 
(profiles_toggle_buttons[index].entry), get_profile_name(index + 1, card_number, 
profiles_file_name));
+               }
+       }
+
+       gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (delete_button), FALSE);
+
+       return EXIT_SUCCESS;
+}
+
+int restore_active_profile(const gint profile_number)
+{
+       gint res;
+
+       res = save_restore(ALSACTL_OP_RESTORE, profile_number, card_number, 
profiles_file_name, NULL);
+
+       return res;
+}
+
+int save_active_profile(GtkWidget *save_button)
+{
+       gint res;
+       gint index;
+
+       if (!(GTK_TOGGLE_BUTTON (save_button)->active))
+               return EXIT_SUCCESS;
+       if ((index = index_active_profile()) >= 0) {
+               res = save_restore(ALSACTL_OP_STORE, index + 1, card_number, 
profiles_file_name, \
+                       gtk_entry_get_text(GTK_ENTRY 
(profiles_toggle_buttons[index].entry)));
+       } else {
+               fprintf(stderr, "No active profile found.\n");
+               gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (save_button), FALSE);
+               return -EXIT_FAILURE;
+       }
+
+       gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (save_button), FALSE);
+
+       return res;
+}
+
+void entry_toggle_editable(GtkWidget *toggle_button, GtkWidget *entry)
+{
+       gint index;
+       gint profile_number;
+
+       if (active_button == toggle_button) {
+               gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (toggle_button), TRUE);
+               gtk_editable_set_editable(GTK_EDITABLE (entry), TRUE);
+               gtk_widget_grab_focus(entry);
+               return;
+       } else if (GTK_TOGGLE_BUTTON (toggle_button)->active) {
+               active_button = toggle_button;
+       }
+       gtk_editable_set_editable(GTK_EDITABLE (entry), GTK_TOGGLE_BUTTON 
(toggle_button)->active);
+       if (GTK_TOGGLE_BUTTON (toggle_button)->active) {
+               gtk_widget_grab_focus(entry);
+               profile_number = NOTFOUND;
+               for (index = 0; index < MAX_PROFILES; index++)
+               {
+                       if (profiles_toggle_buttons[index].toggle_button != 
toggle_button) {
+                               gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON 
(profiles_toggle_buttons[index].toggle_button), FALSE);
+                       } else {
+                               profile_number = index + 1;
+                       }
+               }
+               if (profile_number >= 0)
+                       restore_active_profile(profile_number);
+       }
+}
+
+void enter_callback( const GtkWidget *widget, const GtkWidget *entry )
+{
+       const gchar *entry_text;
+       entry_text = gtk_entry_get_text (GTK_ENTRY (entry));
+       printf("Inhalt : %s\n", entry_text);
+}
+
+static GtkWidget *toggle_button_entry(const GtkWidget *parent, const gchar 
*profile_name, const gint index)
+{
+       GtkWidget *box;
+       GtkWidget *entry_label;
+       GtkWidget *toggle_button;
+
+       box = gtk_hbox_new(FALSE, 0);
+
+       toggle_button = gtk_toggle_button_new();
+       gtk_container_border_width(GTK_CONTAINER(toggle_button), 3);
+
+       profiles_toggle_buttons[index].entry = entry_label = gtk_entry_new();
+       gtk_entry_set_max_length(GTK_ENTRY (entry_label), MAX_PROFILE_NAME_LENGTH);
+       gtk_entry_set_text(GTK_ENTRY (entry_label), profile_name);
+       /* only the active profile can be modified */
+       gtk_editable_set_editable(GTK_EDITABLE (entry_label), FALSE);
+       gtk_signal_connect(GTK_OBJECT (entry_label), "activate",
+                        GTK_SIGNAL_FUNC (enter_callback),
+                        (gpointer) entry_label);
+       gtk_signal_connect(GTK_OBJECT (toggle_button), "toggled",
+                        GTK_SIGNAL_FUNC (entry_toggle_editable),
+                        (gpointer) entry_label);
+
+       gtk_box_pack_start(GTK_BOX (box), entry_label, FALSE, FALSE, 20);
+       gtk_widget_show(entry_label);
+       gtk_widget_show(box);
+       gtk_container_add(GTK_CONTAINER (toggle_button), box);
+       gtk_widget_show(toggle_button);
+       return (toggle_button);
+}
+
+static void create_profiles(GtkWidget *main, GtkWidget *notebook, int page)
+{
+       GtkWidget *label;
+       GtkWidget *label_card_nr;
+       GtkWidget *vbox;
+       GtkWidget *vbox1;
+       GtkWidget *hbox1;
+       GtkWidget *hbox2;
+       GtkWidget *save_button;
+       GtkWidget *delete_button;
+       GtkObject *card_button_adj;
+       GtkWidget *card_button;
+       gint index;
+       gint profile_number;
+       gchar *profile_name;
+       gint max_profiles;
+       gint max_digits;
+
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_widget_show(vbox);
+       gtk_container_add(GTK_CONTAINER(notebook), vbox);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
+
+        label = gtk_label_new("Profiles");
+        gtk_widget_show(label);
+       gtk_notebook_set_tab_label(GTK_NOTEBOOK(notebook), 
+                                  gtk_notebook_get_nth_page(GTK_NOTEBOOK(notebook), 
page), 
+                                  label);
+
+       vbox1 = gtk_vbutton_box_new();
+
+       for (index = 0; index < MAX_PROFILES; index++)
+       {
+               profile_name = get_profile_name(index + 1, card_number, 
profiles_file_name);
+               profiles_toggle_buttons[index].toggle_button = 
toggle_button_entry(window, profile_name, index);
+               gtk_box_pack_start(GTK_BOX (vbox1), 
profiles_toggle_buttons[index].toggle_button, FALSE, FALSE, 20);
+       }
+
+       gtk_widget_show(vbox1);
+       gtk_container_border_width(GTK_CONTAINER(vbox1), 20);
+
+       hbox1 = gtk_hbutton_box_new();
+       gtk_widget_show(hbox1);
+       gtk_container_border_width(GTK_CONTAINER(hbox1), 20);
+
+       hbox2 = gtk_hbox_new(FALSE, 0);
+       gtk_widget_show(hbox2);
+       gtk_box_pack_start(GTK_BOX (hbox1), hbox2, FALSE, FALSE, 20);
+
+        label_card_nr = gtk_label_new("Card Number:");
+        gtk_widget_show(label_card_nr);
+       gtk_box_pack_start(GTK_BOX (hbox2), label_card_nr, FALSE, FALSE, 20);
+       gtk_label_set_justify(GTK_LABEL (label_card_nr), GTK_JUSTIFY_LEFT);
+
+       card_button_adj = gtk_adjustment_new(16, 0, MAX_CARD_NUMBERS, 1, 10, 10);
+       card_number_adj = card_button_adj;
+       card_button = gtk_spin_button_new(GTK_ADJUSTMENT (card_button_adj), 1, 0);
+       gtk_widget_show(card_button);
+       gtk_box_pack_start(GTK_BOX (hbox2), card_button, TRUE, FALSE, 0);
+       gtk_spin_button_set_numeric(GTK_SPIN_BUTTON (card_button), TRUE);
+       gtk_adjustment_set_value(GTK_ADJUSTMENT (card_button_adj), card_number);
+
+       delete_button = gtk_toggle_button_new_with_label("Delete card from profiles");
+       gtk_widget_show(delete_button);
+       gtk_box_pack_start(GTK_BOX (hbox1), delete_button, FALSE, FALSE, 20);
+       gtk_signal_connect(GTK_OBJECT (delete_button), "toggled",
+                        GTK_SIGNAL_FUNC (delete_card_number),
+                        NULL);
+
+       save_button = gtk_toggle_button_new_with_label("Save active profile");
+       gtk_widget_show(save_button);
+       gtk_box_pack_end(GTK_BOX (hbox1), save_button, FALSE, FALSE, 20);
+       gtk_signal_connect(GTK_OBJECT (save_button), "toggled",
+                        GTK_SIGNAL_FUNC (save_active_profile),
+                        NULL);
+
+       gtk_container_add(GTK_CONTAINER (vbox), vbox1);
+       gtk_container_add(GTK_CONTAINER (vbox), hbox1);
+       gtk_widget_show(vbox);
+       if (default_profile != NULL)
+       {
+               /*
+                * only if default_profile is numerical and lower or equal than 
MAX_PROFILES it will be a profile_number
+                * otherwise it will be a profile name
+                */
+               if (strcspn(default_profile, "0123456789") == 0) {
+                       for (max_profiles = MAX_PROFILES, max_digits = 0; max_profiles 
> 9; max_digits++, max_profiles /= 10)
+                               ;
+                       max_digits++;
+                       if (strlen(default_profile) <= max_digits) {
+                               profile_number = atoi(default_profile);
+                               if (profile_number > MAX_PROFILES)
+                                       profile_number = 
get_profile_number(default_profile, card_number, profiles_file_name);
+                       } else {
+                               profile_number = get_profile_number(default_profile, 
card_number, profiles_file_name);
+                       }
+               } else {
+                       profile_number = get_profile_number(default_profile, 
card_number, profiles_file_name);
+               }
+               if ((profile_number > 0) && (profile_number <= MAX_PROFILES)) {
+                       gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON 
(profiles_toggle_buttons[profile_number - 1].toggle_button), TRUE);
+               } else {
+                       fprintf(stderr, "Cannot find profile '%s' for card '%d'.\n", 
default_profile, card_number);
+               }
+       }
+}
 
 static void usage(void)
 {
-       fprintf(stderr, "usage: envy24control [-c card#] [-D control-name] [-o 
num-outputs] [-i num-inputs] [-p num-pcm-outputs] [-s num-spdif-in/outs] [-v]\n");
+       fprintf(stderr, "usage: envy24control [-c card#] [-D control-name] [-o 
num-outputs] [-i num-inputs] [-p num-pcm-outputs] [-s num-spdif-in/outs] [-v] [-f 
profiles-file] [profile name|profile id]\n");
        fprintf(stderr, "\t-c, --card\tAlsa card number to control\n");
        fprintf(stderr, "\t-D, --device\tcontrol-name\n");
        fprintf(stderr, "\t-o, --outputs\tLimit number of analog line outputs to 
display\n");
@@ -1667,6 +1934,7 @@
        fprintf(stderr, "\t-p, --pcm_output\tLimit number of PCM outputs to 
display\n");
        fprintf(stderr, "\t-s, --spdif\tLimit number of spdif inputs/outputs to 
display\n");
        fprintf(stderr, "\t-v, --view_spdif_playback\tshows the spdif playback 
channels in the mixer\n");
+       fprintf(stderr, "\t-f, --profiles_file\tuse file as profiles file\n");
 }
 
 int main(int argc, char **argv)
@@ -1688,7 +1956,8 @@
                {"outputs", 1, 0, 'o'},
                {"pcm_outputs", 1, 0, 'p'},
                {"spdif", 1, 0, 's'},
-               {"view_spdif_playback", 1, 0, 'v'}
+               {"profiles_file", 1, 0, 'f'},
+               {"view_spdif_playback", 0, 0, 'v'},
        };
 
 
@@ -1699,12 +1968,15 @@
         gtk_init(&argc, &argv);
 
        name = "hw:0";
+       card_number = 0;
        input_channels = MAX_INPUT_CHANNELS;
        output_channels = MAX_OUTPUT_CHANNELS;
        pcm_output_channels = MAX_PCM_OUTPUT_CHANNELS;
        spdif_channels = MAX_SPDIF_CHANNELS;
        view_spdif_playback = 0;
-       while ((c = getopt_long(argc, argv, "D:c:i:o:p:s:v:", long_options, NULL)) != 
-1) {
+       profiles_file_name = DEFAULT_PROFILERC;
+       default_profile = NULL;
+       while ((c = getopt_long(argc, argv, "D:c:i:o:p:s:f:v", long_options, NULL)) != 
-1) {
                switch (c) {
                case 'c':
                        i = atoi(optarg);
@@ -1712,6 +1984,7 @@
                                fprintf(stderr, "envy24control: invalid card number 
%d\n", i);
                                exit(1);
                        }
+                       card_number = i;
                        sprintf(tmpname, "hw:%d", i);
                        name = tmpname;
                        break;
@@ -1748,8 +2021,11 @@
                                exit(1);
                        }
                        break;
+               case 'f':
+                       profiles_file_name = optarg;
+                       break;
                case 'v':
-                       view_spdif_playback = atoi(optarg);
+                       view_spdif_playback = 1;
                        break;
                default:
                        usage();
@@ -1757,6 +2033,9 @@
                        break;
                }
        }
+       if (optind < argc) {
+               default_profile = argv[optind];
+       }
 
        if ((err = snd_ctl_open(&ctl, name, 0)) < 0) {
                fprintf(stderr, "snd_ctl_open: %s\n", snd_strerror(err));
@@ -1824,6 +2103,7 @@
        create_hardware(window, notebook, page++);
        if (envy_analog_volume_available())
                create_analog_volume(window, notebook, page++);
+       create_profiles(window, notebook, page++);
        create_about(window, notebook, page++);
 
        npfds = snd_ctl_poll_descriptors_count(ctl);

Index: envy24control.h
===================================================================
RCS file: /cvsroot/alsa/alsa-tools/envy24control/envy24control.h,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- envy24control.h     16 Apr 2004 13:09:35 -0000      1.14
+++ envy24control.h     16 May 2004 13:36:30 -0000      1.15
@@ -7,6 +7,25 @@
 #include <gtk/gtk.h>
 #include <alsa/asoundlib.h>
 
+/* Profiles */
+#ifdef PACKAGE
+#define PROGRAM_NAME PACKAGE
+#else
+#define PROGRAM_NAME "envy24control"
+#endif
+#define MAX_PROFILES 8
+#define MAX_PROFILE_NAME_LENGTH 20
+#define DEFAULT_PROFILERC "~/envy24control/profiles.conf"
+#define SYS_PROFILERC "/etc/envy24control/profiles.conf"
+#ifndef MKDIR
+#define MKDIR "/bin/mkdir"
+#endif
+#ifndef ALSACTL
+#define ALSACTL "/usr/sbin/alsactl"
+#endif
+
+#include "profiles.h"
+
 /* MidiMan */
 #define ICE1712_SUBDEVICE_DELTA1010    0x121430d6
 #define ICE1712_SUBDEVICE_DELTADIO2496 0x121431d6



-------------------------------------------------------
This SF.Net email is sponsored by: SourceForge.net Broadband
Sign-up now for SourceForge Broadband and get the fastest
6.0/768 connection for only $19.95/mo for the first 3 months!
http://ads.osdn.com/?ad_id=2562&alloc_id=6184&op=click
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to