Commit 9c9a3b9d authored by Takashi Iwai's avatar Takashi Iwai

ALSA: usb-audio: Rename early_playback_start flag with lowlatency_playback

This is a preparation patch for the upcoming low-latency improvement
changes.

Rename early_playback_start flag with lowlatency_playback as it's more
intuitive.  The new flag is basically a reverse meaning.

Along with the rename, factor out the code to set the flag to a
function.  This makes the complex condition checks simpler.

Also, the same flag is introduced to snd_usb_endpoint, too, that is
carried from the snd_usb_substream flag.  Currently the endpoint flag
isn't still referred, but will be used in later patches.

Link: https://lore.kernel.org/r/20210929080844.11583-4-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 86a42ad0
...@@ -126,6 +126,7 @@ struct snd_usb_endpoint { ...@@ -126,6 +126,7 @@ struct snd_usb_endpoint {
int skip_packets; /* quirks for devices to ignore the first n packets int skip_packets; /* quirks for devices to ignore the first n packets
in a stream */ in a stream */
bool implicit_fb_sync; /* syncs with implicit feedback */ 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 configure? */
/* for hw constraints */ /* for hw constraints */
...@@ -190,7 +191,7 @@ struct snd_usb_substream { ...@@ -190,7 +191,7 @@ struct snd_usb_substream {
} dsd_dop; } dsd_dop;
bool trigger_tstamp_pending_update; /* trigger timestamp being updated from initial estimate */ bool trigger_tstamp_pending_update; /* trigger timestamp being updated from initial estimate */
bool early_playback_start; /* early start needed for playback? */ bool lowlatency_playback; /* low-latency playback mode */
struct media_ctl *media_ctl; struct media_ctl *media_ctl;
}; };
......
...@@ -794,6 +794,10 @@ void snd_usb_endpoint_set_callback(struct snd_usb_endpoint *ep, ...@@ -794,6 +794,10 @@ void snd_usb_endpoint_set_callback(struct snd_usb_endpoint *ep,
{ {
ep->prepare_data_urb = prepare; ep->prepare_data_urb = prepare;
ep->retire_data_urb = retire; ep->retire_data_urb = retire;
if (data_subs)
ep->lowlatency_playback = data_subs->lowlatency_playback;
else
ep->lowlatency_playback = false;
WRITE_ONCE(ep->data_subs, data_subs); WRITE_ONCE(ep->data_subs, data_subs);
} }
......
...@@ -581,6 +581,22 @@ static int snd_usb_hw_free(struct snd_pcm_substream *substream) ...@@ -581,6 +581,22 @@ static int snd_usb_hw_free(struct snd_pcm_substream *substream)
return 0; return 0;
} }
/* check whether early start is needed for playback stream */
static int lowlatency_playback_available(struct snd_usb_substream *subs)
{
struct snd_usb_audio *chip = subs->stream->chip;
if (subs->direction == SNDRV_PCM_STREAM_CAPTURE)
return false;
/* disabled via module option? */
if (!chip->lowlatency)
return false;
/* too short periods? */
if (subs->data_endpoint->nominal_queue_size >= subs->buffer_bytes)
return false;
return true;
}
/* /*
* prepare callback * prepare callback
* *
...@@ -614,13 +630,8 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream) ...@@ -614,13 +630,8 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream)
subs->period_elapsed_pending = 0; subs->period_elapsed_pending = 0;
runtime->delay = 0; runtime->delay = 0;
/* check whether early start is needed for playback stream */ subs->lowlatency_playback = lowlatency_playback_available(subs);
subs->early_playback_start = if (!subs->lowlatency_playback)
subs->direction == SNDRV_PCM_STREAM_PLAYBACK &&
(!chip->lowlatency ||
(subs->data_endpoint->nominal_queue_size >= subs->buffer_bytes));
if (subs->early_playback_start)
ret = start_endpoints(subs); ret = start_endpoints(subs);
unlock: unlock:
...@@ -1412,7 +1423,7 @@ static void prepare_playback_urb(struct snd_usb_substream *subs, ...@@ -1412,7 +1423,7 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,
subs->trigger_tstamp_pending_update = false; subs->trigger_tstamp_pending_update = false;
} }
if (period_elapsed && !subs->running && !subs->early_playback_start) { if (period_elapsed && !subs->running && subs->lowlatency_playback) {
subs->period_elapsed_pending = 1; subs->period_elapsed_pending = 1;
period_elapsed = 0; period_elapsed = 0;
} }
...@@ -1466,7 +1477,7 @@ static int snd_usb_substream_playback_trigger(struct snd_pcm_substream *substrea ...@@ -1466,7 +1477,7 @@ static int snd_usb_substream_playback_trigger(struct snd_pcm_substream *substrea
prepare_playback_urb, prepare_playback_urb,
retire_playback_urb, retire_playback_urb,
subs); subs);
if (!subs->early_playback_start && if (subs->lowlatency_playback &&
cmd == SNDRV_PCM_TRIGGER_START) { cmd == SNDRV_PCM_TRIGGER_START) {
err = start_endpoints(subs); err = start_endpoints(subs);
if (err < 0) { if (err < 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment