diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2005-08-12 02:28:27 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2005-08-30 02:45:08 -0400 |
commit | d6db392e9235c48bb945624798e9beede7b85b12 (patch) | |
tree | 5f17b000a18f476ea296b1387150b7ff92837215 /sound/usb | |
parent | 15a24c0778e9bdd48d8e1cf60a263837b5c30ed5 (diff) |
[ALSA] usb-audio: fix packets per URB calculation for playback
USB generic driver
When determining how many packets are needed for one period, we cannot
assume that all packets have their maximum size -- we always use the
nominal sample rate when sending data, and could use an even lower rate
when the endpoint uses frequency feedback.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Diffstat (limited to 'sound/usb')
-rw-r--r-- | sound/usb/usbaudio.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 9e38d3d1322..d28106e390c 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c | |||
@@ -938,7 +938,15 @@ static int init_substream_urbs(snd_usb_substream_t *subs, unsigned int period_by | |||
938 | 938 | ||
939 | /* decide how many packets to be used */ | 939 | /* decide how many packets to be used */ |
940 | if (is_playback) { | 940 | if (is_playback) { |
941 | total_packs = (period_bytes + maxsize - 1) / maxsize; | 941 | unsigned int minsize; |
942 | /* determine how small a packet can be */ | ||
943 | minsize = (subs->freqn >> (16 - subs->datainterval)) | ||
944 | * (frame_bits >> 3); | ||
945 | /* with sync from device, assume it can be 25% lower */ | ||
946 | if (subs->syncpipe) | ||
947 | minsize -= minsize >> 2; | ||
948 | minsize = max(minsize, 1u); | ||
949 | total_packs = (period_bytes + minsize - 1) / minsize; | ||
942 | if (total_packs < 2 * MIN_PACKS_URB) | 950 | if (total_packs < 2 * MIN_PACKS_URB) |
943 | total_packs = 2 * MIN_PACKS_URB; | 951 | total_packs = 2 * MIN_PACKS_URB; |
944 | } else { | 952 | } else { |