linux/sound/usb
Alan Stern 976b6c064a ALSA: improve buffer size computations for USB PCM audio
This patch changes the way URBs are allocated and their sizes are
determined for PCM playback in the snd-usb-audio driver.  Currently
the driver allocates too few URBs for endpoints that don't use
implicit sync, making underruns more likely to occur.  This may be a
holdover from before I/O delays could be measured accurately; in any
case, it is no longer necessary.

The patch allocates as many URBs as possible, subject to four
limitations:

	The total number of URBs for the endpoint is not allowed to
	exceed MAX_URBS (which the patch increases from 8 to 12).

	The total number of packets per URB is not allowed to exceed
	MAX_PACKS (or MAX_PACKS_HS for high-speed devices), which is
	decreased from 20 to 6.

	The total duration of queued data is not allowed to exceed
	MAX_QUEUE, which is decreased from 24 ms to 18 ms.

	The total number of ALSA frames in the output queue is not
	allowed to exceed the ALSA buffer size.

The last requirement is the hardest to implement.  Currently the
number of URBs needed to fill a buffer cannot be determined in
advance, because a buffer contains a fixed number of frames whereas
the number of frames in an URB varies to match shifts in the device's
clock rate.  To solve this problem, the patch changes the logic for
deciding how many packets an URB should contain.  Rather than using as
many as possible without exceeding an ALSA period boundary, now the
driver uses only as many packets as needed to transfer a predetermined
number of frames.  As a result, unless the device's clock has an
exceedingly variable rate, the number of URBs making up each period
(and hence each buffer) will remain constant.

The overall effect of the patch is that playback works better in
low-latency settings.  The user can still specify values for
frames/period and periods/buffer that exceed the capabilities of the
hardware, of course.  But for values that are within those
capabilities, the performance will be improved.  For example, testing
shows that a high-speed device can handle 32 frames/period and 3
periods/buffer at 48 KHz, whereas the current driver starts to get
glitchy at 64 frames/period and 2 periods/buffer.

A side effect of these changes is that the "nrpacks" module parameter
is no longer used.  The patch removes it.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
CC: Clemens Ladisch <clemens@ladisch.de>
Tested-by: Daniel Mack <zonque@gmail.com>
Tested-by: Eldad Zack <eldad@fogrefinery.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2013-09-26 10:25:31 +02:00
..
6fire ASoC: Updates for v3.12 2013-08-23 14:12:22 +02:00
caiaq ALSA: usb: uniform style used in MODULE_SUPPORTED_DEVICE() 2013-06-21 14:37:08 +02:00
hiface ALSA: hiface: return correct XRUN indication 2013-07-24 10:51:37 +02:00
misc ALSA: ua101: Fix unlocked snd_pcm_stop() call 2013-07-15 21:24:57 +02:00
usx2y ASoC: Updates for v3.12 2013-08-23 14:12:22 +02:00
card.c ALSA: improve buffer size computations for USB PCM audio 2013-09-26 10:25:31 +02:00
card.h ALSA: improve buffer size computations for USB PCM audio 2013-09-26 10:25:31 +02:00
clock.c ALSA: usb-audio: store protocol version in struct audioformat 2013-06-27 21:59:47 +02:00
clock.h ALSA: usb-audio: UAC2: do clock validity check earlier 2013-04-04 08:30:59 +02:00
debug.h ALSA: usb-audio: make hwc_debug a noop in case HW_CONST_DEBUG is not set 2011-05-18 11:44:35 +02:00
endpoint.c ALSA: improve buffer size computations for USB PCM audio 2013-09-26 10:25:31 +02:00
endpoint.h ALSA: improve buffer size computations for USB PCM audio 2013-09-26 10:25:31 +02:00
format.c ALSA: usb-audio: store protocol version in struct audioformat 2013-06-27 21:59:47 +02:00
format.h ALSA: usb-audio: store protocol version in struct audioformat 2013-06-27 21:59:47 +02:00
helper.c ALSA: snd-usb-audio: set the timeout for usb control set messages to 5000 ms 2013-04-22 10:45:02 +02:00
helper.h ALSA: usb-audio: increase control transfer timeout 2011-09-27 09:21:48 +02:00
Kconfig Add M2Tech hiFace USB-SPDIF driver 2013-06-24 09:26:08 +02:00
Makefile Add M2Tech hiFace USB-SPDIF driver 2013-06-24 09:26:08 +02:00
midi.c ALSA: usb-audio: add MIDI port names for some Roland devices 2013-06-27 21:59:48 +02:00
midi.h
mixer_maps.c ALSA: usb-audio: add support for M-Audio FT C600 2013-02-11 14:02:27 +01:00
mixer_quirks.c ALSA: usb-audio: Add Audio Advantage Micro II 2013-06-28 13:37:12 +02:00
mixer_quirks.h
mixer.c ALSA: Fix assignment of 0/1 to bool variables 2013-09-26 09:57:24 +02:00
mixer.h ALSA: usb-audio: add control index offset 2012-11-29 08:43:12 +01:00
pcm.c ALSA: improve buffer size computations for USB PCM audio 2013-09-26 10:25:31 +02:00
pcm.h ALSA: usb: refine delay information with USB frame counter 2011-09-12 10:30:20 +02:00
power.h ALSA: usbaudio: implement USB autosuspend 2011-03-11 14:59:29 +01:00
proc.c ALSA: usb-audio: proc: use found syncmaxsize to determine feedback format 2013-05-17 08:05:34 +02:00
proc.h
quirks-table.h ALSA: usb-audio: Add Audio Advantage Micro II 2013-06-28 13:37:12 +02:00
quirks.c ALSA: usb-audio: fix automatic Roland/Yamaha MIDI detection 2013-08-12 11:42:28 +02:00
quirks.h ALSA: snd-usb: add quirks handler for DSD streams 2013-04-18 10:03:53 +02:00
stream.c ALSA: usb-audio: add support for many Roland/Yamaha devices 2013-06-27 21:59:48 +02:00
stream.h ALSA: snd-usb: re-order code 2011-09-14 17:07:02 +02:00
usbaudio.h ALSA: improve buffer size computations for USB PCM audio 2013-09-26 10:25:31 +02:00