diff options
-rw-r--r-- | Documentation/sound/alsa/Procfile.txt | 5 | ||||
-rw-r--r-- | sound/core/pcm_lib.c | 9 |
2 files changed, 13 insertions, 1 deletions
diff --git a/Documentation/sound/alsa/Procfile.txt b/Documentation/sound/alsa/Procfile.txt index bba2dbb79d81..cfac20cf9e33 100644 --- a/Documentation/sound/alsa/Procfile.txt +++ b/Documentation/sound/alsa/Procfile.txt | |||
@@ -104,6 +104,11 @@ card*/pcm*/xrun_debug | |||
104 | When this value is greater than 1, the driver will show the | 104 | When this value is greater than 1, the driver will show the |
105 | stack trace additionally. This may help the debugging. | 105 | stack trace additionally. This may help the debugging. |
106 | 106 | ||
107 | Since 2.6.30, this option also enables the hwptr check using | ||
108 | jiffies. This detects spontaneous invalid pointer callback | ||
109 | values, but can be lead to too much corrections for a (mostly | ||
110 | buggy) hardware that doesn't give smooth pointer updates. | ||
111 | |||
107 | card*/pcm*/sub*/info | 112 | card*/pcm*/sub*/info |
108 | The general information of this PCM sub-stream. | 113 | The general information of this PCM sub-stream. |
109 | 114 | ||
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index 3eea98a4e65a..d659995ac3ac 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c | |||
@@ -249,6 +249,11 @@ static int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *substream) | |||
249 | new_hw_ptr = hw_base + pos; | 249 | new_hw_ptr = hw_base + pos; |
250 | } | 250 | } |
251 | } | 251 | } |
252 | |||
253 | /* Do jiffies check only in xrun_debug mode */ | ||
254 | if (!xrun_debug(substream)) | ||
255 | goto no_jiffies_check; | ||
256 | |||
252 | /* Skip the jiffies check for hardwares with BATCH flag. | 257 | /* Skip the jiffies check for hardwares with BATCH flag. |
253 | * Such hardware usually just increases the position at each IRQ, | 258 | * Such hardware usually just increases the position at each IRQ, |
254 | * thus it can't give any strange position. | 259 | * thus it can't give any strange position. |
@@ -336,7 +341,9 @@ int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream) | |||
336 | hw_base = 0; | 341 | hw_base = 0; |
337 | new_hw_ptr = hw_base + pos; | 342 | new_hw_ptr = hw_base + pos; |
338 | } | 343 | } |
339 | if (((delta * HZ) / runtime->rate) > jdelta + HZ/100) { | 344 | /* Do jiffies check only in xrun_debug mode */ |
345 | if (xrun_debug(substream) && | ||
346 | ((delta * HZ) / runtime->rate) > jdelta + HZ/100) { | ||
340 | hw_ptr_error(substream, | 347 | hw_ptr_error(substream, |
341 | "hw_ptr skipping! " | 348 | "hw_ptr skipping! " |
342 | "(pos=%ld, delta=%ld, period=%ld, jdelta=%lu/%lu)\n", | 349 | "(pos=%ld, delta=%ld, period=%ld, jdelta=%lu/%lu)\n", |