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>
#define MAX_PACKS 10
#define MAX_PACKS_HS (MAX_PACKS * 8) /* in high speed 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 SYNC_URBS 4 /* always four urbs for sync */
#define MIN_PACKS_URB 1 /* minimum 1 packet per urb */
#define SYNC_URBS 4 /* always four urbs for sync */
#define MIN_PACKS_URB 1 /* minimum 1 packet per urb */
else
subs->curpacksize = maxsize;
else
subs->curpacksize = maxsize;
- if (snd_usb_get_speed(subs->dev) == USB_SPEED_FULL)
urb_packs = nrpacks;
else
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) {
/* allocate a temporary buffer for playback */
if (is_playback) {
}
/* decide how many packets to be used */
}
/* 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... */
subs->nurbs = (total_packs + urb_packs - 1) / urb_packs;
if (subs->nurbs > MAX_URBS) {
/* too much... */