[alsa-devel] Question about snd_pcm_update_hw_ptr_post()
Can someone explain to me this snippet from snd_pcm_update_hw_ptr_post():
if (avail >= runtime->stop_threshold) { if (substream->runtime->status->state == SNDRV_PCM_STATE_DRAINING) snd_pcm_drain_done(substream); else xrun(substream); return -EPIPE; }
During playback, avail = snd_pcm_playback_avail(). Does this mean that avail is number of frames available in the playback DMA buffer for new data?
If so, why is avail >= runtime->stop_threshold considered an underrun condition? Does ALSA try to keep the amount of available data to a minimum?
If so, how can I adjust runtime->stop_threshold? I'd like to see what happens if I make stop_threshold equal to the size of my DMA buffer.
Timur Tabi wrote:
During playback, avail = snd_pcm_playback_avail(). Does this mean that avail is number of frames available in the playback DMA buffer for new data?
Yes, it's the number of free frames that the application can write.
If so, why is avail >= runtime->stop_threshold considered an underrun condition?
When too many frames in the buffer are free, there are not enough frames available for the hardware to play.
The default value of the stop threshold is the size of the buffer, so an underrun happens when the buffer has been completely emptied.
how can I adjust runtime->stop_threshold?
snd_pcm_sw_params_current() snd_pcm_sw_params_set_stop_threshold() snd_pcm_sw_params()
HTH Clemens
participants (2)
-
Clemens Ladisch
-
Timur Tabi