Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d6db392e authored by Clemens Ladisch's avatar Clemens Ladisch Committed by Jaroslav Kysela
Browse files

[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: default avatarClemens Ladisch <clemens@ladisch.de>
parent 15a24c07
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -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 {