OSDN Git Service

ALSA: pcm: Use snd_pcm_stop_xrun() for xrun injection
authorTakashi Iwai <tiwai@suse.de>
Wed, 4 Jul 2018 13:08:05 +0000 (15:08 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 4 Jul 2018 13:34:59 +0000 (15:34 +0200)
Basically the xrun injection routine can simply call the standard
helper snd_pcm_stop_xrun(), but with one exception: it may be called
even when the stream is closed.

Make snd_pcm_stop_xrun() more robust and check the NULL runtime state,
and simplify xrun injection code by calling it.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/pcm.c
sound/core/pcm_native.c

index 6f037a4..fdb9b92 100644 (file)
@@ -492,13 +492,8 @@ static void snd_pcm_xrun_injection_write(struct snd_info_entry *entry,
                                         struct snd_info_buffer *buffer)
 {
        struct snd_pcm_substream *substream = entry->private_data;
-       struct snd_pcm_runtime *runtime;
 
-       snd_pcm_stream_lock_irq(substream);
-       runtime = substream->runtime;
-       if (runtime && runtime->status->state == SNDRV_PCM_STATE_RUNNING)
-               __snd_pcm_xrun(substream);
-       snd_pcm_stream_unlock_irq(substream);
+       snd_pcm_stop_xrun(substream);
 }
 
 static void snd_pcm_xrun_debug_read(struct snd_info_entry *entry,
index 20174d0..66c90f4 100644 (file)
@@ -1339,7 +1339,7 @@ int snd_pcm_stop_xrun(struct snd_pcm_substream *substream)
        unsigned long flags;
 
        snd_pcm_stream_lock_irqsave(substream, flags);
-       if (snd_pcm_running(substream))
+       if (substream->runtime && snd_pcm_running(substream))
                __snd_pcm_xrun(substream);
        snd_pcm_stream_unlock_irqrestore(substream, flags);
        return 0;