PERFORCE change 166149 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Wed Jul 15 20:54:23 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=166149
Change 166149 by hselasky at hselasky_laptop001 on 2009/07/15 20:53:46
USB audio:
- code factoring patch from "Eygene Ryabinkin"
Affected files ...
.. //depot/projects/usb/src/sys/dev/sound/usb/uaudio.c#53 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/sound/usb/uaudio.c#53 (text+ko) ====
@@ -108,6 +108,7 @@
#define UAUDIO_MINFRAMES 16 /* must be factor of 8 due HS-USB */
#define UAUDIO_NCHANBUFS 2 /* number of outstanding request */
#define UAUDIO_RECURSE_LIMIT 24 /* rounds */
+#define UAUDIO_MINFRAMES_ALIGN(x) ((x) & ~(UAUDIO_MINFRAMES - 1))
#define MAKE_WORD(h,l) (((h) << 8) | (l))
#define BIT_TEST(bm,bno) (((bm)[(bno) / 8] >> (7 - ((bno) % 8))) & 1)
@@ -1113,7 +1114,42 @@
}
}
+/*
+ * The following function sets up data size and block count for the
+ * next audio transfer.
+ */
static void
+uaudio_setup_blockcount(struct uaudio_chan *ch, usb_frcount_t max_frames,
+ uint32_t *total, uint32_t *blockcount)
+{
+ uint32_t temp;
+ uint32_t isiz;
+
+ /* allow dynamic sizing of play buffer */
+ isiz = ch->intr_size;
+
+ /* allow dynamic sizing of play buffer */
+ temp = isiz / ch->bytes_per_frame;
+
+ /* align units */
+ temp = UAUDIO_MINFRAMES_ALIGN(temp);
+
+ /* range check - min */
+ if (temp == 0)
+ temp = UAUDIO_MINFRAMES;
+
+ /* range check - max */
+ if (temp > max_frames)
+ temp = max_frames;
+
+ /* store blockcount */
+ *blockcount = temp;
+
+ /* compute the total length */
+ *total = temp * ch->bytes_per_frame;
+}
+
+static void
uaudio_chan_play_callback(struct usb_xfer *xfer, usb_error_t error)
{
struct uaudio_chan *ch = usbd_xfer_softc(xfer);
@@ -1126,25 +1162,8 @@
usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
- /* allow dynamic sizing of play buffer */
- total = ch->intr_size;
-
- /* allow dynamic sizing of play buffer */
- blockcount = total / ch->bytes_per_frame;
-
- /* align units */
- blockcount -= (blockcount % UAUDIO_MINFRAMES);
-
- /* range check - min */
- if (blockcount == 0) {
- blockcount = UAUDIO_MINFRAMES;
- }
- /* range check - max */
- if (blockcount > usbd_xfer_max_frames(xfer)) {
- blockcount = usbd_xfer_max_frames(xfer);
- }
- /* compute the total length */
- total = blockcount * ch->bytes_per_frame;
+ uaudio_setup_blockcount(ch, usbd_xfer_max_frames(xfer),
+ &total, &blockcount);
switch (USB_GET_STATE(xfer)) {
case USB_ST_TRANSFERRED:
@@ -1221,25 +1240,8 @@
usbd_xfer_status(xfer, &actlen, NULL, NULL, &nframes);
- /* allow dynamic sizing of play buffer */
- total = ch->intr_size;
-
- /* allow dynamic sizing of play buffer */
- blockcount = total / ch->bytes_per_frame;
-
- /* align units */
- blockcount -= (blockcount % UAUDIO_MINFRAMES);
-
- /* range check - min */
- if (blockcount == 0) {
- blockcount = UAUDIO_MINFRAMES;
- }
- /* range check - max */
- if (blockcount > usbd_xfer_max_frames(xfer)) {
- blockcount = usbd_xfer_max_frames(xfer);
- }
- /* compute the total length */
- total = blockcount * ch->bytes_per_frame;
+ uaudio_setup_blockcount(ch, usbd_xfer_max_frames(xfer),
+ &total, &blockcount);
switch (USB_GET_STATE(xfer)) {
case USB_ST_TRANSFERRED:
More information about the p4-projects
mailing list