Update of /cvsroot/alsa/alsa-kernel/usb
In directory usw-pr-cvs1:/tmp/cvs-serv11371

Modified Files:
        usbmixer.c usbmixer_maps.c 
Log Message:
- allow control mappers to specify the control type of 
  each unit.
- more descriptions for extigy.



Index: usbmixer.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbmixer.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- usbmixer.c  10 Oct 2002 13:45:32 -0000      1.5
+++ usbmixer.c  11 Oct 2002 11:32:43 -0000      1.6
@@ -78,7 +78,8 @@
 
 
 enum {
-       USB_FEATURE_MUTE = 0,
+       USB_FEATURE_NONE = 0,
+       USB_FEATURE_MUTE = 1,
        USB_FEATURE_VOLUME,
        USB_FEATURE_BASS,
        USB_FEATURE_MID,
@@ -99,6 +100,40 @@
        USB_MIXER_U16,
 };
 
+enum {
+       USB_PROC_UPDOWN = 1,
+       USB_PROC_UPDOWN_SWITCH = 1,
+       USB_PROC_UPDOWN_MODE_SEL = 2,
+
+       USB_PROC_PROLOGIC = 2,
+       USB_PROC_PROLOGIC_SWITCH = 1,
+       USB_PROC_PROLOGIC_MODE_SEL = 2,
+
+       USB_PROC_3DENH = 3,
+       USB_PROC_3DENH_SWITCH = 1,
+       USB_PROC_3DENH_SPACE = 2,
+
+       USB_PROC_REVERB = 4,
+       USB_PROC_REVERB_SWITCH = 1,
+       USB_PROC_REVERB_LEVEL = 2,
+       USB_PROC_REVERB_TIME = 3,
+       USB_PROC_REVERB_DELAY = 4,
+
+       USB_PROC_CHORUS = 5,
+       USB_PROC_CHORUS_SWITCH = 1,
+       USB_PROC_CHORUS_LEVEL = 2,
+       USB_PROC_CHORUS_RATE = 3,
+       USB_PROC_CHORUS_DEPTH = 4,
+
+       USB_PROC_DCR = 6,
+       USB_PROC_DCR_SWITCH = 1,
+       USB_PROC_DCR_RATIO = 2,
+       USB_PROC_DCR_MAX_AMP = 3,
+       USB_PROC_DCR_THRESHOLD = 4,
+       USB_PROC_DCR_ATTACK = 5,
+       USB_PROC_DCR_RELEASE = 6,
+};
+
 #define MAX_CHANNELS   10      /* max logical channels */
 
 
@@ -110,7 +145,7 @@
 #include "usbmixer_maps.c"
 
 /* get the mapped name if the unit matches */
