16 Feb
2017
16 Feb
'17
12:09 p.m.
On Thu, 16 Feb 2017 10:48:42 +0100, OnkelDead wrote:
+static int snd_us16x08_route_get(struct snd_kcontrol *kcontrol,
- struct snd_ctl_elem_value *ucontrol)
+{
- struct usb_mixer_elem_info *elem = kcontrol->private_data;
- int index = ucontrol->id.index;
- /* route has no bias */
- ucontrol->value.integer.value[0] = elem->cache_val[index];
This should be ucontrol->value.enumerated.item[0], instead.
+static int snd_us16x08_route_put(struct snd_kcontrol *kcontrol,
- struct snd_ctl_elem_value *ucontrol)
+{
...
- /* get the new value (no bias for routes) */
- val = ucontrol->value.integer.value[0];
Ditto.
- if (val < 2) {
/* input comes from a master channel */
val_org = val;
buf[2] = 0x02;
- } else {
/* input comes from a computer channel */
buf[2] = 0x03;
val_org = val - 2;
- }
Note that there is no value range check before passed to put callback, thus you should put some sanity check before this evaluation,
if (val < 0 || val >= 10) return -EINVAL;
The same is applied to other put callback with INTEGER type, too.
I could fix a trivial thing like the missing static in my side, but the things like the above are a fundamental bug, so please fix and resubmit.
thanks,
Takashi