summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound
diff options
context:
space:
mode:
authorhselasky <hselasky@FreeBSD.org>2016-10-28 12:43:49 +0000
committerhselasky <hselasky@FreeBSD.org>2016-10-28 12:43:49 +0000
commit6b0f7c8f32d62ec38328c66908677348fc692d16 (patch)
treedf18b914e3b7064713c5e0529dc6c6d74ef02e03 /sys/dev/sound
parent4c1afdb90f1d81b4565cdaf52a555ad8c7f3faea (diff)
downloadFreeBSD-src-6b0f7c8f32d62ec38328c66908677348fc692d16.zip
FreeBSD-src-6b0f7c8f32d62ec38328c66908677348fc692d16.tar.gz
MFC r307651:
Add support for adjusting the hardware buffering delay for USB audio. Requested by: Goran Mekic <meka@tilda.center>
Diffstat (limited to 'sys/dev/sound')
-rw-r--r--sys/dev/sound/usb/uaudio.c35
1 files changed, 30 insertions, 5 deletions
diff --git a/sys/dev/sound/usb/uaudio.c b/sys/dev/sound/usb/uaudio.c
index 3de87ae..7e32b70 100644
--- a/sys/dev/sound/usb/uaudio.c
+++ b/sys/dev/sound/usb/uaudio.c
@@ -95,6 +95,7 @@ __FBSDID("$FreeBSD$");
static int uaudio_default_rate = 0; /* use rate list */
static int uaudio_default_bits = 32;
static int uaudio_default_channels = 0; /* use default */
+static int uaudio_buffer_ms = 8;
#ifdef USB_DEBUG
static int uaudio_debug = 0;
@@ -109,9 +110,32 @@ SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_bits, CTLFLAG_RWTUN,
&uaudio_default_bits, 0, "uaudio default sample bits");
SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_channels, CTLFLAG_RWTUN,
&uaudio_default_channels, 0, "uaudio default sample channels");
+
+static int
+uaudio_buffer_ms_sysctl(SYSCTL_HANDLER_ARGS)
+{
+ int err, val;
+
+ val = uaudio_buffer_ms;
+ err = sysctl_handle_int(oidp, &val, 0, req);
+
+ if (err != 0 || req->newptr == NULL || val == uaudio_buffer_ms)
+ return (err);
+
+ if (val > 8)
+ val = 8;
+ else if (val < 2)
+ val = 2;
+
+ uaudio_buffer_ms = val;
+
+ return (0);
+}
+SYSCTL_PROC(_hw_usb_uaudio, OID_AUTO, buffer_ms, CTLTYPE_INT | CTLFLAG_RWTUN,
+ 0, sizeof(int), uaudio_buffer_ms_sysctl, "I",
+ "uaudio buffering delay from 2ms to 8ms");
#endif
-#define UAUDIO_IRQS (8000 / UAUDIO_NFRAMES) /* interrupts per second */
#define UAUDIO_NFRAMES 64 /* must be factor of 8 due HS-USB */
#define UAUDIO_NCHANBUFS 2 /* number of outstanding request */
#define UAUDIO_RECURSE_LIMIT 255 /* rounds */
@@ -1278,10 +1302,10 @@ uaudio_configure_msg_sub(struct uaudio_softc *sc,
if (fps < 8000) {
/* FULL speed USB */
- frames = 8;
+ frames = uaudio_buffer_ms;
} else {
/* HIGH speed USB */
- frames = UAUDIO_NFRAMES;
+ frames = uaudio_buffer_ms * 8;
}
fps_shift = usbd_xfer_get_fps_shift(chan->xfer[0]);
@@ -2158,8 +2182,9 @@ tr_setup:
}
/* start the SYNC transfer one time per second, if any */
- if (++(ch->intr_counter) >= UAUDIO_IRQS) {
- ch->intr_counter = 0;
+ ch->intr_counter += ch->intr_frames;
+ if (ch->intr_counter >= ch->frames_per_second) {
+ ch->intr_counter -= ch->frames_per_second;
usbd_transfer_start(ch->xfer[UAUDIO_NCHANBUFS]);
}
OpenPOWER on IntegriCloud