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 _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel