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

Modified Files:
        driverevents.c envy24control.1 envy24control.c envy24control.h 
        levelmeters.c mixer.c patchbay.c 
Log Message:
Dirk Kalis <[EMAIL PROTECTED]>
The second patch is for envy24control. this patch uses the new driver
design. it is not necessary to give the parameters for inputs and/or
outputs. only the available controls given by the driver will be displayed.
this patch needs the kernel driver patch.


Index: driverevents.c
===================================================================
RCS file: /cvsroot/alsa/alsa-tools/envy24control/driverevents.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- driverevents.c      14 Nov 2002 11:22:19 -0000      1.9
+++ driverevents.c      5 Mar 2004 09:10:01 -0000       1.10
@@ -54,12 +54,16 @@
                        rate_reset_update();
                else if (!strcmp(name, "Multi Playback Volume"))
                        mixer_update_stream(index + 1, 1, 0);
-               else if (!strcmp(name, "Multi Capture Volume"))
+               else if (!strcmp(name, "H/W Multi Capture Volume"))
                        mixer_update_stream(index + 11, 1, 0);
+               else if (!strcmp(name, "IEC958 Multi Capture Volume"))
+                       mixer_update_stream(index + 19, 1, 0);
                else if (!strcmp(name, "Multi Playback Switch"))
                        mixer_update_stream(index + 1, 0, 1);
-               else if (!strcmp(name, "Multi Capture Switch"))
+               else if (!strcmp(name, "H/W Multi Capture Switch"))
                        mixer_update_stream(index + 11, 0, 1);
+               else if (!strcmp(name, "IEC958 Multi Capture Switch"))
+                       mixer_update_stream(index + 19, 0, 1);
                else if (!strcmp(name, "H/W Playback Route"))
                        patchbay_update();
                else if (!strcmp(name, "IEC958 Playback Route"))

Index: envy24control.1
===================================================================
RCS file: /cvsroot/alsa/alsa-tools/envy24control/envy24control.1,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- envy24control.1     24 Feb 2004 19:05:44 -0000      1.4
+++ envy24control.1     5 Mar 2004 09:10:01 -0000       1.5
@@ -32,13 +32,27 @@
 card in your ALSA driver setup.
 .TP
 \fI-o\fP outputs
-Limit number of analog line outputs to display.  Default is 8.
+Limit number of analog line outputs to display.  Default is the number of
+DACs in the driver specification. Maximum is 8.
+The number of analog output lines can only be reduced from the available
+number of output lines.
 .TP
 \fI-i\fP inputs
-Limit number of analog line inputs to display.  Default is 8.
+Limit number of analog line inputs to display.  Default is the number of
+ADCS in the driver specification. Maximum is 8.
+The number of analog input lines can only be reduced from the available
+number of input lines.
 .TP
-\fI-s\fP outputs
+\fI-p\fP pcm outputs
+Limit number of PCM outputs to display.  Default is 8.
+.TP
+\fI-s\fP spdif inputs/outputs
 Limit number of SPDIF inputs/outputs to display.  Default is 2.
+.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.
 
 .SH SEE ALSO
 \fB

Index: envy24control.c
===================================================================
RCS file: /cvsroot/alsa/alsa-tools/envy24control/envy24control.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- envy24control.c     24 Feb 2004 19:05:44 -0000      1.22
+++ envy24control.c     5 Mar 2004 09:10:01 -0000       1.23
@@ -24,7 +24,7 @@
 #define _GNU_SOURCE
 #include <getopt.h>
 
-int input_channels, output_channels, spdif_channels;
+int input_channels, output_channels, pcm_output_channels, spdif_channels, 
view_spdif_playback;
 ice1712_eeprom_t card_eeprom;
 snd_ctl_t *ctl;
 
@@ -131,8 +131,10 @@
        GtkWidget *toggle;
        char str[64], drawname[32];
 
