[alsa-devel] [PATCH 2/2] sound: usb: allow clock source validity interrupts

Takashi Iwai tiwai at suse.de
Sat Apr 9 10:52:17 CEST 2016


On Fri, 08 Apr 2016 19:52:02 +0200,
Daniel Mack wrote:
> 
> miniDSP USBStreamer UAC2 devices send clock validity changes with the
> control field set to zero. The current interrupt handler ignores all
> packets if the control field does not match the mixer element's, but
> it really should only do that in case that field is needed to
> distinguish multiple elements with the same ID.
> 
> This patch implements a logic that lets notifications packets pass
> if the element ID is unique for a given device.
> 
> Signed-off-by: Daniel Mack <daniel at zonque.org>
> ---
>  sound/usb/mixer.c | 9 ++++++++-
>  1 file changed, 8 insertions(+), 1 deletion(-)
> 
> diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
> index 973274b..aa6f16e 100644
> --- a/sound/usb/mixer.c
> +++ b/sound/usb/mixer.c
> @@ -2371,6 +2371,7 @@ static void snd_usb_mixer_interrupt_v2(struct usb_mixer_interface *mixer,
>  	__u8 unitid = (index >> 8) & 0xff;
>  	__u8 control = (value >> 8) & 0xff;
>  	__u8 channel = value & 0xff;
> +	unsigned int count = 0;
>  
>  	if (channel >= MAX_CHANNELS) {
>  		usb_audio_dbg(mixer->chip,
> @@ -2379,6 +2380,12 @@ static void snd_usb_mixer_interrupt_v2(struct usb_mixer_interface *mixer,
>  		return;
>  	}
>  
> +	for (list = mixer->id_elems[unitid]; list; list = list->next_id_elem)
> +		count++;
> +
> +	if (count == 0)
> +		return;
> +
>  	for (list = mixer->id_elems[unitid]; list; list = list->next_id_elem) {
>  		struct usb_mixer_elem_info *info;
>  
> @@ -2386,7 +2393,7 @@ static void snd_usb_mixer_interrupt_v2(struct usb_mixer_interface *mixer,
>  			continue;
>  
>  		info = (struct usb_mixer_elem_info *)list;
> -		if (info->control != control)
> +		if (count > 1 && info->control != control)
>  			continue;

Just for checking count=0 and count=1, we need no loop to count
beforehand.
		if (info->control != control &&
		    (list != mixer->id_elems[unit] ||
		     list->list_next_id_elem))
			continue;

But, this doesn't look better and is more harder to understand, so I'm
not willing to sell it :)


thanks,

Takashi


More information about the Alsa-devel mailing list