On Fri, Jan 08, 2021 at 11:06:59PM +0900, Takashi Sakamoto wrote:
Hi,
On Fri, Jan 08, 2021 at 12:40:28PM +0100, Jaroslav Kysela wrote:
Dne 08. 01. 21 v 12:23 Jaska Uimonen napsal(a):
Current kcontrol structs don't have a member to describe the control type. The type is present in the widget which contains the control. As there can be many controls in one widget it is inherently presumed that the control types are the same.
Lately there has been use cases where different types of controls would be needed for single widget. Thus enable this by adding the control type to kcontrol and kcontrol_new structs.
It looks like a SoC only extension. Use private_data to carry this information. It has no value for the toplevel code.
Jaroslav
In current design of ALSA control core, the type of control element is firstly determined by driver in callback of snd_kcontrol.info(). The callback is done when userspace applications call ioctl(2) with SNDRV_CTL_IOCTL_ELEM_INFO request.
The patch doesn't touch to the above processing. It means that the type information is just for kernel-land implementation and is not exposed to userspace application.
Essentially, driver is dominant to determine the type of control element in control element set which the driver adds. It's possible to achieve your intension without changing ALSA control core itself, in my opinion.
As Jaroslav said, it's better to change core of ALSA SoC part according to your intention. If you'd like to change ALSA control core, I'd like to request for the check of mismatch between the value of added member in snd_kcontrol and the value of type of control element returned from driver, like:
diff --git a/sound/core/control.c b/sound/core/control.c index 809b0a62e..c3ae70574 100644 --- a/sound/core/control.c +++ b/sound/core/control.c @@ -973,6 +973,7 @@ static int __snd_ctl_elem_info(struct snd_card *card, result = kctl->info(kctl, info); if (result >= 0) { snd_BUG_ON(info->access); + snd_BUG_ON(info->type == kctl->kcontrol_type); index_offset = snd_ctl_get_ioff(kctl, &info->id); vd = &kctl->vd[index_offset]; snd_ctl_build_ioff(&info->id, kctl, index_offset);
Regards
Takashi Sakamoto
Hi,
Thanks for the comments, I tried to do the same thing now in asoc level, will send v2.
br, Jaska