[alsa-devel] [PATCH v2] ALSA: usb-audio: Recurse before saving terminal properties

Daniel Mack daniel at zonque.org
Wed Aug 19 17:17:19 CEST 2015


On 08/19/2015 09:28 AM, Julian Scheel wrote:
> The input terminal parser recurses into the referenced clock entity to verify
> it is existant and thus the terminal descriptor is valid. The actual property
> values of the term instance which is initially parsed must not be overriden by
> the recursion. For this to work the term properties have to be assigned after
> recursing into the referenced clock entity descriptors.
> 
> Signed-off-by: Julian Scheel <julian at jusst.de>

Given your explanations, I believe this is the right thing to do.

Acked-by: Daniel Mack <daniel at zonque.org>


Thanks!


> ---
> Changes in v2:
> - Store term->id after recursion as well, as it gets overriden in the
>   recursion
> - Add comments explaining that the recursion is only for validation of the
>   descriptor validity
> ---
>  sound/usb/mixer.c | 16 +++++++++++-----
>  1 file changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
> index 81055d3..c50790c 100644
> --- a/sound/usb/mixer.c
> +++ b/sound/usb/mixer.c
> @@ -731,15 +731,21 @@ static int check_input_term(struct mixer_build *state, int id,
>  				term->name = d->iTerminal;
>  			} else { /* UAC_VERSION_2 */
>  				struct uac2_input_terminal_descriptor *d = p1;
> -				term->type = le16_to_cpu(d->wTerminalType);
> -				term->channels = d->bNrChannels;
> -				term->chconfig = le32_to_cpu(d->bmChannelConfig);
> -				term->name = d->iTerminal;
>  
> -				/* call recursively to get the clock selectors */
> +				/* call recursively to verify that the
> +				 * referenced clock entity is valid */
>  				err = check_input_term(state, d->bCSourceID, term);
>  				if (err < 0)
>  					return err;
> +
> +				/* save input term properties after recursion,
> +				 * to ensure they are not overriden by the
> +				 * recursion calls */
> +				term->id = id;
> +				term->type = le16_to_cpu(d->wTerminalType);
> +				term->channels = d->bNrChannels;
> +				term->chconfig = le32_to_cpu(d->bmChannelConfig);
> +				term->name = d->iTerminal;
>  			}
>  			return 0;
>  		case UAC_FEATURE_UNIT: {
> 



More information about the Alsa-devel mailing list