diff options
Diffstat (limited to 'src/polyp')
-rw-r--r-- | src/polyp/glib12-mainloop.c | 1 | ||||
-rw-r--r-- | src/polyp/mainloop.c | 1 | ||||
-rw-r--r-- | src/polyp/polypaudio.h | 4 | ||||
-rw-r--r-- | src/polyp/timeval.c | 142 | ||||
-rw-r--r-- | src/polyp/timeval.h | 53 | ||||
-rw-r--r-- | src/polyp/util.c | 136 | ||||
-rw-r--r-- | src/polyp/util.h | 22 |
7 files changed, 213 insertions, 146 deletions
diff --git a/src/polyp/glib12-mainloop.c b/src/polyp/glib12-mainloop.c index f7459f19..dfd6ff2f 100644 --- a/src/polyp/glib12-mainloop.c +++ b/src/polyp/glib12-mainloop.c @@ -25,6 +25,7 @@ #include <assert.h> +#include <polyp/timeval.h> #include <polyp/xmalloc.h> #include <polypcore/idxset.h> diff --git a/src/polyp/mainloop.c b/src/polyp/mainloop.c index 8f44c180..6b5b3b25 100644 --- a/src/polyp/mainloop.c +++ b/src/polyp/mainloop.c @@ -44,6 +44,7 @@ #include "../polypcore/pipe.h" #endif +#include <polyp/timeval.h> #include <polyp/xmalloc.h> #include <polypcore/core-util.h> diff --git a/src/polyp/polypaudio.h b/src/polyp/polypaudio.h index 51e3f970..c172315b 100644 --- a/src/polyp/polypaudio.h +++ b/src/polyp/polypaudio.h @@ -41,6 +41,7 @@ #include <polyp/mainloop.h> #include <polyp/mainloop-signal.h> #include <polyp/util.h> +#include <polyp/timeval.h> /** \file * Include all polyplib header files at once. The following @@ -48,7 +49,8 @@ * \ref context.h, \ref stream.h, \ref introspect.h, \ref subscribe.h, * \ref scache.h, \ref version.h, \ref error.h, \ref channelmap.h, * \ref operation.h,\ref volume.h, \ref xmalloc.h, \ref utf8.h, \ref - * thread-mainloop.h, \ref mainloop.h, \ref util.h and \ref mainloop-signal.h at once */ + * thread-mainloop.h, \ref mainloop.h, \ref util.h, \ref timeval.h and + * \ref mainloop-signal.h at once */ /** \mainpage * diff --git a/src/polyp/timeval.c b/src/polyp/timeval.c new file mode 100644 index 00000000..6043d7fd --- /dev/null +++ b/src/polyp/timeval.c @@ -0,0 +1,142 @@ +/* $Id$ */ + +/*** + This file is part of polypaudio. + + polypaudio 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. + + polypaudio 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 polypaudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <assert.h> +#include <stddef.h> +#include <sys/time.h> + +#ifdef HAVE_WINDOWS_H +#include <windows.h> +#endif + +#include "../polypcore/winsock.h" + +#include "timeval.h" + +struct timeval *pa_gettimeofday(struct timeval *tv) { +#ifdef HAVE_GETTIMEOFDAY + assert(tv); + + return gettimeofday(tv, NULL) < 0 ? NULL : tv; +#elif defined(OS_IS_WIN32) + /* + * Copied from implementation by Steven Edwards (LGPL). + * Found on wine mailing list. + */ + +#if defined(_MSC_VER) || defined(__BORLANDC__) +#define EPOCHFILETIME (116444736000000000i64) +#else +#define EPOCHFILETIME (116444736000000000LL) +#endif + + FILETIME ft; + LARGE_INTEGER li; + __int64 t; + + assert(tv); + + GetSystemTimeAsFileTime(&ft); + li.LowPart = ft.dwLowDateTime; + li.HighPart = ft.dwHighDateTime; + t = li.QuadPart; /* In 100-nanosecond intervals */ + t -= EPOCHFILETIME; /* Offset to the Epoch time */ + t /= 10; /* In microseconds */ + tv->tv_sec = (long)(t / 1000000); + tv->tv_usec = (long)(t % 1000000); + + return tv; +#else +#error "Platform lacks gettimeofday() or equivalent function." +#endif +} + +pa_usec_t pa_timeval_diff(const struct timeval *a, const struct timeval *b) { + pa_usec_t r; + assert(a && b); + + /* Check which whan is the earlier time and swap the two arguments if reuqired. */ + if (pa_timeval_cmp(a, b) < 0) { + const struct timeval *c; + c = a; + a = b; + b = c; + } + + /* Calculate the second difference*/ + r = ((pa_usec_t) a->tv_sec - b->tv_sec)* 1000000; + + /* Calculate the microsecond difference */ + if (a->tv_usec > b->tv_usec) + r += ((pa_usec_t) a->tv_usec - b->tv_usec); + else if (a->tv_usec < b->tv_usec) + r -= ((pa_usec_t) b->tv_usec - a->tv_usec); + + return r; +} + +int pa_timeval_cmp(const struct timeval *a, const struct timeval *b) { + assert(a && b); + + if (a->tv_sec < b->tv_sec) + return -1; + + if (a->tv_sec > b->tv_sec) + return 1; + + if (a->tv_usec < b->tv_usec) + return -1; + + if (a->tv_usec > b->tv_usec) + return 1; + + return 0; +} + +pa_usec_t pa_timeval_age(const struct timeval *tv) { + struct timeval now; + assert(tv); + + return pa_timeval_diff(pa_gettimeofday(&now), tv); +} + +struct timeval* pa_timeval_add(struct timeval *tv, pa_usec_t v) { + unsigned long secs; + assert(tv); + + secs = (v/1000000); + tv->tv_sec += (unsigned long) secs; + v -= secs*1000000; + + tv->tv_usec += v; + + /* Normalize */ + while (tv->tv_usec >= 1000000) { + tv->tv_sec++; + tv->tv_usec -= 1000000; + } + + return tv; +} diff --git a/src/polyp/timeval.h b/src/polyp/timeval.h new file mode 100644 index 00000000..9990d4ca --- /dev/null +++ b/src/polyp/timeval.h @@ -0,0 +1,53 @@ +#ifndef footimevalhfoo +#define footimevalhfoo + +/* $Id$ */ + +/*** + This file is part of polypaudio. + + polypaudio 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. + + polypaudio 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 polypaudio; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + +#include <polyp/cdecl.h> +#include <polyp/sample.h> + +/** \file + * Utility functions for handling timeval calculations */ + +PA_C_DECL_BEGIN + +struct timeval; + +/** Return the current timestamp, just like UNIX gettimeofday() */ +struct timeval *pa_gettimeofday(struct timeval *tv); + +/** Calculate the difference between the two specified timeval + * structs. */ +pa_usec_t pa_timeval_diff(const struct timeval *a, const struct timeval *b); + +/** Compare the two timeval structs and return 0 when equal, negative when a < b, positive otherwse */ +int pa_timeval_cmp(const struct timeval *a, const struct timeval *b); + +/** Return the time difference between now and the specified timestamp */ +pa_usec_t pa_timeval_age(const struct timeval *tv); + +/** Add the specified time inmicroseconds to the specified timeval structure */ +struct timeval* pa_timeval_add(struct timeval *tv, pa_usec_t v); + +PA_C_DECL_END + +#endif diff --git a/src/polyp/util.c b/src/polyp/util.c index 76b5c9b9..dcebff59 100644 --- a/src/polyp/util.c +++ b/src/polyp/util.c @@ -23,39 +23,33 @@ #include <config.h> #endif -#include <stdarg.h> -#include <stdlib.h> -#include <signal.h> -#include <errno.h> #include <assert.h> -#include <string.h> +#include <errno.h> #include <stdio.h> -#include <fcntl.h> -#include <unistd.h> -#include <limits.h> +#include <stdlib.h> +#include <string.h> #include <time.h> -#include <ctype.h> +#include <unistd.h> #include <sys/types.h> -#include <sys/stat.h> -#include <sys/time.h> - -#ifdef HAVE_NETDB_H -#include <netdb.h> -#endif #ifdef HAVE_PWD_H #include <pwd.h> #endif -#ifdef HAVE_GRP_H -#include <grp.h> +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif + +#ifdef HAVE_NETDB_H +#include <netdb.h> #endif #ifdef HAVE_WINDOWS_H #include <windows.h> #endif -#include <polyp/xmalloc.h> +#include "../polypcore/winsock.h" + #include <polypcore/log.h> #include <polypcore/core-util.h> @@ -154,112 +148,6 @@ char *pa_get_home_dir(char *s, size_t l) { #endif } -struct timeval *pa_gettimeofday(struct timeval *tv) { -#ifdef HAVE_GETTIMEOFDAY - assert(tv); - - return gettimeofday(tv, NULL) < 0 ? NULL : tv; -#elif defined(OS_IS_WIN32) - /* - * Copied from implementation by Steven Edwards (LGPL). - * Found on wine mailing list. - */ - -#if defined(_MSC_VER) || defined(__BORLANDC__) -#define EPOCHFILETIME (116444736000000000i64) -#else -#define EPOCHFILETIME (116444736000000000LL) -#endif - - FILETIME ft; - LARGE_INTEGER li; - __int64 t; - - assert(tv); - - GetSystemTimeAsFileTime(&ft); - li.LowPart = ft.dwLowDateTime; - li.HighPart = ft.dwHighDateTime; - t = li.QuadPart; /* In 100-nanosecond intervals */ - t -= EPOCHFILETIME; /* Offset to the Epoch time */ - t /= 10; /* In microseconds */ - tv->tv_sec = (long)(t / 1000000); - tv->tv_usec = (long)(t % 1000000); - - return tv; -#else -#error "Platform lacks gettimeofday() or equivalent function." -#endif -} - -pa_usec_t pa_timeval_diff(const struct timeval *a, const struct timeval *b) { - pa_usec_t r; - assert(a && b); - - /* Check which whan is the earlier time and swap the two arguments if reuqired. */ - if (pa_timeval_cmp(a, b) < 0) { - const struct timeval *c; - c = a; - a = b; - b = c; - } - - /* Calculate the second difference*/ - r = ((pa_usec_t) a->tv_sec - b->tv_sec)* 1000000; - - /* Calculate the microsecond difference */ - if (a->tv_usec > b->tv_usec) - r += ((pa_usec_t) a->tv_usec - b->tv_usec); - else if (a->tv_usec < b->tv_usec) - r -= ((pa_usec_t) b->tv_usec - a->tv_usec); - - return r; -} - -int pa_timeval_cmp(const struct timeval *a, const struct timeval *b) { - assert(a && b); - - if (a->tv_sec < b->tv_sec) - return -1; - - if (a->tv_sec > b->tv_sec) - return 1; - - if (a->tv_usec < b->tv_usec) - return -1; - - if (a->tv_usec > b->tv_usec) - return 1; - - return 0; -} - -pa_usec_t pa_timeval_age(const struct timeval *tv) { - struct timeval now; - assert(tv); - - return pa_timeval_diff(pa_gettimeofday(&now), tv); -} - -struct timeval* pa_timeval_add(struct timeval *tv, pa_usec_t v) { - unsigned long secs; - assert(tv); - - secs = (v/1000000); - tv->tv_sec += (unsigned long) secs; - v -= secs*1000000; - - tv->tv_usec += v; - - /* Normalize */ - while (tv->tv_usec >= 1000000) { - tv->tv_sec++; - tv->tv_usec -= 1000000; - } - - return tv; -} - char *pa_get_binary_name(char *s, size_t l) { #ifdef HAVE_READLINK diff --git a/src/polyp/util.h b/src/polyp/util.h index 8bd03f98..cd8aab0b 100644 --- a/src/polyp/util.h +++ b/src/polyp/util.h @@ -22,10 +22,8 @@ USA. ***/ -#include <sys/types.h> -#include <inttypes.h> +#include <stddef.h> -#include <polyp/sample.h> #include <polyp/cdecl.h> /** \file @@ -33,8 +31,6 @@ PA_C_DECL_BEGIN -struct timeval; - /** Return the current username in the specified string buffer. */ char *pa_get_user_name(char *s, size_t l); @@ -55,22 +51,6 @@ char *pa_get_binary_name(char *s, size_t l); * component). */ const char *pa_path_get_filename(const char *p); -/** Return the current timestamp, just like UNIX gettimeofday() */ -struct timeval *pa_gettimeofday(struct timeval *tv); - -/** Calculate the difference between the two specified timeval - * structs. */ -pa_usec_t pa_timeval_diff(const struct timeval *a, const struct timeval *b); - -/** Compare the two timeval structs and return 0 when equal, negative when a < b, positive otherwse */ -int pa_timeval_cmp(const struct timeval *a, const struct timeval *b); - -/** Return the time difference between now and the specified timestamp */ -pa_usec_t pa_timeval_age(const struct timeval *tv); - -/** Add the specified time inmicroseconds to the specified timeval structure */ -struct timeval* pa_timeval_add(struct timeval *tv, pa_usec_t v); - /** Wait t milliseconds */ int pa_msleep(unsigned long t); |