Hi folks,
We're using a Zoom UAC-2 USB audio interface, which provides an async playback endpoint ("1 OUT (ASYNC)") and an async capture endpoint ("2 IN (ASYNC)"), both with 2-channel S32_LE in 44100, 48000, 88200, 96000, 176400, or 192000 samples per second. For whatever reason, the explicit feedback on the playback endpoint seems a bit unstable and also biased a little high. alsaloop -t 1000 gets repeated playback underruns and starts trying to resample the audio to adjust the rate (even though it's just looping from capture back to playback on the same device!).
I've found that using implicit feedback produces much more stable results and doesn't seem to hurt anything else (patch below). I wasn't sure if the other "implicit feedback quirk" devices in sound/usb/pcm.c are also ASYNC devices that happen to perform better using implicit feedback instead (in which case adding the Zoom UAC-2 to the list seems pretty routine), or if the others are SYNC devices that only need help identifying the right endpoint and ifnum -- i.e., how unorthodox is it to use implicit feedback on an ASYNC device? Hopefully not very.
Please let me know if you'd like any additional information or testing.
Best regards, Keith
From 2c8d691d39ab2824c344ac2562a1e8605b3384ba Mon Sep 17 00:00:00 2001
From: Keith Winstein keithw@cs.stanford.edu Date: Sun, 25 Oct 2020 22:05:47 -0700 Subject: [PATCH] ALSA: usb-audio: Add implicit feedback quirk for Zoom UAC-2
Signed-off-by: Keith Winstein keithw@cs.stanford.edu Tested-by: Keith Winstein keithw@cs.stanford.edu --- sound/usb/pcm.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index b401ee894e1b..5723e8e69cf1 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -352,6 +352,10 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs, ep = 0x81; ifnum = 2; goto add_sync_ep_from_ifnum; + case USB_ID(0x1686, 0xf029): /* ZOOM UAC-2 */ + ep = 0x82; + ifnum = 2; + goto add_sync_ep_from_ifnum; case USB_ID(0x1397, 0x0001): /* Behringer UFX1604 */ case USB_ID(0x1397, 0x0002): /* Behringer UFX1204 */ ep = 0x81;