}
err = snd_pcm_poll_descriptors(pcm, &pfd, 1);
assert(err == 1);
+ __retry:
err_poll = poll(&pfd, 1, timeout);
if (err_poll < 0)
return -errno;
-#if 0 /* very useful code to test poll related problems */
- {
- snd_pcm_sframes_t delay, avail_update;
- snd_pcm_hwsync(pcm);
- avail_update = snd_pcm_avail_update(pcm);
- if (avail_update < pcm->avail_min) {
- printf("*** snd_pcm_wait() FATAL ERROR!!!\n");
- printf("avail_min = %li, avail_update = %li\n", pcm->avail_min, avail_update);
- }
- }
-#endif
err = snd_pcm_poll_descriptors_revents(pcm, &pfd, 1, &revents);
if (err < 0)
return err;
return -EIO;
}
}
+ if ((revents & (POLLIN | POLLOUT)) == 0)
+ goto __retry;
+#if 0 /* very useful code to test poll related problems */
+ {
+ snd_pcm_sframes_t avail_update;
+ snd_pcm_hwsync(pcm);
+ avail_update = snd_pcm_avail_update(pcm);
+ if (avail_update < (snd_pcm_sframes_t)pcm->avail_min) {
+ printf("*** snd_pcm_wait() FATAL ERROR!!!\n");
+ printf("avail_min = %li, avail_update = %li\n", pcm->avail_min, avail_update);
+ }
+ }
+#endif
return err_poll > 0 ? 1 : 0;
}
events = pfds[0].revents;
if (events & POLLIN) {
int empty = 0;
+ snd_pcm_avail_update(pcm);
if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
events |= POLLOUT;
events &= ~POLLIN;
}
/* empty the timer read queue */
while (empty && snd_timer_read(dmix->timer, &rbuf, sizeof(rbuf)) == sizeof(rbuf)) ;
+ if (empty)
+ events &= ~(POLLOUT|POLLIN);
}
*revents = events;
return 0;