From 125c52889626b2ac408ecbcc8ea85575f5808e07 Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Sat, 4 Apr 2009 23:19:53 +0300 Subject: pulse: move pa_rtclock_now in pulsecommon --- src/pulsecore/core-rtclock.c | 152 +++++++++++++++++++++++++++++++++++++++++ src/pulsecore/core-rtclock.h | 45 ++++++++++++ src/pulsecore/log.c | 3 +- src/pulsecore/ratelimit.c | 3 +- src/pulsecore/rtclock.c | 158 ------------------------------------------- src/pulsecore/rtclock.h | 47 ------------- src/pulsecore/rtpoll.c | 2 +- 7 files changed, 202 insertions(+), 208 deletions(-) create mode 100644 src/pulsecore/core-rtclock.c create mode 100644 src/pulsecore/core-rtclock.h delete mode 100644 src/pulsecore/rtclock.c delete mode 100644 src/pulsecore/rtclock.h (limited to 'src/pulsecore') diff --git a/src/pulsecore/core-rtclock.c b/src/pulsecore/core-rtclock.c new file mode 100644 index 00000000..0610e297 --- /dev/null +++ b/src/pulsecore/core-rtclock.c @@ -0,0 +1,152 @@ +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + PulseAudio is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include + +#ifdef HAVE_SYS_PRCTL_H +#include +#endif + +#include +#include +#include + +#include "core-rtclock.h" + +pa_usec_t pa_rtclock_age(const struct timeval *tv) { + struct timeval now; + pa_assert(tv); + + return pa_timeval_diff(pa_rtclock_get(&now), tv); +} + +struct timeval *pa_rtclock_get(struct timeval *tv) { +#ifdef HAVE_CLOCK_GETTIME + struct timespec ts; + +#ifdef CLOCK_MONOTONIC + /* No locking or atomic ops for no_monotonic here */ + static pa_bool_t no_monotonic = FALSE; + + if (!no_monotonic) + if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0) + no_monotonic = TRUE; + + if (no_monotonic) +#endif + pa_assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0); + + pa_assert(tv); + + tv->tv_sec = ts.tv_sec; + tv->tv_usec = ts.tv_nsec / 1000; + + return tv; + +#else /* HAVE_CLOCK_GETTIME */ + + return pa_gettimeofday(tv); + +#endif +} + +pa_bool_t pa_rtclock_hrtimer(void) { +#ifdef HAVE_CLOCK_GETTIME + struct timespec ts; + +#ifdef CLOCK_MONOTONIC + if (clock_getres(CLOCK_MONOTONIC, &ts) >= 0) + return ts.tv_sec == 0 && ts.tv_nsec <= PA_HRTIMER_THRESHOLD_USEC*1000; +#endif + + pa_assert_se(clock_getres(CLOCK_REALTIME, &ts) == 0); + return ts.tv_sec == 0 && ts.tv_nsec <= PA_HRTIMER_THRESHOLD_USEC*1000; + +#else /* HAVE_CLOCK_GETTIME */ + + return FALSE; + +#endif +} + +#define TIMER_SLACK_NS (int) ((500 * PA_NSEC_PER_USEC)) + +void pa_rtclock_hrtimer_enable(void) { +#ifdef PR_SET_TIMERSLACK + int slack_ns; + + if ((slack_ns = prctl(PR_GET_TIMERSLACK, 0, 0, 0, 0)) < 0) { + pa_log_info("PR_GET_TIMERSLACK/PR_SET_TIMERSLACK not supported."); + return; + } + + pa_log_debug("Timer slack is set to %i us.", (int) (slack_ns/PA_NSEC_PER_USEC)); + + if (slack_ns > TIMER_SLACK_NS) { + slack_ns = TIMER_SLACK_NS; + + pa_log_debug("Setting timer slack to %i us.", (int) (slack_ns/PA_NSEC_PER_USEC)); + + if (prctl(PR_SET_TIMERSLACK, slack_ns, 0, 0, 0) < 0) { + pa_log_warn("PR_SET_TIMERSLACK failed: %s", pa_cstrerror(errno)); + return; + } + } + +#endif +} + +struct timeval* pa_rtclock_from_wallclock(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(&wc_now, tv) < 0) + pa_timeval_add(&rt_now, pa_timeval_diff(tv, &wc_now)); + else + pa_timeval_sub(&rt_now, pa_timeval_diff(&wc_now, tv)); + + *tv = rt_now; +#endif + + return tv; +} + +pa_usec_t pa_timespec_load(const struct timespec *ts) { + pa_assert(ts); + + return + (pa_usec_t) ts->tv_sec * PA_USEC_PER_SEC + + (pa_usec_t) ts->tv_nsec / PA_NSEC_PER_USEC; +} diff --git a/src/pulsecore/core-rtclock.h b/src/pulsecore/core-rtclock.h new file mode 100644 index 00000000..83ff7c7c --- /dev/null +++ b/src/pulsecore/core-rtclock.h @@ -0,0 +1,45 @@ +#ifndef foopulsertclockhfoo +#define foopulsertclockhfoo + +/*** + This file is part of PulseAudio. + + Copyright 2004-2006 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + PulseAudio is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with PulseAudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include +#include + +struct timeval; + +/* Something like pulse/timeval.h but based on CLOCK_MONOTONIC */ + +struct timeval *pa_rtclock_get(struct timeval *ts); + +pa_usec_t pa_rtclock_age(const struct timeval *tv); +pa_bool_t pa_rtclock_hrtimer(void); +void pa_rtclock_hrtimer_enable(void); + +/* timer with a resolution better than this are considered high-resolution */ +#define PA_HRTIMER_THRESHOLD_USEC 10 + +struct timeval* pa_rtclock_from_wallclock(struct timeval *tv); + +pa_usec_t pa_timespec_load(const struct timespec *ts); + +#endif diff --git a/src/pulsecore/log.c b/src/pulsecore/log.c index acff981b..8c21ee6c 100644 --- a/src/pulsecore/log.c +++ b/src/pulsecore/log.c @@ -38,6 +38,7 @@ #include #endif +#include #include #include #include @@ -45,7 +46,7 @@ #include #include -#include +#include #include #include diff --git a/src/pulsecore/ratelimit.c b/src/pulsecore/ratelimit.c index f00587af..844dd77d 100644 --- a/src/pulsecore/ratelimit.c +++ b/src/pulsecore/ratelimit.c @@ -23,7 +23,8 @@ #include #endif -#include +#include + #include #include diff --git a/src/pulsecore/rtclock.c b/src/pulsecore/rtclock.c deleted file mode 100644 index 53c0258c..00000000 --- a/src/pulsecore/rtclock.c +++ /dev/null @@ -1,158 +0,0 @@ -/*** - This file is part of PulseAudio. - - Copyright 2004-2006 Lennart Poettering - Copyright 2006 Pierre Ossman for Cendio AB - - PulseAudio is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - PulseAudio is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with PulseAudio; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - USA. -***/ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include - -#ifdef HAVE_SYS_PRCTL_H -#include -#endif - -#include -#include -#include - -#include "rtclock.h" - -pa_usec_t pa_rtclock_age(const struct timeval *tv) { - struct timeval now; - pa_assert(tv); - - return pa_timeval_diff(pa_rtclock_get(&now), tv); -} - -struct timeval *pa_rtclock_get(struct timeval *tv) { -#ifdef HAVE_CLOCK_GETTIME - struct timespec ts; - -#ifdef CLOCK_MONOTONIC - /* No locking or atomic ops for no_monotonic here */ - static pa_bool_t no_monotonic = FALSE; - - if (!no_monotonic) - if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0) - no_monotonic = TRUE; - - if (no_monotonic) -#endif - pa_assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0); - - pa_assert(tv); - - tv->tv_sec = ts.tv_sec; - tv->tv_usec = ts.tv_nsec / 1000; - - return tv; - -#else /* HAVE_CLOCK_GETTIME */ - - return pa_gettimeofday(tv); - -#endif -} - -pa_bool_t pa_rtclock_hrtimer(void) { -#ifdef HAVE_CLOCK_GETTIME - struct timespec ts; - -#ifdef CLOCK_MONOTONIC - if (clock_getres(CLOCK_MONOTONIC, &ts) >= 0) - return ts.tv_sec == 0 && ts.tv_nsec <= PA_HRTIMER_THRESHOLD_USEC*1000; -#endif - - pa_assert_se(clock_getres(CLOCK_REALTIME, &ts) == 0); - return ts.tv_sec == 0 && ts.tv_nsec <= PA_HRTIMER_THRESHOLD_USEC*1000; - -#else /* HAVE_CLOCK_GETTIME */ - - return FALSE; - -#endif -} - -#define TIMER_SLACK_NS (int) ((500 * PA_NSEC_PER_USEC)) - -void pa_rtclock_hrtimer_enable(void) { -#ifdef PR_SET_TIMERSLACK - int slack_ns; - - if ((slack_ns = prctl(PR_GET_TIMERSLACK, 0, 0, 0, 0)) < 0) { - pa_log_info("PR_GET_TIMERSLACK/PR_SET_TIMERSLACK not supported."); - return; - } - - pa_log_debug("Timer slack is set to %i us.", (int) (slack_ns/PA_NSEC_PER_USEC)); - - if (slack_ns > TIMER_SLACK_NS) { - slack_ns = TIMER_SLACK_NS; - - pa_log_debug("Setting timer slack to %i us.", (int) (slack_ns/PA_NSEC_PER_USEC)); - - if (prctl(PR_SET_TIMERSLACK, slack_ns, 0, 0, 0) < 0) { - pa_log_warn("PR_SET_TIMERSLACK failed: %s", pa_cstrerror(errno)); - return; - } - } - -#endif -} - -pa_usec_t pa_rtclock_now(void) { - struct timeval tv; - - return pa_timeval_load(pa_rtclock_get(&tv)); -} - -struct timeval* pa_rtclock_from_wallclock(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(&wc_now, tv) < 0) - pa_timeval_add(&rt_now, pa_timeval_diff(tv, &wc_now)); - else - pa_timeval_sub(&rt_now, pa_timeval_diff(&wc_now, tv)); - - *tv = rt_now; -#endif - - return tv; -} - -pa_usec_t pa_timespec_load(const struct timespec *ts) { - pa_assert(ts); - - return - (pa_usec_t) ts->tv_sec * PA_USEC_PER_SEC + - (pa_usec_t) ts->tv_nsec / PA_NSEC_PER_USEC; -} diff --git a/src/pulsecore/rtclock.h b/src/pulsecore/rtclock.h deleted file mode 100644 index b8a588c0..00000000 --- a/src/pulsecore/rtclock.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef foopulsertclockhfoo -#define foopulsertclockhfoo - -/*** - This file is part of PulseAudio. - - Copyright 2004-2006 Lennart Poettering - - PulseAudio is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - PulseAudio is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with PulseAudio; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 - USA. -***/ - -#include -#include - -struct timeval; - -/* Something like pulse/timeval.h but based on CLOCK_MONOTONIC */ - -struct timeval *pa_rtclock_get(struct timeval *ts); - -pa_usec_t pa_rtclock_now(void); - -pa_usec_t pa_rtclock_age(const struct timeval *tv); -pa_bool_t pa_rtclock_hrtimer(void); -void pa_rtclock_hrtimer_enable(void); - -/* timer with a resolution better than this are considered high-resolution */ -#define PA_HRTIMER_THRESHOLD_USEC 10 - -struct timeval* pa_rtclock_from_wallclock(struct timeval *tv); - -pa_usec_t pa_timespec_load(const struct timespec *ts); - -#endif diff --git a/src/pulsecore/rtpoll.c b/src/pulsecore/rtpoll.c index 006b93f6..9401debd 100644 --- a/src/pulsecore/rtpoll.c +++ b/src/pulsecore/rtpoll.c @@ -44,7 +44,7 @@ #include #include -#include +#include #include #include #include -- cgit