--- arts-1.3.2.orig/flow/audioioalsa9.cc 2004-05-26 20:50:18.000000000 +0200 +++ arts-1.3.2/flow/audioioalsa9.cc 2005-05-20 11:08:54.000000000 +0200 @@ -263,15 +263,40 @@ int AudioIOALSA::getParam(AudioParam p) { + snd_pcm_sframes_t avail; switch(p) { case canRead: if (! m_pcm_capture) return -1; - return snd_pcm_frames_to_bytes(m_pcm_capture, snd_pcm_avail_update(m_pcm_capture)); + while ((avail = snd_pcm_avail_update(m_pcm_capture)) < 0) { + if (avail == -EPIPE) + avail = xrun(m_pcm_capture); +#ifdef HAVE_SND_PCM_RESUME + else if (avail == -ESTRPIPE) + avail = resume(m_pcm_capture); +#endif + if (avail < 0) { + arts_info("Capture error: %s", snd_strerror(avail)); + return -1; + } + } + return snd_pcm_frames_to_bytes(m_pcm_capture, avail); case canWrite: if (! m_pcm_playback) return -1; - return snd_pcm_frames_to_bytes(m_pcm_playback, snd_pcm_avail_update(m_pcm_playback)); + while ((avail = snd_pcm_avail_update(m_pcm_playback)) < 0) { + if (avail == -EPIPE) + avail = xrun(m_pcm_playback); +#ifdef HAVE_SND_PCM_RESUME + else if (avail == -ESTRPIPE) + avail = resume(m_pcm_playback); +#endif + if (avail < 0) { + arts_info("Playback error: %s", snd_strerror(avail)); + return -1; + } + } + return snd_pcm_frames_to_bytes(m_pcm_playback, avail); case selectReadFD: return -1;