Update of /cvsroot/alsa/alsa-kernel/usb In directory usw-pr-cvs1:/tmp/cvs-serv11821
Modified Files: usbmixer.c Log Message: tries to get min/max values of mixer elements later at info() callback even if the info cannot be obtained at loading time by some reason. Index: usbmixer.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/usb/usbmixer.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- usbmixer.c 15 Aug 2002 12:13:11 -0000 1.2 +++ usbmixer.c 2 Sep 2002 15:51:16 -0000 1.3 @@ -73,6 +73,7 @@ int channels; int val_type; int min, max; + unsigned int initialized: 1; }; @@ -498,6 +499,23 @@ uinfo->value.integer.min = 0; uinfo->value.integer.max = 1; } else { + if (! cval->initialized) { + int minchn = 0; + if (cval->cmask) { + int i; + for (i = 0; i < MAX_CHANNELS; i++) + if (cval->cmask & (1 << i)) { + minchn = i + 1; + 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) { + snd_printk(KERN_ERR "%d:%d: cannot get min/max values +for control %d\n", cval->id, cval->ctrlif, cval->control); + return -EINVAL; + } + cval->initialized = 1; + } uinfo->value.integer.min = 0; uinfo->value.integer.max = cval->max - cval->min; } @@ -515,8 +533,10 @@ for (c = 0; c < MAX_CHANNELS; c++) { if (cval->cmask & (1 << c)) { err = get_cur_mix_value(cval, c + 1, &val); - if (err < 0) + if (err < 0) { + printk("cannot get current value for control +%d ch %d: err = %d\n", cval->control, c + 1, err); return err; + } val = get_relative_value(cval, val); ucontrol->value.integer.value[cnt] = val; cnt++; @@ -525,8 +545,10 @@ } else { /* master channel */ err = get_cur_mix_value(cval, 0, &val); - if (err < 0) + if (err < 0) { + printk("cannot get current value for control %d master ch: err += %d\n", cval->control, err); return err; + } val = get_relative_value(cval, val); ucontrol->value.integer.value[0] = val; } @@ -592,6 +614,7 @@ int nameid = desc[desc[0] - 1]; snd_kcontrol_t *kctl; usb_mixer_elem_info_t *cval; + int minchn = 0; if (control == USB_FEATURE_GEQ) { /* FIXME: not supported yet */ @@ -614,22 +637,25 @@ else { int i, c = 0; for (i = 0; i < 16; i++) - if (ctl_mask & (1 << i)) + if (ctl_mask & (1 << i)) { + if (! minchn) + minchn = i + 1; c++; + } cval->channels = c; } /* get min/max values */ if (cval->val_type == USB_MIXER_BOOLEAN || - cval->val_type == USB_MIXER_INV_BOOLEAN) + cval->val_type == USB_MIXER_INV_BOOLEAN) { cval->max = 1; - else { - if (get_ctl_value(cval, GET_MAX, ((cval->control+1) << 8) | (ctl_mask ? 1 : 0), &cval->max) < 0 || - get_ctl_value(cval, GET_MIN, ((cval->control+1) << 8) | (ctl_mask ? 1 : 0), &cval->min) < 0) { + 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) snd_printk(KERN_ERR "%d:%d: cannot get min/max values for control %d\n", cval->id, cval->ctrlif, control); - snd_magic_kfree(cval); - return; - } + else + cval->initialized = 1; } kctl = snd_ctl_new1(&usb_feature_unit_ctl, cval); @@ -759,6 +785,7 @@ int i, len; snd_kcontrol_t *kctl; usb_audio_term_t iterm; + int minchn = 0; cval = snd_magic_kcalloc(usb_mixer_elem_info_t, 0, GFP_KERNEL); if (! cval) @@ -776,16 +803,17 @@ if (check_matrix_bitmap(desc + 9 + num_ins, in_ch, i, num_outs)) { cval->cmask |= (1 << i); cval->channels++; + if (! minchn) + minchn = i + 1; } } /* get min/max values */ - if (get_ctl_value(cval, GET_MAX, ((in_ch+1) << 8) | 1, &cval->max) < 0 || - get_ctl_value(cval, GET_MIN, ((in_ch+1) << 8) | 1, &cval->min) < 0) { + 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) snd_printk(KERN_ERR "cannot get min/max values for mixer\n"); - snd_magic_kfree(cval); - return; - } + else + cval->initialized = 1; kctl = snd_ctl_new1(&usb_feature_unit_ctl, cval); if (! kctl) { @@ -994,11 +1022,10 @@ /* get min/max values */ if (get_ctl_value(cval, GET_MAX, cval->control, &cval->max) < 0 || - get_ctl_value(cval, GET_MIN, cval->control, &cval->min) < 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"); - snd_magic_kfree(cval); - continue; - } + else + cval->initialized = 1; kctl = snd_ctl_new1(&mixer_procunit_ctl, cval); if (! kctl) { @@ -1158,6 +1185,7 @@ cval->channels = 1; cval->min = 1; cval->max = num_ins; + cval->initialized = 1; namelist = kmalloc(sizeof(char *) * num_ins, GFP_KERNEL); if (! namelist) { ------------------------------------------------------- This sf.net email is sponsored by: OSDN - Tired of that same old cell phone? Get a new here for FREE! https://www.inphonic.com/r.asp?r=sourceforge1&refcode1=vs3390 _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog