summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2005-08-12 06:25:26 (GMT)
committerJaroslav Kysela <perex@suse.cz>2005-08-30 06:45:04 (GMT)
commit15a24c0778e9bdd48d8e1cf60a263837b5c30ed5 (patch)
treeb7bde1b8f54e4cf8224ed6445d6b8cf9977151ab
parenta53fc188ec6fc406276799da465fe789c40d96b2 (diff)
downloadlinux-fsl-qoriq-15a24c0778e9bdd48d8e1cf60a263837b5c30ed5.tar.xz
[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>
-rw-r--r--sound/usb/usbaudio.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
index 8298c46..9e38d3d 100644
--- a/sound/usb/usbaudio.c
+++ b/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... */