From 97202d1b2d1638df147a369f4476060f608b568f Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 1 Sep 2006 00:24:32 +0000 Subject: fix a race condition with stream connection vs. latency measuremtn (found by theBear) git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@1355 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/modules/module-tunnel.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/modules/module-tunnel.c b/src/modules/module-tunnel.c index 18e1d97d..a110c57e 100644 --- a/src/modules/module-tunnel.c +++ b/src/modules/module-tunnel.c @@ -490,8 +490,21 @@ static void start_subscribe(struct userdata *u) { pa_pstream_send_tagstruct(u->pstream, t); } +static void timeout_callback(pa_mainloop_api *m, pa_time_event*e, PA_GCC_UNUSED const struct timeval *tv, void *userdata) { + struct userdata *u = userdata; + struct timeval ntv; + assert(m && e && u); + + request_latency(u); + + pa_gettimeofday(&ntv); + ntv.tv_sec += LATENCY_INTERVAL; + m->time_restart(e, &ntv); +} + static void create_stream_callback(pa_pdispatch *pd, uint32_t command, PA_GCC_UNUSED uint32_t tag, pa_tagstruct *t, void *userdata) { struct userdata *u = userdata; + struct timeval ntv; assert(pd && u && u->pdispatch == pd); if (command != PA_COMMAND_REPLY) { @@ -535,6 +548,11 @@ static void create_stream_callback(pa_pdispatch *pd, uint32_t command, PA_GCC_UN start_subscribe(u); request_info(u); + 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); + request_latency(u); #ifdef TUNNEL_SINK send_bytes(u); @@ -840,18 +858,6 @@ static int source_set_hw_mute(pa_source *source) { } #endif -static void timeout_callback(pa_mainloop_api *m, pa_time_event*e, PA_GCC_UNUSED const struct timeval *tv, void *userdata) { - struct userdata *u = userdata; - struct timeval ntv; - assert(m && e && u); - - request_latency(u); - - pa_gettimeofday(&ntv); - ntv.tv_sec += LATENCY_INTERVAL; - m->time_restart(e, &ntv); -} - static int load_key(struct userdata *u, const char*fn) { assert(u); @@ -883,10 +889,8 @@ int pa__init(pa_core *c, pa_module*m) { struct userdata *u = NULL; pa_sample_spec ss; pa_channel_map map; - struct timeval ntv; char *t, *dn = NULL; - assert(c && m); if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { @@ -986,9 +990,7 @@ int pa__init(pa_core *c, pa_module*m) { pa_xfree(dn); - pa_gettimeofday(&ntv); - ntv.tv_sec += LATENCY_INTERVAL; - u->time_event = c->mainloop->time_new(c->mainloop, &ntv, timeout_callback, u); + u->time_event = NULL; pa_modargs_free(ma); -- cgit