diff options
Diffstat (limited to 'src/osd/modules/lib/osdlib_macosx.c')
-rw-r--r-- | src/osd/modules/lib/osdlib_macosx.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/src/osd/modules/lib/osdlib_macosx.c b/src/osd/modules/lib/osdlib_macosx.c index 7aab9eaf78c..4f3b5bd3548 100644 --- a/src/osd/modules/lib/osdlib_macosx.c +++ b/src/osd/modules/lib/osdlib_macosx.c @@ -6,11 +6,17 @@ #include <mach/mach.h> #include <mach/mach_time.h> +#include <mach/mach_traps.h> #include <Carbon/Carbon.h> // MAME headers +#include "osdcore.h" #include "osdlib.h" +// FIXME: We shouldn't use SDL functions in here + +#include "sdlinc.h" + //============================================================ // osd_process_kill //============================================================ @@ -102,3 +108,121 @@ int osd_setenv(const char *name, const char *value, int overwrite) { return setenv(name, value, overwrite); } + +//============================================================ +// PROTOTYPES +//============================================================ + +static osd_ticks_t init_cycle_counter(void); +static osd_ticks_t mach_cycle_counter(void); + +//============================================================ +// STATIC VARIABLES +//============================================================ + +static osd_ticks_t (*cycle_counter)(void) = init_cycle_counter; +static osd_ticks_t (*ticks_counter)(void) = init_cycle_counter; +static osd_ticks_t ticks_per_second; + +//============================================================ +// init_cycle_counter +// +// to avoid total grossness, this function is split by subarch +//============================================================ + +static osd_ticks_t init_cycle_counter(void) +{ + osd_ticks_t start, end; + osd_ticks_t a, b; + + cycle_counter = mach_cycle_counter; + ticks_counter = mach_cycle_counter; + + // wait for an edge on the timeGetTime call + a = SDL_GetTicks(); + do + { + b = SDL_GetTicks(); + } while (a == b); + + // get the starting cycle count + start = (*cycle_counter)(); + + // now wait for 1/4 second total + do + { + a = SDL_GetTicks(); + } while (a - b < 250); + + // get the ending cycle count + end = (*cycle_counter)(); + + // compute ticks_per_sec + ticks_per_second = (end - start) * 4; + + // return the current cycle count + return (*cycle_counter)(); +} + +//============================================================ +// performance_cycle_counter +//============================================================ + +//============================================================ +// mach_cycle_counter +//============================================================ +static osd_ticks_t mach_cycle_counter(void) +{ + return mach_absolute_time(); +} + +//============================================================ +// osd_cycles +//============================================================ + +osd_ticks_t osd_ticks(void) +{ + return (*cycle_counter)(); +} + + +//============================================================ +// osd_ticks_per_second +//============================================================ + +osd_ticks_t osd_ticks_per_second(void) +{ + if (ticks_per_second == 0) + { + // if we haven't computed the value yet, there's no time like the present + init_cycle_counter(); + } + return ticks_per_second; +} + + + +//============================================================ +// osd_sleep +//============================================================ + +void osd_sleep(osd_ticks_t duration) +{ + UINT32 msec; + + // make sure we've computed ticks_per_second + if (ticks_per_second == 0) + (void)osd_ticks(); + + // convert to milliseconds, rounding down + msec = (UINT32)(duration * 1000 / 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); + } +} + |