-static int check_mapped_name(mixer_build_t *state, int unitid, char *buf, int buflen)
+static int check_mapped_name(mixer_build_t *state, int unitid, int control, char 
+*buf, int buflen)
 {
        const struct usbmix_ctl_map *map;
        const struct usbmix_name_map *p;
@@ -121,7 +156,8 @@
                    map->product != dev->idProduct)
                        continue;
                for (p = map->map; p->id; p++) {
-                       if (p->id == unitid) {
+                       if (p->id == unitid &&
+                           (! control || ! p->control || control == p->control)) {
                                buflen--;
                                strncpy(buf, p->name, buflen - 1);
                                buf[buflen] = 0;
@@ -258,7 +294,7 @@
 /* channel = 0: master, 1 = first channel */
 inline static int get_cur_mix_value(usb_mixer_elem_info_t *cval, int channel, int 
*value)
 {
-       return get_ctl_value(cval, GET_CUR, ((cval->control + 1) << 8) | channel, 
value);
+       return get_ctl_value(cval, GET_CUR, (cval->control << 8) | channel, value);
 }
 
 /*
@@ -287,7 +323,7 @@
 
 inline static int set_cur_mix_value(usb_mixer_elem_info_t *cval, int channel, int 
value)
 {
-       return set_ctl_value(cval, SET_CUR, ((cval->control + 1) << 8) | channel, 
value);
+       return set_ctl_value(cval, SET_CUR, (cval->control << 8) | channel, value);
 }
 
 
@@ -540,8 +576,8 @@
                                                break;
                                        }
                        }
-                       if (get_ctl_value(cval, GET_MAX, ((cval->control+1) << 8) | 
minchn, &cval->max) < 0 ||
-                           get_ctl_value(cval, GET_MIN, ((cval->control+1) << 8) | 
minchn, &cval->min) < 0) {
+                       if (get_ctl_value(cval, GET_MAX, (cval->control << 8) | 
+minchn, &cval->max) < 0 ||
+                           get_ctl_value(cval, GET_MIN, (cval->control << 8) | 
+minchn, &cval->min) < 0) {
                                snd_printk(KERN_ERR "%d:%d: cannot get min/max values 
for control %d\n", cval->id, cval->ctrlif, cval->control);
                                return -EINVAL;
                        }
@@ -647,6 +683,8 @@
        usb_mixer_elem_info_t *cval;
        int minchn = 0;
 
+       control++; /* change from zero-based to 1-based value */
+
        if (control == USB_FEATURE_GEQ) {
                /* FIXME: not supported yet */
                return;
@@ -662,7 +700,7 @@
        cval->id = unitid;
        cval->control = control;
        cval->cmask = ctl_mask;
-       cval->val_type = audio_feature_info[control].type;
+       cval->val_type = audio_feature_info[control-1].type;
        if (ctl_mask == 0)
                cval->channels = 1;     /* master channel */
        else {
@@ -682,8 +720,8 @@
                cval->max = 1;
                cval->initialized = 1;
        } else {
-               if (get_ctl_value(cval, GET_MAX, ((cval->control+1) << 8) | minchn, 
&cval->max) < 0 ||
-                   get_ctl_value(cval, GET_MIN, ((cval->control+1) << 8) | minchn, 
&cval->min) < 0)
+               if (get_ctl_value(cval, GET_MAX, (cval->control << 8) | minchn, 
+&cval->max) < 0 ||
+                   get_ctl_value(cval, GET_MIN, (cval->control << 8) | minchn, 
+&cval->min) < 0)
                        snd_printk(KERN_ERR "%d:%d: cannot get min/max values for 
control %d\n", cval->id, cval->ctrlif, control);
                else
                        cval->initialized = 1;
@@ -697,7 +735,7 @@
        }
        kctl->private_free = usb_mixer_elem_free;
 
-       len = check_mapped_name(state, unitid, kctl->id.name, sizeof(kctl->id.name));
+       len = check_mapped_name(state, unitid, control, kctl->id.name, 
+sizeof(kctl->id.name));
        mapped_name = len != 0;
        if (! len && nameid)
                len = snd_usb_copy_string_desc(state, nameid, kctl->id.name, 
sizeof(kctl->id.name));
@@ -742,7 +780,7 @@
 
        default:
                if (! len)
-                       strcpy(kctl->id.name, audio_feature_info[control].name);
+                       strcpy(kctl->id.name, audio_feature_info[control-1].name);
                break;
        }
 
@@ -835,7 +873,7 @@
        cval->chip = state->chip;
        cval->ctrlif = state->ctrlif;
        cval->id = unitid;
-       cval->control = in_ch;
+       cval->control = in_ch + 1; /* based on 1 */
        cval->val_type = USB_MIXER_S16;
        for (i = 0; i < num_outs; i++) {
                if (check_matrix_bitmap(desc + 9 + num_ins, in_ch, i, num_outs)) {
@@ -847,8 +885,8 @@
        }
 
        /* get min/max values */
-       if (get_ctl_value(cval, GET_MAX, ((in_ch+1) << 8) | minchn, &cval->max) < 0 ||
-           get_ctl_value(cval, GET_MIN, ((in_ch+1) << 8) | minchn, &cval->min) < 0)
+       if (get_ctl_value(cval, GET_MAX, (cval->control << 8) | minchn, &cval->max) < 
+0 ||
+           get_ctl_value(cval, GET_MIN, (cval->control << 8) | minchn, &cval->min) < 
+0)
                snd_printk(KERN_ERR "cannot get min/max values for mixer\n");
        else
                cval->initialized = 1;
@@ -861,7 +899,7 @@
        }
        kctl->private_free = usb_mixer_elem_free;
 
-       len = check_mapped_name(state, unitid, kctl->id.name, sizeof(kctl->id.name));
+       len = check_mapped_name(state, unitid, 0, kctl->id.name, 
+sizeof(kctl->id.name));
        if (! len)
                len = get_term_name(state, &iterm, kctl->id.name, 
sizeof(kctl->id.name), 0);
        if (! len)
@@ -958,51 +996,51 @@
 };
 
 static struct procunit_value_info updown_proc_info[] = {
-       { 0x01, "Switch", USB_MIXER_BOOLEAN },
-       { 0x02, "Mode Select", USB_MIXER_U8 },
+       { USB_PROC_UPDOWN_SWITCH, "Switch", USB_MIXER_BOOLEAN },
+       { USB_PROC_UPDOWN_MODE_SEL, "Mode Select", USB_MIXER_U8 },
        { 0 }
 };
 static struct procunit_value_info prologic_proc_info[] = {
-       { 0x01, "Switch", USB_MIXER_BOOLEAN },
-       { 0x02, "Mode Select", USB_MIXER_U8 },
+       { USB_PROC_PROLOGIC_SWITCH, "Switch", USB_MIXER_BOOLEAN },
+       { USB_PROC_PROLOGIC_MODE_SEL, "Mode Select", USB_MIXER_U8 },
        { 0 }
 };
 static struct procunit_value_info threed_enh_proc_info[] = {
-       { 0x01, "Switch", USB_MIXER_BOOLEAN },
-       { 0x02, "Spaciousness", USB_MIXER_U8 },
+       { USB_PROC_3DENH_SWITCH, "Switch", USB_MIXER_BOOLEAN },
+       { USB_PROC_3DENH_SPACE, "Spaciousness", USB_MIXER_U8 },
        { 0 }
 };
 static struct procunit_value_info reverb_proc_info[] = {
-       { 0x01, "Switch", USB_MIXER_BOOLEAN },
-       { 0x02, "Level", USB_MIXER_U8 },
-       { 0x03, "Time", USB_MIXER_U16 },
-       { 0x04, "Delay", USB_MIXER_U8 },
+       { USB_PROC_REVERB_SWITCH, "Switch", USB_MIXER_BOOLEAN },
+       { USB_PROC_REVERB_LEVEL, "Level", USB_MIXER_U8 },
+       { USB_PROC_REVERB_TIME, "Time", USB_MIXER_U16 },
+       { USB_PROC_REVERB_DELAY, "Delay", USB_MIXER_U8 },
        { 0 }
 };
 static struct procunit_value_info chorus_proc_info[] = {
-       { 0x01, "Switch", USB_MIXER_BOOLEAN },
-       { 0x02, "Level", USB_MIXER_U8 },
-       { 0x03, "Rate", USB_MIXER_U16 },
-       { 0x04, "Depth", USB_MIXER_U16 },
+       { USB_PROC_CHORUS_SWITCH, "Switch", USB_MIXER_BOOLEAN },
+       { USB_PROC_CHORUS_LEVEL, "Level", USB_MIXER_U8 },
+       { USB_PROC_CHORUS_RATE, "Rate", USB_MIXER_U16 },
+       { USB_PROC_CHORUS_DEPTH, "Depth", USB_MIXER_U16 },
        { 0 }
 };
 static struct procunit_value_info dcr_proc_info[] = {
-       { 0x01, "Switch", USB_MIXER_BOOLEAN },
-       { 0x02, "Ratio", USB_MIXER_U16 },
-       { 0x03, "Max Amp", USB_MIXER_S16 },
-       { 0x04, "Threshold", USB_MIXER_S16 },
-       { 0x05, "Attack Time", USB_MIXER_U16 },
-       { 0x06, "Release Time", USB_MIXER_U16 },
+       { USB_PROC_DCR_SWITCH, "Switch", USB_MIXER_BOOLEAN },
+       { USB_PROC_DCR_RATIO, "Ratio", USB_MIXER_U16 },
+       { USB_PROC_DCR_MAX_AMP, "Max Amp", USB_MIXER_S16 },
+       { USB_PROC_DCR_THRESHOLD, "Threshold", USB_MIXER_S16 },
+       { USB_PROC_DCR_ATTACK, "Attack Time", USB_MIXER_U16 },
+       { USB_PROC_DCR_RELEASE, "Release Time", USB_MIXER_U16 },
        { 0 }
 };
 
 static struct procunit_info procunits[] = {
-       { 0x01, "Up Down", updown_proc_info },
-       { 0x02, "Dolby Prologic", prologic_proc_info },
-       { 0x03, "3D Stereo Extender", threed_enh_proc_info },
-       { 0x04, "Reverb", reverb_proc_info },
-       { 0x05, "Chorus", chorus_proc_info },
-       { 0x06, "DCR", dcr_proc_info },
+       { USB_PROC_UPDOWN, "Up Down", updown_proc_info },
+       { USB_PROC_PROLOGIC, "Dolby Prologic", prologic_proc_info },
+       { USB_PROC_3DENH, "3D Stereo Extender", threed_enh_proc_info },
+       { USB_PROC_REVERB, "Reverb", reverb_proc_info },
+       { USB_PROC_CHORUS, "Chorus", chorus_proc_info },
+       { USB_PROC_DCR, "DCR", dcr_proc_info },
        { 0 },
 };
 
@@ -1065,6 +1103,8 @@
                if (get_ctl_value(cval, GET_MAX, cval->control, &cval->max) < 0 ||
                    get_ctl_value(cval, GET_MIN, cval->control, &cval->min) < 0)
                        snd_printk(KERN_ERR "cannot get min/max values for proc/ext 
unit\n");
+               else if (cval->max <= cval->min)
+                       snd_printk(KERN_ERR "invalid min/max values (%d/%d) for 
+proc/ext unit %d\n", cval->min, cval->max, unitid);
                else
                        cval->initialized = 1;
 
@@ -1076,7 +1116,7 @@
                }
                kctl->private_free = usb_mixer_elem_free;
 
-               if (check_mapped_name(state, unitid, kctl->id.name, 
sizeof(kctl->id.name)))
+               if (check_mapped_name(state, unitid, cval->control, kctl->id.name, 
+sizeof(kctl->id.name)))
                        ;
                else if (info->name)
                        strcpy(kctl->id.name, info->name);
@@ -1271,7 +1311,7 @@
        kctl->private_free = usb_mixer_selector_elem_free;
 
        nameid = desc[desc[0] - 1];
-       len = check_mapped_name(state, unitid, kctl->id.name, sizeof(kctl->id.name));
+       len = check_mapped_name(state, unitid, 0, kctl->id.name, 
+sizeof(kctl->id.name));
        if (len)
                ;
        else if (nameid)

Index: usbmixer_maps.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/usb/usbmixer_maps.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- usbmixer_maps.c     10 Oct 2002 13:45:32 -0000      1.1
+++ usbmixer_maps.c     11 Oct 2002 11:32:43 -0000      1.2
@@ -23,6 +23,7 @@
 struct usbmix_name_map {
        int id;
        const char *name;
+       int control;
 };
 
 struct usbmix_ctl_map {
@@ -38,31 +39,52 @@
 /*
  * Topology of SB Extigy (see on the wide screen :)
 
-USB_IN[1] --->FU[2] -----------------------------+->MU[16] - PE[17]-+- FU[18] -+- 
EU[27] -+- EU[21] - FU[22] -+- FU[23] > Dig_OUT[24]
-                                                 |                  |          |      
    |                   |
-USB_IN[3] -+->SU[5] - FU[6] -+- MU[14] - PE[15] -+                  |          |      
    |                   +- FU[25] > Dig_OUT[26]
-           ^                 |                   |                  |          |      
    |
-Dig_IN[4] -+                 |                   |                  |          |      
    +- FU[28] --------------------> Spk_OUT[19]
+USB_IN[1] 
+--->FU[2]------------------------------+->MU[16]-->PE[17]-+->FU[18]--+->EU[27]--+->EU[21]-->FU[22]--+->FU[23]
+ > Dig_OUT[24]
+                                                 ^                  |          |      
+    |                   |
+USB_IN[3] -+->SU[5]-->FU[6]--+->MU[14] ->PE[15]->+                  |          |      
+    |                   +->FU[25] > Dig_OUT[26]
+           ^                 ^                   |                  |          |      
+    |
+Dig_IN[4] -+                 |                   |                  |          |      
+    +->FU[28]---------------------> Spk_OUT[19]
                              |                   |                  |          |
-Lin-IN[7] -+-- FU[8] --------+                   |                  |          
+----------------------------------------> Hph_OUT[20]
+Lin-IN[7] -+-->FU[8]---------+                   |                  |          
++----------------------------------------> Hph_OUT[20]
            |                                     |                  |
-Mic-IN[9] --+- FU[10] ---------------------------+                  |
+Mic-IN[9] --+->FU[10]----------------------------+                  |
            ||                                                       |
            ||  +----------------------------------------------------+
            VV  V
-           ++--+->SU[11] ->FU[12] 
-------------------------------------------------------------------------------------->
 USB_OUT[13]
+           ++--+->SU[11]-->FU[12] 
+-------------------------------------------------------------------------------------->
+ USB_OUT[13]
 */
 
 static struct usbmix_name_map extigy_map[] = {
+       /* 1: IT pcm */
        { 2, "PCM Playback" }, /* FU */
-       { 5, "Digital Playback Source" }, /* SU */
-       { 6, "Digital" }, /* FU */
+       /* 3: IT pcm */
+       /* 4: IT digital in */
+       { 5, "Digital In Playback Source" }, /* SU */
+       { 6, "Digital In" }, /* FU */
+       /* 7: IT line */
        { 8, "Line Playback" }, /* FU */
+       /* 9: IT mic */
        { 10, "Mic Playback" }, /* FU */
        { 11, "Capture Source" }, /* SU */
        { 12, "Capture" }, /* FU */
-       { 18, "Master Playback" }, /* FU */
-       /* FIXME: more to come here... */
+       /* 13: OT pcm capture */
+       /* 14: MU (w/o controls) */
+       /* 15: PE (3D enh) */
+       /* 16: MU (w/o controls) */
+       /* 17: PE (updown) */           /* FIXME: what control? */
+       { 18, "Tone Control - Bass", USB_FEATURE_BASS }, /* FU */
+       { 18, "Tone Control - Treble", USB_FEATURE_TREBLE }, /* FU */
+       { 18, "Master Playback" }, /* FU; others */
+       /* 19: OT speaker */
+       /* 20: OT headphone */
+       { 21, "Digital Out Extension" }, /* EU */ /* FIXME: what? */
+       { 22, "Digital Out Playback" }, /* FU */
+       { 23, "Digital Out1 Playback" }, /* FU */  /* FIXME: corresponds to 24 */
+       /* 24: OT digital out */
+       { 25, "Digital Out2 Playback" }, /* FU */  /* FIXME: corresponds to 26 */
+       /* 26: OT digital out */
+       { 27, "Output Extension" }, /* EU */ /* FIXME: what? */
+       /* 28: FU (mute) */
        { 0 } /* terminator */
 };
 



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to