[alsa-devel] [PATCH 1/4] ALSA: usb-audio: parse more format descriptors with structs

Takashi Iwai tiwai at suse.de
Thu May 27 10:09:41 CEST 2010


At Wed, 26 May 2010 18:11:36 +0200,
Daniel Mack wrote:
> 
> Signed-off-by: Daniel Mack <daniel at caiaq.de>

Applied all patches now.  Thanks.


Takashi

> ---
>  sound/usb/endpoint.c |   11 +++++++----
>  sound/usb/format.c   |   20 ++++++++++----------
>  sound/usb/format.h   |    7 ++++---
>  3 files changed, 21 insertions(+), 17 deletions(-)
> 
> diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
> index ef07a6d..4887342 100644
> --- a/sound/usb/endpoint.c
> +++ b/sound/usb/endpoint.c
> @@ -158,8 +158,9 @@ int snd_usb_parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
>  	int i, altno, err, stream;
>  	int format = 0, num_channels = 0;
>  	struct audioformat *fp = NULL;
> -	unsigned char *fmt, *csep;
> +	unsigned char *csep;
>  	int num, protocol;
> +	struct uac_format_type_i_continuous_descriptor *fmt;
>  
>  	dev = chip->dev;
>  
> @@ -256,8 +257,8 @@ int snd_usb_parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
>  				   dev->devnum, iface_no, altno);
>  			continue;
>  		}
> -		if (((protocol == UAC_VERSION_1) && (fmt[0] < 8)) ||
> -		    ((protocol == UAC_VERSION_2) && (fmt[0] != 6))) {
> +		if (((protocol == UAC_VERSION_1) && (fmt->bLength < 8)) ||
> +		    ((protocol == UAC_VERSION_2) && (fmt->bLength != 6))) {
>  			snd_printk(KERN_ERR "%d:%u:%d : invalid UAC_FORMAT_TYPE desc\n",
>  				   dev->devnum, iface_no, altno);
>  			continue;
> @@ -268,7 +269,9 @@ int snd_usb_parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
>  		 * with the previous one, except for a larger packet size, but
>  		 * is actually a mislabeled two-channel setting; ignore it.
>  		 */
> -		if (fmt[4] == 1 && fmt[5] == 2 && altno == 2 && num == 3 &&
> +		if (fmt->bNrChannels == 1 &&
> +		    fmt->bSubframeSize == 2 &&
> +		    altno == 2 && num == 3 &&
>  		    fp && fp->altsetting == 1 && fp->channels == 1 &&
>  		    fp->formats == SNDRV_PCM_FMTBIT_S16_LE &&
>  		    protocol == UAC_VERSION_1 &&
> diff --git a/sound/usb/format.c b/sound/usb/format.c
> index b87cf87..caaa3ef 100644
> --- a/sound/usb/format.c
> +++ b/sound/usb/format.c
> @@ -278,12 +278,11 @@ err:
>   * parse the format type I and III descriptors
>   */
>  static int parse_audio_format_i(struct snd_usb_audio *chip,
> -				struct audioformat *fp,
> -				int format, void *_fmt,
> +				struct audioformat *fp, int format,
> +				struct uac_format_type_i_continuous_descriptor *fmt,
>  				struct usb_host_interface *iface)
>  {
>  	struct usb_interface_descriptor *altsd = get_iface_desc(iface);
> -	struct uac_format_type_i_discrete_descriptor *fmt = _fmt;
>  	int protocol = altsd->bInterfaceProtocol;
>  	int pcm_format, ret;
>  
> @@ -320,7 +319,7 @@ static int parse_audio_format_i(struct snd_usb_audio *chip,
>  	switch (protocol) {
>  	case UAC_VERSION_1:
>  		fp->channels = fmt->bNrChannels;
> -		ret = parse_audio_format_rates_v1(chip, fp, _fmt, 7);
> +		ret = parse_audio_format_rates_v1(chip, fp, (unsigned char *) fmt, 7);
>  		break;
>  	case UAC_VERSION_2:
>  		/* fp->channels is already set in this case */
> @@ -392,12 +391,12 @@ static int parse_audio_format_ii(struct snd_usb_audio *chip,
>  }
>  
>  int snd_usb_parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp,
> -		       int format, unsigned char *fmt, int stream,
> -		       struct usb_host_interface *iface)
> +			       int format, struct uac_format_type_i_continuous_descriptor *fmt,
> +			       int stream, struct usb_host_interface *iface)
>  {
>  	int err;
>  
> -	switch (fmt[3]) {
> +	switch (fmt->bFormatType) {
>  	case UAC_FORMAT_TYPE_I:
>  	case UAC_FORMAT_TYPE_III:
>  		err = parse_audio_format_i(chip, fp, format, fmt, iface);
> @@ -407,10 +406,11 @@ int snd_usb_parse_audio_format(struct snd_usb_audio *chip, struct audioformat *f
>  		break;
>  	default:
>  		snd_printd(KERN_INFO "%d:%u:%d : format type %d is not supported yet\n",
> -			   chip->dev->devnum, fp->iface, fp->altsetting, fmt[3]);
> +			   chip->dev->devnum, fp->iface, fp->altsetting,
> +			   fmt->bFormatType);
>  		return -1;
>  	}
> -	fp->fmt_type = fmt[3];
> +	fp->fmt_type = fmt->bFormatType;
>  	if (err < 0)
>  		return err;
>  #if 1
> @@ -421,7 +421,7 @@ int snd_usb_parse_audio_format(struct snd_usb_audio *chip, struct audioformat *f
>  	if (chip->usb_id == USB_ID(0x041e, 0x3000) ||
>  	    chip->usb_id == USB_ID(0x041e, 0x3020) ||
>  	    chip->usb_id == USB_ID(0x041e, 0x3061)) {
> -		if (fmt[3] == UAC_FORMAT_TYPE_I &&
> +		if (fmt->bFormatType == UAC_FORMAT_TYPE_I &&
>  		    fp->rates != SNDRV_PCM_RATE_48000 &&
>  		    fp->rates != SNDRV_PCM_RATE_96000)
>  			return -1;
> diff --git a/sound/usb/format.h b/sound/usb/format.h
> index 8298c4e..387924f 100644
> --- a/sound/usb/format.h
> +++ b/sound/usb/format.h
> @@ -1,8 +1,9 @@
>  #ifndef __USBAUDIO_FORMAT_H
>  #define __USBAUDIO_FORMAT_H
>  
> -int snd_usb_parse_audio_format(struct snd_usb_audio *chip, struct audioformat *fp,
> -			       int format, unsigned char *fmt, int stream,
> -			       struct usb_host_interface *iface);
> +int snd_usb_parse_audio_format(struct snd_usb_audio *chip,
> +			       struct audioformat *fp, int format,
> +			       struct uac_format_type_i_continuous_descriptor *fmt,
> +			       int stream, struct usb_host_interface *iface);
>  
>  #endif /*  __USBAUDIO_FORMAT_H */
> -- 
> 1.7.1
> 


More information about the Alsa-devel mailing list