ALSA: PCM midlevel: lower jiffies check margin using runtime->delay value
When hardware has large FIFO, it is necessary to lower jiffies margin by count of queued samples. Signed-off-by: Jaroslav Kysela <perex@perex.cz> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
13f040f9e5
commit
a4444da31e
@ -263,6 +263,9 @@ static int snd_pcm_update_hw_ptr_interrupt(struct snd_pcm_substream *substream)
|
|||||||
if (runtime->hw.info & SNDRV_PCM_INFO_BATCH)
|
if (runtime->hw.info & SNDRV_PCM_INFO_BATCH)
|
||||||
goto no_jiffies_check;
|
goto no_jiffies_check;
|
||||||
hdelta = new_hw_ptr - old_hw_ptr;
|
hdelta = new_hw_ptr - old_hw_ptr;
|
||||||
|
if (hdelta < runtime->delay)
|
||||||
|
goto no_jiffies_check;
|
||||||
|
hdelta -= runtime->delay;
|
||||||
jdelta = jiffies - runtime->hw_ptr_jiffies;
|
jdelta = jiffies - runtime->hw_ptr_jiffies;
|
||||||
if (((hdelta * HZ) / runtime->rate) > jdelta + HZ/100) {
|
if (((hdelta * HZ) / runtime->rate) > jdelta + HZ/100) {
|
||||||
delta = jdelta /
|
delta = jdelta /
|
||||||
@ -349,8 +352,12 @@ int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream)
|
|||||||
new_hw_ptr = hw_base + pos;
|
new_hw_ptr = hw_base + pos;
|
||||||
}
|
}
|
||||||
/* Do jiffies check only in xrun_debug mode */
|
/* Do jiffies check only in xrun_debug mode */
|
||||||
if (xrun_debug(substream, 4) &&
|
if (!xrun_debug(substream, 4))
|
||||||
((delta * HZ) / runtime->rate) > jdelta + HZ/100) {
|
goto no_jiffies_check;
|
||||||
|
if (delta < runtime->delay)
|
||||||
|
goto no_jiffies_check;
|
||||||
|
delta -= runtime->delay;
|
||||||
|
if (((delta * HZ) / runtime->rate) > jdelta + HZ/100) {
|
||||||
hw_ptr_error(substream,
|
hw_ptr_error(substream,
|
||||||
"hw_ptr skipping! "
|
"hw_ptr skipping! "
|
||||||
"(pos=%ld, delta=%ld, period=%ld, jdelta=%lu/%lu)\n",
|
"(pos=%ld, delta=%ld, period=%ld, jdelta=%lu/%lu)\n",
|
||||||
@ -359,6 +366,7 @@ int snd_pcm_update_hw_ptr(struct snd_pcm_substream *substream)
|
|||||||
((delta * HZ) / runtime->rate));
|
((delta * HZ) / runtime->rate));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
no_jiffies_check:
|
||||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
|
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
|
||||||
runtime->silence_size > 0)
|
runtime->silence_size > 0)
|
||||||
snd_pcm_playback_silence(substream, new_hw_ptr);
|
snd_pcm_playback_silence(substream, new_hw_ptr);
|
||||||
|
Loading…
Reference in New Issue
Block a user