ALSA: pcm: Update hardware pointer before start capture
authorRicardo Biehl Pasquali <pasqualirb@gmail.com>
Fri, 7 Sep 2018 19:58:54 +0000 (16:58 -0300)
committerTakashi Iwai <tiwai@suse.de>
Mon, 10 Sep 2018 07:06:55 +0000 (09:06 +0200)
This ensures the transfer loop won't waste a run to read
the few frames (if any) between start and hw_ptr update.
It will wait for the next interrupt with wait_for_avail().

Signed-off-by: Ricardo Biehl Pasquali <pasqualirb@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/pcm_lib.c

index 7f71c24..40013b2 100644 (file)
@@ -2172,6 +2172,10 @@ snd_pcm_sframes_t __snd_pcm_lib_xfer(struct snd_pcm_substream *substream,
        if (err < 0)
                goto _end_unlock;
 
+       runtime->twake = runtime->control->avail_min ? : 1;
+       if (runtime->status->state == SNDRV_PCM_STATE_RUNNING)
+               snd_pcm_update_hw_ptr(substream);
+
        if (!is_playback &&
            runtime->status->state == SNDRV_PCM_STATE_PREPARED) {
                if (size >= runtime->start_threshold) {
@@ -2185,10 +2189,8 @@ snd_pcm_sframes_t __snd_pcm_lib_xfer(struct snd_pcm_substream *substream,
                }
        }
 
-       runtime->twake = runtime->control->avail_min ? : 1;
-       if (runtime->status->state == SNDRV_PCM_STATE_RUNNING)
-               snd_pcm_update_hw_ptr(substream);
        avail = snd_pcm_avail(substream);
+
        while (size > 0) {
                snd_pcm_uframes_t frames, appl_ptr, appl_ofs;
                snd_pcm_uframes_t cont;