Skip to content

Commit 532a208

Browse files
committed
ALSA: usb-audio: Avoid implicit feedback on Pioneer devices
For addressing the regression on Pioneer devices, we recently corrected the quirk code to enable the implicit feedback mode on those devices properly. However, the devices still showed problems with the full duplex operations with JACK, and after debug sessions, we figured out that the older kernels that had worked with JACK also didn't use the implicit feedback mode at all although they had the quirk code to enable it; instead, the old code worked just to skip the normal sync endpoint setup that would have been detected without it. IOW, what broke without the implicit-fb quirk in the past was the application of the normal sync endpoint that is actually the capture data endpoint on these devices. This patch covers the overseen piece: it modifies the quirk code again not to enable the implicit feedback mode but just to make the driver skipping the sync endpoint detection. This made the driver working with JACK full-duplex mode again. Still it's not quite clear why the implicit feedback doesn't work on those devices yet; maybe it's about some issues in the URB setup. But at least, with this patch, the driver should work in the level of the older kernels again. Fixes: 167c9dc ("ALSA: usb-audio: Fix implicit feedback sync setup for Pioneer devices") Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Takashi Iwai <[email protected]>
1 parent 3784d44 commit 532a208

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

sound/usb/implicit.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -175,11 +175,13 @@ static int add_roland_implicit_fb(struct snd_usb_audio *chip,
175175
ifnum, alts);
176176
}
177177

178-
/* Pioneer devices: playback and capture streams sharing the same iface/altset
178+
/* Playback and capture EPs on Pioneer devices share the same iface/altset,
179+
* but they don't seem working with the implicit fb mode well, hence we
180+
* just return as if the sync were already set up.
179181
*/
180-
static int add_pioneer_implicit_fb(struct snd_usb_audio *chip,
181-
struct audioformat *fmt,
182-
struct usb_host_interface *alts)
182+
static int skip_pioneer_sync_ep(struct snd_usb_audio *chip,
183+
struct audioformat *fmt,
184+
struct usb_host_interface *alts)
183185
{
184186
struct usb_endpoint_descriptor *epd;
185187

@@ -194,8 +196,7 @@ static int add_pioneer_implicit_fb(struct snd_usb_audio *chip,
194196
(epd->bmAttributes & USB_ENDPOINT_USAGE_MASK) !=
195197
USB_ENDPOINT_USAGE_IMPLICIT_FB))
196198
return 0;
197-
return add_implicit_fb_sync_ep(chip, fmt, epd->bEndpointAddress, 1,
198-
alts->desc.bInterfaceNumber, alts);
199+
return 1; /* don't handle with the implicit fb, just skip sync EP */
199200
}
200201

201202
static int __add_generic_implicit_fb(struct snd_usb_audio *chip,
@@ -298,11 +299,11 @@ static int audioformat_implicit_fb_quirk(struct snd_usb_audio *chip,
298299
return 1;
299300
}
300301

301-
/* Pioneer devices implicit feedback with vendor spec class */
302+
/* Pioneer devices with vendor spec class */
302303
if (attr == USB_ENDPOINT_SYNC_ASYNC &&
303304
alts->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
304305
USB_ID_VENDOR(chip->usb_id) == 0x2b73 /* Pioneer */) {
305-
if (add_pioneer_implicit_fb(chip, fmt, alts))
306+
if (skip_pioneer_sync_ep(chip, fmt, alts))
306307
return 1;
307308
}
308309

0 commit comments

Comments
 (0)