diff options
Diffstat (limited to 'src/osd/modules/lib/osdlib_unix.c')
-rw-r--r-- | src/osd/modules/lib/osdlib_unix.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/osd/modules/lib/osdlib_unix.c b/src/osd/modules/lib/osdlib_unix.c index f01771dabee..cae75e08871 100644 --- a/src/osd/modules/lib/osdlib_unix.c +++ b/src/osd/modules/lib/osdlib_unix.c @@ -4,7 +4,14 @@ #include <sys/mman.h> #include <sys/types.h> #include <signal.h> +#include <time.h> +#include <sys/time.h> +#ifdef SDLMAME_EMSCRIPTEN +#include <emscripten.h> +#endif +// MAME headers +#include "osdcore.h" #include "osdlib.h" //============================================================ @@ -88,3 +95,47 @@ void osd_free(void *ptr) #error "MALLOC_DEBUG not yet supported" #endif } + +//============================================================ +// osd_cycles +//============================================================ + +osd_ticks_t osd_ticks(void) +{ +#ifdef SDLMAME_EMSCRIPTEN + return (osd_ticks_t)(emscripten_get_now() * 1000.0); +#else + struct timeval tp; + static osd_ticks_t start_sec = 0; + + gettimeofday(&tp, NULL); + if (start_sec==0) + start_sec = tp.tv_sec; + return (tp.tv_sec - start_sec) * (osd_ticks_t) 1000000 + tp.tv_usec; +#endif +} + +osd_ticks_t osd_ticks_per_second(void) +{ + return (osd_ticks_t) 1000000; +} + +//============================================================ +// osd_sleep +//============================================================ + +void osd_sleep(osd_ticks_t duration) +{ + UINT32 msec; + + // convert to milliseconds, rounding down + msec = (UINT32)(duration * 1000 / osd_ticks_per_second()); + + // only sleep if at least 2 full milliseconds + if (msec >= 2) + { + // take a couple of msecs off the top for good measure + msec -= 2; + usleep(msec*1000); + } +} |