Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Oct 2012 08:00:01 +0000 (UTC)
From:      Hans Petter Selasky <hselasky@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r241988 - head/sys/dev/sound/usb
Message-ID:  <201210240800.q9O801cm070256@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: hselasky
Date: Wed Oct 24 08:00:01 2012
New Revision: 241988
URL: http://svn.freebsd.org/changeset/base/241988

Log:
  Fix USB audio specification compliance by filtering which descriptors can
  appear on which interface. This fixes detection of some USB audio adapters.
  Also increase the channel limit for FULL speed devices to 4 channels.
  
  Tested by:	gavin
  MFC after:	1 week

Modified:
  head/sys/dev/sound/usb/uaudio.c

Modified: head/sys/dev/sound/usb/uaudio.c
==============================================================================
--- head/sys/dev/sound/usb/uaudio.c	Wed Oct 24 07:23:29 2012	(r241987)
+++ head/sys/dev/sound/usb/uaudio.c	Wed Oct 24 08:00:01 2012	(r241988)
@@ -1054,13 +1054,20 @@ uaudio_chan_fill_info_sub(struct uaudio_
 			sed.v1 = NULL;
 		}
 
-		if ((acdp == NULL) &&
-		    (desc->bDescriptorType == UDESC_CS_INTERFACE) &&
-		    (desc->bDescriptorSubtype == AS_GENERAL) &&
-		    (desc->bDescriptorSubtype == UDESCSUB_AC_HEADER) &&
-		    (desc->bLength >= sizeof(*acdp))) {
-			acdp = (void *)desc;
-			audio_rev = UGETW(acdp->bcdADC);
+		if (audio_if == 0) {
+			if ((acdp == NULL) &&
+			    (desc->bDescriptorType == UDESC_CS_INTERFACE) &&
+			    (desc->bDescriptorSubtype == UDESCSUB_AC_HEADER) &&
+			    (desc->bLength >= sizeof(*acdp))) {
+				acdp = (void *)desc;
+				audio_rev = UGETW(acdp->bcdADC);
+			}
+
+			/*
+			 * Don't collect any USB audio descriptors if
+			 * this is not an USB audio stream interface.
+			 */
+			continue;
 		}
 
 		if ((acdp != NULL) &&
@@ -1132,9 +1139,8 @@ uaudio_chan_fill_info_sub(struct uaudio_
 					sed.v1 = (void *)desc;
 			}
 		}
-		if (audio_if == 0 || asid.v1 == NULL ||
-		    asf1d.v1 == NULL || ed1 == NULL ||
-		    sed.v1 == NULL) {
+		if (asid.v1 == NULL || asf1d.v1 == NULL ||
+		    ed1 == NULL || sed.v1 == NULL) {
 			/* need more descriptors */
 			continue;
 		}
@@ -1349,7 +1355,7 @@ uaudio_chan_fill_info(struct uaudio_soft
 			 * disable surround setups on FULL-speed USB
 			 * by default
 			 */
-			channels = 2;
+			channels = 4;
 			break;
 		default:
 			channels = 16;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201210240800.q9O801cm070256>