void mame_timer_set_global_time(mame_time newbase) { mame_timer *timer; /* set the new global offset */ global_basetime = newbase; LOG(("mame_timer_set_global_time: new=%.9f head->expire=%.9f\n", mame_time_to_double(newbase), mame_time_to_double(timer_head->expire))); /* now process any timers that are overdue */ while (compare_mame_times(timer_head->expire, global_basetime) <= 0) { int was_enabled = timer_head->enabled; /* if this is a one-shot timer, disable it now */ timer = timer_head; if (compare_mame_times(timer->period, time_zero) == 0 || compare_mame_times(timer->period, time_never) == 0) timer->enabled = 0; /* set the global state of which callback we're in */ callback_timer_modified = 0; callback_timer = timer; callback_timer_expire_time = timer->expire; /* call the callback */ if (was_enabled && timer->callback) { LOG(("Timer %s:%d fired (expire=%.9f)\n", timer->file, timer->line, mame_time_to_double(timer->expire))); profiler_mark(PROFILER_TIMER_CALLBACK); (*timer->callback)(timer->callback_param); profiler_mark(PROFILER_END); } /* clear the callback timer global */ callback_timer = NULL; /* reset or remove the timer, but only if it wasn't modified during the callback */ if (!callback_timer_modified) { /* if the timer is temporary, remove it now */ if (timer->temporary) timer_remove(timer); /* otherwise, reschedule it */ else { timer->start = timer->expire; timer->expire = add_mame_times(timer->expire, timer->period); timer_list_remove(timer); timer_list_insert(timer); } } } }
void mame_timer_adjust(mame_timer *which, mame_time duration, int param, mame_time period) { mame_time time = get_current_time(); /* error if this is an inactive timer */ if (which->tag == -1) { printf("mame_timer_adjust: adjusting an inactive timer!\n"); logerror("mame_timer_adjust: adjusting an inactive timer!\n"); return; } /* if this is the callback timer, mark it modified */ if (which == callback_timer) callback_timer_modified = 1; /* compute the time of the next firing and insert into the list */ which->callback_param = param; which->enabled = 1; /* set the start and expire times */ which->start = time; which->expire = add_mame_times(time, duration); which->period = period; /* remove and re-insert the timer in its new order */ timer_list_remove(which); timer_list_insert(which); /* if this was inserted as the head, abort the current timeslice and resync */ LOG(("timer_adjust %s:%d to expire @ %.9f\n", which->file, which->line, mame_time_to_double(which->expire))); if (which == timer_head && cpu_getexecutingcpu() >= 0) activecpu_abort_timeslice(); }
int sound_scalebufferpos(int value) { mame_time elapsed = mame_timer_timeelapsed(sound_update_timer); int result; /* clamp to protect against negative time */ if (elapsed.seconds < 0) elapsed = time_zero; result = (int)((double)value * mame_time_to_double(elapsed) * Machine->screen[0].refresh); if (value >= 0) return (result < value) ? result : value; else return (result > value) ? result : value; }
static void node_wait(xml_data_node *node) { xml_attribute_node *attr_node; attr_node = xml_get_attribute(node, "time"); if (!attr_node) { error_missingattribute("time"); return; } memset(&new_command, 0, sizeof(new_command)); new_command.command_type = MESSTEST_COMMAND_WAIT; new_command.u.wait_time = mame_time_to_double(parse_time(attr_node->value)); if (!append_command()) { error_outofmemory(); return; } }