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