mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-04 13:29:59 -05:00
* dispatch defer events in pa_mainloop_dispatch() and not already in pa_mainloop_prepare()
* fix the "timeout" parameter of pa_mainloop_prepare() * remove pa_mainloop_deferred_pending() and update the simple API accordingly git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@690 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
parent
853caf1274
commit
bf88854e60
3 changed files with 81 additions and 86 deletions
|
|
@ -624,65 +624,77 @@ static void clear_wakeup(pa_mainloop *m) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int pa_mainloop_prepare(pa_mainloop *m, int timeout) {
|
int pa_mainloop_prepare(pa_mainloop *m, int timeout) {
|
||||||
int dispatched = 0;
|
assert(m);
|
||||||
|
assert(m->state == STATE_PASSIVE);
|
||||||
assert(m && (m->state == STATE_PASSIVE));
|
|
||||||
|
|
||||||
clear_wakeup(m);
|
clear_wakeup(m);
|
||||||
|
|
||||||
scan_dead(m);
|
scan_dead(m);
|
||||||
|
|
||||||
if (m->quit)
|
if (m->quit)
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
dispatched += dispatch_defer(m);
|
if (!m->deferred_pending) {
|
||||||
|
|
||||||
if (m->quit)
|
|
||||||
goto quit;
|
|
||||||
|
|
||||||
if (m->rebuild_pollfds)
|
if (m->rebuild_pollfds)
|
||||||
rebuild_pollfds(m);
|
rebuild_pollfds(m);
|
||||||
|
|
||||||
m->prepared_timeout = calc_next_timeout(m);
|
m->prepared_timeout = calc_next_timeout(m);
|
||||||
if ((timeout >= 0) && (m->prepared_timeout > timeout))
|
if (timeout >= 0 && (timeout < m->prepared_timeout || m->prepared_timeout < 0))
|
||||||
m->prepared_timeout = timeout;
|
m->prepared_timeout = timeout;
|
||||||
|
}
|
||||||
|
|
||||||
m->state = STATE_PREPARED;
|
m->state = STATE_PREPARED;
|
||||||
|
return 0;
|
||||||
return dispatched;
|
|
||||||
|
|
||||||
quit:
|
quit:
|
||||||
|
|
||||||
m->state = STATE_QUIT;
|
m->state = STATE_QUIT;
|
||||||
|
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pa_mainloop_poll(pa_mainloop *m) {
|
int pa_mainloop_poll(pa_mainloop *m) {
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(m && (m->state == STATE_PREPARED));
|
assert(m);
|
||||||
|
assert(m->state == STATE_PREPARED);
|
||||||
|
|
||||||
|
if (m->quit)
|
||||||
|
goto quit;
|
||||||
|
|
||||||
m->state = STATE_POLLING;
|
m->state = STATE_POLLING;
|
||||||
|
|
||||||
|
if (m->deferred_pending)
|
||||||
|
r = 0;
|
||||||
|
else {
|
||||||
r = poll(m->pollfds, m->n_pollfds, m->prepared_timeout);
|
r = poll(m->pollfds, m->n_pollfds, m->prepared_timeout);
|
||||||
|
|
||||||
if ((r < 0) && (errno == EINTR))
|
if (r < 0) {
|
||||||
|
if (errno == EINTR)
|
||||||
r = 0;
|
r = 0;
|
||||||
|
|
||||||
if (r < 0)
|
|
||||||
m->state = STATE_PASSIVE;
|
|
||||||
else
|
else
|
||||||
m->state = STATE_POLLED;
|
pa_log(__FILE__": poll(): %s", strerror(errno));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m->state = r < 0 ? STATE_PASSIVE : STATE_POLLED;
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
quit:
|
||||||
|
m->state = STATE_QUIT;
|
||||||
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pa_mainloop_dispatch(pa_mainloop *m) {
|
int pa_mainloop_dispatch(pa_mainloop *m) {
|
||||||
int dispatched = 0;
|
int dispatched = 0;
|
||||||
|
|
||||||
assert(m && (m->state == STATE_POLLED));
|
assert(m);
|
||||||
|
assert(m->state == STATE_POLLED);
|
||||||
|
|
||||||
|
if (m->quit)
|
||||||
|
goto quit;
|
||||||
|
|
||||||
|
if (m->deferred_pending)
|
||||||
|
dispatched += dispatch_defer(m);
|
||||||
|
else {
|
||||||
dispatched += dispatch_timeout(m);
|
dispatched += dispatch_timeout(m);
|
||||||
|
|
||||||
if (m->quit)
|
if (m->quit)
|
||||||
|
|
@ -690,6 +702,8 @@ int pa_mainloop_dispatch(pa_mainloop *m) {
|
||||||
|
|
||||||
dispatched += dispatch_pollfds(m);
|
dispatched += dispatch_pollfds(m);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (m->quit)
|
if (m->quit)
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
|
|
@ -698,9 +712,7 @@ int pa_mainloop_dispatch(pa_mainloop *m) {
|
||||||
return dispatched;
|
return dispatched;
|
||||||
|
|
||||||
quit:
|
quit:
|
||||||
|
|
||||||
m->state = STATE_QUIT;
|
m->state = STATE_QUIT;
|
||||||
|
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -710,39 +722,30 @@ int pa_mainloop_get_retval(pa_mainloop *m) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval) {
|
int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval) {
|
||||||
int r, dispatched = 0;
|
int r;
|
||||||
|
|
||||||
assert(m);
|
assert(m);
|
||||||
|
|
||||||
r = pa_mainloop_prepare(m, block ? -1 : 0);
|
if ((r = pa_mainloop_prepare(m, block ? -1 : 0)) < 0)
|
||||||
if (r < 0) {
|
goto quit;
|
||||||
|
|
||||||
|
if ((r = pa_mainloop_poll(m)) < 0)
|
||||||
|
goto quit;
|
||||||
|
|
||||||
|
if ((r = pa_mainloop_dispatch(m)) < 0)
|
||||||
|
goto quit;
|
||||||
|
|
||||||
|
return r;
|
||||||
|
|
||||||
|
quit:
|
||||||
|
|
||||||
if ((r == -2) && retval)
|
if ((r == -2) && retval)
|
||||||
*retval = pa_mainloop_get_retval(m);
|
*retval = pa_mainloop_get_retval(m);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
dispatched += r;
|
|
||||||
|
|
||||||
r = pa_mainloop_poll(m);
|
|
||||||
if (r < 0) {
|
|
||||||
pa_log(__FILE__": poll(): %s", strerror(errno));
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
r = pa_mainloop_dispatch(m);
|
|
||||||
if (r < 0) {
|
|
||||||
if ((r == -2) && retval)
|
|
||||||
*retval = pa_mainloop_get_retval(m);
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
dispatched += r;
|
|
||||||
|
|
||||||
return dispatched;
|
|
||||||
}
|
|
||||||
|
|
||||||
int pa_mainloop_run(pa_mainloop *m, int *retval) {
|
int pa_mainloop_run(pa_mainloop *m, int *retval) {
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
while ((r = pa_mainloop_iterate(m, 1, retval)) >= 0);
|
while ((r = pa_mainloop_iterate(m, 1, retval)) >= 0);
|
||||||
|
|
||||||
if (r == -2)
|
if (r == -2)
|
||||||
|
|
@ -764,12 +767,6 @@ pa_mainloop_api* pa_mainloop_get_api(pa_mainloop*m) {
|
||||||
return &m->api;
|
return &m->api;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pa_mainloop_deferred_pending(pa_mainloop *m) {
|
|
||||||
assert(m);
|
|
||||||
return m->deferred_pending > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
void pa_mainloop_dump(pa_mainloop *m) {
|
void pa_mainloop_dump(pa_mainloop *m) {
|
||||||
assert(m);
|
assert(m);
|
||||||
|
|
|
||||||
|
|
@ -107,12 +107,9 @@ int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval);
|
||||||
/** Run unlimited iterations of the main loop object until the main loop's quit() routine is called. */
|
/** Run unlimited iterations of the main loop object until the main loop's quit() routine is called. */
|
||||||
int pa_mainloop_run(pa_mainloop *m, int *retval);
|
int pa_mainloop_run(pa_mainloop *m, int *retval);
|
||||||
|
|
||||||
/** Return the abstract main loop abstraction layer vtable for this main loop. This calls pa_mainloop_iterate() iteratively.*/
|
/** Return the abstract main loop abstraction layer vtable for this main loop. */
|
||||||
pa_mainloop_api* pa_mainloop_get_api(pa_mainloop*m);
|
pa_mainloop_api* pa_mainloop_get_api(pa_mainloop*m);
|
||||||
|
|
||||||
/** Return non-zero when there are any deferred events pending. \since 0.5 */
|
|
||||||
int pa_mainloop_deferred_pending(pa_mainloop *m);
|
|
||||||
|
|
||||||
/** Shutdown the main loop */
|
/** Shutdown the main loop */
|
||||||
void pa_mainloop_quit(pa_mainloop *m, int r);
|
void pa_mainloop_quit(pa_mainloop *m, int r);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -92,9 +92,7 @@ static int iterate(pa_simple *p, int block, int *rerror) {
|
||||||
if (check_error(p, rerror) < 0)
|
if (check_error(p, rerror) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!block && !pa_context_is_pending(p->context))
|
if (block || pa_context_is_pending(p->context)) {
|
||||||
return 0;
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (pa_mainloop_iterate(p->mainloop, 1, NULL) < 0) {
|
if (pa_mainloop_iterate(p->mainloop, 1, NULL) < 0) {
|
||||||
if (rerror)
|
if (rerror)
|
||||||
|
|
@ -104,18 +102,21 @@ static int iterate(pa_simple *p, int block, int *rerror) {
|
||||||
|
|
||||||
if (check_error(p, rerror) < 0)
|
if (check_error(p, rerror) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
} while (pa_context_is_pending(p->context));
|
} while (pa_context_is_pending(p->context));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
int r;
|
||||||
|
|
||||||
while (pa_mainloop_deferred_pending(p->mainloop)) {
|
if ((r = pa_mainloop_iterate(p->mainloop, 0, NULL)) < 0) {
|
||||||
|
|
||||||
if (pa_mainloop_iterate(p->mainloop, 0, NULL) < 0) {
|
|
||||||
if (rerror)
|
if (rerror)
|
||||||
*rerror = PA_ERR_INTERNAL;
|
*rerror = PA_ERR_INTERNAL;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (r == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
if (check_error(p, rerror) < 0)
|
if (check_error(p, rerror) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue