mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
Base mainloop on pa_rtclock_now()
Move the mainloop to monotonic based time events.
Introduces 4 helper functions:
pa_{context,core}_rttime_{new,restart}(), that fill correctly a
timeval with the rtclock flag set if the mainloop supports it.
Both mainloop-test and mainloop-test-glib works with rt and timeval
based time events. PulseAudio and clients should be fully functional.
This patch has received several iterations, and this one as been
largely untested.
Signed-off-by: Marc-André Lureau <marca-andre.lureau@nokia.com>
This commit is contained in:
parent
125c528896
commit
0955e3d45b
42 changed files with 311 additions and 233 deletions
|
|
@ -64,6 +64,11 @@ AM_CFLAGS = \
|
|||
-I$(top_srcdir)/src/modules/alsa \
|
||||
-I$(top_builddir)/src/modules/alsa \
|
||||
-I$(top_srcdir)/src/modules/raop \
|
||||
-I$(top_builddir)/src/modules/raop \
|
||||
-I$(top_srcdir)/src/modules/x11 \
|
||||
-I$(top_builddir)/src/modules/x11 \
|
||||
-I$(top_srcdir)/src/modules/jack \
|
||||
-I$(top_builddir)/src/modules/jack \
|
||||
$(PTHREAD_CFLAGS) -D_POSIX_PTHREAD_SEMANTICS \
|
||||
$(LIBSAMPLERATE_CFLAGS) \
|
||||
$(LIBSNDFILE_CFLAGS) \
|
||||
|
|
@ -688,6 +693,7 @@ pulseinclude_HEADERS = \
|
|||
pulse/operation.h \
|
||||
pulse/proplist.h \
|
||||
pulse/pulseaudio.h \
|
||||
pulse/rtclock.h \
|
||||
pulse/sample.h \
|
||||
pulse/scache.h \
|
||||
pulse/simple.h \
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ static void message_cb(pa_mainloop_api*a, pa_time_event*e, const struct timeval
|
|||
}
|
||||
|
||||
pa_timeval_add(pa_gettimeofday(&tvnext), 100000);
|
||||
a->time_restart(e, &tvnext);
|
||||
a->rtclock_time_restart(e, &tvnext);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -1018,7 +1018,7 @@ int main(int argc, char *argv[]) {
|
|||
#endif
|
||||
|
||||
#ifdef OS_IS_WIN32
|
||||
win32_timer = pa_mainloop_get_api(mainloop)->time_new(pa_mainloop_get_api(mainloop), pa_gettimeofday(&win32_tv), message_cb, NULL);
|
||||
win32_timer = pa_mainloop_get_api(mainloop)->rtclock_time_new(pa_mainloop_get_api(mainloop), pa_gettimeofday(&win32_tv), message_cb, NULL);
|
||||
#endif
|
||||
|
||||
oil_init();
|
||||
|
|
|
|||
|
|
@ -86,6 +86,8 @@ pa_context_ref;
|
|||
pa_context_remove_autoload_by_index;
|
||||
pa_context_remove_autoload_by_name;
|
||||
pa_context_remove_sample;
|
||||
pa_context_rttime_new;
|
||||
pa_context_rttime_restart;
|
||||
pa_context_set_card_profile_by_index;
|
||||
pa_context_set_card_profile_by_name;
|
||||
pa_context_set_default_sink;
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
#include <pulse/volume.h>
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/util.h>
|
||||
#include <pulse/rtclock.h>
|
||||
|
||||
#include <pulsecore/core-error.h>
|
||||
#include <pulsecore/module.h>
|
||||
|
|
@ -53,7 +54,7 @@ PA_MODULE_DESCRIPTION("Automatically restore profile of cards");
|
|||
PA_MODULE_VERSION(PACKAGE_VERSION);
|
||||
PA_MODULE_LOAD_ONCE(TRUE);
|
||||
|
||||
#define SAVE_INTERVAL 10
|
||||
#define SAVE_INTERVAL (10 * PA_USEC_PER_SEC)
|
||||
|
||||
static const char* const valid_modargs[] = {
|
||||
NULL
|
||||
|
|
@ -75,12 +76,11 @@ struct entry {
|
|||
char profile[PA_NAME_MAX];
|
||||
} PA_GCC_PACKED ;
|
||||
|
||||
static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *tv, void *userdata) {
|
||||
static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) {
|
||||
struct userdata *u = userdata;
|
||||
|
||||
pa_assert(a);
|
||||
pa_assert(e);
|
||||
pa_assert(tv);
|
||||
pa_assert(u);
|
||||
|
||||
pa_assert(e == u->save_time_event);
|
||||
|
|
@ -132,14 +132,10 @@ fail:
|
|||
}
|
||||
|
||||
static void trigger_save(struct userdata *u) {
|
||||
struct timeval tv;
|
||||
|
||||
if (u->save_time_event)
|
||||
return;
|
||||
|
||||
pa_gettimeofday(&tv);
|
||||
tv.tv_sec += SAVE_INTERVAL;
|
||||
u->save_time_event = u->core->mainloop->time_new(u->core->mainloop, &tv, save_time_callback, u);
|
||||
u->save_time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + SAVE_INTERVAL, save_time_callback, u);
|
||||
}
|
||||
|
||||
static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
|
||||
|
|
|
|||
|
|
@ -225,9 +225,8 @@ static void adjust_rates(struct userdata *u) {
|
|||
pa_asyncmsgq_send(u->sink->asyncmsgq, PA_MSGOBJECT(u->sink), SINK_MESSAGE_UPDATE_LATENCY, NULL, (int64_t) avg_total_latency, NULL);
|
||||
}
|
||||
|
||||
static void time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *tv, void *userdata) {
|
||||
static void time_callback(pa_mainloop_api *a, pa_time_event *e, const struct timeval *t, void *userdata) {
|
||||
struct userdata *u = userdata;
|
||||
struct timeval n;
|
||||
|
||||
pa_assert(u);
|
||||
pa_assert(a);
|
||||
|
|
@ -235,9 +234,7 @@ static void time_callback(pa_mainloop_api*a, pa_time_event* e, const struct time
|
|||
|
||||
adjust_rates(u);
|
||||
|
||||
pa_gettimeofday(&n);
|
||||
n.tv_sec += (time_t) u->adjust_time;
|
||||
u->sink->core->mainloop->time_restart(e, &n);
|
||||
pa_core_rttime_restart(u->core, e, pa_rtclock_now() + u->adjust_time * PA_USEC_PER_SEC);
|
||||
}
|
||||
|
||||
static void process_render_null(struct userdata *u, pa_usec_t now) {
|
||||
|
|
@ -1171,12 +1168,8 @@ int pa__init(pa_module*m) {
|
|||
if (o->sink_input)
|
||||
pa_sink_input_put(o->sink_input);
|
||||
|
||||
if (u->adjust_time > 0) {
|
||||
struct timeval tv;
|
||||
pa_gettimeofday(&tv);
|
||||
tv.tv_sec += (time_t) u->adjust_time;
|
||||
u->time_event = m->core->mainloop->time_new(m->core->mainloop, &tv, time_callback, u);
|
||||
}
|
||||
if (u->adjust_time > 0)
|
||||
u->time_event = pa_core_rttime_new(m->core, pa_rtclock_now() + u->adjust_time * PA_USEC_PER_SEC, time_callback, u);
|
||||
|
||||
pa_modargs_free(ma);
|
||||
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <pulse/rtclock.h>
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/util.h>
|
||||
|
||||
|
|
@ -42,7 +43,7 @@ PA_MODULE_DESCRIPTION("Automatically restore the default sink and source");
|
|||
PA_MODULE_VERSION(PACKAGE_VERSION);
|
||||
PA_MODULE_LOAD_ONCE(TRUE);
|
||||
|
||||
#define DEFAULT_SAVE_INTERVAL 5
|
||||
#define SAVE_INTERVAL (5 * PA_USEC_PER_SEC)
|
||||
|
||||
struct userdata {
|
||||
pa_core *core;
|
||||
|
|
@ -127,7 +128,7 @@ static void save(struct userdata *u) {
|
|||
u->modified = FALSE;
|
||||
}
|
||||
|
||||
static void time_cb(pa_mainloop_api *a, pa_time_event *e, const struct timeval *tv, void *userdata) {
|
||||
static void time_cb(pa_mainloop_api *a, pa_time_event *e, const struct timeval *t, void *userdata) {
|
||||
struct userdata *u = userdata;
|
||||
|
||||
pa_assert(u);
|
||||
|
|
@ -146,12 +147,8 @@ static void subscribe_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t id
|
|||
|
||||
u->modified = TRUE;
|
||||
|
||||
if (!u->time_event) {
|
||||
struct timeval tv;
|
||||
pa_gettimeofday(&tv);
|
||||
pa_timeval_add(&tv, DEFAULT_SAVE_INTERVAL*PA_USEC_PER_SEC);
|
||||
u->time_event = u->core->mainloop->time_new(u->core->mainloop, &tv, time_cb, u);
|
||||
}
|
||||
if (!u->time_event)
|
||||
u->time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + SAVE_INTERVAL, time_cb, u);
|
||||
}
|
||||
|
||||
int pa__init(pa_module *m) {
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
#include <pulse/volume.h>
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/util.h>
|
||||
#include <pulse/rtclock.h>
|
||||
|
||||
#include <pulsecore/core-error.h>
|
||||
#include <pulsecore/module.h>
|
||||
|
|
@ -58,7 +59,7 @@ PA_MODULE_USAGE(
|
|||
"restore_volume=<Save/restore volumes?> "
|
||||
"restore_muted=<Save/restore muted states?>");
|
||||
|
||||
#define SAVE_INTERVAL 10
|
||||
#define SAVE_INTERVAL (10 * PA_USEC_PER_SEC)
|
||||
|
||||
static const char* const valid_modargs[] = {
|
||||
"restore_volume",
|
||||
|
|
@ -95,12 +96,11 @@ struct entry {
|
|||
char port[PA_NAME_MAX];
|
||||
} PA_GCC_PACKED;
|
||||
|
||||
static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *tv, void *userdata) {
|
||||
static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) {
|
||||
struct userdata *u = userdata;
|
||||
|
||||
pa_assert(a);
|
||||
pa_assert(e);
|
||||
pa_assert(tv);
|
||||
pa_assert(u);
|
||||
|
||||
pa_assert(e == u->save_time_event);
|
||||
|
|
@ -162,14 +162,10 @@ fail:
|
|||
}
|
||||
|
||||
static void trigger_save(struct userdata *u) {
|
||||
struct timeval tv;
|
||||
|
||||
if (u->save_time_event)
|
||||
return;
|
||||
|
||||
pa_gettimeofday(&tv);
|
||||
tv.tv_sec += SAVE_INTERVAL;
|
||||
u->save_time_event = u->core->mainloop->time_new(u->core->mainloop, &tv, save_time_callback, u);
|
||||
u->save_time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + SAVE_INTERVAL, save_time_callback, u);
|
||||
}
|
||||
|
||||
static pa_bool_t entries_equal(const struct entry *a, const struct entry *b) {
|
||||
|
|
|
|||
|
|
@ -609,7 +609,7 @@ int pa__init(pa_module*m) {
|
|||
pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
|
||||
pa_sink_set_rtpoll(u->sink, u->rtpoll);
|
||||
|
||||
if (!(u->client = pa_socket_client_new_string(u->core->mainloop, espeaker, ESD_DEFAULT_PORT))) {
|
||||
if (!(u->client = pa_socket_client_new_string(u->core->mainloop, TRUE, espeaker, ESD_DEFAULT_PORT))) {
|
||||
pa_log("Failed to connect to server.");
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
#include <pulse/volume.h>
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/util.h>
|
||||
#include <pulse/rtclock.h>
|
||||
|
||||
#include <pulsecore/core-error.h>
|
||||
#include <pulsecore/module.h>
|
||||
|
|
@ -61,7 +62,7 @@ PA_MODULE_USAGE(
|
|||
"restore_volume=<Save/restore volumes?> "
|
||||
"restore_muted=<Save/restore muted states?>");
|
||||
|
||||
#define SAVE_INTERVAL 10
|
||||
#define SAVE_INTERVAL (10 * PA_USEC_PER_SEC)
|
||||
#define IDENTIFICATION_PROPERTY "module-stream-restore.id"
|
||||
|
||||
static const char* const valid_modargs[] = {
|
||||
|
|
@ -111,12 +112,11 @@ enum {
|
|||
SUBCOMMAND_EVENT
|
||||
};
|
||||
|
||||
static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *tv, void *userdata) {
|
||||
static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) {
|
||||
struct userdata *u = userdata;
|
||||
|
||||
pa_assert(a);
|
||||
pa_assert(e);
|
||||
pa_assert(tv);
|
||||
pa_assert(u);
|
||||
|
||||
pa_assert(e == u->save_time_event);
|
||||
|
|
@ -210,7 +210,6 @@ fail:
|
|||
}
|
||||
|
||||
static void trigger_save(struct userdata *u) {
|
||||
struct timeval tv;
|
||||
pa_native_connection *c;
|
||||
uint32_t idx;
|
||||
|
||||
|
|
@ -230,9 +229,7 @@ static void trigger_save(struct userdata *u) {
|
|||
if (u->save_time_event)
|
||||
return;
|
||||
|
||||
pa_gettimeofday(&tv);
|
||||
tv.tv_sec += SAVE_INTERVAL;
|
||||
u->save_time_event = u->core->mainloop->time_new(u->core->mainloop, &tv, save_time_callback, u);
|
||||
u->save_time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + SAVE_INTERVAL, save_time_callback, u);
|
||||
}
|
||||
|
||||
static pa_bool_t entries_equal(const struct entry *a, const struct entry *b) {
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
|
||||
#include <pulse/xmalloc.h>
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/rtclock.h>
|
||||
|
||||
#include <pulsecore/core.h>
|
||||
#include <pulsecore/core-util.h>
|
||||
|
|
@ -75,11 +76,11 @@ struct device_info {
|
|||
struct userdata *userdata;
|
||||
pa_sink *sink;
|
||||
pa_source *source;
|
||||
struct timeval last_use;
|
||||
pa_usec_t last_use;
|
||||
pa_time_event *time_event;
|
||||
};
|
||||
|
||||
static void timeout_cb(pa_mainloop_api*a, pa_time_event* e, const struct timeval *tv, void *userdata) {
|
||||
static void timeout_cb(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) {
|
||||
struct device_info *d = userdata;
|
||||
|
||||
pa_assert(d);
|
||||
|
|
@ -98,22 +99,20 @@ static void timeout_cb(pa_mainloop_api*a, pa_time_event* e, const struct timeval
|
|||
}
|
||||
|
||||
static void restart(struct device_info *d) {
|
||||
struct timeval tv;
|
||||
pa_usec_t now;
|
||||
const char *s;
|
||||
uint32_t timeout;
|
||||
|
||||
pa_assert(d);
|
||||
pa_assert(d->sink || d->source);
|
||||
|
||||
pa_gettimeofday(&tv);
|
||||
d->last_use = tv;
|
||||
d->last_use = now = pa_rtclock_now();
|
||||
|
||||
s = pa_proplist_gets(d->sink ? d->sink->proplist : d->source->proplist, "module-suspend-on-idle.timeout");
|
||||
if (!s || pa_atou(s, &timeout) < 0)
|
||||
timeout = d->userdata->timeout;
|
||||
timeout = d->userdata->timeout;
|
||||
|
||||
pa_timeval_add(&tv, timeout * PA_USEC_PER_SEC);
|
||||
|
||||
d->userdata->core->mainloop->time_restart(d->time_event, &tv);
|
||||
pa_core_rttime_restart(d->userdata->core, d->time_event, now + timeout * PA_USEC_PER_SEC);
|
||||
|
||||
if (d->sink)
|
||||
pa_log_debug("Sink %s becomes idle, timeout in %u seconds.", d->sink->name, timeout);
|
||||
|
|
@ -338,7 +337,7 @@ static pa_hook_result_t device_new_hook_cb(pa_core *c, pa_object *o, struct user
|
|||
d->userdata = u;
|
||||
d->source = source ? pa_source_ref(source) : NULL;
|
||||
d->sink = sink ? pa_sink_ref(sink) : NULL;
|
||||
d->time_event = c->mainloop->time_new(c->mainloop, NULL, timeout_cb, d);
|
||||
d->time_event = pa_core_rttime_new(c, PA_USEC_INVALID, timeout_cb, d);
|
||||
pa_hashmap_put(u->device_infos, o, d);
|
||||
|
||||
if ((d->sink && pa_sink_check_suspend(d->sink) <= 0) ||
|
||||
|
|
|
|||
|
|
@ -113,7 +113,7 @@ static const char* const valid_modargs[] = {
|
|||
|
||||
#define DEFAULT_TIMEOUT 5
|
||||
|
||||
#define LATENCY_INTERVAL 10
|
||||
#define LATENCY_INTERVAL (10*PA_USEC_PER_SEC)
|
||||
|
||||
#define MIN_NETWORK_LATENCY_USEC (8*PA_USEC_PER_MSEC)
|
||||
|
||||
|
|
@ -879,9 +879,8 @@ static void request_latency(struct userdata *u) {
|
|||
}
|
||||
|
||||
/* Called from main context */
|
||||
static void timeout_callback(pa_mainloop_api *m, pa_time_event*e, const struct timeval *tv, void *userdata) {
|
||||
static void timeout_callback(pa_mainloop_api *m, pa_time_event *e, const struct timeval *t, void *userdata) {
|
||||
struct userdata *u = userdata;
|
||||
struct timeval ntv;
|
||||
|
||||
pa_assert(m);
|
||||
pa_assert(e);
|
||||
|
|
@ -889,9 +888,7 @@ static void timeout_callback(pa_mainloop_api *m, pa_time_event*e, const struct
|
|||
|
||||
request_latency(u);
|
||||
|
||||
pa_gettimeofday(&ntv);
|
||||
ntv.tv_sec += LATENCY_INTERVAL;
|
||||
m->time_restart(e, &ntv);
|
||||
pa_core_rttime_restart(u->core, e, pa_rtclock_now() + LATENCY_INTERVAL);
|
||||
}
|
||||
|
||||
/* Called from main context */
|
||||
|
|
@ -1358,7 +1355,6 @@ static void start_subscribe(struct userdata *u) {
|
|||
/* Called from main context */
|
||||
static void create_stream_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
|
||||
struct userdata *u = userdata;
|
||||
struct timeval ntv;
|
||||
#ifdef TUNNEL_SINK
|
||||
uint32_t bytes;
|
||||
#endif
|
||||
|
|
@ -1440,9 +1436,7 @@ static void create_stream_callback(pa_pdispatch *pd, uint32_t command, uint32_t
|
|||
request_info(u);
|
||||
|
||||
pa_assert(!u->time_event);
|
||||
pa_gettimeofday(&ntv);
|
||||
ntv.tv_sec += LATENCY_INTERVAL;
|
||||
u->time_event = u->core->mainloop->time_new(u->core->mainloop, &ntv, timeout_callback, u);
|
||||
u->time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + LATENCY_INTERVAL, timeout_callback, u);
|
||||
|
||||
request_latency(u);
|
||||
|
||||
|
|
@ -1707,7 +1701,7 @@ static void on_connection(pa_socket_client *sc, pa_iochannel *io, void *userdata
|
|||
}
|
||||
|
||||
u->pstream = pa_pstream_new(u->core->mainloop, io, u->core->mempool);
|
||||
u->pdispatch = pa_pdispatch_new(u->core->mainloop, command_table, PA_COMMAND_MAX);
|
||||
u->pdispatch = pa_pdispatch_new(u->core->mainloop, TRUE, command_table, PA_COMMAND_MAX);
|
||||
|
||||
pa_pstream_set_die_callback(u->pstream, pstream_die_callback, u);
|
||||
pa_pstream_set_recieve_packet_callback(u->pstream, pstream_packet_callback, u);
|
||||
|
|
@ -1854,7 +1848,7 @@ int pa__init(pa_module*m) {
|
|||
goto fail;
|
||||
}
|
||||
|
||||
if (!(u->client = pa_socket_client_new_string(m->core->mainloop, u->server_name, PA_NATIVE_DEFAULT_PORT))) {
|
||||
if (!(u->client = pa_socket_client_new_string(m->core->mainloop, TRUE, u->server_name, PA_NATIVE_DEFAULT_PORT))) {
|
||||
pa_log("Failed to connect to server '%s'", u->server_name);
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -256,7 +256,7 @@ static void poll_cb(pa_mainloop_api*a, pa_time_event *e, const struct timeval *t
|
|||
pa_gettimeofday(&ntv);
|
||||
pa_timeval_add(&ntv, u->poll_timeout);
|
||||
|
||||
a->time_restart(e, &ntv);
|
||||
a->rtclock_time_restart(e, &ntv);
|
||||
}
|
||||
|
||||
static void defer_cb(pa_mainloop_api*a, pa_defer_event *e, void *userdata) {
|
||||
|
|
@ -549,7 +549,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
|||
pa_gettimeofday(&tv);
|
||||
pa_timeval_add(&tv, u->poll_timeout);
|
||||
|
||||
u->event = c->mainloop->time_new(c->mainloop, &tv, poll_cb, u);
|
||||
u->event = c->mainloop->rtclock_time_new(c->mainloop, &tv, poll_cb, u);
|
||||
assert(u->event);
|
||||
|
||||
u->defer = c->mainloop->defer_new(c->mainloop, defer_cb, u);
|
||||
|
|
|
|||
|
|
@ -331,7 +331,7 @@ static void rtsp_cb(pa_rtsp_client *rtsp, pa_rtsp_state state, pa_headerlist* he
|
|||
uint32_t port = pa_rtsp_serverport(c->rtsp);
|
||||
pa_log_debug("RAOP: RECORDED");
|
||||
|
||||
if (!(c->sc = pa_socket_client_new_string(c->core->mainloop, c->host, port))) {
|
||||
if (!(c->sc = pa_socket_client_new_string(c->core->mainloop, TRUE, c->host, port))) {
|
||||
pa_log("failed to connect to server '%s:%d'", c->host, port);
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -113,6 +113,7 @@ struct session {
|
|||
|
||||
struct userdata {
|
||||
pa_module *module;
|
||||
pa_core *core;
|
||||
|
||||
pa_sap_context sap_context;
|
||||
pa_io_event* sap_event;
|
||||
|
|
@ -622,15 +623,13 @@ static void sap_event_cb(pa_mainloop_api *m, pa_io_event *e, int fd, pa_io_event
|
|||
}
|
||||
}
|
||||
|
||||
static void check_death_event_cb(pa_mainloop_api *m, pa_time_event *t, const struct timeval *ptv, void *userdata) {
|
||||
static void check_death_event_cb(pa_mainloop_api *m, pa_time_event *t, const struct timeval *tv, void *userdata) {
|
||||
struct session *s, *n;
|
||||
struct userdata *u = userdata;
|
||||
struct timeval now;
|
||||
struct timeval tv;
|
||||
|
||||
pa_assert(m);
|
||||
pa_assert(t);
|
||||
pa_assert(ptv);
|
||||
pa_assert(u);
|
||||
|
||||
pa_rtclock_get(&now);
|
||||
|
|
@ -648,9 +647,7 @@ static void check_death_event_cb(pa_mainloop_api *m, pa_time_event *t, const str
|
|||
}
|
||||
|
||||
/* Restart timer */
|
||||
pa_gettimeofday(&tv);
|
||||
pa_timeval_add(&tv, DEATH_TIMEOUT*PA_USEC_PER_SEC);
|
||||
m->time_restart(t, &tv);
|
||||
pa_core_rttime_restart(u->module->core, t, pa_rtclock_now() + DEATH_TIMEOUT * PA_USEC_PER_SEC);
|
||||
}
|
||||
|
||||
int pa__init(pa_module*m) {
|
||||
|
|
@ -664,7 +661,6 @@ int pa__init(pa_module*m) {
|
|||
socklen_t salen;
|
||||
const char *sap_address;
|
||||
int fd = -1;
|
||||
struct timeval tv;
|
||||
|
||||
pa_assert(m);
|
||||
|
||||
|
|
@ -697,6 +693,7 @@ int pa__init(pa_module*m) {
|
|||
|
||||
m->userdata = u = pa_xnew(struct userdata, 1);
|
||||
u->module = m;
|
||||
u->core = m->core;
|
||||
u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL));
|
||||
|
||||
u->sap_event = m->core->mainloop->io_new(m->core->mainloop, fd, PA_IO_EVENT_INPUT, sap_event_cb, u);
|
||||
|
|
@ -706,9 +703,7 @@ int pa__init(pa_module*m) {
|
|||
u->n_sessions = 0;
|
||||
u->by_origin = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
|
||||
|
||||
pa_gettimeofday(&tv);
|
||||
pa_timeval_add(&tv, DEATH_TIMEOUT * PA_USEC_PER_SEC);
|
||||
u->check_death_event = m->core->mainloop->time_new(m->core->mainloop, &tv, check_death_event_cb, u);
|
||||
u->check_death_event = pa_core_rttime_new(m->core, pa_rtclock_now() + DEATH_TIMEOUT * PA_USEC_PER_SEC, check_death_event_cb, u);
|
||||
|
||||
pa_modargs_free(ma);
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <pulse/rtclock.h>
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/util.h>
|
||||
#include <pulse/xmalloc.h>
|
||||
|
|
@ -77,7 +78,7 @@ PA_MODULE_USAGE(
|
|||
#define DEFAULT_DESTINATION "224.0.0.56"
|
||||
#define MEMBLOCKQ_MAXLENGTH (1024*170)
|
||||
#define DEFAULT_MTU 1280
|
||||
#define SAP_INTERVAL 5
|
||||
#define SAP_INTERVAL (5*PA_USEC_PER_SEC)
|
||||
|
||||
static const char* const valid_modargs[] = {
|
||||
"source",
|
||||
|
|
@ -151,18 +152,14 @@ static void source_output_kill(pa_source_output* o) {
|
|||
|
||||
static void sap_event_cb(pa_mainloop_api *m, pa_time_event *t, const struct timeval *tv, void *userdata) {
|
||||
struct userdata *u = userdata;
|
||||
struct timeval next;
|
||||
|
||||
pa_assert(m);
|
||||
pa_assert(t);
|
||||
pa_assert(tv);
|
||||
pa_assert(u);
|
||||
|
||||
pa_sap_send(&u->sap_context, 0);
|
||||
|
||||
pa_gettimeofday(&next);
|
||||
pa_timeval_add(&next, SAP_INTERVAL * PA_USEC_PER_SEC);
|
||||
m->time_restart(t, &next);
|
||||
pa_core_rttime_restart(u->module->core, t, pa_rtclock_now() + SAP_INTERVAL);
|
||||
}
|
||||
|
||||
int pa__init(pa_module*m) {
|
||||
|
|
@ -186,7 +183,6 @@ int pa__init(pa_module*m) {
|
|||
char *p;
|
||||
int r, j;
|
||||
socklen_t k;
|
||||
struct timeval tv;
|
||||
char hn[128], *n;
|
||||
pa_bool_t loop = FALSE;
|
||||
pa_source_output_new_data data;
|
||||
|
|
@ -395,9 +391,7 @@ int pa__init(pa_module*m) {
|
|||
|
||||
pa_sap_send(&u->sap_context, 0);
|
||||
|
||||
pa_gettimeofday(&tv);
|
||||
pa_timeval_add(&tv, SAP_INTERVAL * PA_USEC_PER_SEC);
|
||||
u->sap_event = m->core->mainloop->time_new(m->core->mainloop, &tv, sap_event_cb, u);
|
||||
u->sap_event = pa_core_rttime_new(m->core, pa_rtclock_now() + SAP_INTERVAL, sap_event_cb, u);
|
||||
|
||||
pa_source_output_put(u->source_output);
|
||||
|
||||
|
|
|
|||
|
|
@ -333,7 +333,7 @@ int pa_rtsp_connect(pa_rtsp_client *c) {
|
|||
pa_xfree(c->session);
|
||||
c->session = NULL;
|
||||
|
||||
if (!(c->sc = pa_socket_client_new_string(c->mainloop, c->hostname, c->port))) {
|
||||
if (!(c->sc = pa_socket_client_new_string(c->mainloop, TRUE, c->hostname, c->port))) {
|
||||
pa_log("failed to connect to server '%s:%d'", c->hostname, c->port);
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@
|
|||
#include <pulsecore/dynarray.h>
|
||||
#include <pulsecore/socket-client.h>
|
||||
#include <pulsecore/pstream-util.h>
|
||||
#include <pulsecore/core-rtclock.h>
|
||||
#include <pulsecore/core-util.h>
|
||||
#include <pulsecore/log.h>
|
||||
#include <pulsecore/socket-util.h>
|
||||
|
|
@ -540,7 +541,7 @@ static void setup_context(pa_context *c, pa_iochannel *io) {
|
|||
pa_pstream_set_recieve_memblock_callback(c->pstream, pstream_memblock_callback, c);
|
||||
|
||||
pa_assert(!c->pdispatch);
|
||||
c->pdispatch = pa_pdispatch_new(c->mainloop, command_table, PA_COMMAND_MAX);
|
||||
c->pdispatch = pa_pdispatch_new(c->mainloop, c->use_rtclock, command_table, PA_COMMAND_MAX);
|
||||
|
||||
if (!c->conf->cookie_valid)
|
||||
pa_log_info(_("No cookie loaded. Attempting to connect without."));
|
||||
|
|
@ -757,7 +758,7 @@ static void track_pulseaudio_on_dbus(pa_context *c, DBusBusType type, pa_dbus_wr
|
|||
pa_assert(conn);
|
||||
|
||||
dbus_error_init(&error);
|
||||
if (!(*conn = pa_dbus_wrap_connection_new(c->mainloop, type, &error)) || dbus_error_is_set(&error)) {
|
||||
if (!(*conn = pa_dbus_wrap_connection_new(c->mainloop, c->use_rtclock, type, &error)) || dbus_error_is_set(&error)) {
|
||||
pa_log_warn("Unable to contact DBUS: %s: %s", error.name, error.message);
|
||||
goto finish;
|
||||
}
|
||||
|
|
@ -827,7 +828,7 @@ static int try_next_connection(pa_context *c) {
|
|||
pa_xfree(c->server);
|
||||
c->server = pa_xstrdup(u);
|
||||
|
||||
if (!(c->client = pa_socket_client_new_string(c->mainloop, u, PA_NATIVE_DEFAULT_PORT)))
|
||||
if (!(c->client = pa_socket_client_new_string(c->mainloop, c->use_rtclock, u, PA_NATIVE_DEFAULT_PORT)))
|
||||
continue;
|
||||
|
||||
c->is_local = !!pa_socket_client_is_local(c->client);
|
||||
|
|
@ -1443,3 +1444,25 @@ finish:
|
|||
if (pl)
|
||||
pa_proplist_free(pl);
|
||||
}
|
||||
|
||||
pa_time_event* pa_context_rttime_new(pa_context *c, pa_usec_t usec, pa_time_event_cb_t cb, void *userdata) {
|
||||
struct timeval tv;
|
||||
|
||||
pa_assert(c);
|
||||
pa_assert(c->mainloop);
|
||||
|
||||
pa_timeval_rtstore(&tv, usec, c->use_rtclock);
|
||||
|
||||
return c->mainloop->time_new(c->mainloop, &tv, cb, userdata);
|
||||
}
|
||||
|
||||
void pa_context_rttime_restart(pa_context *c, pa_time_event *e, pa_usec_t usec) {
|
||||
struct timeval tv;
|
||||
|
||||
pa_assert(c);
|
||||
pa_assert(c->mainloop);
|
||||
|
||||
pa_timeval_rtstore(&tv, usec, c->use_rtclock);
|
||||
|
||||
c->mainloop->time_restart(e, &tv);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -260,6 +260,14 @@ pa_operation *pa_context_proplist_remove(pa_context *c, const char *const keys[]
|
|||
* introspection functions, such as pa_context_get_client_info(). \since 0.9.11 */
|
||||
uint32_t pa_context_get_index(pa_context *s);
|
||||
|
||||
/** Create a new timer event source for the specified time (wrapper
|
||||
for mainloop->time_new). \since 0.9.16 */
|
||||
pa_time_event* pa_context_rttime_new(pa_context *c, pa_usec_t usec, pa_time_event_cb_t cb, void *userdata);
|
||||
/** Restart a running or expired timer event source (wrapper
|
||||
for mainloop->time_restart). \since 0.9.16 */
|
||||
void pa_context_rttime_restart(pa_context *c, pa_time_event *e, pa_usec_t usec);
|
||||
|
||||
|
||||
PA_C_DECL_END
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -89,6 +89,7 @@ struct pa_context {
|
|||
pa_bool_t server_specified:1;
|
||||
pa_bool_t no_fail:1;
|
||||
pa_bool_t do_autospawn:1;
|
||||
pa_bool_t use_rtclock:1;
|
||||
pa_spawn_api spawn_api;
|
||||
|
||||
pa_strlist *server_list;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include <time.h>
|
||||
|
||||
#include <pulse/cdecl.h>
|
||||
#include <pulse/sample.h>
|
||||
#include <pulse/version.h>
|
||||
|
||||
/** \file
|
||||
|
|
|
|||
|
|
@ -42,10 +42,12 @@
|
|||
#include <pulsecore/pipe.h>
|
||||
#endif
|
||||
|
||||
#include <pulse/i18n.h>
|
||||
#include <pulse/rtclock.h>
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/xmalloc.h>
|
||||
#include <pulse/i18n.h>
|
||||
|
||||
#include <pulsecore/core-rtclock.h>
|
||||
#include <pulsecore/core-util.h>
|
||||
#include <pulsecore/llist.h>
|
||||
#include <pulsecore/log.h>
|
||||
|
|
@ -75,7 +77,7 @@ struct pa_time_event {
|
|||
pa_bool_t dead:1;
|
||||
|
||||
pa_bool_t enabled:1;
|
||||
struct timeval timeval;
|
||||
pa_usec_t time;
|
||||
|
||||
pa_time_event_cb_t callback;
|
||||
void *userdata;
|
||||
|
|
@ -317,6 +319,21 @@ static void mainloop_defer_set_destroy(pa_defer_event *e, pa_defer_event_destroy
|
|||
}
|
||||
|
||||
/* Time events */
|
||||
static pa_usec_t timeval_load(struct timeval *tv) {
|
||||
pa_bool_t is_rtclock;
|
||||
|
||||
if (!tv)
|
||||
return PA_USEC_INVALID;
|
||||
|
||||
is_rtclock = !!(tv->tv_usec & PA_TIMEVAL_RTCLOCK);
|
||||
tv->tv_usec &= ~PA_TIMEVAL_RTCLOCK;
|
||||
|
||||
if (!is_rtclock)
|
||||
pa_rtclock_from_wallclock(tv);
|
||||
|
||||
return pa_timeval_load(tv);
|
||||
}
|
||||
|
||||
static pa_time_event* mainloop_time_new(
|
||||
pa_mainloop_api*a,
|
||||
const struct timeval *tv,
|
||||
|
|
@ -325,11 +342,14 @@ static pa_time_event* mainloop_time_new(
|
|||
|
||||
pa_mainloop *m;
|
||||
pa_time_event *e;
|
||||
pa_usec_t t;
|
||||
struct timeval ttv;
|
||||
|
||||
pa_assert(a);
|
||||
pa_assert(a->userdata);
|
||||
pa_assert(callback);
|
||||
|
||||
t = timeval_load(tv? ttv = *tv, &ttv : NULL);
|
||||
m = a->userdata;
|
||||
pa_assert(a == &m->api);
|
||||
|
||||
|
|
@ -337,15 +357,15 @@ static pa_time_event* mainloop_time_new(
|
|||
e->mainloop = m;
|
||||
e->dead = FALSE;
|
||||
|
||||
if ((e->enabled = !!tv)) {
|
||||
e->timeval = *tv;
|
||||
if ((e->enabled = (t != PA_USEC_INVALID))) {
|
||||
e->time = t;
|
||||
|
||||
m->n_enabled_time_events++;
|
||||
|
||||
if (m->cached_next_time_event) {
|
||||
pa_assert(m->cached_next_time_event->enabled);
|
||||
|
||||
if (pa_timeval_cmp(tv, &m->cached_next_time_event->timeval) < 0)
|
||||
if (t < m->cached_next_time_event->time)
|
||||
m->cached_next_time_event = e;
|
||||
}
|
||||
}
|
||||
|
|
@ -363,24 +383,30 @@ static pa_time_event* mainloop_time_new(
|
|||
}
|
||||
|
||||
static void mainloop_time_restart(pa_time_event *e, const struct timeval *tv) {
|
||||
pa_bool_t valid;
|
||||
pa_usec_t t;
|
||||
struct timeval ttv;
|
||||
|
||||
pa_assert(e);
|
||||
pa_assert(!e->dead);
|
||||
|
||||
if (e->enabled && !tv) {
|
||||
t = timeval_load(tv? ttv = *tv, &ttv : NULL);
|
||||
valid = (t != PA_USEC_INVALID);
|
||||
if (e->enabled && !valid) {
|
||||
pa_assert(e->mainloop->n_enabled_time_events > 0);
|
||||
e->mainloop->n_enabled_time_events--;
|
||||
} else if (!e->enabled && tv)
|
||||
} else if (!e->enabled && valid)
|
||||
e->mainloop->n_enabled_time_events++;
|
||||
|
||||
if ((e->enabled = !!tv)) {
|
||||
e->timeval = *tv;
|
||||
if ((e->enabled = valid)) {
|
||||
e->time = t;
|
||||
pa_mainloop_wakeup(e->mainloop);
|
||||
}
|
||||
|
||||
if (e->mainloop->cached_next_time_event && e->enabled) {
|
||||
pa_assert(e->mainloop->cached_next_time_event->enabled);
|
||||
|
||||
if (pa_timeval_cmp(tv, &e->mainloop->cached_next_time_event->timeval) < 0)
|
||||
if (t < e->mainloop->cached_next_time_event->time)
|
||||
e->mainloop->cached_next_time_event = e;
|
||||
} else if (e->mainloop->cached_next_time_event == e)
|
||||
e->mainloop->cached_next_time_event = NULL;
|
||||
|
|
@ -721,11 +747,11 @@ static pa_time_event* find_next_time_event(pa_mainloop *m) {
|
|||
if (t->dead || !t->enabled)
|
||||
continue;
|
||||
|
||||
if (!n || pa_timeval_cmp(&t->timeval, &n->timeval) < 0) {
|
||||
if (!n || t->time < n->time) {
|
||||
n = t;
|
||||
|
||||
/* Shortcut for tv = { 0, 0 } */
|
||||
if (n->timeval.tv_sec <= 0)
|
||||
/* Shortcut for time == 0 */
|
||||
if (n->time == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -736,7 +762,6 @@ static pa_time_event* find_next_time_event(pa_mainloop *m) {
|
|||
|
||||
static int calc_next_timeout(pa_mainloop *m) {
|
||||
pa_time_event *t;
|
||||
struct timeval now;
|
||||
pa_usec_t usec;
|
||||
|
||||
if (!m->n_enabled_time_events)
|
||||
|
|
@ -745,41 +770,41 @@ static int calc_next_timeout(pa_mainloop *m) {
|
|||
t = find_next_time_event(m);
|
||||
pa_assert(t);
|
||||
|
||||
if (t->timeval.tv_sec <= 0)
|
||||
if (t->time == 0)
|
||||
return 0;
|
||||
|
||||
pa_gettimeofday(&now);
|
||||
usec = t->time - pa_rtclock_now();
|
||||
|
||||
if (pa_timeval_cmp(&t->timeval, &now) <= 0)
|
||||
if (usec <= 0)
|
||||
return 0;
|
||||
|
||||
usec = pa_timeval_diff(&t->timeval, &now);
|
||||
return (int) (usec / 1000);
|
||||
return (int) (usec / 1000); /* in milliseconds */
|
||||
}
|
||||
|
||||
static int dispatch_timeout(pa_mainloop *m) {
|
||||
pa_time_event *e;
|
||||
struct timeval now;
|
||||
pa_usec_t now;
|
||||
int r = 0;
|
||||
pa_assert(m);
|
||||
|
||||
if (m->n_enabled_time_events <= 0)
|
||||
return 0;
|
||||
|
||||
pa_gettimeofday(&now);
|
||||
now = pa_rtclock_now();
|
||||
|
||||
for (e = m->time_events; e && !m->quit; e = e->next) {
|
||||
|
||||
if (e->dead || !e->enabled)
|
||||
continue;
|
||||
|
||||
if (pa_timeval_cmp(&e->timeval, &now) <= 0) {
|
||||
if (e->time <= now) {
|
||||
struct timeval tv;
|
||||
pa_assert(e->callback);
|
||||
|
||||
/* Disable time event */
|
||||
mainloop_time_restart(e, NULL);
|
||||
|
||||
e->callback(&m->api, e, &e->timeval, e->userdata);
|
||||
e->callback(&m->api, e, pa_timeval_rtstore(&tv, e->time, TRUE), e->userdata);
|
||||
|
||||
r++;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -320,14 +320,10 @@ static void request_auto_timing_update(pa_stream *s, pa_bool_t force) {
|
|||
}
|
||||
|
||||
if (s->auto_timing_update_event) {
|
||||
struct timeval next;
|
||||
|
||||
if (force)
|
||||
s->auto_timing_interval_usec = AUTO_TIMING_INTERVAL_START_USEC;
|
||||
|
||||
pa_gettimeofday(&next);
|
||||
pa_timeval_add(&next, s->auto_timing_interval_usec);
|
||||
s->mainloop->time_restart(s->auto_timing_update_event, &next);
|
||||
pa_context_rttime_restart(s->context, s->auto_timing_update_event, pa_rtclock_now() + s->auto_timing_interval_usec);
|
||||
|
||||
s->auto_timing_interval_usec = PA_MIN(AUTO_TIMING_INTERVAL_END_USEC, s->auto_timing_interval_usec*2);
|
||||
}
|
||||
|
|
@ -801,7 +797,7 @@ static void invalidate_indexes(pa_stream *s, pa_bool_t r, pa_bool_t w) {
|
|||
request_auto_timing_update(s, TRUE);
|
||||
}
|
||||
|
||||
static void auto_timing_update_callback(pa_mainloop_api *m, pa_time_event *e, const struct timeval *tv, void *userdata) {
|
||||
static void auto_timing_update_callback(pa_mainloop_api *m, pa_time_event *e, const struct timeval *t, void *userdata) {
|
||||
pa_stream *s = userdata;
|
||||
|
||||
pa_assert(s);
|
||||
|
|
@ -823,12 +819,9 @@ static void create_stream_complete(pa_stream *s) {
|
|||
s->write_callback(s, (size_t) s->requested_bytes, s->write_userdata);
|
||||
|
||||
if (s->flags & PA_STREAM_AUTO_TIMING_UPDATE) {
|
||||
struct timeval tv;
|
||||
pa_gettimeofday(&tv);
|
||||
s->auto_timing_interval_usec = AUTO_TIMING_INTERVAL_START_USEC;
|
||||
pa_timeval_add(&tv, s->auto_timing_interval_usec);
|
||||
pa_assert(!s->auto_timing_update_event);
|
||||
s->auto_timing_update_event = s->mainloop->time_new(s->mainloop, &tv, &auto_timing_update_callback, s);
|
||||
s->auto_timing_update_event = pa_context_rttime_new(s->context, pa_rtclock_now() + s->auto_timing_interval_usec, &auto_timing_update_callback, s);
|
||||
|
||||
request_auto_timing_update(s, TRUE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,6 +51,9 @@ PA_C_DECL_BEGIN
|
|||
/** The number of nanoseconds in a microsecond */
|
||||
#define PA_NSEC_PER_USEC ((pa_usec_t) 1000ULL)
|
||||
|
||||
/** Invalid time in usec */
|
||||
#define PA_USEC_INVALID ((pa_usec_t) -1)
|
||||
|
||||
struct timeval;
|
||||
|
||||
/** Return the current timestamp, just like UNIX gettimeofday() */
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/xmalloc.h>
|
||||
|
||||
#include <pulsecore/log.h>
|
||||
|
|
@ -116,14 +117,13 @@ struct AvahiTimeout {
|
|||
void *userdata;
|
||||
};
|
||||
|
||||
static void timeout_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *tv, void *userdata) {
|
||||
AvahiTimeout *t = userdata;
|
||||
static void timeout_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) {
|
||||
AvahiTimeout *to = userdata;
|
||||
|
||||
pa_assert(a);
|
||||
pa_assert(e);
|
||||
pa_assert(t);
|
||||
|
||||
t->callback(t, t->userdata);
|
||||
to->callback(to, to->userdata);
|
||||
}
|
||||
|
||||
static AvahiTimeout* timeout_new(const AvahiPoll *api, const struct timeval *tv, AvahiTimeoutCallback callback, void *userdata) {
|
||||
|
|
@ -145,6 +145,7 @@ static AvahiTimeout* timeout_new(const AvahiPoll *api, const struct timeval *tv,
|
|||
}
|
||||
|
||||
static void timeout_update(AvahiTimeout *t, const struct timeval *tv) {
|
||||
|
||||
pa_assert(t);
|
||||
|
||||
if (t->time_event && tv)
|
||||
|
|
|
|||
|
|
@ -150,3 +150,38 @@ pa_usec_t pa_timespec_load(const struct timespec *ts) {
|
|||
(pa_usec_t) ts->tv_sec * PA_USEC_PER_SEC +
|
||||
(pa_usec_t) ts->tv_nsec / PA_NSEC_PER_USEC;
|
||||
}
|
||||
|
||||
|
||||
static struct timeval* wallclock_from_rtclock(struct timeval *tv) {
|
||||
|
||||
#ifdef HAVE_CLOCK_GETTIME
|
||||
struct timeval wc_now, rt_now;
|
||||
|
||||
pa_gettimeofday(&wc_now);
|
||||
pa_rtclock_get(&rt_now);
|
||||
|
||||
pa_assert(tv);
|
||||
|
||||
if (pa_timeval_cmp(&rt_now, tv) < 0)
|
||||
pa_timeval_add(&wc_now, pa_timeval_diff(tv, &rt_now));
|
||||
else
|
||||
pa_timeval_sub(&wc_now, pa_timeval_diff(&rt_now, tv));
|
||||
|
||||
*tv = wc_now;
|
||||
#endif
|
||||
|
||||
return tv;
|
||||
}
|
||||
|
||||
struct timeval* pa_timeval_rtstore(struct timeval *tv, pa_usec_t v, pa_bool_t rtclock) {
|
||||
pa_assert(tv);
|
||||
|
||||
pa_timeval_store(tv, v);
|
||||
|
||||
if (rtclock)
|
||||
tv->tv_usec |= PA_TIMEVAL_RTCLOCK;
|
||||
else
|
||||
wallclock_from_rtclock(tv);
|
||||
|
||||
return tv;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,8 +38,13 @@ void pa_rtclock_hrtimer_enable(void);
|
|||
/* timer with a resolution better than this are considered high-resolution */
|
||||
#define PA_HRTIMER_THRESHOLD_USEC 10
|
||||
|
||||
/* bit to set in tv.tv_usec to mark that the timeval is in monotonic time */
|
||||
#define PA_TIMEVAL_RTCLOCK (1 << 30)
|
||||
|
||||
struct timeval* pa_rtclock_from_wallclock(struct timeval *tv);
|
||||
|
||||
pa_usec_t pa_timespec_load(const struct timespec *ts);
|
||||
|
||||
struct timeval* pa_timeval_rtstore(struct timeval *tv, pa_usec_t v, pa_bool_t rtclock);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
#include <pulse/util.h>
|
||||
#include <pulse/volume.h>
|
||||
#include <pulse/xmalloc.h>
|
||||
#include <pulse/rtclock.h>
|
||||
|
||||
#include <pulsecore/sink-input.h>
|
||||
#include <pulsecore/sample-util.h>
|
||||
|
|
@ -54,6 +55,7 @@
|
|||
#include <pulsecore/core-subscribe.h>
|
||||
#include <pulsecore/namereg.h>
|
||||
#include <pulsecore/sound-file.h>
|
||||
#include <pulsecore/core-rtclock.h>
|
||||
#include <pulsecore/core-util.h>
|
||||
#include <pulsecore/log.h>
|
||||
#include <pulsecore/core-error.h>
|
||||
|
|
@ -61,11 +63,10 @@
|
|||
|
||||
#include "core-scache.h"
|
||||
|
||||
#define UNLOAD_POLL_TIME 60
|
||||
#define UNLOAD_POLL_TIME (60 * PA_USEC_PER_SEC)
|
||||
|
||||
static void timeout_callback(pa_mainloop_api *m, pa_time_event*e, const struct timeval *tv, void *userdata) {
|
||||
static void timeout_callback(pa_mainloop_api *m, pa_time_event *e, const struct timeval *t, void *userdata) {
|
||||
pa_core *c = userdata;
|
||||
struct timeval ntv;
|
||||
|
||||
pa_assert(c);
|
||||
pa_assert(c->mainloop == m);
|
||||
|
|
@ -73,9 +74,7 @@ static void timeout_callback(pa_mainloop_api *m, pa_time_event*e, const struct t
|
|||
|
||||
pa_scache_unload_unused(c);
|
||||
|
||||
pa_gettimeofday(&ntv);
|
||||
ntv.tv_sec += UNLOAD_POLL_TIME;
|
||||
m->time_restart(e, &ntv);
|
||||
pa_core_rttime_restart(c, e, pa_rtclock_now() + UNLOAD_POLL_TIME);
|
||||
}
|
||||
|
||||
static void free_entry(pa_scache_entry *e) {
|
||||
|
|
@ -256,12 +255,8 @@ int pa_scache_add_file_lazy(pa_core *c, const char *name, const char *filename,
|
|||
|
||||
pa_proplist_sets(e->proplist, PA_PROP_MEDIA_FILENAME, filename);
|
||||
|
||||
if (!c->scache_auto_unload_event) {
|
||||
struct timeval ntv;
|
||||
pa_gettimeofday(&ntv);
|
||||
ntv.tv_sec += UNLOAD_POLL_TIME;
|
||||
c->scache_auto_unload_event = c->mainloop->time_new(c->mainloop, &ntv, timeout_callback, c);
|
||||
}
|
||||
if (!c->scache_auto_unload_event)
|
||||
c->scache_auto_unload_event = pa_core_rttime_new(c, pa_rtclock_now() + UNLOAD_POLL_TIME, timeout_callback, c);
|
||||
|
||||
if (idx)
|
||||
*idx = e->index;
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include <pulse/rtclock.h>
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/xmalloc.h>
|
||||
|
||||
|
|
@ -35,6 +36,7 @@
|
|||
#include <pulsecore/sink.h>
|
||||
#include <pulsecore/source.h>
|
||||
#include <pulsecore/namereg.h>
|
||||
#include <pulsecore/core-rtclock.h>
|
||||
#include <pulsecore/core-util.h>
|
||||
#include <pulsecore/core-scache.h>
|
||||
#include <pulsecore/core-subscribe.h>
|
||||
|
|
@ -214,7 +216,7 @@ static void core_free(pa_object *o) {
|
|||
pa_xfree(c);
|
||||
}
|
||||
|
||||
static void exit_callback(pa_mainloop_api*m, pa_time_event *e, const struct timeval *tv, void *userdata) {
|
||||
static void exit_callback(pa_mainloop_api *m, pa_time_event *e, const struct timeval *t, void *userdata) {
|
||||
pa_core *c = userdata;
|
||||
pa_assert(c->exit_event == e);
|
||||
|
||||
|
|
@ -229,11 +231,7 @@ void pa_core_check_idle(pa_core *c) {
|
|||
c->exit_idle_time >= 0 &&
|
||||
pa_idxset_size(c->clients) == 0) {
|
||||
|
||||
struct timeval tv;
|
||||
pa_gettimeofday(&tv);
|
||||
tv.tv_sec+= c->exit_idle_time;
|
||||
|
||||
c->exit_event = c->mainloop->time_new(c->mainloop, &tv, exit_callback, c);
|
||||
c->exit_event = pa_core_rttime_new(c, pa_rtclock_now() + c->exit_idle_time * PA_USEC_PER_SEC, exit_callback, c);
|
||||
|
||||
} else if (c->exit_event && pa_idxset_size(c->clients) > 0) {
|
||||
c->mainloop->time_free(c->exit_event);
|
||||
|
|
@ -261,3 +259,21 @@ void pa_core_maybe_vacuum(pa_core *c) {
|
|||
pa_log_debug("Hmm, no streams around, trying to vacuum.");
|
||||
pa_mempool_vacuum(c->mempool);
|
||||
}
|
||||
|
||||
pa_time_event* pa_core_rttime_new(pa_core *c, pa_usec_t usec, pa_time_event_cb_t cb, void *userdata) {
|
||||
struct timeval tv;
|
||||
|
||||
pa_assert(c);
|
||||
pa_assert(c->mainloop);
|
||||
|
||||
return c->mainloop->time_new(c->mainloop, pa_timeval_rtstore(&tv, usec, TRUE), cb, userdata);
|
||||
}
|
||||
|
||||
void pa_core_rttime_restart(pa_core *c, pa_time_event *e, pa_usec_t usec) {
|
||||
struct timeval tv;
|
||||
|
||||
pa_assert(c);
|
||||
pa_assert(c->mainloop);
|
||||
|
||||
c->mainloop->time_restart(e, pa_timeval_rtstore(&tv, usec, TRUE));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -183,4 +183,8 @@ int pa_core_exit(pa_core *c, pa_bool_t force, int retval);
|
|||
|
||||
void pa_core_maybe_vacuum(pa_core *c);
|
||||
|
||||
/* wrapper for c->mainloop->time_*() RT time events */
|
||||
pa_time_event* pa_core_rttime_new(pa_core *c, pa_usec_t usec, pa_time_event_cb_t cb, void *userdata);
|
||||
void pa_core_rttime_restart(pa_core *c, pa_time_event *e, pa_usec_t usec);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ pa_dbus_connection* pa_dbus_bus_get(pa_core *c, DBusBusType type, DBusError *err
|
|||
if ((pconn = pa_shared_get(c, prop_name[type])))
|
||||
return pa_dbus_connection_ref(pconn);
|
||||
|
||||
if (!(conn = pa_dbus_wrap_connection_new(c->mainloop, type, error)))
|
||||
if (!(conn = pa_dbus_wrap_connection_new(c->mainloop, TRUE, type, error)))
|
||||
return NULL;
|
||||
|
||||
return dbus_connection_new(c, conn, prop_name[type]);
|
||||
|
|
|
|||
|
|
@ -26,9 +26,11 @@
|
|||
|
||||
#include <stdarg.h>
|
||||
|
||||
#include <pulse/xmalloc.h>
|
||||
#include <pulse/rtclock.h>
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/xmalloc.h>
|
||||
|
||||
#include <pulsecore/core-rtclock.h>
|
||||
#include <pulsecore/core-util.h>
|
||||
#include <pulsecore/log.h>
|
||||
|
||||
|
|
@ -38,6 +40,12 @@ struct pa_dbus_wrap_connection {
|
|||
pa_mainloop_api *mainloop;
|
||||
DBusConnection *connection;
|
||||
pa_defer_event* dispatch_event;
|
||||
pa_bool_t use_rtclock:1;
|
||||
};
|
||||
|
||||
struct timeout_data {
|
||||
pa_dbus_wrap_connection *c;
|
||||
DBusTimeout *timeout;
|
||||
};
|
||||
|
||||
static void dispatch_cb(pa_mainloop_api *ea, pa_defer_event *ev, void *userdata) {
|
||||
|
|
@ -118,16 +126,18 @@ static void handle_io_event(pa_mainloop_api *ea, pa_io_event *e, int fd, pa_io_e
|
|||
}
|
||||
|
||||
/* pa_time_event_cb_t timer event handler */
|
||||
static void handle_time_event(pa_mainloop_api *ea, pa_time_event* e, const struct timeval *tv, void *userdata) {
|
||||
DBusTimeout *timeout = userdata;
|
||||
static void handle_time_event(pa_mainloop_api *ea, pa_time_event* e, const struct timeval *t, void *userdata) {
|
||||
struct timeval tv;
|
||||
struct timeout_data *d = userdata;
|
||||
|
||||
if (dbus_timeout_get_enabled(timeout)) {
|
||||
struct timeval next = *tv;
|
||||
dbus_timeout_handle(timeout);
|
||||
pa_assert(d);
|
||||
pa_assert(d->c);
|
||||
|
||||
if (dbus_timeout_get_enabled(d->timeout)) {
|
||||
dbus_timeout_handle(d->timeout);
|
||||
|
||||
/* restart it for the next scheduled time */
|
||||
pa_timeval_add(&next, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000);
|
||||
ea->time_restart(e, &next);
|
||||
ea->time_restart(e, pa_timeval_rtstore(&tv, pa_timeval_load(t) + dbus_timeout_get_interval(d->timeout) * PA_USEC_PER_MSEC, d->c->use_rtclock));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -179,11 +189,16 @@ static void toggle_watch(DBusWatch *watch, void *data) {
|
|||
c->mainloop->io_enable(ev, get_watch_flags(watch));
|
||||
}
|
||||
|
||||
static void time_event_destroy_cb(pa_mainloop_api *a, pa_time_event *e, void *userdata) {
|
||||
pa_xfree(userdata);
|
||||
}
|
||||
|
||||
/* DBusAddTimeoutFunction callback for pa mainloop */
|
||||
static dbus_bool_t add_timeout(DBusTimeout *timeout, void *data) {
|
||||
pa_dbus_wrap_connection *c = data;
|
||||
pa_time_event *ev;
|
||||
struct timeval tv;
|
||||
struct timeout_data *d;
|
||||
|
||||
pa_assert(timeout);
|
||||
pa_assert(c);
|
||||
|
|
@ -191,10 +206,11 @@ static dbus_bool_t add_timeout(DBusTimeout *timeout, void *data) {
|
|||
if (!dbus_timeout_get_enabled(timeout))
|
||||
return FALSE;
|
||||
|
||||
pa_gettimeofday(&tv);
|
||||
pa_timeval_add(&tv, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000);
|
||||
|
||||
ev = c->mainloop->time_new(c->mainloop, &tv, handle_time_event, timeout);
|
||||
d = pa_xnew(struct timeout_data, 1);
|
||||
d->c = c;
|
||||
d->timeout = timeout;
|
||||
ev = c->mainloop->time_new(c->mainloop, pa_timeval_rtstore(&tv, pa_rtclock_now() + dbus_timeout_get_interval(timeout) * PA_USEC_PER_MSEC, c->use_rtclock), handle_time_event, d);
|
||||
c->mainloop->time_set_destroy(ev, time_event_destroy_cb);
|
||||
|
||||
dbus_timeout_set_data(timeout, ev, NULL);
|
||||
|
||||
|
|
@ -215,23 +231,20 @@ static void remove_timeout(DBusTimeout *timeout, void *data) {
|
|||
|
||||
/* DBusTimeoutToggledFunction callback for pa mainloop */
|
||||
static void toggle_timeout(DBusTimeout *timeout, void *data) {
|
||||
pa_dbus_wrap_connection *c = data;
|
||||
struct timeout_data *d = data;
|
||||
pa_time_event *ev;
|
||||
struct timeval tv;
|
||||
|
||||
pa_assert(d);
|
||||
pa_assert(d->c);
|
||||
pa_assert(timeout);
|
||||
pa_assert(c);
|
||||
|
||||
pa_assert_se(ev = dbus_timeout_get_data(timeout));
|
||||
|
||||
if (dbus_timeout_get_enabled(timeout)) {
|
||||
struct timeval tv;
|
||||
|
||||
pa_gettimeofday(&tv);
|
||||
pa_timeval_add(&tv, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000);
|
||||
|
||||
c->mainloop->time_restart(ev, &tv);
|
||||
d->c->mainloop->time_restart(ev, pa_timeval_rtstore(&tv, pa_rtclock_now() + dbus_timeout_get_interval(timeout) * PA_USEC_PER_MSEC, d->c->use_rtclock));
|
||||
} else
|
||||
c->mainloop->time_restart(ev, NULL);
|
||||
d->c->mainloop->time_restart(ev, pa_timeval_rtstore(&tv, PA_USEC_INVALID, d->c->use_rtclock));
|
||||
}
|
||||
|
||||
static void wakeup_main(void *userdata) {
|
||||
|
|
@ -244,7 +257,7 @@ static void wakeup_main(void *userdata) {
|
|||
c->mainloop->defer_enable(c->dispatch_event, 1);
|
||||
}
|
||||
|
||||
pa_dbus_wrap_connection* pa_dbus_wrap_connection_new(pa_mainloop_api *m, DBusBusType type, DBusError *error) {
|
||||
pa_dbus_wrap_connection* pa_dbus_wrap_connection_new(pa_mainloop_api *m, pa_bool_t use_rtclock, DBusBusType type, DBusError *error) {
|
||||
DBusConnection *conn;
|
||||
pa_dbus_wrap_connection *pconn;
|
||||
char *id;
|
||||
|
|
@ -257,6 +270,7 @@ pa_dbus_wrap_connection* pa_dbus_wrap_connection_new(pa_mainloop_api *m, DBusBus
|
|||
pconn = pa_xnew(pa_dbus_wrap_connection, 1);
|
||||
pconn->mainloop = m;
|
||||
pconn->connection = conn;
|
||||
pconn->use_rtclock = use_rtclock;
|
||||
|
||||
dbus_connection_set_exit_on_disconnect(conn, FALSE);
|
||||
dbus_connection_set_dispatch_status_function(conn, dispatch_status, pconn, NULL);
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@
|
|||
/* A wrap connection is not shared or refcounted, it is available in client side */
|
||||
typedef struct pa_dbus_wrap_connection pa_dbus_wrap_connection;
|
||||
|
||||
pa_dbus_wrap_connection* pa_dbus_wrap_connection_new(pa_mainloop_api *mainloop, DBusBusType type, DBusError *error);
|
||||
pa_dbus_wrap_connection* pa_dbus_wrap_connection_new(pa_mainloop_api *mainloop, pa_bool_t use_rtclock, DBusBusType type, DBusError *error);
|
||||
void pa_dbus_wrap_connection_free(pa_dbus_wrap_connection* conn);
|
||||
|
||||
DBusConnection* pa_dbus_wrap_connection_get(pa_dbus_wrap_connection *conn);
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <pulse/rtclock.h>
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/xmalloc.h>
|
||||
|
||||
|
|
@ -37,6 +38,7 @@
|
|||
#include <pulsecore/macro.h>
|
||||
#include <pulsecore/refcnt.h>
|
||||
#include <pulsecore/flist.h>
|
||||
#include <pulsecore/core-rtclock.h>
|
||||
|
||||
#include "pdispatch.h"
|
||||
|
||||
|
|
@ -204,6 +206,7 @@ struct pa_pdispatch {
|
|||
pa_pdispatch_drain_callback drain_callback;
|
||||
void *drain_userdata;
|
||||
const pa_creds *creds;
|
||||
pa_bool_t use_rtclock:1;
|
||||
};
|
||||
|
||||
static void reply_info_free(struct reply_info *r) {
|
||||
|
|
@ -220,7 +223,7 @@ static void reply_info_free(struct reply_info *r) {
|
|||
pa_xfree(r);
|
||||
}
|
||||
|
||||
pa_pdispatch* pa_pdispatch_new(pa_mainloop_api *mainloop, const pa_pdispatch_cb_t*table, unsigned entries) {
|
||||
pa_pdispatch* pa_pdispatch_new(pa_mainloop_api *mainloop, pa_bool_t use_rtclock, const pa_pdispatch_cb_t *table, unsigned entries) {
|
||||
pa_pdispatch *pd;
|
||||
pa_assert(mainloop);
|
||||
|
||||
|
|
@ -235,6 +238,7 @@ pa_pdispatch* pa_pdispatch_new(pa_mainloop_api *mainloop, const pa_pdispatch_cb_
|
|||
pd->drain_callback = NULL;
|
||||
pd->drain_userdata = NULL;
|
||||
pd->creds = NULL;
|
||||
pd->use_rtclock = use_rtclock;
|
||||
|
||||
return pd;
|
||||
}
|
||||
|
|
@ -342,7 +346,7 @@ finish:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void timeout_callback(pa_mainloop_api*m, pa_time_event*e, const struct timeval *tv, void *userdata) {
|
||||
static void timeout_callback(pa_mainloop_api*m, pa_time_event*e, const struct timeval *t, void *userdata) {
|
||||
struct reply_info*r = userdata;
|
||||
|
||||
pa_assert(r);
|
||||
|
|
@ -371,10 +375,7 @@ void pa_pdispatch_register_reply(pa_pdispatch *pd, uint32_t tag, int timeout, pa
|
|||
r->free_cb = free_cb;
|
||||
r->tag = tag;
|
||||
|
||||
pa_gettimeofday(&tv);
|
||||
tv.tv_sec += timeout;
|
||||
|
||||
pa_assert_se(r->time_event = pd->mainloop->time_new(pd->mainloop, &tv, timeout_callback, r));
|
||||
pa_assert_se(r->time_event = pd->mainloop->time_new(pd->mainloop, pa_timeval_rtstore(&tv, pa_rtclock_now() + timeout * PA_USEC_PER_SEC, pd->use_rtclock), timeout_callback, r));
|
||||
|
||||
PA_LLIST_PREPEND(struct reply_info, pd->replies, r);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ typedef struct pa_pdispatch pa_pdispatch;
|
|||
typedef void (*pa_pdispatch_cb_t)(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
|
||||
typedef void (*pa_pdispatch_drain_callback)(pa_pdispatch *pd, void *userdata);
|
||||
|
||||
pa_pdispatch* pa_pdispatch_new(pa_mainloop_api *m, const pa_pdispatch_cb_t*table, unsigned entries);
|
||||
pa_pdispatch* pa_pdispatch_new(pa_mainloop_api *m, pa_bool_t use_rtclock, const pa_pdispatch_cb_t*table, unsigned entries);
|
||||
void pa_pdispatch_unref(pa_pdispatch *pd);
|
||||
pa_pdispatch* pa_pdispatch_ref(pa_pdispatch *pd);
|
||||
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <pulse/rtclock.h>
|
||||
#include <pulse/sample.h>
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/utf8.h>
|
||||
|
|
@ -63,7 +64,7 @@
|
|||
#define MAX_CONNECTIONS 64
|
||||
|
||||
/* Kick a client if it doesn't authenticate within this time */
|
||||
#define AUTH_TIMEOUT 5
|
||||
#define AUTH_TIMEOUT (5*PA_USEC_PER_SEC)
|
||||
|
||||
#define DEFAULT_COOKIE_FILE ".esd_auth"
|
||||
|
||||
|
|
@ -1459,11 +1460,10 @@ static pa_usec_t source_output_get_latency_cb(pa_source_output *o) {
|
|||
|
||||
/*** entry points ***/
|
||||
|
||||
static void auth_timeout(pa_mainloop_api*m, pa_time_event *e, const struct timeval *tv, void *userdata) {
|
||||
static void auth_timeout(pa_mainloop_api *m, pa_time_event *e, const struct timeval *t, void *userdata) {
|
||||
connection *c = CONNECTION(userdata);
|
||||
|
||||
pa_assert(m);
|
||||
pa_assert(tv);
|
||||
connection_assert_ref(c);
|
||||
pa_assert(c->auth_timeout_event == e);
|
||||
|
||||
|
|
@ -1553,12 +1553,9 @@ void pa_esound_protocol_connect(pa_esound_protocol *p, pa_iochannel *io, pa_esou
|
|||
c->authorized = TRUE;
|
||||
}
|
||||
|
||||
if (!c->authorized) {
|
||||
struct timeval tv;
|
||||
pa_gettimeofday(&tv);
|
||||
tv.tv_sec += AUTH_TIMEOUT;
|
||||
c->auth_timeout_event = p->core->mainloop->time_new(p->core->mainloop, &tv, auth_timeout, c);
|
||||
} else
|
||||
if (!c->authorized)
|
||||
c->auth_timeout_event = pa_core_rttime_new(p->core, pa_rtclock_now() + AUTH_TIMEOUT, auth_timeout, c);
|
||||
else
|
||||
c->auth_timeout_event = NULL;
|
||||
|
||||
c->defer_event = p->core->mainloop->defer_new(p->core->mainloop, defer_callback, c);
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@
|
|||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <pulse/rtclock.h>
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/version.h>
|
||||
#include <pulse/utf8.h>
|
||||
|
|
@ -61,7 +62,7 @@
|
|||
#include "protocol-native.h"
|
||||
|
||||
/* Kick a client if it doesn't authenticate within this time */
|
||||
#define AUTH_TIMEOUT 60
|
||||
#define AUTH_TIMEOUT (60 * PA_USEC_PER_SEC)
|
||||
|
||||
/* Don't accept more connection than this */
|
||||
#define MAX_CONNECTIONS 64
|
||||
|
|
@ -4479,11 +4480,10 @@ static void client_send_event_cb(pa_client *client, const char*event, pa_proplis
|
|||
|
||||
/*** module entry points ***/
|
||||
|
||||
static void auth_timeout(pa_mainloop_api*m, pa_time_event *e, const struct timeval *tv, void *userdata) {
|
||||
static void auth_timeout(pa_mainloop_api*m, pa_time_event *e, const struct timeval *t, void *userdata) {
|
||||
pa_native_connection *c = PA_NATIVE_CONNECTION(userdata);
|
||||
|
||||
pa_assert(m);
|
||||
pa_assert(tv);
|
||||
pa_native_connection_assert_ref(c);
|
||||
pa_assert(c->auth_timeout_event == e);
|
||||
|
||||
|
|
@ -4541,12 +4541,9 @@ void pa_native_protocol_connect(pa_native_protocol *p, pa_iochannel *io, pa_nati
|
|||
c->authorized = TRUE;
|
||||
}
|
||||
|
||||
if (!c->authorized) {
|
||||
struct timeval tv;
|
||||
pa_gettimeofday(&tv);
|
||||
tv.tv_sec += AUTH_TIMEOUT;
|
||||
c->auth_timeout_event = p->core->mainloop->time_new(p->core->mainloop, &tv, auth_timeout, c);
|
||||
} else
|
||||
if (!c->authorized)
|
||||
c->auth_timeout_event = pa_core_rttime_new(p->core, pa_rtclock_now() + AUTH_TIMEOUT, auth_timeout, c);
|
||||
else
|
||||
c->auth_timeout_event = NULL;
|
||||
|
||||
c->is_local = pa_iochannel_socket_is_local(io);
|
||||
|
|
@ -4565,7 +4562,7 @@ void pa_native_protocol_connect(pa_native_protocol *p, pa_iochannel *io, pa_nati
|
|||
pa_pstream_set_revoke_callback(c->pstream, pstream_revoke_callback, c);
|
||||
pa_pstream_set_release_callback(c->pstream, pstream_release_callback, c);
|
||||
|
||||
c->pdispatch = pa_pdispatch_new(p->core->mainloop, command_table, PA_COMMAND_MAX);
|
||||
c->pdispatch = pa_pdispatch_new(p->core->mainloop, TRUE, command_table, PA_COMMAND_MAX);
|
||||
|
||||
c->record_streams = pa_idxset_new(NULL, NULL);
|
||||
c->output_streams = pa_idxset_new(NULL, NULL);
|
||||
|
|
|
|||
|
|
@ -52,12 +52,14 @@
|
|||
#include <asyncns.h>
|
||||
#endif
|
||||
|
||||
#include <pulse/rtclock.h>
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/xmalloc.h>
|
||||
|
||||
#include <pulsecore/winsock.h>
|
||||
#include <pulsecore/core-error.h>
|
||||
#include <pulsecore/socket-util.h>
|
||||
#include <pulsecore/core-rtclock.h>
|
||||
#include <pulsecore/core-util.h>
|
||||
#include <pulsecore/socket-util.h>
|
||||
#include <pulsecore/log.h>
|
||||
|
|
@ -420,12 +422,11 @@ fail:
|
|||
|
||||
#endif
|
||||
|
||||
static void timeout_cb(pa_mainloop_api *m, pa_time_event *e, const struct timeval *tv, void *userdata) {
|
||||
static void timeout_cb(pa_mainloop_api *m, pa_time_event *e, const struct timeval *t, void *userdata) {
|
||||
pa_socket_client *c = userdata;
|
||||
|
||||
pa_assert(m);
|
||||
pa_assert(e);
|
||||
pa_assert(tv);
|
||||
pa_assert(c);
|
||||
|
||||
if (c->fd >= 0) {
|
||||
|
|
@ -437,17 +438,16 @@ static void timeout_cb(pa_mainloop_api *m, pa_time_event *e, const struct timeva
|
|||
do_call(c);
|
||||
}
|
||||
|
||||
static void start_timeout(pa_socket_client *c) {
|
||||
static void start_timeout(pa_socket_client *c, pa_bool_t use_rtclock) {
|
||||
struct timeval tv;
|
||||
|
||||
pa_assert(c);
|
||||
pa_assert(!c->timeout_event);
|
||||
|
||||
pa_gettimeofday(&tv);
|
||||
pa_timeval_add(&tv, CONNECT_TIMEOUT * PA_USEC_PER_SEC);
|
||||
c->timeout_event = c->mainloop->time_new(c->mainloop, &tv, timeout_cb, c);
|
||||
c->timeout_event = c->mainloop->time_new(c->mainloop, pa_timeval_rtstore(&tv, pa_rtclock_now() + CONNECT_TIMEOUT * PA_USEC_PER_SEC, use_rtclock), timeout_cb, c);
|
||||
}
|
||||
|
||||
pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, const char*name, uint16_t default_port) {
|
||||
pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, pa_bool_t use_rtclock, const char*name, uint16_t default_port) {
|
||||
pa_socket_client *c = NULL;
|
||||
pa_parsed_address a;
|
||||
|
||||
|
|
@ -463,7 +463,7 @@ pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, const char*nam
|
|||
switch (a.type) {
|
||||
case PA_PARSED_ADDRESS_UNIX:
|
||||
if ((c = pa_socket_client_new_unix(m, a.path_or_host)))
|
||||
start_timeout(c);
|
||||
start_timeout(c, use_rtclock);
|
||||
break;
|
||||
|
||||
case PA_PARSED_ADDRESS_TCP4: /* Fallthrough */
|
||||
|
|
@ -499,7 +499,7 @@ pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, const char*nam
|
|||
c->asyncns_io_event = m->io_new(m, asyncns_fd(c->asyncns), PA_IO_EVENT_INPUT, asyncns_cb, c);
|
||||
c->asyncns_query = asyncns_getaddrinfo(c->asyncns, a.path_or_host, port, &hints);
|
||||
pa_assert(c->asyncns_query);
|
||||
start_timeout(c);
|
||||
start_timeout(c, use_rtclock);
|
||||
}
|
||||
#elif defined(HAVE_GETADDRINFO)
|
||||
{
|
||||
|
|
@ -513,7 +513,7 @@ pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, const char*nam
|
|||
|
||||
if (res->ai_addr) {
|
||||
if ((c = pa_socket_client_new_sockaddr(m, res->ai_addr, res->ai_addrlen)))
|
||||
start_timeout(c);
|
||||
start_timeout(c, use_rtclock);
|
||||
}
|
||||
|
||||
freeaddrinfo(res);
|
||||
|
|
@ -546,7 +546,7 @@ pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, const char*nam
|
|||
s.sin_port = htons(a.port);
|
||||
|
||||
if ((c = pa_socket_client_new_sockaddr(m, (struct sockaddr*)&s, sizeof(s))))
|
||||
start_timeout(c);
|
||||
start_timeout(c, use_rtclock);
|
||||
}
|
||||
#endif /* HAVE_LIBASYNCNS */
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ pa_socket_client* pa_socket_client_new_ipv6(pa_mainloop_api *m, uint8_t address[
|
|||
#endif
|
||||
pa_socket_client* pa_socket_client_new_unix(pa_mainloop_api *m, const char *filename);
|
||||
pa_socket_client* pa_socket_client_new_sockaddr(pa_mainloop_api *m, const struct sockaddr *sa, size_t salen);
|
||||
pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, const char *a, uint16_t default_port);
|
||||
pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, pa_bool_t use_rtclock, const char *a, uint16_t default_port);
|
||||
|
||||
pa_socket_client* pa_socket_client_ref(pa_socket_client *c);
|
||||
void pa_socket_client_unref(pa_socket_client *c);
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@
|
|||
#include <sys/time.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <pulse/rtclock.h>
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/gccmacro.h>
|
||||
|
||||
|
|
@ -99,9 +100,7 @@ int main(int argc, char *argv[]) {
|
|||
de = a->defer_new(a, dcb, NULL);
|
||||
assert(de);
|
||||
|
||||
pa_gettimeofday(&tv);
|
||||
tv.tv_sec += 10;
|
||||
te = a->time_new(a, &tv, tcb, NULL);
|
||||
te = a->time_new(a, pa_timeval_rtstore(&tv, pa_rtclock_now() + 2 * PA_USEC_PER_SEC, TRUE), tcb, NULL);
|
||||
|
||||
#if defined(GLIB_MAIN_LOOP)
|
||||
g_main_loop_run(glib_main_loop);
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@
|
|||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <pulse/rtclock.h>
|
||||
#include <pulse/timeval.h>
|
||||
#include <pulse/util.h>
|
||||
#include <pulse/thread-mainloop.h>
|
||||
|
|
@ -32,7 +33,7 @@
|
|||
|
||||
#include <pulsecore/macro.h>
|
||||
|
||||
static void tcb(pa_mainloop_api*a, pa_time_event *e, const struct timeval *tv, void *userdata) {
|
||||
static void tcb(pa_mainloop_api *a, pa_time_event *e, const struct timeval *tv, void *userdata) {
|
||||
pa_assert_se(pa_threaded_mainloop_in_thread(userdata));
|
||||
fprintf(stderr, "TIME EVENT START\n");
|
||||
pa_threaded_mainloop_signal(userdata, 1);
|
||||
|
|
@ -53,9 +54,7 @@ int main(int argc, char *argv[]) {
|
|||
|
||||
pa_assert_se(!pa_threaded_mainloop_in_thread(m));
|
||||
|
||||
pa_gettimeofday(&tv);
|
||||
tv.tv_sec += 5;
|
||||
a->time_new(a, &tv, tcb, m);
|
||||
a->time_new(a, pa_timeval_rtstore(&tv, pa_rtclock_now() + 5 * PA_USEC_PER_SEC, TRUE), tcb, m);
|
||||
|
||||
fprintf(stderr, "waiting 5s (signal)\n");
|
||||
pa_threaded_mainloop_wait(m);
|
||||
|
|
|
|||
|
|
@ -27,8 +27,9 @@
|
|||
#include <assert.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include <pulse/pulseaudio.h>
|
||||
#include <pulse/browser.h>
|
||||
#include <pulse/pulseaudio.h>
|
||||
#include <pulse/rtclock.h>
|
||||
|
||||
#include <pulsecore/core-util.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@
|
|||
|
||||
#include <pulse/i18n.h>
|
||||
#include <pulse/pulseaudio.h>
|
||||
#include <pulse/rtclock.h>
|
||||
|
||||
#include <pulsecore/macro.h>
|
||||
#include <pulsecore/core-util.h>
|
||||
|
|
@ -583,9 +584,7 @@ static void sigusr1_signal_callback(pa_mainloop_api*m, pa_signal_event *e, int s
|
|||
pa_operation_unref(pa_stream_update_timing_info(stream, stream_update_timing_callback, NULL));
|
||||
}
|
||||
|
||||
static void time_event_callback(pa_mainloop_api*m, pa_time_event *e, const struct timeval *tv, void *userdata) {
|
||||
struct timeval next;
|
||||
|
||||
static void time_event_callback(pa_mainloop_api *m, pa_time_event *e, const struct timeval *t, void *userdata) {
|
||||
if (stream && pa_stream_get_state(stream) == PA_STREAM_READY) {
|
||||
pa_operation *o;
|
||||
if (!(o = pa_stream_update_timing_info(stream, stream_update_timing_callback, NULL)))
|
||||
|
|
@ -594,10 +593,7 @@ static void time_event_callback(pa_mainloop_api*m, pa_time_event *e, const struc
|
|||
pa_operation_unref(o);
|
||||
}
|
||||
|
||||
pa_gettimeofday(&next);
|
||||
pa_timeval_add(&next, TIME_EVENT_USEC);
|
||||
|
||||
m->time_restart(e, &next);
|
||||
pa_context_rttime_restart(context, e, pa_rtclock_now() + TIME_EVENT_USEC);
|
||||
}
|
||||
|
||||
static void help(const char *argv0) {
|
||||
|
|
@ -1068,13 +1064,8 @@ int main(int argc, char *argv[]) {
|
|||
}
|
||||
|
||||
if (verbose) {
|
||||
struct timeval tv;
|
||||
|
||||
pa_gettimeofday(&tv);
|
||||
pa_timeval_add(&tv, TIME_EVENT_USEC);
|
||||
|
||||
if (!(time_event = mainloop_api->time_new(mainloop_api, &tv, time_event_callback, NULL))) {
|
||||
pa_log(_("time_new() failed.\n"));
|
||||
if (!(time_event = pa_context_rttime_new(context, pa_rtclock_now() + TIME_EVENT_USEC, time_event_callback, NULL))) {
|
||||
pa_log(_("pa_context_rttime_new() failed.\n"));
|
||||
goto quit;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue