浏览代码

[ALSA] usb-audio: use 1 ms URBs when capturing

USB generic driver
When capturing audio data, we do not know beforehand how many samples
the device sends per frame, so we have to use URBs that are as short as
possible to make sure that we can handle period boundaries without any
additional latencies.

Furthermore, the total count of URBs submitted doesn't matter when
capturing, so we can just use the maximum number.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Clemens Ladisch 20 年之前
父节点
当前提交
15a24c0778
共有 1 个文件被更改,包括 12 次插入6 次删除
  1. 12 6
      sound/usb/usbaudio.c

+ 12 - 6
sound/usb/usbaudio.c

@@ -97,7 +97,7 @@ MODULE_PARM_DESC(async_unlink, "Use async unlink mode.");
 
 #define MAX_PACKS	10
 #define MAX_PACKS_HS	(MAX_PACKS * 8)	/* in high speed mode */
-#define MAX_URBS	5	/* max. 20ms long packets */
+#define MAX_URBS	8
 #define SYNC_URBS	4	/* always four urbs for sync */
 #define MIN_PACKS_URB	1	/* minimum 1 packet per urb */
 
@@ -920,10 +920,12 @@ static int init_substream_urbs(snd_usb_substream_t *subs, unsigned int period_by
 	else
 		subs->curpacksize = maxsize;
 
-	if (snd_usb_get_speed(subs->dev) == USB_SPEED_FULL)
+	if (is_playback)
 		urb_packs = nrpacks;
 	else
-		urb_packs = (nrpacks * 8) >> subs->datainterval;
+		urb_packs = 1;
+	if (snd_usb_get_speed(subs->dev) == USB_SPEED_HIGH)
+		urb_packs = (urb_packs * 8) >> subs->datainterval;
 
 	/* allocate a temporary buffer for playback */
 	if (is_playback) {
@@ -935,9 +937,13 @@ static int init_substream_urbs(snd_usb_substream_t *subs, unsigned int period_by
 	}
 
 	/* decide how many packets to be used */
-	total_packs = (period_bytes + maxsize - 1) / maxsize;
-	if (total_packs < 2 * MIN_PACKS_URB)
-		total_packs = 2 * MIN_PACKS_URB;
+	if (is_playback) {
+		total_packs = (period_bytes + maxsize - 1) / maxsize;
+		if (total_packs < 2 * MIN_PACKS_URB)
+			total_packs = 2 * MIN_PACKS_URB;
+	} else {
+		total_packs = MAX_URBS * urb_packs;
+	}
 	subs->nurbs = (total_packs + urb_packs - 1) / urb_packs;
 	if (subs->nurbs > MAX_URBS) {
 		/* too much... */