-       if (stream <= 10) {
+       if (stream <= MAX_PCM_OUTPUT_CHANNELS) {
                sprintf(str, "PCM Out %i", stream);
+       } else if (stream <= (MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS)) {
+               sprintf(str, "S/PDIF Out %s", stream & 1 ? "L": "R");
        } else if ((card_eeprom.subvendor == ICE1712_SUBDEVICE_DMX6FIRE) && (stream == 
11)) {
                sprintf(str, "CD In L");
        } else if ((card_eeprom.subvendor == ICE1712_SUBDEVICE_DMX6FIRE) && (stream == 
12)) {
@@ -145,12 +147,10 @@
                sprintf(str, "Phono/Mic In L");
        } else if ((card_eeprom.subvendor == ICE1712_SUBDEVICE_DMX6FIRE) && (stream == 
16)) {
                sprintf(str, "Phono/Mic In R");
-       } else if (stream <= 18) {
-               sprintf(str, "H/W In %i", stream - 10);
-       } else if (stream == 19) {
-               strcpy(str, "S/PDIF In L");
-       } else if (stream == 20) {
-               strcpy(str, "S/PDIF In R");
+       } else if (stream <= (MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + 
MAX_INPUT_CHANNELS)) {
+               sprintf(str, "H/W In %i", stream - (MAX_PCM_OUTPUT_CHANNELS + 
MAX_SPDIF_CHANNELS));
+       } else if (stream <= (MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + 
MAX_INPUT_CHANNELS + MAX_SPDIF_CHANNELS)) {
+               sprintf(str, "S/PDIF In %s", stream & 1 ? "L": "R");
        } else {
                strcpy(str, "???");
        }
@@ -356,12 +356,25 @@
        gtk_widget_show(hbox);
        gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);
 
-       for(stream = 1; stream <= output_channels; stream ++)
-               create_mixer_frame(hbox, stream);
-       for(stream = 11; stream <= input_channels + 10; stream ++)
-               create_mixer_frame(hbox, stream);
-       for(stream = 19; stream <= spdif_channels + 18; stream ++)
-               create_mixer_frame(hbox, stream);
+       for(stream = 1; stream <= pcm_output_channels; stream ++) {
+               if (mixer_stream_is_active(stream))
+                       create_mixer_frame(hbox, stream);
+       }
+       for(stream = (MAX_PCM_OUTPUT_CHANNELS + 1); \
+               stream <= spdif_channels + MAX_PCM_OUTPUT_CHANNELS; stream ++) {
+               if (mixer_stream_is_active(stream) && view_spdif_playback)
+                       create_mixer_frame(hbox, stream);
+       }
+       for(stream = (MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + 1); \
+               stream <= input_channels + (MAX_PCM_OUTPUT_CHANNELS + 
MAX_SPDIF_CHANNELS); stream ++) {
+               if (mixer_stream_is_active(stream))
+                       create_mixer_frame(hbox, stream);
+       }
+       for(stream = (MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + 
MAX_INPUT_CHANNELS + 1); \
+               stream <= spdif_channels + (MAX_PCM_OUTPUT_CHANNELS + 
MAX_SPDIF_CHANNELS + MAX_INPUT_CHANNELS); stream ++) {
+               if (mixer_stream_is_active(stream))
+                       create_mixer_frame(hbox, stream);
+       }
 }
 
 static void create_router_frame(GtkWidget *box, int stream, int pos)
@@ -374,6 +387,7 @@
        GSList *group = NULL;
        char str[64], str1[64];
        int idx;
+       int pcm_channel,s_pdif_channel;
        static char *table[10] = {
                "S/PDIF In L",
                "S/PDIF In R",
@@ -397,16 +411,20 @@
                 table[7] = "Phono/Mic In R";
        }
 
