Implemented drain()

This commit is contained in:
Jaroslav Kysela 2003-02-12 14:54:41 +00:00
parent 6b8875c814
commit b3b7afc638

View file

@ -581,7 +581,6 @@ static int snd_pcm_dmix_sync_ptr(snd_pcm_t *pcm)
gettimeofday(&dmix->trigger_tstamp, 0); gettimeofday(&dmix->trigger_tstamp, 0);
dmix->state = SND_PCM_STATE_XRUN; dmix->state = SND_PCM_STATE_XRUN;
dmix->avail_max = avail; dmix->avail_max = avail;
printf("XRUN?\n");
return -EPIPE; return -EPIPE;
} }
if (avail > dmix->avail_max) if (avail > dmix->avail_max)
@ -825,7 +824,7 @@ static int snd_pcm_dmix_prepare(snd_pcm_t *pcm)
{ {
snd_pcm_dmix_t *dmix = pcm->private_data; snd_pcm_dmix_t *dmix = pcm->private_data;
assert(pcm->boundary == dmix->shmptr->s.boundary); /* for sure */ // assert(pcm->boundary == dmix->shmptr->s.boundary); /* for sure */
dmix->state = SND_PCM_STATE_PREPARED; dmix->state = SND_PCM_STATE_PREPARED;
dmix->appl_ptr = 0; dmix->appl_ptr = 0;
dmix->hw_ptr = 0; dmix->hw_ptr = 0;
@ -877,11 +876,24 @@ static int snd_pcm_dmix_drop(snd_pcm_t *pcm)
static int snd_pcm_dmix_drain(snd_pcm_t *pcm) static int snd_pcm_dmix_drain(snd_pcm_t *pcm)
{ {
snd_pcm_dmix_t *dmix = pcm->private_data; snd_pcm_dmix_t *dmix = pcm->private_data;
snd_pcm_uframes_t stop_threshold;
int err;
if (dmix->state == SND_PCM_STATE_OPEN) if (dmix->state == SND_PCM_STATE_OPEN)
return -EBADFD; return -EBADFD;
snd_timer_stop(dmix->timer); stop_threshold = pcm->stop_threshold;
dmix->state = SND_PCM_STATE_SETUP; if (pcm->stop_threshold > pcm->buffer_size)
return 0; pcm->stop_threshold = pcm->buffer_size;
while (dmix->state == SND_PCM_STATE_RUNNING) {
err = snd_pcm_dmix_sync_ptr(pcm);
if (err < 0)
break;
if (pcm->mode & SND_PCM_NONBLOCK)
return -EAGAIN;
snd_pcm_wait(pcm, -1);
}
pcm->stop_threshold = stop_threshold;
return snd_pcm_dmix_drop(pcm);
} }
static int snd_pcm_dmix_pause(snd_pcm_t *pcm, int enable) static int snd_pcm_dmix_pause(snd_pcm_t *pcm, int enable)