aboutsummaryrefslogtreecommitdiffstats
path: root/sound/usb
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2005-08-12 02:25:26 -0400
committerJaroslav Kysela <perex@suse.cz>2005-08-30 02:45:04 -0400
commit15a24c0778e9bdd48d8e1cf60a263837b5c30ed5 (patch)
treeb7bde1b8f54e4cf8224ed6445d6b8cf9977151ab /sound/usb
parenta53fc188ec6fc406276799da465fe789c40d96b2 (diff)
[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>
Diffstat (limited to 'sound/usb')
-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 8298c462c291..9e38d3d1322a 100644
--- a/sound/usb/usbaudio.c
+++ b/sound/usb/usbaudio.c
@@ -97,7 +97,7 @@ MODULE_PARM_DESC(async_unlink, "Use async unlink mode.");
97 97
98#define MAX_PACKS 10 98#define MAX_PACKS 10
99#define MAX_PACKS_HS (MAX_PACKS * 8) /* in high speed mode */ 99#define MAX_PACKS_HS (MAX_PACKS * 8) /* in high speed mode */
100#define MAX_URBS 5 /* max. 20ms long packets */ 100#define MAX_URBS 8
101#define SYNC_URBS 4 /* always four urbs for sync */ 101#define SYNC_URBS 4 /* always four urbs for sync */
102#define MIN_PACKS_URB 1 /* minimum 1 packet per urb */ 102#define MIN_PACKS_URB 1 /* minimum 1 packet per urb */
103 103
@@ -920,10 +920,12 @@ static int init_substream_urbs(snd_usb_substream_t *subs, unsigned int period_by
920 else 920 else
921 subs->curpacksize = maxsize; 921 subs->curpacksize = maxsize;
922 922
923 if (snd_usb_get_speed(subs->dev) == USB_SPEED_FULL) 923 if (is_playback)
924 urb_packs = nrpacks; 924 urb_packs = nrpacks;
925 else 925 else
926 urb_packs = (nrpacks * 8) >> subs->datainterval; 926 urb_packs = 1;
927 if (snd_usb_get_speed(subs->dev) == USB_SPEED_HIGH)
928 urb_packs = (urb_packs * 8) >> subs->datainterval;
927 929
928 /* allocate a temporary buffer for playback */ 930 /* allocate a temporary buffer for playback */
929 if (is_playback) { 931 if (is_playback) {
@@ -935,9 +937,13 @@ static int init_substream_urbs(snd_usb_substream_t *subs, unsigned int period_by
935 } 937 }
936 938
937 /* decide how many packets to be used */ 939 /* decide how many packets to be used */
938 total_packs = (period_bytes + maxsize - 1) / maxsize; 940 if (is_playback) {
939 if (total_packs < 2 * MIN_PACKS_URB) 941 total_packs = (period_bytes + maxsize - 1) / maxsize;
940 total_packs = 2 * MIN_PACKS_URB; 942 if (total_packs < 2 * MIN_PACKS_URB)
943 total_packs = 2 * MIN_PACKS_URB;
944 } else {
945 total_packs = MAX_URBS * urb_packs;
946 }
941 subs->nurbs = (total_packs + urb_packs - 1) / urb_packs; 947 subs->nurbs = (total_packs + urb_packs - 1) / urb_packs;
942 if (subs->nurbs > MAX_URBS) { 948 if (subs->nurbs > MAX_URBS) {
943 /* too much... */ 949 /* too much... */