提交 d6db392e 编写于 作者: C Clemens Ladisch 提交者: Jaroslav Kysela

[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: NClemens Ladisch <clemens@ladisch.de>
上级 15a24c07
......@@ -938,7 +938,15 @@ static int init_substream_urbs(snd_usb_substream_t *subs, unsigned int period_by
/* decide how many packets to be used */
if (is_playback) {
total_packs = (period_bytes + maxsize - 1) / maxsize;
unsigned int minsize;
/* determine how small a packet can be */
minsize = (subs->freqn >> (16 - subs->datainterval))
* (frame_bits >> 3);
/* with sync from device, assume it can be 25% lower */
if (subs->syncpipe)
minsize -= minsize >> 2;
minsize = max(minsize, 1u);
total_packs = (period_bytes + minsize - 1) / minsize;
if (total_packs < 2 * MIN_PACKS_URB)
total_packs = 2 * MIN_PACKS_URB;
} else {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册