[alsa-devel] Fwd: Re: [PATCH v6 1/1] ALSA: Tascam US-16x08 DSP mixer quirk
Takashi Iwai
tiwai at suse.de
Thu Feb 16 08:56:54 CET 2017
On Wed, 15 Feb 2017 18:32:07 +0100,
Detlef Urban wrote:
>
>
> It seems that my approach to add names to snd_ctl_elem_info
> enumeration is wrong (see bleow).
> I couldn't find documentation or any example to lean on.
> Any hints ?
>
>
> -------- Weitergeleitete Nachricht --------
> Betreff: Re: [alsa-devel] [PATCH v6 1/1] ALSA: Tascam US-16x08
> DSP mixer quirk
> Datum: Wed, 15 Feb 2017 23:46:04 +0800
> Von: kbuild test robot <lkp at intel.com>
> An: OnkelDead <onkel at paraair.de>
> Kopie (CC): OnkelDead <onkel at paraair.de>,
> alsa-devel at alsa-project.org, kbuild-all at 01.org, tiwai at suse.com
>
>
>
> Hi OnkelDead,
>
> [auto build test WARNING on sound/for-next]
> [also build test WARNING on v4.10-rc8 next-20170215]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/OnkelDead/ALSA-Tascam-US-16x08-DSP-mixer-quirk/20170215-222805
> base: https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git for-next
> config: blackfin-allmodconfig (attached as .config)
> compiler: bfin-uclinux-gcc (GCC) 6.2.0
> reproduce:
> wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # save the attached .config to linux build tree
> make.cross ARCH=blackfin
>
> All warnings (new ones prefixed by >>):
>
> sound/usb/mixer_us16x08.c: In function 'snd_us16x08_route_info':
> >> sound/usb/mixer_us16x08.c:201:38: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
> uinfo->value.enumerated.names_ptr = (__u64) route_names;
> ^
>
> vim +201 sound/usb/mixer_us16x08.c
>
> 185 }
> 186
> 187 return err;
> 188 }
> 189
> 190 static int snd_us16x08_route_info(struct snd_kcontrol *kcontrol,
> 191 struct snd_ctl_elem_info *uinfo)
> 192 {
> 193 int i;
> 194
> 195 uinfo->count = 1;
> 196 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
> 197 uinfo->value.integer.max = SND_US16X08_KCMAX(kcontrol);
> 198 uinfo->value.integer.min = SND_US16X08_KCMIN(kcontrol);
> 199 uinfo->value.integer.step = SND_US16X08_KCSTEP(kcontrol);
> 200 uinfo->value.enumerated.items = 10;
> > 201 uinfo->value.enumerated.names_ptr = (__u64) route_names;
> 202 uinfo->value.enumerated.names_length = 0;
> 203 for (i = 0; i < 10; i++)
> 204 uinfo->value.enumerated.names_length +=
> 205 strlen(route_names[i]) + 1;
> 206 return 0;
> 207 }
The code does wrong in multiple ways.
First off, if you use ENUMERATED type, you can't set
uinfo->value.integer.*, but you can set only
uinfo->value.enumerated.*. It's a union, so you know why.
Second, value.enumerated.names_ptr and value.enumerated.names_length
are not used for the normal kctls, it's only for special kctls. Leave
them.
Third, the concept of enum kctl info callback is to return only three
things: count, value.enumerated.items, and value.enumerated.name.
The first one is the size of the array, the second is the size of the
enum list, and the third one is the enum string corresponding to the
value.enumearted.item given by the caller.
And, the solution is, like Clemens already mentioned, to use
snd_ctl_enum_info() helper function:
static int snd_us16x08_route_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
return snd_ctl_enum_info(uinfo, 1, 10, route_names);
}
Takashi
More information about the Alsa-devel
mailing list