diff --git a/src/tempo.c b/src/tempo.c index 5c040a4..917694e 100644 --- a/src/tempo.c +++ b/src/tempo.c @@ -7,7 +7,13 @@ #include "config.h" #include "tempo.h" -static long now_ms() { return 1000 * clock() / CLOCKS_PER_SEC; } +static long now_ms() { + struct timespec ts; + if (clock_gettime(CLOCK_REALTIME, &ts) != 0) { + return 0; + } + return 1000 * ts.tv_sec + ts.tv_nsec / 1e6; +} static void reset_tap_chain(Tempo *tempo, long t) { tempo->last_reset = t; diff --git a/src/timer.c b/src/timer.c index e664f30..5b28c89 100644 --- a/src/timer.c +++ b/src/timer.c @@ -1,3 +1,4 @@ +#include #include #include @@ -8,7 +9,7 @@ void timer_init(Timer *timer, const unsigned int target) { timer->counter = 0; timer->target = target; - timer->start = clock(); + clock_gettime(CLOCK_REALTIME, &timer->start); } bool timer_inc(Timer *timer) { @@ -17,13 +18,16 @@ bool timer_inc(Timer *timer) { } double timer_reset(Timer *timer) { - clock_t stop; + struct timespec stop; double secs; double per_secs; - stop = clock(); + if (clock_gettime(CLOCK_REALTIME, &stop) != 0) { + return 0.0; + } - secs = (double)(stop - timer->start) / CLOCKS_PER_SEC; + secs = (double)(stop.tv_sec - timer->start.tv_sec) + + (double)(stop.tv_nsec - timer->start.tv_nsec) / 1e9; per_secs = (double)timer->counter / secs; timer->start = stop; diff --git a/src/types.h b/src/types.h index 892bb9c..45025ea 100644 --- a/src/types.h +++ b/src/types.h @@ -280,7 +280,7 @@ typedef struct StateBackgroundWriteArgs { // timer.c typedef struct Timer { - clock_t start; + struct timespec start; unsigned int counter; unsigned int target; } Timer;