subs->data_endpoint->sync_master = subs->sync_endpoint;
- if (subs->data_endpoint->iface != subs->sync_endpoint->iface ||
- subs->data_endpoint->altsetting != subs->sync_endpoint->altsetting) {
+ if (!subs->sync_endpoint->use_count &&
+ (subs->data_endpoint->iface != subs->sync_endpoint->iface ||
+ subs->data_endpoint->altsetting != subs->sync_endpoint->altsetting)) {
err = usb_set_interface(subs->dev,
subs->sync_endpoint->iface,
subs->sync_endpoint->altsetting);
struct usb_device *dev = subs->dev;
struct usb_host_interface *alts;
struct usb_interface *iface;
+ struct snd_usb_endpoint *ep;
int err;
iface = usb_ifnum_to_if(dev, fmt->iface);
if (fmt == subs->cur_audiofmt && !subs->need_setup_fmt)
return 0;
+ /* shared EP with implicit fb */
+ if (fmt->implicit_fb && !subs->need_setup_fmt) {
+ ep = snd_usb_get_endpoint(subs->stream->chip, fmt->endpoint,
+ fmt->iface, fmt->altsetting);
+ if (ep && ep->use_count > 0)
+ goto add_data_ep;
+ }
+
/* close the old interface */
if (subs->interface >= 0 && (subs->interface != fmt->iface || subs->need_setup_fmt)) {
if (!subs->stream->chip->keep_iface) {
snd_usb_set_interface_quirk(dev);
}
+ subs->need_setup_ep = true;
+
+ add_data_ep:
subs->interface = fmt->iface;
subs->altset_idx = fmt->altset_idx;
subs->data_endpoint = snd_usb_add_endpoint(subs->stream->chip,
if (err < 0)
return err;
- err = snd_usb_init_pitch(subs->stream->chip, fmt->iface, alts, fmt);
- if (err < 0)
- return err;
+ if (subs->need_setup_ep) {
+ err = snd_usb_init_pitch(subs->stream->chip, fmt->iface, alts, fmt);
+ if (err < 0)
+ return err;
+ }
subs->cur_audiofmt = fmt;
if (ret < 0)
goto unlock;
- subs->interface = fmt->iface;
- subs->altset_idx = fmt->altset_idx;
- subs->need_setup_ep = true;
-
unlock:
snd_usb_unlock_shutdown(subs->stream->chip);
if (ret < 0)