ALSA: usb-audio: Rename early_playback_start flag with lowlatency_playback
authorTakashi Iwai <tiwai@suse.de>
Wed, 29 Sep 2021 08:08:38 +0000 (10:08 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 30 Sep 2021 11:55:20 +0000 (13:55 +0200)
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.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/card.h
sound/usb/endpoint.c
sound/usb/pcm.c

index 746a765..a00caa1 100644 (file)
@@ -126,6 +126,7 @@ struct snd_usb_endpoint {
        int skip_packets;               /* quirks for devices to ignore the first n packets
                                           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? */
 
        /* for hw constraints */
@@ -190,7 +191,7 @@ struct snd_usb_substream {
        } dsd_dop;
 
        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;
 };
 
index 0624156..8e164d7 100644 (file)
@@ -794,6 +794,10 @@ void snd_usb_endpoint_set_callback(struct snd_usb_endpoint *ep,
 {
        ep->prepare_data_urb = prepare;
        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);
 }
 
index 1939211..4dd7f1c 100644 (file)
@@ -581,6 +581,22 @@ static int snd_usb_hw_free(struct snd_pcm_substream *substream)
        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
  *
@@ -614,13 +630,8 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream)
        subs->period_elapsed_pending = 0;
        runtime->delay = 0;
 
-       /* check whether early start is needed for playback stream */
-       subs->early_playback_start =
-               subs->direction == SNDRV_PCM_STREAM_PLAYBACK &&
-               (!chip->lowlatency ||
-                (subs->data_endpoint->nominal_queue_size >= subs->buffer_bytes));
-
-       if (subs->early_playback_start)
+       subs->lowlatency_playback = lowlatency_playback_available(subs);
+       if (!subs->lowlatency_playback)
                ret = start_endpoints(subs);
 
  unlock:
@@ -1412,7 +1423,7 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,
                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;
                period_elapsed = 0;
        }
@@ -1466,7 +1477,7 @@ static int snd_usb_substream_playback_trigger(struct snd_pcm_substream *substrea
                                              prepare_playback_urb,
                                              retire_playback_urb,
                                              subs);
-               if (!subs->early_playback_start &&
+               if (subs->lowlatency_playback &&
                    cmd == SNDRV_PCM_TRIGGER_START) {
                        err = start_endpoints(subs);
                        if (err < 0) {