Author: hselasky
Date: Mon Aug 18 14:30:43 2014
New Revision: 270134
URL: http://svnweb.freebsd.org/changeset/base/270134

Log:
  Use the "bSubslotSize" and "bSubFrameSize" fields to obtain the actual
  sample size. According to the USB audio frame format specification
  from USB.org, the value in the "bBitResolution" field can be less than
  the actual sample size, depending on the actual hardware, and should
  not be used for this computation.
  
  PR:           192755
  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     Mon Aug 18 14:23:07 2014        
(r270133)
+++ head/sys/dev/sound/usb/uaudio.c     Mon Aug 18 14:30:43 2014        
(r270134)
@@ -1659,21 +1659,10 @@ uaudio_chan_fill_info_sub(struct uaudio_
                } else if (audio_rev >= UAUDIO_VERSION_20) {
 
                        uint32_t dwFormat;
-                       uint8_t bSubslotSize;
 
                        dwFormat = UGETDW(asid.v2->bmFormats);
                        bChannels = asid.v2->bNrChannels;
-                       bBitResolution = asf1d.v2->bBitResolution;
-                       bSubslotSize = asf1d.v2->bSubslotSize;
-
-                       /* Map 4-byte aligned 24-bit samples into 32-bit */
-                       if (bBitResolution == 24 && bSubslotSize == 4)
-                               bBitResolution = 32;
-
-                       if (bBitResolution != (bSubslotSize * 8)) {
-                               DPRINTF("Invalid bSubslotSize\n");
-                               goto next_ep;
-                       }
+                       bBitResolution = asf1d.v2->bSubslotSize * 8;
 
                        if ((bChannels != channels) ||
                            (bBitResolution != bit_resolution)) {
@@ -1720,7 +1709,7 @@ uaudio_chan_fill_info_sub(struct uaudio_
 
                        wFormat = UGETW(asid.v1->wFormatTag);
                        bChannels = UAUDIO_MAX_CHAN(asf1d.v1->bNrChannels);
-                       bBitResolution = asf1d.v1->bBitResolution;
+                       bBitResolution = asf1d.v1->bSubFrameSize * 8;
 
                        if (asf1d.v1->bSamFreqType == 0) {
                                DPRINTFN(16, "Sample rate: %d-%dHz\n",
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to