From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Iwai Subject: Re: [PATCH] ALSA: usb-audio: Recurse before saving terminal properties Date: Fri, 14 Aug 2015 15:06:58 +0200 Message-ID: References: <1439410499-28630-1-git-send-email-julian@jusst.de> Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by alsa0.perex.cz (Postfix) with ESMTP id F422626549F for ; Fri, 14 Aug 2015 15:06:59 +0200 (CEST) In-Reply-To: <1439410499-28630-1-git-send-email-julian@jusst.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: Julian Scheel Cc: alsa-devel@alsa-project.org, Daniel Mack List-Id: alsa-devel@alsa-project.org On Wed, 12 Aug 2015 22:14:59 +0200, Julian Scheel wrote: > > When the descriptor parser recurses into the clock source descriptor, the > terminals properties, like name and type, are set to the values of the clock > selector as check_input_term overwrites term->name and others in the recursive > call. As we want to only fill missing values using the descriptors higher in > the recursion tree the properties taken from the actual descriptor must be > applied after recursing. > > Signed-off-by: Julian Scheel Thanks for the patch. I vaguely remember of a similar patch, maybe you who already sent. One thing I find uncertain is whether this breaks the current logic completely, namely: > @@ -715,15 +715,16 @@ 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 */ > err = check_input_term(state, d->bCSourceID, term); > if (err < 0) > return err; > + > + term->type = le16_to_cpu(d->wTerminalType); > + term->channels = d->bNrChannels; > + term->chconfig = le32_to_cpu(d->bmChannelConfig); > + term->name = d->iTerminal; ... by this override, essentially all fields except for id are restored. Then what's the point to call check_input_term() for the clock source? Maybe Daniel can answer better how the original code is supposed to work. Daniel? Takashi