From 3255bc8eaee6d03c6d8ff184743d17f17cb15b10 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 23 Oct 2020 20:37:04 +0200 Subject: [PATCH] context: use clock time as rttime when using our loop --- pipewire-pulseaudio/src/context.c | 6 ++--- pipewire-pulseaudio/src/internal.h | 4 +++- pipewire-pulseaudio/src/mainloop.c | 8 ++++--- pipewire-pulseaudio/src/rtclock.c | 35 ++++++++++++++++++++++++++++++ 4 files changed, 46 insertions(+), 7 deletions(-) diff --git a/pipewire-pulseaudio/src/context.c b/pipewire-pulseaudio/src/context.c index bef510b5d..84ce10132 100644 --- a/pipewire-pulseaudio/src/context.c +++ b/pipewire-pulseaudio/src/context.c @@ -1691,7 +1691,7 @@ pa_context *pa_context_new_with_proplist(pa_mainloop_api *mainloop, const char * if (p) pw_properties_update_proplist(props, p); - if (pa_mainloop_api_is_pipewire(mainloop)) + if (pa_mainloop_api_is_our_api(mainloop)) loop = mainloop->userdata; else { loop = pw_loop_new(NULL); @@ -2196,7 +2196,7 @@ pa_time_event* pa_context_rttime_new(PA_CONST pa_context *c, pa_usec_t usec, pa_ if (usec == PA_USEC_INVALID) return c->mainloop->time_new(c->mainloop, NULL, cb, userdata); - pa_timeval_store(&tv, usec); + pa_timeval_rtstore(&tv, usec, !c->fallback_loop); return c->mainloop->time_new(c->mainloop, &tv, cb, userdata); } @@ -2213,7 +2213,7 @@ void pa_context_rttime_restart(PA_CONST pa_context *c, pa_time_event *e, pa_usec if (usec == PA_USEC_INVALID) c->mainloop->time_restart(e, NULL); else { - pa_timeval_store(&tv, usec); + pa_timeval_rtstore(&tv, usec, !c->fallback_loop); c->mainloop->time_restart(e, &tv); } } diff --git a/pipewire-pulseaudio/src/internal.h b/pipewire-pulseaudio/src/internal.h index a2207a9da..7f76bda99 100644 --- a/pipewire-pulseaudio/src/internal.h +++ b/pipewire-pulseaudio/src/internal.h @@ -506,10 +506,12 @@ struct pa_operation void *state_userdata; }; -bool pa_mainloop_api_is_pipewire(pa_mainloop_api *api); +bool pa_mainloop_api_is_our_api(pa_mainloop_api *api); #define PA_TIMEVAL_RTCLOCK ((time_t) (1LU << 30)) struct timeval* pa_rtclock_from_wallclock(struct timeval *tv); +struct timeval* pa_rtclock_to_wallclock(struct timeval *tv); +struct timeval* pa_timeval_rtstore(struct timeval *tv, pa_usec_t v, bool rtclock); pa_operation *pa_operation_new(pa_context *c, pa_stream *s, pa_operation_cb_t cb, size_t userdata_size); void pa_operation_done(pa_operation *o); diff --git a/pipewire-pulseaudio/src/mainloop.c b/pipewire-pulseaudio/src/mainloop.c index fa76b7cfc..6e2e44ac7 100644 --- a/pipewire-pulseaudio/src/mainloop.c +++ b/pipewire-pulseaudio/src/mainloop.c @@ -127,7 +127,7 @@ static void set_timer(pa_time_event *ev, const struct timeval *tv) } else { struct timeval ttv = *tv; - if (!!(ttv.tv_usec & PA_TIMEVAL_RTCLOCK)) + if ((ttv.tv_usec & PA_TIMEVAL_RTCLOCK) != 0) ttv.tv_usec &= ~PA_TIMEVAL_RTCLOCK; else pa_rtclock_from_wallclock(&ttv); @@ -292,9 +292,10 @@ pa_mainloop *pa_mainloop_new(void) return NULL; } -bool pa_mainloop_api_is_pipewire(pa_mainloop_api *api) +bool pa_mainloop_api_is_our_api(pa_mainloop_api *api) { - return api && api->io_new == api_io_new; + pa_assert(api); + return api->io_new == api_io_new; } SPA_EXPORT @@ -494,3 +495,4 @@ void pa_mainloop_api_once(pa_mainloop_api* m, void (*callback)(pa_mainloop_api * pa_assert_se(e = m->defer_new(m, once_callback, i)); m->defer_set_destroy(e, free_callback); } + diff --git a/pipewire-pulseaudio/src/rtclock.c b/pipewire-pulseaudio/src/rtclock.c index a9208f488..0851083f9 100644 --- a/pipewire-pulseaudio/src/rtclock.c +++ b/pipewire-pulseaudio/src/rtclock.c @@ -69,3 +69,38 @@ struct timeval* pa_rtclock_from_wallclock(struct timeval *tv) return tv; } +struct timeval* pa_rtclock_to_wallclock(struct timeval *tv) +{ + struct timeval wc_now, rt_now; + + pa_assert(tv); + + pa_gettimeofday(&wc_now); + pa_rtclock_get(&rt_now); + + 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; + + return tv; +} + +struct timeval* pa_timeval_rtstore(struct timeval *tv, pa_usec_t v, bool rtclock) +{ + pa_assert(tv); + + if (v == PA_USEC_INVALID) + return NULL; + + pa_timeval_store(tv, v); + + if (rtclock) + tv->tv_usec |= PA_TIMEVAL_RTCLOCK; + else + pa_rtclock_to_wallclock(tv); + + return tv; +}