ALSA: usb-audio: Avoid superfluous endpoint setup
After splitting to snd_usb_endpoint_set_params() and *_prepare(), the
skip of each function should be checked with different flags, while we
still use ep->need_setup as the single one. Introduce
ep->need_prepare for indicating the need of prepare, and also add the
missing check of ep->need_setup at the set_params.
Fixes: 2be79d5864
("ALSA: usb-audio: Split endpoint setups for hw_params and prepare (take#2)")
Link: https://lore.kernel.org/r/20221009104212.18877-5-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
9355b60e40
commit
1045f5f1ff
@ -129,7 +129,8 @@ struct snd_usb_endpoint {
|
||||
in a stream */
|
||||
bool implicit_fb_sync; /* syncs with implicit feedback */
|
||||
bool lowlatency_playback; /* low-latency playback mode */
|
||||
bool need_setup; /* (re-)need for configure? */
|
||||
bool need_setup; /* (re-)need for hw_params? */
|
||||
bool need_prepare; /* (re-)need for prepare? */
|
||||
|
||||
/* for hw constraints */
|
||||
const struct audioformat *cur_audiofmt;
|
||||
|
@ -824,6 +824,7 @@ snd_usb_endpoint_open(struct snd_usb_audio *chip,
|
||||
|
||||
ep->implicit_fb_sync = fp->implicit_fb;
|
||||
ep->need_setup = true;
|
||||
ep->need_prepare = true;
|
||||
|
||||
usb_audio_dbg(chip, " channels=%d, rate=%d, format=%s, period_bytes=%d, periods=%d, implicit_fb=%d\n",
|
||||
ep->cur_channels, ep->cur_rate,
|
||||
@ -952,7 +953,7 @@ void snd_usb_endpoint_close(struct snd_usb_audio *chip,
|
||||
/* Prepare for suspening EP, called from the main suspend handler */
|
||||
void snd_usb_endpoint_suspend(struct snd_usb_endpoint *ep)
|
||||
{
|
||||
ep->need_setup = true;
|
||||
ep->need_prepare = true;
|
||||
if (ep->iface_ref)
|
||||
ep->iface_ref->need_setup = true;
|
||||
if (ep->clock_ref)
|
||||
@ -1335,9 +1336,12 @@ int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
|
||||
struct snd_usb_endpoint *ep)
|
||||
{
|
||||
const struct audioformat *fmt = ep->cur_audiofmt;
|
||||
int err;
|
||||
int err = 0;
|
||||
|
||||
mutex_lock(&chip->mutex);
|
||||
if (!ep->need_setup)
|
||||
goto unlock;
|
||||
|
||||
/* release old buffers, if any */
|
||||
err = release_urbs(ep, false);
|
||||
if (err < 0)
|
||||
@ -1386,8 +1390,11 @@ int snd_usb_endpoint_set_params(struct snd_usb_audio *chip,
|
||||
ep->curframesize = ep->curpacksize / ep->cur_frame_bytes;
|
||||
|
||||
err = update_clock_ref_rate(chip, ep);
|
||||
if (err >= 0)
|
||||
if (err >= 0) {
|
||||
ep->need_setup = false;
|
||||
err = 0;
|
||||
}
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&chip->mutex);
|
||||
return err;
|
||||
@ -1437,7 +1444,7 @@ int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
|
||||
mutex_lock(&chip->mutex);
|
||||
if (WARN_ON(!ep->iface_ref))
|
||||
goto unlock;
|
||||
if (!ep->need_setup)
|
||||
if (!ep->need_prepare)
|
||||
goto unlock;
|
||||
|
||||
/* If the interface has been already set up, just set EP parameters */
|
||||
@ -1491,7 +1498,7 @@ int snd_usb_endpoint_prepare(struct snd_usb_audio *chip,
|
||||
ep->iface_ref->need_setup = false;
|
||||
|
||||
done:
|
||||
ep->need_setup = false;
|
||||
ep->need_prepare = false;
|
||||
err = 1;
|
||||
|
||||
unlock:
|
||||
|
Loading…
Reference in New Issue
Block a user