static void network_test_delay(void) { int i, j; BYTE new_frame_delta; BYTE buf[0x60]; long packet_delay[NUM_OF_TESTPACKETS]; char st[256]; vsyncarch_init(); ui_display_statustext(translate_text(IDGS_TESTING_BEST_FRAME_DELAY), 0); if (network_mode == NETWORK_SERVER_CONNECTED) { for (i = 0; i < NUM_OF_TESTPACKETS; i++) { *((unsigned long*)buf) = vsyncarch_gettime(); if (network_send_buffer(network_socket, buf, sizeof(buf)) < 0 || network_recv_buffer(network_socket, buf, sizeof(buf)) < 0) return; packet_delay[i] = vsyncarch_gettime() - *((unsigned long*)buf); } /* Sort the packets delays*/ for (i = 0; i < NUM_OF_TESTPACKETS - 1; i++) { for (j = i + 1; j < NUM_OF_TESTPACKETS; j++) { if (packet_delay[i] < packet_delay[j]) { long d = packet_delay[i]; packet_delay[i] = packet_delay[j]; packet_delay[j] = d; } } #ifdef NETWORK_DEBUG log_debug("packet_delay[%d]=%ld",i,packet_delay[i]); #endif } #ifdef NETWORK_DEBUG log_debug("vsyncarch_frequency = %ld", vsyncarch_frequency()); #endif /* calculate delay with 90% of packets beeing fast enough */ /* FIXME: This needs some further investigation */ new_frame_delta = 5 + (BYTE)(vsync_get_refresh_frequency() * packet_delay[(int)(0.1 * NUM_OF_TESTPACKETS)] / (float)vsyncarch_frequency()); network_send_buffer(network_socket, &new_frame_delta, sizeof(new_frame_delta)); } else { /* network_mode == NETWORK_CLIENT */ for (i = 0; i < NUM_OF_TESTPACKETS; i++) { if (network_recv_buffer(network_socket, buf, sizeof(buf)) < 0 || network_send_buffer(network_socket, buf, sizeof(buf)) < 0) return; } network_recv_buffer(network_socket, &new_frame_delta, sizeof(new_frame_delta)); } network_free_frame_event_list(); frame_delta = new_frame_delta; network_init_frame_event_list(); sprintf(st, translate_text(IDGS_USING_D_FRAMES_DELAY), frame_delta); log_debug("netplay connected with %d frames delta.", frame_delta); ui_display_statustext(st, 1); }
void vsync_init(void (*hook)(void)) { vsync_hook = hook; vsync_suspend_speed_eval(); clk_guard_add_callback(maincpu_clk_guard, clk_overflow_callback, NULL); vsyncarch_init(); vsyncarch_freq = vsyncarch_frequency(); }