{
snd_pcm_direct_t *dmix = pcm->private_data;
unsigned short events;
+ int empty = 0;
assert(pfds && nfds == 1 && revents);
events = pfds[0].revents;
if (events & POLLIN) {
snd_pcm_uframes_t avail;
- int empty;
snd_pcm_avail_update(pcm);
if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
events |= POLLOUT;
avail = snd_pcm_mmap_capture_avail(pcm);
}
empty = avail < pcm->avail_min;
- if (empty) {
- snd_pcm_direct_clear_timer_queue(dmix);
- events &= ~(POLLOUT|POLLIN);
- }
}
switch (snd_pcm_state(dmix->spcm)) {
case SND_PCM_STATE_XRUN:
events |= POLLERR;
break;
default:
+ if (empty) {
+ snd_pcm_direct_clear_timer_queue(dmix);
+ events &= ~(POLLOUT|POLLIN);
+ }
break;
}
*revents = events;
dmix->avail_max = avail;
if (avail >= pcm->stop_threshold) {
struct timeval tv;
- snd_pcm_direct_timer_stop(dmix);
+ snd_timer_stop(dmix->timer);
gettimeofday(&tv, 0);
dmix->trigger_tstamp.tv_sec = tv.tv_sec;
dmix->trigger_tstamp.tv_nsec = tv.tv_usec * 1000L;
return -EPIPE;
}
dmix->state = SND_PCM_STATE_SETUP;
+ /* clear queue to remove pending poll events */
+ snd_pcm_direct_clear_timer_queue(dmix);
}
return 0;
}