diff --git a/common/JackTime.h b/common/JackTime.h index 165175fd..1fce0aa6 100644 --- a/common/JackTime.h +++ b/common/JackTime.h @@ -33,18 +33,20 @@ extern "C" #if defined(__APPLE__) #include - #include +#include extern double __jack_time_ratio; - static inline jack_time_t GetMicroSeconds(void) { + static inline jack_time_t GetMicroSeconds(void) + { return (jack_time_t) (mach_absolute_time () * __jack_time_ratio); } /* This should only be called ONCE per process. */ extern void InitTime(); - static inline void JackSleep(long usec) { + static inline void JackSleep(long usec) + { usleep(usec); } @@ -58,7 +60,8 @@ extern "C" extern void InitTime(); - static void JackSleep(long usec) { + static void JackSleep(long usec) + { Sleep(usec / 1000); } @@ -68,7 +71,8 @@ extern "C" #include - static inline void JackSleep(long usec) { + static inline void JackSleep(long usec) + { usleep(usec); } @@ -77,13 +81,15 @@ extern "C" extern jack_time_t __jack_cpu_mhz; extern jack_time_t GetMhz(); extern void InitTime(); - static inline jack_time_t GetMicroSeconds (void) { + static inline jack_time_t GetMicroSeconds(void) + { return get_cycles() / __jack_cpu_mhz; } #else #include extern void InitTime(); - static inline jack_time_t GetMicroSeconds (void) { + static inline jack_time_t GetMicroSeconds(void) + { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return (jack_time_t)ts.tv_sec * 1000000 + ts.tv_nsec / 1000; diff --git a/common/timestamps.c b/common/timestamps.c new file mode 100644 index 00000000..7a48e8a9 --- /dev/null +++ b/common/timestamps.c @@ -0,0 +1,79 @@ +/* + Copyright (C) 2002-2003 Paul Davis + + This program 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. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#include +#include +#include "timestamps.h" +#include "JackTime.h" + +typedef struct { + jack_time_t when; + const char *what; +} jack_timestamp_t; + +static jack_timestamp_t *timestamps = 0; +static unsigned long timestamp_cnt = 0; +static unsigned long timestamp_index; + +void +jack_init_timestamps (unsigned long howmany) +{ + if (timestamps) { + free (timestamps); + } + timestamps = (jack_timestamp_t *) + malloc (howmany * sizeof(jack_timestamp_t)); + timestamp_cnt = howmany; + memset (timestamps, 0, sizeof(jack_timestamp_t) * howmany); + timestamp_index = 0; +} + +void +jack_timestamp (const char *what) +{ + if (timestamp_index < timestamp_cnt) { + timestamps[timestamp_index].when = GetMicroSeconds(); + timestamps[timestamp_index].what = what; + ++timestamp_index; + } +} + +void +jack_dump_timestamps (FILE *out) +{ + unsigned long i; + + for (i = 0; i < timestamp_index; ++i) { + fprintf (out, "%-.32s %" PRIu64 " %" PRIu64, + timestamps[i].what, timestamps[i].when, + timestamps[i].when - timestamps[0].when); + if (i > 0) { + fprintf (out, " %" PRIu64, + timestamps[i].when - timestamps[i-1].when); + } + fputc ('\n', out); + } +} + +void +jack_reset_timestamps () +{ + timestamp_index = 0; +} + diff --git a/common/timestamps.h b/common/timestamps.h new file mode 100644 index 00000000..cbef55f0 --- /dev/null +++ b/common/timestamps.h @@ -0,0 +1,40 @@ +/* + Copyright (C) 2002 Paul Davis + + This program 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. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ + +#ifndef __jack_timestamps_h__ +#define __jack_timestamps_h__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +void jack_init_timestamps (unsigned long howmany); +void jack_timestamp (const char *what); +void jack_dump_timestamps (FILE *out); +void jack_reset_timestamps (); + +#ifdef __cplusplus +} +#endif + +#endif /* __jack_timestamps_h__ */ + +