aboutsummaryrefslogtreecommitdiffstats
path: root/sound/usb/usbaudio.c
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2005-08-12 02:28:27 -0400
committerJaroslav Kysela <perex@suse.cz>2005-08-30 02:45:08 -0400
commitd6db392e9235c48bb945624798e9beede7b85b12 (patch)
tree5f17b000a18f476ea296b1387150b7ff92837215 /sound/usb/usbaudio.c
parent15a24c0778e9bdd48d8e1cf60a263837b5c30ed5 (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/usbaudio.c')
-rw-r--r--sound/usb/usbaudio.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
index 9e38d3d1322a..d28106e390c4 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 {