[alsa-devel] [PATCH 1/4] ALSA: control: return payload length for TLV operation

Takashi Sakamoto o-takashi at sakamocchi.jp
Tue Aug 30 09:09:33 CEST 2016


On Aug 30 2016 16:05, Clemens Ladisch wrote:
> 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.

As I described, TLV feature of ALSA control interface is not only used 
to transfer threshold level information, but also arbitrary data for I/O 
by developers in ALSA SoC part. The '_tlv[1]' protocol is not 
necessarily kept by them.


Regards

Takashi Sakamoto


More information about the Alsa-devel mailing list