/* TOP */
#include "osdep/timer.h"
...
...
/** Destroy libao driver */
static void uninit(int immed) {
size_t play_space;
int delay_sleep;
char *buf = NULL;
if (stream && !immed) {
/* space available in PA play buffer */
play_space = get_space();
/* note: get_delay() changes after play(),
* but we want post play() */
delay_sleep = get_delay() * 1000 * 1000;
/* fill play space with empty/zero-filled buffer */
if (play_space > 0 && (buf = malloc(play_space)) != NULL) {
memset(buf, 0, play_space);
play(buf, play_space, 0);
/* play uses NULL for free_cb so a local copy is
* created by PA. free() is OK here.
* */
free(buf);
}
/* sleep actual time, (excluding play of empty buffer) */
usec_sleep(delay_sleep);
/*
* Have noticed in some occasions that track can hang on
* pa_stream_drain, even after play + sleep.
* As everything now _should_ have been delivered by server
* reset() won't cut audio.
* */
reset();
/* Now; is this needed after reset() ? */
pa_threaded_mainloop_lock(mainloop);
waitop(pa_stream_drain(stream, success_cb, NULL));
}
if (mainloop)
...
...
...
}