summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound
diff options
context:
space:
mode:
authoralfred <alfred@FreeBSD.org>2009-07-30 00:14:56 +0000
committeralfred <alfred@FreeBSD.org>2009-07-30 00:14:56 +0000
commit10ba0f506878eea2734223032f5d89657824d502 (patch)
treefb7b9e552eea9af75d0f8b48d735c270b46bee96 /sys/dev/sound
parente04ffbb8b67e9f6a83ea4fee6093b81757856740 (diff)
downloadFreeBSD-src-10ba0f506878eea2734223032f5d89657824d502.zip
FreeBSD-src-10ba0f506878eea2734223032f5d89657824d502.tar.gz
USB audio:
- code factoring patch from "Eygene Ryabinkin" - P4 ID: 166149 Submitted by: hps Approved by: re
Diffstat (limited to 'sys/dev/sound')
-rw-r--r--sys/dev/sound/usb/uaudio.c78
1 files changed, 40 insertions, 38 deletions
diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
index 83e0aa9..fe63e0d 100644
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -108,6 +108,7 @@ SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_channels, CTLFLAG_RW,
#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,6 +1114,41 @@ done:
}
}
+/*
+ * 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)
{
@@ -1126,25 +1162,8 @@ uaudio_chan_play_callback(struct usb_xfer *xfer, usb_error_t error)
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 @@ uaudio_chan_record_callback(struct usb_xfer *xfer, usb_error_t error)
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:
OpenPOWER on IntegriCloud