ALSA: pcm - Reset invalid position even without debug option
authorTakashi Iwai <tiwai@suse.de>
Thu, 19 Mar 2009 09:01:47 +0000 (10:01 +0100)
committerTakashi Iwai <tiwai@suse.de>
Thu, 19 Mar 2009 09:01:47 +0000 (10:01 +0100)
Always reset the invalind hw_ptr position returned by the pointer
callback.  The behavior should be consitent independently from the
debug option.

Also, add the printk_ratelimit() check to avoid flooding debug
prints.

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

index 3026547..92ed6d8 100644 (file)
@@ -159,11 +159,15 @@ snd_pcm_update_hw_ptr_pos(struct snd_pcm_substream *substream,
        pos = substream->ops->pointer(substream);
        if (pos == SNDRV_PCM_POS_XRUN)
                return pos; /* XRUN */
        pos = substream->ops->pointer(substream);
        if (pos == SNDRV_PCM_POS_XRUN)
                return pos; /* XRUN */
-#ifdef CONFIG_SND_DEBUG
        if (pos >= runtime->buffer_size) {
        if (pos >= runtime->buffer_size) {
-               snd_printk(KERN_ERR  "BUG: stream = %i, pos = 0x%lx, buffer size = 0x%lx, period size = 0x%lx\n", substream->stream, pos, runtime->buffer_size, runtime->period_size);
+               if (printk_ratelimit()) {
+                       snd_printd(KERN_ERR  "BUG: stream = %i, pos = 0x%lx, "
+                                  "buffer size = 0x%lx, period size = 0x%lx\n",
+                                  substream->stream, pos, runtime->buffer_size,
+                                  runtime->period_size);
+               }
+               pos = 0;
        }
        }
-#endif
        pos -= pos % runtime->min_align;
        return pos;
 }
        pos -= pos % runtime->min_align;
        return pos;
 }