[alsa-devel] How does ALSA detect underrun in OSS emulation?
Can someone explain to me the exact method that ALSA uses to detect underrun with OSS emulation? I have a driver that reports underrun on almost every period when I use OSS emulation and I'm playing with a non-supported sample rate. So I'm assuming that maybe my hardware is playing the audio too fast or too slow, and the driver is returning periods before ALSA expects them. What I don't understand is: how does ALSA know that a period was finished too early. Does it use a timer, or is it purely application driven?
At Mon, 25 Feb 2008 09:22:41 -0600, Timur Tabi wrote:
Can someone explain to me the exact method that ALSA uses to detect underrun with OSS emulation? I have a driver that reports underrun on almost every period when I use OSS emulation and I'm playing with a non-supported sample rate. So I'm assuming that maybe my hardware is playing the audio too fast or too slow, and the driver is returning periods before ALSA expects them. What I don't understand is: how does ALSA know that a period was finished too early. Does it use a timer, or is it purely application driven?
It's just as same as on ALSA native API, checks the validity of the current position reported by pointer callback in snd_pcm_period_elapsed().
Takashi
Takashi Iwai wrote:
It's just as same as on ALSA native API, checks the validity of the current position reported by pointer callback in snd_pcm_period_elapsed().
Are you talking about this code in snd_pcm_update_hw_ptr_pos?
pos = substream->ops->pointer(substream); if (pos == SNDRV_PCM_POS_XRUN) return pos; /* XRUN */
What if my 'pointer' function never returns SNDRV_PCM_POS_XRUN? How else can I get an underrun detected?
At Mon, 25 Feb 2008 09:38:38 -0600, Timur Tabi wrote:
Takashi Iwai wrote:
It's just as same as on ALSA native API, checks the validity of the current position reported by pointer callback in snd_pcm_period_elapsed().
Are you talking about this code in snd_pcm_update_hw_ptr_pos?
pos = substream->ops->pointer(substream); if (pos == SNDRV_PCM_POS_XRUN) return pos; /* XRUN */
This is one part that ALSA detects XRUN.
What if my 'pointer' function never returns SNDRV_PCM_POS_XRUN? How else can I get an underrun detected?
Another part is in snd_pcm_update_hw_ptr_post(). It checks whether the updated empty space (snd_pcm_playback_avail()) is bigger than stop_threshold (usually equal with the buffer size).
Takashi
participants (2)
-
Takashi Iwai
-
Timur Tabi