]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ALSA: pcm: trace XRUN event at injection, too
authorTakashi Iwai <tiwai@suse.de>
Wed, 4 Jul 2018 12:46:27 +0000 (14:46 +0200)
committerTakashi Iwai <tiwai@suse.de>
Wed, 4 Jul 2018 13:34:57 +0000 (15:34 +0200)
The PCM xrun injection triggers directly snd_pcm_stop() without the
standard xrun handler, hence it's not recorded on the event buffer.
Ditto for snd_pcm_stop_xrun() call and SNDRV_PCM_IOCTL_XRUN ioctl.
They are inconvenient from the debugging POV.

Let's make them to trigger XRUN via the standard helper more
consistently.

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

index c352bfb973cc292e756dd351c2ad66604be68b56..6f037a4b8b52d653867a0f5c9c33f78439e5fc09 100644 (file)
@@ -497,7 +497,7 @@ static void snd_pcm_xrun_injection_write(struct snd_info_entry *entry,
        snd_pcm_stream_lock_irq(substream);
        runtime = substream->runtime;
        if (runtime && runtime->status->state == SNDRV_PCM_STATE_RUNNING)
-               snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
+               __snd_pcm_xrun(substream);
        snd_pcm_stream_unlock_irq(substream);
 }
 
index 44b5ae83308215cddd0c027048346e727ff95382..c1d2e8e1fc6b0e7ae7f6ebd909e116dd6d1d9293 100644 (file)
@@ -153,7 +153,8 @@ EXPORT_SYMBOL(snd_pcm_debug_name);
                        dump_stack();                           \
        } while (0)
 
-static void xrun(struct snd_pcm_substream *substream)
+/* call with stream lock held */
+void __snd_pcm_xrun(struct snd_pcm_substream *substream)
 {
        struct snd_pcm_runtime *runtime = substream->runtime;
 
@@ -201,7 +202,7 @@ int snd_pcm_update_state(struct snd_pcm_substream *substream,
                }
        } else {
                if (avail >= runtime->stop_threshold) {
-                       xrun(substream);
+                       __snd_pcm_xrun(substream);
                        return -EPIPE;
                }
        }
@@ -297,7 +298,7 @@ static int snd_pcm_update_hw_ptr0(struct snd_pcm_substream *substream,
        }
 
        if (pos == SNDRV_PCM_POS_XRUN) {
-               xrun(substream);
+               __snd_pcm_xrun(substream);
                return -EPIPE;
        }
        if (pos >= runtime->buffer_size) {
index 7a499d02df6cf66ecaeb134afeacf89cc9603688..c515612969a474485b2a843591a15a42605e8a0a 100644 (file)
@@ -65,4 +65,6 @@ static inline void snd_pcm_timer_init(struct snd_pcm_substream *substream) {}
 static inline void snd_pcm_timer_done(struct snd_pcm_substream *substream) {}
 #endif
 
+void __snd_pcm_xrun(struct snd_pcm_substream *substream);
+
 #endif /* __SOUND_CORE_PCM_LOCAL_H */
index cecc79772c947ecde8237e199b6043eb39e38e44..20174d0c05276f39739b3697b6921328d85afcfd 100644 (file)
@@ -1337,13 +1337,12 @@ int snd_pcm_drain_done(struct snd_pcm_substream *substream)
 int snd_pcm_stop_xrun(struct snd_pcm_substream *substream)
 {
        unsigned long flags;
-       int ret = 0;
 
        snd_pcm_stream_lock_irqsave(substream, flags);
        if (snd_pcm_running(substream))
-               ret = snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
+               __snd_pcm_xrun(substream);
        snd_pcm_stream_unlock_irqrestore(substream, flags);
-       return ret;
+       return 0;
 }
 EXPORT_SYMBOL_GPL(snd_pcm_stop_xrun);
 
@@ -1591,7 +1590,8 @@ static int snd_pcm_xrun(struct snd_pcm_substream *substream)
                result = 0;     /* already there */
                break;
        case SNDRV_PCM_STATE_RUNNING:
-               result = snd_pcm_stop(substream, SNDRV_PCM_STATE_XRUN);
+               __snd_pcm_xrun(substream);
+               result = 0;
                break;
        default:
                result = -EBADFD;