[alsa-devel] [PATCH 1/4] ALSA: control: return payload length for TLV operation
Clemens Ladisch
clemens at ladisch.de
Tue Aug 30 09:05:33 CEST 2016
Takashi Sakamoto wrote:
> [...] APIs return operated length, while TLV feature
> can't. This is inconvenient to applications.
>
> This commit enables control core to return operated length of TLV feature.
> This changes the prototype of 'snd_kcontrol_tlv_rw_t' to get a pointer to
> size variable so that each implementation of the prototype can modify the
> variable with operated length.
I'll use this function as an example:
> --- a/sound/usb/mixer.c
> +++ b/sound/usb/mixer.c
> @@ -535,17 +535,20 @@ int snd_usb_set_cur_mix_value(struct usb_mixer_elem_info *cval, int channel,
> * TLV callback for mixer volume controls
> */
> int snd_usb_mixer_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
> - unsigned int size, unsigned int __user *_tlv)
> + unsigned int *size, unsigned int __user *_tlv)
> {
> struct usb_mixer_elem_info *cval = kcontrol->private_data;
> DECLARE_TLV_DB_MINMAX(scale, 0, 0);
>
> - if (size < sizeof(scale))
> + if (*size < sizeof(scale))
> return -ENOMEM;
> scale[2] = cval->dBmin;
> scale[3] = cval->dBmax;
> if (copy_to_user(_tlv, scale, sizeof(scale)))
> return -EFAULT;
> +
> + *size = sizeof(scale);
> +
> return 0;
> }
The size is already returned in scale[1] (it's initialized by
DECLARE_TLV_DB_MINMAX()). That's exactly what the "L" in "TLV" means.
All other TLV callbacks also take care to set this field correctly.
If there were any TLV callback that did not set _tlv[1] to the actual
size, it would be buggy, and just needed to be fixed to do so.
Regards,
Clemens
More information about the Alsa-devel
mailing list