-       if (stream <= 8) {
+       if (stream <= MAX_OUTPUT_CHANNELS) {
                sprintf(str, "H/W Out %i (%s)", stream, stream & 1 ? "L" : "R");
-       } else if (stream == 9) {
+       } else if (stream == (MAX_OUTPUT_CHANNELS + 1)) {
                strcpy(str, "S/PDIF Out (L)");
-       } else if (stream == 10) {
+       } else if (stream == (MAX_OUTPUT_CHANNELS + 2)) {
                strcpy(str, "S/PDIF Out (R)");
        } else {
                strcpy(str, "???");
        }
-       sprintf(str1, "PCM Out %i", stream);
+       if ((stream == MAX_PCM_OUTPUT_CHANNELS + 1) || (stream == 
MAX_PCM_OUTPUT_CHANNELS + 2)) {
+               sprintf(str1, "S/PDIF Out (%s)", stream & 1 ? "L" : "R");
+       } else { 
+               sprintf(str1, "PCM Out %i", stream);
+       }
 
        frame = gtk_frame_new(str);
        gtk_widget_show(frame);
@@ -419,7 +437,6 @@
        gtk_container_add(GTK_CONTAINER(frame), vbox);
        gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
 
-
        radiobutton = gtk_radio_button_new_with_label(group, str1);
        router_radio[stream-1][0] = radiobutton;
        group = gtk_radio_button_group(GTK_RADIO_BUTTON(radiobutton));
@@ -437,7 +454,7 @@
        label = gtk_label_new("");
        gtk_widget_show(label);
 
-       if(stream == 1 || stream == 2 || stream == 9 || stream == 10) {
+       if(stream <= MAX_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS) {
                radiobutton = gtk_radio_button_new_with_label(group, stream & 1 ? 
"Digital Mix L" : "Digital Mix R");
                router_radio[stream-1][1] = radiobutton;
                group = gtk_radio_button_group(GTK_RADIO_BUTTON(radiobutton));
@@ -506,7 +523,7 @@
                if (patchbay_stream_is_active(stream))
                        create_router_frame(hbox, stream, pos++);
        }
-       for (stream = 8; stream <= 8 + spdif_channels; stream++) {
+       for (stream = MAX_OUTPUT_CHANNELS + 1; stream <= MAX_OUTPUT_CHANNELS + 
spdif_channels; stream++) {
                if (patchbay_stream_is_active(stream))
                        create_router_frame(hbox, stream, pos++);
        }
@@ -1643,12 +1660,14 @@
 
 static void usage(void)
 {
-       fprintf(stderr, "usage: envy24control [-c card#] [-D control-name] [-o 
num-outputs] [-i num-inputs]\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]\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 outputs to display\n");
-       fprintf(stderr, "\t-i, --input\tLimit number of inputs to display\n");
-       fprintf(stderr, "\t-s, --spdif\tLimit number of spdif outputs to display\n");
+       fprintf(stderr, "\t-o, --outputs\tLimit number of analog line outputs to 
display\n");
+       fprintf(stderr, "\t-i, --input\tLimit number of analog line inputs to 
display\n");
+       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");
 }
 
 int main(int argc, char **argv)
@@ -1661,15 +1680,16 @@
        int npfds;
        struct pollfd *pfds;
        int page;
-       int output_channels_set = 0;
        int input_channels_set = 0;
+       int output_channels_set = 0;
        static struct option long_options[] = {
                {"device", 1, 0, 'D'},
                {"card", 1, 0, 'c'},
                {"inputs", 1, 0, 'i'},
                {"outputs", 1, 0, 'o'},
+               {"pcm_outputs", 1, 0, 'p'},
                {"spdif", 1, 0, 's'},
-               {0, 0, 0, 0}
+               {"view_spdif_playback", 1, 0, 'v'}
        };
 
 
@@ -1682,8 +1702,10 @@
        name = "hw:0";
        input_channels = MAX_INPUT_CHANNELS;
        output_channels = MAX_OUTPUT_CHANNELS;
+       pcm_output_channels = MAX_PCM_OUTPUT_CHANNELS;
        spdif_channels = MAX_SPDIF_CHANNELS;
-       while ((c = getopt_long(argc, argv, "D:c:i:o:s:", long_options, NULL)) != -1) {
+       view_spdif_playback = 0;
+       while ((c = getopt_long(argc, argv, "D:c:i:o:p:s:v:", long_options, NULL)) != 
-1) {
                switch (c) {
                case 'c':
                        i = atoi(optarg);
@@ -1710,7 +1732,14 @@
                        if (output_channels < 0 || output_channels > 
MAX_OUTPUT_CHANNELS) {
                                fprintf(stderr, "envy24control: must have 0-%i 
outputs\n", MAX_OUTPUT_CHANNELS);
                                exit(1);
+                       }
                        output_channels_set = 1;
+                       break;
+               case 'p':
+                       pcm_output_channels = atoi(optarg);
+                       if (pcm_output_channels < 0 || pcm_output_channels > 
MAX_PCM_OUTPUT_CHANNELS) {
+                               fprintf(stderr, "envy24control: must have 0-%i pcm 
outputs\n", MAX_PCM_OUTPUT_CHANNELS);
+                               exit(1);
                        }
                        break;
                case 's':
@@ -1720,6 +1749,9 @@
                                exit(1);
                        }
                        break;
+               case 'v':
+                       view_spdif_playback = atoi(optarg);
+                       break;
                default:
                        usage();
                        exit(1);
@@ -1763,10 +1795,14 @@
 
        /* Initialize code */
        level_meters_init();
+       mixer_init();
        patchbay_init();
        hardware_init();
        analog_volume_init();
 
+       fprintf(stderr, "using\t --- input_channels: %i\n\t --- output_channels: 
%i\n\t --- pcm_output_channels: %i\n\t --- spdif in/out channels: %i\n", \
+               input_channels, output_channels, pcm_output_channels, spdif_channels);
+
         /* Make the title */
         sprintf(title, "Envy24 Control Utility %s (%s)", VERSION, 
snd_ctl_card_info_get_longname(hw_info));
 

Index: envy24control.h
===================================================================
RCS file: /cvsroot/alsa/alsa-tools/envy24control/envy24control.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- envy24control.h     24 Feb 2004 19:05:44 -0000      1.12
+++ envy24control.h     5 Mar 2004 09:10:01 -0000       1.13
@@ -25,10 +25,20 @@
 /* Hoontech */
 #define ICE1712_SUBDEVICE_STDSP24       0x12141217      /* Hoontech SoundTrack Audio 
DSP 24 */
 
+/* max number of cards for alsa */
 #define MAX_CARD_NUMBERS       8
+/* max number of HW input/output channels (analog lines)
+ * the number of available HW input/output channels is defined
+ * at 'adcs/dacs' in the driver
+ */
+/* max number of HW input channels (analog lines) */
 #define MAX_INPUT_CHANNELS     8
+/* max number of HW output channels (analog lines) */
 #define MAX_OUTPUT_CHANNELS    8
+/* max number of spdif input/output channels */
 #define MAX_SPDIF_CHANNELS     2
+/* max number of PCM output channels */
+#define MAX_PCM_OUTPUT_CHANNELS        8
 
 typedef struct {
        unsigned int subvendor; /* PCI[2c-2f] */
@@ -143,10 +153,12 @@
 void level_meters_init(void);
 void level_meters_postinit(void);
 
+int mixer_stream_is_active(int stream);
 void mixer_update_stream(int stream, int vol_flag, int sw_flag);
 void mixer_toggled_solo(GtkWidget *togglebutton, gpointer data);
 void mixer_toggled_mute(GtkWidget *togglebutton, gpointer data);
 void mixer_adjust(GtkAdjustment *adj, gpointer data);
+void mixer_init(void);
 void mixer_postinit(void);
 
 int patchbay_stream_is_active(int stream);

Index: levelmeters.c
===================================================================
RCS file: /cvsroot/alsa/alsa-tools/envy24control/levelmeters.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- levelmeters.c       4 Jun 2003 13:46:49 -0000       1.6
+++ levelmeters.c       5 Mar 2004 09:10:01 -0000       1.7
@@ -28,7 +28,7 @@
 static GdkPixmap *pixmap[21] = { NULL, };
 static snd_ctl_elem_value_t *peaks;
 
-extern int input_channels, output_channels, spdif_channels;
+extern int input_channels, output_channels, pcm_output_channels, spdif_channels, 
view_spdif_playback;
 
 static void update_peak_switch(void)
 {
@@ -197,7 +197,7 @@
        int idx, l1, l2;
 
        update_peak_switch();
-       for (idx = 0; idx <= output_channels; idx++) {
+       for (idx = 0; idx <= pcm_output_channels; idx++) {
                get_levels(idx, &l1, &l2);
                widget = idx == 0 ? mixer_mix_drawing : mixer_drawing[idx-1];
                if (!GTK_WIDGET_VISIBLE(widget))
@@ -210,7 +210,22 @@
                                0, 0,
                                widget->allocation.width, widget->allocation.height);  
 
        }
-       for (idx = 11; idx <= input_channels + 10; idx++) {
+       if (view_spdif_playback) {
+               for (idx = MAX_PCM_OUTPUT_CHANNELS + 1; idx <= MAX_OUTPUT_CHANNELS + 
spdif_channels; idx++) {
+                       get_levels(idx, &l1, &l2);
+                       widget = idx == 0 ? mixer_mix_drawing : mixer_drawing[idx-1];
+                       if (!GTK_WIDGET_VISIBLE(widget))
+                               continue;
+                       redraw_meters(idx, widget->allocation.width, 
widget->allocation.height, l1, l2);
+                       gdk_draw_pixmap(widget->window,
+                                       widget->style->black_gc,
+                                       pixmap[idx],
+                                       0, 0,
+                                       0, 0,
+                                       widget->allocation.width, 
widget->allocation.height);   
+               }
+       }
+       for (idx = MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + 1; idx <= 
input_channels + MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS; idx++) {
                get_levels(idx, &l1, &l2);
                widget = idx == 0 ? mixer_mix_drawing : mixer_drawing[idx-1];
                if (!GTK_WIDGET_VISIBLE(widget))
@@ -223,7 +238,8 @@
                                0, 0,
                                widget->allocation.width, widget->allocation.height);  
 
        }
-       for (idx = 19; idx <= spdif_channels + 18; idx++) {
+       for (idx = MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + MAX_INPUT_CHANNELS + 
1; \
+                   idx <= spdif_channels + MAX_PCM_OUTPUT_CHANNELS + 
MAX_SPDIF_CHANNELS + MAX_INPUT_CHANNELS; idx++) {
                get_levels(idx, &l1, &l2);
                widget = idx == 0 ? mixer_mix_drawing : mixer_drawing[idx-1];
                if (!GTK_WIDGET_VISIBLE(widget))

Index: mixer.c
===================================================================
RCS file: /cvsroot/alsa/alsa-tools/envy24control/mixer.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- mixer.c     24 Feb 2004 19:05:44 -0000      1.8
+++ mixer.c     5 Mar 2004 09:10:01 -0000       1.9
@@ -19,10 +19,21 @@
 
 #include "envy24control.h"
 
+#define        MULTI_PLAYBACK_SWITCH           "Multi Playback Switch"
+#define MULTI_PLAYBACK_VOLUME          "Multi Playback Volume"
+
+#define HW_MULTI_CAPTURE_SWITCH                "H/W Multi Capture Switch"
+#define IEC958_MULTI_CAPTURE_SWITCH    "IEC958 Multi Capture Switch"
+
+#define HW_MULTI_CAPTURE_VOLUME                "H/W Multi Capture Volume"
+#define IEC958_MULTI_CAPTURE_VOLUME    "IEC958 Multi Capture Volume"
+
 #define toggle_set(widget, state) \
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), state);
 
-extern int input_channels, output_channels, spdif_channels;
+static int stream_is_active[MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + \
+                               MAX_INPUT_CHANNELS + MAX_SPDIF_CHANNELS];
+extern int input_channels, output_channels, pcm_output_channels, spdif_channels, 
view_spdif_playback;
 
 static int is_active(GtkWidget *widget)
 {
@@ -33,13 +44,16 @@
 {
        int err;
        
+       if (! stream_is_active[stream - 1])
+               return;
+
        if (vol_flag) {
                snd_ctl_elem_value_t *vol;
                int v[2];
                snd_ctl_elem_value_alloca(&vol);
                snd_ctl_elem_value_set_interface(vol, SND_CTL_ELEM_IFACE_MIXER);
-               snd_ctl_elem_value_set_name(vol, stream <= 10 ? "Multi Playback 
Volume" : "Multi Capture Volume");
-               snd_ctl_elem_value_set_index(vol, (stream - 1) % 10);
+               snd_ctl_elem_value_set_name(vol, stream <= 10 ? MULTI_PLAYBACK_VOLUME 
: (stream <= 18 ? HW_MULTI_CAPTURE_VOLUME : IEC958_MULTI_CAPTURE_VOLUME));
+               snd_ctl_elem_value_set_index(vol, stream <= 18 ? (stream - 1) % 10 : 
(stream - 1) % 18 );
                if ((err = snd_ctl_elem_read(ctl, vol)) < 0)
                        g_print("Unable to read multi playback volume: %s\n", 
snd_strerror(err));
                v[0] = snd_ctl_elem_value_get_integer(vol, 0);
@@ -54,8 +68,8 @@
                int v[2];
                snd_ctl_elem_value_alloca(&sw);
                snd_ctl_elem_value_set_interface(sw, SND_CTL_ELEM_IFACE_MIXER);
-               snd_ctl_elem_value_set_name(sw, stream <= 10 ? "Multi Playback Switch" 
: "Multi Capture Switch");
-               snd_ctl_elem_value_set_index(sw, (stream - 1) % 10);
+               snd_ctl_elem_value_set_name(sw, stream <= 10 ? MULTI_PLAYBACK_SWITCH : 
(stream <= 18 ? HW_MULTI_CAPTURE_SWITCH : IEC958_MULTI_CAPTURE_SWITCH));
+               snd_ctl_elem_value_set_index(sw, stream <= 18 ? (stream - 1) % 10 : 
(stream - 1) % 18 );
                if ((err = snd_ctl_elem_read(ctl, sw)) < 0)
                        g_print("Unable to read multi playback switch: %s\n", 
snd_strerror(err));
                v[0] = snd_ctl_elem_value_get_boolean(sw, 0);
@@ -74,8 +88,8 @@
        
        snd_ctl_elem_value_alloca(&sw);
        snd_ctl_elem_value_set_interface(sw, SND_CTL_ELEM_IFACE_MIXER);
-       snd_ctl_elem_value_set_name(sw, stream <= 10 ? "Multi Playback Switch" : 
"Multi Capture Switch");
-       snd_ctl_elem_value_set_index(sw, (stream - 1) % 10);
+       snd_ctl_elem_value_set_name(sw, stream <= 10 ? MULTI_PLAYBACK_SWITCH : (stream 
<= 18 ? HW_MULTI_CAPTURE_SWITCH : IEC958_MULTI_CAPTURE_SWITCH));
+       snd_ctl_elem_value_set_index(sw, stream <= 18 ? (stream - 1) % 10 : (stream - 
1) % 18 );
        if ((err = snd_ctl_elem_read(ctl, sw)) < 0)
                g_print("Unable to read multi switch: %s\n", snd_strerror(err));
        if (left >= 0 && left != snd_ctl_elem_value_get_boolean(sw, 0)) {
@@ -118,8 +132,8 @@
        
        snd_ctl_elem_value_alloca(&vol);
        snd_ctl_elem_value_set_interface(vol, SND_CTL_ELEM_IFACE_MIXER);
-       snd_ctl_elem_value_set_name(vol, stream <= 10 ? "Multi Playback Volume" : 
"Multi Capture Volume");
-       snd_ctl_elem_value_set_index(vol, (stream - 1) % 10);
+       snd_ctl_elem_value_set_name(vol, stream <= 10 ? MULTI_PLAYBACK_VOLUME : 
(stream <= 18 ? HW_MULTI_CAPTURE_VOLUME : IEC958_MULTI_CAPTURE_VOLUME));
+       snd_ctl_elem_value_set_index(vol, stream <= 18 ? (stream - 1) % 10 : (stream - 
1) % 18 );
        if ((err = snd_ctl_elem_read(ctl, vol)) < 0)
                g_print("Unable to read multi volume: %s\n", snd_strerror(err));
        if (left >= 0) {
@@ -151,14 +165,82 @@
        set_volume1(stream, vol[0], vol[1]);
 }
 
+int mixer_stream_is_active(int stream)
+{
+       return stream_is_active[stream - 1];
+}
+
+void mixer_init(void)
+{
+       int i;
+       int nb_active_channels;
+       snd_ctl_elem_value_t *val;
+
+       snd_ctl_elem_value_alloca(&val);
+       snd_ctl_elem_value_set_interface(val, SND_CTL_ELEM_IFACE_MIXER);
+       memset (stream_is_active, 0, (MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + 
MAX_INPUT_CHANNELS + MAX_SPDIF_CHANNELS) * sizeof(int));
+       snd_ctl_elem_value_set_name(val, MULTI_PLAYBACK_SWITCH);
+       nb_active_channels = 0;
+       for (i = 0; i < pcm_output_channels; i++) {
+               snd_ctl_elem_value_set_numid(val, 0);
+               snd_ctl_elem_value_set_index(val, i);
+               if (snd_ctl_elem_read(ctl, val) < 0)
+                       continue;
+
+               stream_is_active[i] = 1;
+               nb_active_channels++;
+       }
+       pcm_output_channels = nb_active_channels;
+       for (i = MAX_PCM_OUTPUT_CHANNELS; i < MAX_PCM_OUTPUT_CHANNELS + 
spdif_channels; i++) {
+               snd_ctl_elem_value_set_numid(val, 0);
+               snd_ctl_elem_value_set_index(val, i);
+               if (snd_ctl_elem_read(ctl, val) < 0)
+                       continue;
+               stream_is_active[i] = 1;
+       }
+       snd_ctl_elem_value_set_name(val, HW_MULTI_CAPTURE_SWITCH);
+       nb_active_channels = 0;
+       for (i = 0; i < input_channels; i++) {
+               snd_ctl_elem_value_set_numid(val, 0);
+               snd_ctl_elem_value_set_index(val, i);
+               if (snd_ctl_elem_read(ctl, val) < 0)
+                       continue;
+
+               stream_is_active[i + MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS] = 1;
+               nb_active_channels++;
+       }
+       input_channels = nb_active_channels;
+       snd_ctl_elem_value_set_name(val, IEC958_MULTI_CAPTURE_SWITCH);
+       for (i = 0; i < spdif_channels; i++) {
+               snd_ctl_elem_value_set_numid(val, 0);
+               snd_ctl_elem_value_set_index(val, i);
+               if (snd_ctl_elem_read(ctl, val) < 0)
+                       continue;
+               stream_is_active[i + MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + 
MAX_INPUT_CHANNELS] = 1;
+       }
+}
+
 void mixer_postinit(void)
 {
        int stream;
 
-       for (stream = 1; stream <= output_channels; stream++)
-               mixer_update_stream(stream, 1, 1);
-       for (stream = 11; stream <= input_channels + 10; stream++)
-               mixer_update_stream(stream, 1, 1);
-       for (stream = 19; stream <= spdif_channels + 18; stream++)
-               mixer_update_stream(stream, 1, 1);
+       for (stream = 1; stream <= pcm_output_channels; stream++) {
+               if (stream_is_active[stream - 1])
+                       mixer_update_stream(stream, 1, 1);
+       }
+       for (stream = MAX_PCM_OUTPUT_CHANNELS + 1; \
+               stream <= MAX_PCM_OUTPUT_CHANNELS + spdif_channels; stream++) {
+               if (stream_is_active[stream - 1] && view_spdif_playback)
+                       mixer_update_stream(stream, 1, 1);
+       }
+       for (stream = MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + 1; \
+               stream <= MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + 
input_channels; stream++) {
+               if (stream_is_active[stream - 1])
+                       mixer_update_stream(stream, 1, 1);
+       }
+       for (stream = MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + 
MAX_INPUT_CHANNELS + 1; \
+               stream <= MAX_PCM_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS + 
MAX_INPUT_CHANNELS + spdif_channels; stream++) {
+               if (stream_is_active[stream - 1])
+                       mixer_update_stream(stream, 1, 1);
+       }
 }

Index: patchbay.c
===================================================================
RCS file: /cvsroot/alsa/alsa-tools/envy24control/patchbay.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- patchbay.c  24 Feb 2004 19:05:44 -0000      1.8
+++ patchbay.c  5 Mar 2004 09:10:01 -0000       1.9
@@ -26,7 +26,7 @@
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), state);
 
 static int stream_active[MAX_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS];
-extern int output_channels, input_channels, spdif_channels;
+extern int output_channels, input_channels, pcm_output_channels, spdif_channels;
 
 static int is_active(GtkWidget *widget)
 {
@@ -45,9 +45,9 @@
        }
        snd_ctl_elem_value_alloca(&val);
        snd_ctl_elem_value_set_interface(val, SND_CTL_ELEM_IFACE_MIXER);
-       if (stream >= 8) {
+       if (stream >= MAX_OUTPUT_CHANNELS) {
                snd_ctl_elem_value_set_name(val, SPDIF_PLAYBACK_ROUTE_NAME);
-               snd_ctl_elem_value_set_index(val, stream - 8);
+               snd_ctl_elem_value_set_index(val, stream - MAX_OUTPUT_CHANNELS);
        } else {
                snd_ctl_elem_value_set_name(val, ANALOG_PLAYBACK_ROUTE_NAME);
                snd_ctl_elem_value_set_index(val, stream);
@@ -55,13 +55,13 @@
        if ((err = snd_ctl_elem_read(ctl, val)) < 0)
                return 0;
        out = snd_ctl_elem_value_get_enumerated(val, 0);
-       if (out >= 11) {
-               if (stream >= 8 || stream < 2)
+       if (out >= MAX_INPUT_CHANNELS + MAX_SPDIF_CHANNELS + 1) {
+               if (stream >= MAX_PCM_OUTPUT_CHANNELS || stream < MAX_SPDIF_CHANNELS)
                        return 1; /* digital mixer */
-       } else if (out >= 9)
-               return out - 9 + 2; /* spdif left (=2) / right (=3) */
+       } else if (out >= MAX_INPUT_CHANNELS + 1)
+               return out - (MAX_INPUT_CHANNELS + 1) + 2; /* spdif left (=2) / right 
(=3) */
        else if (out >= 1)
-               return out + 3; /* analog (4-) */
+               return out + spdif_channels + 1; /* analog (4-) */
 
        return 0; /* pcm */
 }
@@ -70,7 +70,7 @@
 {
        int stream, tidx;
 
-       for (stream = 1; stream <= output_channels; stream++) {
+       for (stream = 1; stream <= (MAX_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS); 
stream++) {
                if (stream_active[stream - 1]) {
                        tidx = get_toggle_index(stream);
                        toggle_set(router_radio[stream - 1][tidx], TRUE);
@@ -93,7 +93,7 @@
                return;
        out = 0;
        if (idx == 1)
-               out = 11;
+               out = MAX_INPUT_CHANNELS + MAX_SPDIF_CHANNELS + 1;
        else if (idx == 2 || idx == 3)  /* S/PDIF left & right */
                out = idx + 7; /* 9-10 */
        else if (idx >= 4) /* analog */
@@ -101,9 +101,9 @@
 
        snd_ctl_elem_value_alloca(&val);
        snd_ctl_elem_value_set_interface(val, SND_CTL_ELEM_IFACE_MIXER);
-       if (stream >= 8) {
+       if (stream >= MAX_OUTPUT_CHANNELS) {
                snd_ctl_elem_value_set_name(val, SPDIF_PLAYBACK_ROUTE_NAME);
-               snd_ctl_elem_value_set_index(val, stream - 8);
+               snd_ctl_elem_value_set_index(val, stream - MAX_OUTPUT_CHANNELS);
        } else {
                snd_ctl_elem_value_set_name(val, ANALOG_PLAYBACK_ROUTE_NAME);
                snd_ctl_elem_value_set_index(val, stream);
@@ -131,12 +131,14 @@
 void patchbay_init(void)
 {
        int i;
+       int nb_active_channels;
        snd_ctl_elem_value_t *val;
 
        snd_ctl_elem_value_alloca(&val);
        snd_ctl_elem_value_set_interface(val, SND_CTL_ELEM_IFACE_MIXER);
        snd_ctl_elem_value_set_name(val, ANALOG_PLAYBACK_ROUTE_NAME);
        memset (stream_active, 0, (MAX_OUTPUT_CHANNELS + MAX_SPDIF_CHANNELS) * 
sizeof(int));
+       nb_active_channels = 0;
        for (i = 0; i < output_channels; i++) {
                snd_ctl_elem_value_set_numid(val, 0);
                snd_ctl_elem_value_set_index(val, i);
@@ -144,15 +146,20 @@
                        continue;
 
                stream_active[i] = 1;
+               nb_active_channels++;
        }
+       output_channels = nb_active_channels;
        snd_ctl_elem_value_set_name(val, SPDIF_PLAYBACK_ROUTE_NAME);
+       nb_active_channels = 0;
        for (i = 0; i < spdif_channels; i++) {
                snd_ctl_elem_value_set_numid(val, 0);
                snd_ctl_elem_value_set_index(val, i);
                if (snd_ctl_elem_read(ctl, val) < 0)
                        continue;
-               stream_active[i + 8] = 1;
+               stream_active[i + MAX_OUTPUT_CHANNELS] = 1;
+               nb_active_channels++;
        }
+       spdif_channels = nb_active_channels;
 }
 
 void patchbay_postinit(void)



-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to