void client_main_loop (void) { int quit = 0; int engine_updated = 0; /* Set up the game */ reset_start_time (); update_avail_modules (0); screen_full_refresh (); if (no_init_help == 0) { block_help_exit = 1; help_flag = 1; if (make_dir_ok_flag) { activate_help ("ask-dir.hlp"); make_dir_ok_flag = 0; } else { activate_help ("opening.hlp"); } } /* Set speed */ #if defined (CS_PROFILE) || defined (START_FAST_SPEED) select_fast (); #else select_medium (); #endif /* Main Loop */ do { int key; /* Get timestamp for this iteration */ get_real_time(); /* Process events */ #if defined (LC_X11) call_event (); key = x_key_value; x_key_value = 0; #elif defined (WIN32) call_event (); key = GetKeystroke (); #else mouse_update (); key = vga_getkey (); #endif /* nothing happened if key == 0 XXX: right? */ /* GCS: I'm not sure */ if (key != 0) { process_keystrokes (key); } /* Simulate the timestep */ quit = execute_timestep (); } while (quit == 0); }
int main (int argc, char *argv[]) { char* load_filename; /* Initialize some global variables */ initialize_server (); /* Set up the paths to certain files and directories */ init_path_strings (); #ifndef CS_PROFILE #ifdef SEED_RAND srand (time (0)); #endif #endif init_types (); initialize_tax_rates (); reset_start_time (); load_filename = parse_server_args (argc, argv); if (load_filename && file_exists(load_filename)) { printf ("Server is trying to load: %s\n", load_filename); load_city (load_filename); zoom_originx = main_screen_originx; zoom_originy = main_screen_originy; } else { engine_new_city (&zoom_originx, &zoom_originy, 1); } printf ("Server starting main loop!\n"); while (1) { sniff_packets (); engine_do_time_step (); get_real_time (); send_periodic_messages (); if (total_time % 1000 == 0) { debug_print_stats (); } } return 0; }
void initLincity() { initLCengine(); reset_start_time (); screen_full_refresh (); //load current game if it exists //ldsvguts.cpp load_saved_city (char *s) //does not work if file is missing... char* s = "9_currentGameNG.scn"; char *cname = (char *) malloc (strlen (lc_save_dir) + strlen (s) + 2); sprintf (cname, "%s%c%s", lc_save_dir, PATH_SLASH, s); if( ! loadCityNG( std::string( cname ) ) ) { //create a new City with village just in case new_city( &main_screen_originx, &main_screen_originy, 1 ); } free (cname); }
/* intercept the bus messages from our children. We watch for the ASYNC_START * message with is posted by the elements (sinks) that require a reset of the * running_time after a flush. ASYNC_START also brings the pipeline back into * the PAUSED, pending PAUSED state. When the ASYNC_DONE message is received the * pipeline will redistribute the new base_time and will bring the elements back * to the desired state of the pipeline. */ static void gst_pipeline_handle_message (GstBin * bin, GstMessage * message) { GstPipeline *pipeline = GST_PIPELINE_CAST (bin); switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_RESET_TIME: { GstClockTime running_time; gst_message_parse_reset_time (message, &running_time); /* reset our running time if we need to distribute a new base_time to the * children. */ reset_start_time (pipeline, running_time); break; } case GST_MESSAGE_CLOCK_LOST: { GstClock *clock; gst_message_parse_clock_lost (message, &clock); GST_OBJECT_LOCK (bin); if (clock == GST_ELEMENT_CAST (bin)->clock) { GST_DEBUG_OBJECT (bin, "Used clock '%s' got lost", GST_OBJECT_NAME (clock)); pipeline->priv->update_clock = TRUE; } GST_OBJECT_UNLOCK (bin); } default: break; } GST_BIN_CLASS (parent_class)->handle_message (bin, message); }
/* MT safe */ static GstStateChangeReturn gst_pipeline_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn result = GST_STATE_CHANGE_SUCCESS; GstPipeline *pipeline = GST_PIPELINE_CAST (element); GstClock *clock; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: GST_OBJECT_LOCK (element); if (element->bus) gst_bus_set_flushing (element->bus, FALSE); GST_OBJECT_UNLOCK (element); break; case GST_STATE_CHANGE_READY_TO_PAUSED: GST_OBJECT_LOCK (element); pipeline->priv->update_clock = TRUE; GST_OBJECT_UNLOCK (element); /* READY to PAUSED starts running_time from 0 */ reset_start_time (pipeline, 0); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: { GstClockTime now, start_time, last_start_time, delay; gboolean update_clock; GstClock *cur_clock; GST_DEBUG_OBJECT (element, "selecting clock and base_time"); GST_OBJECT_LOCK (element); cur_clock = element->clock; if (cur_clock) gst_object_ref (cur_clock); /* get the desired running_time of the first buffer aka the start_time */ start_time = GST_ELEMENT_START_TIME (pipeline); last_start_time = pipeline->priv->last_start_time; pipeline->priv->last_start_time = start_time; /* see if we need to update the clock */ update_clock = pipeline->priv->update_clock; pipeline->priv->update_clock = FALSE; delay = pipeline->delay; GST_OBJECT_UNLOCK (element); /* running time changed, either with a PAUSED or a flush, we need to check * if there is a new clock & update the base time */ /* only do this for top-level, however */ if (GST_OBJECT_PARENT (element) == NULL && (update_clock || last_start_time != start_time)) { GST_DEBUG_OBJECT (pipeline, "Need to update start_time"); /* when going to PLAYING, select a clock when needed. If we just got * flushed, we don't reselect the clock. */ if (update_clock) { GST_DEBUG_OBJECT (pipeline, "Need to update clock."); clock = gst_element_provide_clock (element); } else { GST_DEBUG_OBJECT (pipeline, "Don't need to update clock, using old clock."); /* only try to ref if cur_clock is not NULL */ if (cur_clock) gst_object_ref (cur_clock); clock = cur_clock; } if (clock) { now = gst_clock_get_time (clock); } else { GST_DEBUG_OBJECT (pipeline, "no clock, using base time of NONE"); now = GST_CLOCK_TIME_NONE; } if (clock != cur_clock) { /* now distribute the clock (which could be NULL). If some * element refuses the clock, this will return FALSE and * we effectively fail the state change. */ if (!gst_element_set_clock (element, clock)) goto invalid_clock; /* if we selected and distributed a new clock, let the app * know about it */ gst_element_post_message (element, gst_message_new_new_clock (GST_OBJECT_CAST (element), clock)); } if (clock) gst_object_unref (clock); if (start_time != GST_CLOCK_TIME_NONE && now != GST_CLOCK_TIME_NONE) { GstClockTime new_base_time = now - start_time + delay; GST_DEBUG_OBJECT (element, "start_time=%" GST_TIME_FORMAT ", now=%" GST_TIME_FORMAT ", base_time %" GST_TIME_FORMAT, GST_TIME_ARGS (start_time), GST_TIME_ARGS (now), GST_TIME_ARGS (new_base_time)); gst_element_set_base_time (element, new_base_time); } else { GST_DEBUG_OBJECT (pipeline, "NOT adjusting base_time because start_time is NONE"); } } else { GST_DEBUG_OBJECT (pipeline, "NOT adjusting base_time because we selected one before"); } if (cur_clock) gst_object_unref (cur_clock); break; } case GST_STATE_CHANGE_PLAYING_TO_PAUSED: { /* we take a start_time snapshot before calling the children state changes * so that they know about when the pipeline PAUSED. */ pipeline_update_start_time (element); break; } case GST_STATE_CHANGE_PAUSED_TO_READY: reset_start_time (pipeline, 0); break; case GST_STATE_CHANGE_READY_TO_NULL: break; } result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; case GST_STATE_CHANGE_PLAYING_TO_PAUSED: { /* Take a new snapshot of the start_time after calling the state change on * all children. This will be the running_time of the pipeline when we go * back to PLAYING */ pipeline_update_start_time (element); break; } case GST_STATE_CHANGE_PAUSED_TO_READY: break; case GST_STATE_CHANGE_READY_TO_NULL: { GstBus *bus; gboolean auto_flush; /* grab some stuff before we release the lock to flush out the bus */ GST_OBJECT_LOCK (element); if ((bus = element->bus)) gst_object_ref (bus); auto_flush = pipeline->priv->auto_flush_bus; GST_OBJECT_UNLOCK (element); if (bus) { if (auto_flush) { gst_bus_set_flushing (bus, TRUE); } else { GST_INFO_OBJECT (element, "not flushing bus, auto-flushing disabled"); } gst_object_unref (bus); } break; } } return result; /* ERRORS */ invalid_clock: { /* we generate this error when the selected clock was not * accepted by some element */ GST_ELEMENT_ERROR (pipeline, CORE, CLOCK, (_("Selected clock cannot be used in pipeline.")), ("Pipeline cannot operate with selected clock")); GST_DEBUG_OBJECT (pipeline, "Pipeline cannot operate with selected clock %p", clock); if (clock) gst_object_unref (clock); return GST_STATE_CHANGE_FAILURE; } }