mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-31 22:25:35 -04:00
A next try to fix the snd_pcm_wait() behaviour with direct plugins
This commit is contained in:
parent
f2175f1384
commit
f5a5284c6d
2 changed files with 17 additions and 11 deletions
|
|
@ -2082,20 +2082,10 @@ int snd_pcm_wait(snd_pcm_t *pcm, int timeout)
|
|||
}
|
||||
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;
|
||||
|
|
@ -2112,6 +2102,19 @@ int snd_pcm_wait(snd_pcm_t *pcm, int timeout)
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -427,6 +427,7 @@ int snd_pcm_direct_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned in
|
|||
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;
|
||||
|
|
@ -436,6 +437,8 @@ int snd_pcm_direct_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned in
|
|||
}
|
||||
/* 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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue