ALSA: usb-audio: separate sync endpoint setting from set_format
Setting the sync endpoint currently takes up about half of set_format(). Move it to a dedicated function. No functional change. Signed-off-by: Eldad Zack <eldad@fogrefinery.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
d133f2c22e
commit
71bb64c56d
128
sound/usb/pcm.c
128
sound/usb/pcm.c
@ -327,64 +327,17 @@ static int search_roland_implicit_fb(struct usb_device *dev, int ifnum,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* find a matching format and set up the interface
|
static int set_sync_endpoint(struct snd_usb_substream *subs,
|
||||||
*/
|
struct audioformat *fmt,
|
||||||
static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt)
|
struct usb_device *dev,
|
||||||
|
struct usb_host_interface *alts,
|
||||||
|
struct usb_interface_descriptor *altsd)
|
||||||
{
|
{
|
||||||
struct usb_device *dev = subs->dev;
|
|
||||||
struct usb_host_interface *alts;
|
|
||||||
struct usb_interface_descriptor *altsd;
|
|
||||||
struct usb_interface *iface;
|
struct usb_interface *iface;
|
||||||
unsigned int ep, attr;
|
|
||||||
int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK;
|
int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK;
|
||||||
int err, implicit_fb = 0;
|
unsigned int ep, attr;
|
||||||
|
int implicit_fb = 0;
|
||||||
iface = usb_ifnum_to_if(dev, fmt->iface);
|
|
||||||
if (WARN_ON(!iface))
|
|
||||||
return -EINVAL;
|
|
||||||
alts = &iface->altsetting[fmt->altset_idx];
|
|
||||||
altsd = get_iface_desc(alts);
|
|
||||||
if (WARN_ON(altsd->bAlternateSetting != fmt->altsetting))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
if (fmt == subs->cur_audiofmt)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* close the old interface */
|
|
||||||
if (subs->interface >= 0 && subs->interface != fmt->iface) {
|
|
||||||
err = usb_set_interface(subs->dev, subs->interface, 0);
|
|
||||||
if (err < 0) {
|
|
||||||
snd_printk(KERN_ERR "%d:%d:%d: return to setting 0 failed (%d)\n",
|
|
||||||
dev->devnum, fmt->iface, fmt->altsetting, err);
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
subs->interface = -1;
|
|
||||||
subs->altset_idx = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set interface */
|
|
||||||
if (subs->interface != fmt->iface ||
|
|
||||||
subs->altset_idx != fmt->altset_idx) {
|
|
||||||
err = usb_set_interface(dev, fmt->iface, fmt->altsetting);
|
|
||||||
if (err < 0) {
|
|
||||||
snd_printk(KERN_ERR "%d:%d:%d: usb_set_interface failed (%d)\n",
|
|
||||||
dev->devnum, fmt->iface, fmt->altsetting, err);
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
snd_printdd(KERN_INFO "setting usb interface %d:%d\n",
|
|
||||||
fmt->iface, fmt->altsetting);
|
|
||||||
subs->interface = fmt->iface;
|
|
||||||
subs->altset_idx = fmt->altset_idx;
|
|
||||||
|
|
||||||
snd_usb_set_interface_quirk(dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
subs->data_endpoint = snd_usb_add_endpoint(subs->stream->chip,
|
|
||||||
alts, fmt->endpoint, subs->direction,
|
|
||||||
SND_USB_ENDPOINT_TYPE_DATA);
|
|
||||||
if (!subs->data_endpoint)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
/* we need a sync pipe in async OUT or adaptive IN mode */
|
/* we need a sync pipe in async OUT or adaptive IN mode */
|
||||||
/* check the number of EP, since some devices have broken
|
/* check the number of EP, since some devices have broken
|
||||||
@ -479,6 +432,71 @@ add_sync_ep:
|
|||||||
subs->data_endpoint->sync_master = subs->sync_endpoint;
|
subs->data_endpoint->sync_master = subs->sync_endpoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* find a matching format and set up the interface
|
||||||
|
*/
|
||||||
|
static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt)
|
||||||
|
{
|
||||||
|
struct usb_device *dev = subs->dev;
|
||||||
|
struct usb_host_interface *alts;
|
||||||
|
struct usb_interface_descriptor *altsd;
|
||||||
|
struct usb_interface *iface;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
iface = usb_ifnum_to_if(dev, fmt->iface);
|
||||||
|
if (WARN_ON(!iface))
|
||||||
|
return -EINVAL;
|
||||||
|
alts = &iface->altsetting[fmt->altset_idx];
|
||||||
|
altsd = get_iface_desc(alts);
|
||||||
|
if (WARN_ON(altsd->bAlternateSetting != fmt->altsetting))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (fmt == subs->cur_audiofmt)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* close the old interface */
|
||||||
|
if (subs->interface >= 0 && subs->interface != fmt->iface) {
|
||||||
|
err = usb_set_interface(subs->dev, subs->interface, 0);
|
||||||
|
if (err < 0) {
|
||||||
|
snd_printk(KERN_ERR "%d:%d:%d: return to setting 0 failed (%d)\n",
|
||||||
|
dev->devnum, fmt->iface, fmt->altsetting, err);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
subs->interface = -1;
|
||||||
|
subs->altset_idx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set interface */
|
||||||
|
if (subs->interface != fmt->iface ||
|
||||||
|
subs->altset_idx != fmt->altset_idx) {
|
||||||
|
err = usb_set_interface(dev, fmt->iface, fmt->altsetting);
|
||||||
|
if (err < 0) {
|
||||||
|
snd_printk(KERN_ERR "%d:%d:%d: usb_set_interface failed (%d)\n",
|
||||||
|
dev->devnum, fmt->iface, fmt->altsetting, err);
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
snd_printdd(KERN_INFO "setting usb interface %d:%d\n",
|
||||||
|
fmt->iface, fmt->altsetting);
|
||||||
|
subs->interface = fmt->iface;
|
||||||
|
subs->altset_idx = fmt->altset_idx;
|
||||||
|
|
||||||
|
snd_usb_set_interface_quirk(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
subs->data_endpoint = snd_usb_add_endpoint(subs->stream->chip,
|
||||||
|
alts, fmt->endpoint, subs->direction,
|
||||||
|
SND_USB_ENDPOINT_TYPE_DATA);
|
||||||
|
|
||||||
|
if (!subs->data_endpoint)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
err = set_sync_endpoint(subs, fmt, dev, alts, altsd);
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
err = snd_usb_init_pitch(subs->stream->chip, fmt->iface, alts, fmt);
|
err = snd_usb_init_pitch(subs->stream->chip, fmt->iface, alts, fmt);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
Loading…
Reference in New Issue
Block a user