static bool cmd_set_shader(const char *arg) { if (!driver.video->set_shader) return false; enum rarch_shader_type type = RARCH_SHADER_NONE; const char *ext = path_get_extension(arg); if (strcmp(ext, "glsl") == 0 || strcmp(ext, "glslp") == 0) type = RARCH_SHADER_GLSL; else if (strcmp(ext, "cg") == 0 || strcmp(ext, "cgp") == 0) type = RARCH_SHADER_CG; if (type == RARCH_SHADER_NONE) return false; msg_queue_clear(g_extern.msg_queue); char msg[PATH_MAX]; snprintf(msg, sizeof(msg), "Shader: \"%s\"", arg); msg_queue_push(g_extern.msg_queue, msg, 1, 120); RARCH_LOG("Applying shader \"%s\".\n", arg); return video_set_shader_func(type, arg); }
static void gfx_ctx_d3d_update_title(void *data) { d3d_video_t *d3d = (d3d_video_t*)data; char buf[128], buffer_fps[128]; bool fps_draw = g_settings.fps_show; if (gfx_get_fps(buf, sizeof(buf), fps_draw ? buffer_fps : NULL, sizeof(buffer_fps))) { #ifndef _XBOX SetWindowText(d3d->hWnd, buf); #endif } if (fps_draw) { #ifdef _XBOX char mem[128]; MEMORYSTATUS stat; GlobalMemoryStatus(&stat); snprintf(mem, sizeof(mem), "|| MEM: %.2f/%.2fMB", stat.dwAvailPhys/(1024.0f*1024.0f), stat.dwTotalPhys/(1024.0f*1024.0f)); strlcat(buffer_fps, mem, sizeof(buffer_fps)); #endif msg_queue_push(g_extern.msg_queue, buffer_fps, 1, 1); } #ifndef _XBOX g_extern.frame_count++; #endif }
bool screenshot_dump(const char *folder, const void *frame, unsigned width, unsigned height, int pitch, bool bgr24) { (void)folder; (void)frame; (void)width; (void)height; (void)pitch; (void)bgr24; d3d_video_t *d3d = (d3d_video_t*)driver.video_data; HRESULT ret = S_OK; char filename[PATH_MAX_LENGTH]; char shotname[PATH_MAX_LENGTH]; fill_dated_filename(shotname, "bmp", sizeof(shotname)); snprintf(filename, sizeof(filename), "%s\\%s", g_settings.screenshot_directory, shotname); D3DSurface *surf = NULL; d3d->dev->GetBackBuffer(-1, D3DBACKBUFFER_TYPE_MONO, &surf); ret = XGWriteSurfaceToFile(surf, filename); surf->Release(); if(ret == S_OK) { RARCH_LOG("Screenshot saved: %s.\n", filename); msg_queue_push(g_extern.msg_queue, "Screenshot saved.", 1, 30); return true; } return false; }
void rarch_main_data_msg_queue_push(unsigned type, const char *msg, const char *msg2, unsigned prio, unsigned duration, bool flush) { char new_msg[PATH_MAX_LENGTH]; msg_queue_t *queue = NULL; snprintf(new_msg, sizeof(new_msg), "%s|%s", msg, msg2); switch(type) { case DATA_TYPE_NONE: break; case DATA_TYPE_FILE: queue = g_data_runloop.nbio.msg_queue; break; case DATA_TYPE_IMAGE: queue = g_data_runloop.nbio.image.msg_queue; break; case DATA_TYPE_HTTP: queue = g_data_runloop.http.msg_queue; break; #ifdef HAVE_OVERLAY case DATA_TYPE_OVERLAY: break; #endif } if (!queue) return; if (flush) msg_queue_clear(queue); msg_queue_push(queue, new_msg, prio, duration); }
bool load_menu_game(void) { if (g_extern.main_is_init) rarch_main_deinit(); struct rarch_main_wrap args = {0}; args.verbose = g_extern.verbose; args.config_path = *g_extern.config_path ? g_extern.config_path : NULL; args.sram_path = *g_extern.savefile_dir ? g_extern.savefile_dir : NULL; args.state_path = *g_extern.savestate_dir ? g_extern.savestate_dir : NULL; args.rom_path = *g_extern.fullpath ? g_extern.fullpath : NULL; args.libretro_path = g_settings.libretro; args.no_rom = rgui->load_no_rom; rgui->load_no_rom = false; if (rarch_main_init_wrap(&args) == 0) { RARCH_LOG("rarch_main_init_wrap() succeeded.\n"); return true; } else { char name[PATH_MAX]; char msg[PATH_MAX]; fill_pathname_base(name, g_extern.fullpath, sizeof(name)); snprintf(msg, sizeof(msg), "Failed to load %s.\n", name); msg_queue_push(g_extern.msg_queue, msg, 1, 90); rgui->msg_force = true; RARCH_ERR("rarch_main_init_wrap() failed.\n"); return false; } }
static void netplay_post_frame_spectate(netplay_t *handle) { unsigned i; if (handle->spectate_client) return; for (i = 0; i < MAX_SPECTATORS; i++) { if (handle->spectate_fds[i] == -1) continue; if (!send_all(handle->spectate_fds[i], handle->spectate_input, handle->spectate_input_ptr * sizeof(int16_t))) { RARCH_LOG("Client (#%u) disconnected ...\n", i); char msg[512]; snprintf(msg, sizeof(msg), "Client (#%u) disconnected.", i); msg_queue_push(g_extern.msg_queue, msg, 1, 180); close(handle->spectate_fds[i]); handle->spectate_fds[i] = -1; break; } } handle->spectate_input_ptr = 0; }
static bool input_try_autoconfigure_joypad_from_conf(config_file_t *conf, unsigned index, const char *name, const char *driver, bool block_osd_spam) { if (!conf) return false; char ident[1024]; char input_driver[1024]; *ident = *input_driver = '\0'; config_get_array(conf, "input_device", ident, sizeof(ident)); config_get_array(conf, "input_driver", input_driver, sizeof(input_driver)); if (!strcmp(ident, name) && !strcmp(driver, input_driver)) { g_settings.input.autoconfigured[index] = true; input_autoconfigure_joypad_conf(conf, g_settings.input.autoconf_binds[index]); char msg[512]; snprintf(msg, sizeof(msg), "Joypad port #%u (%s) configured.", index, name); if (!block_osd_spam) msg_queue_push(g_extern.msg_queue, msg, 0, 60); RARCH_LOG("%s\n", msg); return true; } return false; }
void rarch_main_msg_queue_push(const char *msg, unsigned prio, unsigned duration, bool flush) { settings_t *settings; settings = config_get_ptr(); if(!settings->video.font_enable) return; if (!g_msg_queue) return; #ifdef HAVE_THREADS slock_lock(mq_lock); #endif if (flush) msg_queue_clear(g_msg_queue); msg_queue_push(g_msg_queue, msg, prio, duration); #ifdef HAVE_THREADS slock_unlock(mq_lock); #endif if (ui_companion_is_on_foreground()) { const ui_companion_driver_t *ui = ui_companion_get_ptr(); if (ui->msg_queue_push) ui->msg_queue_push(msg, prio, duration, flush); } }
static void check_stateslots(bool pressed_increase, bool pressed_decrease) { char msg[PATH_MAX]; /* Save state slots */ if (pressed_increase) g_settings.state_slot++; else if (pressed_decrease) { if (g_settings.state_slot > 0) g_settings.state_slot--; } else return; if (g_extern.msg_queue) msg_queue_clear(g_extern.msg_queue); snprintf(msg, sizeof(msg), "State slot: %d", g_settings.state_slot); if (g_extern.msg_queue) msg_queue_push(g_extern.msg_queue, msg, 1, 180); RARCH_LOG("%s\n", msg); }
void netplay_flip_players(netplay_t *handle) { uint32_t flip_frame = handle->frame_count + 2 * UDP_FRAME_PACKETS; uint32_t flip_frame_net = htonl(flip_frame); const char *msg = NULL; if (handle->spectate) { msg = "Cannot flip players in spectate mode."; goto error; } if (handle->port == 0) { msg = "Cannot flip players if you're not the host."; goto error; } // Make sure both clients are definitely synced up. if (handle->frame_count < (handle->flip_frame + 2 * UDP_FRAME_PACKETS)) { msg = "Cannot flip players yet. Wait a second or two before attempting flip."; goto error; } if (netplay_send_cmd(handle, NETPLAY_CMD_FLIP_PLAYERS, &flip_frame_net, sizeof(flip_frame_net)) && netplay_get_response(handle)) { RARCH_LOG("Netplay players are flipped.\n"); msg_queue_push(g_extern.msg_queue, "Netplay players are flipped.", 1, 180); // Queue up a flip well enough in the future. handle->flip ^= true; handle->flip_frame = flip_frame; } else { msg = "Failed to flip players."; goto error; } return; error: RARCH_WARN("%s\n", msg); msg_queue_push(g_extern.msg_queue, msg, 1, 180); }
static void cheat_manager_update(cheat_manager_t *handle) { msg_queue_clear(g_extern.msg_queue); char msg[256]; snprintf(msg, sizeof(msg), "Cheat: #%u [%s]: %s", handle->ptr, handle->cheats[handle->ptr].state ? "ON" : "OFF", handle->cheats[handle->ptr].desc); msg_queue_push(g_extern.msg_queue, msg, 1, 180); RARCH_LOG("%s\n", msg); }
static void gfx_ctx_update_window_title(void) { char buf[128], buf_fps[128]; bool fps_draw = g_extern.lifecycle_mode_state & (1ULL << MODE_FPS_DRAW); gfx_get_fps(buf, sizeof(buf), fps_draw ? buf_fps : NULL, sizeof(buf_fps)); if (fps_draw) msg_queue_push(g_extern.msg_queue, buf_fps, 1, 1); }
static void gfx_ctx_update_window_title(void) { char buf[128], buf_fps[128]; bool fps_draw = g_settings.fps_show; gfx_get_fps(buf, sizeof(buf), fps_draw ? buf_fps : NULL, sizeof(buf_fps)); if (fps_draw) msg_queue_push(g_extern.msg_queue, buf_fps, 1, 1); }
/** * video_monitor_set_refresh_rate: * @hz : New refresh rate for monitor. * * Sets monitor refresh rate to new value. **/ void video_monitor_set_refresh_rate(float hz) { char msg[PATH_MAX_LENGTH]; snprintf(msg, sizeof(msg), "Setting refresh rate to: %.3f Hz.", hz); msg_queue_push(g_extern.msg_queue, msg, 1, 180); RARCH_LOG("%s\n", msg); g_settings.video.refresh_rate = hz; }
static bool input_try_autoconfigure_joypad_from_conf(config_file_t *conf, unsigned index, const char *name, const char *driver, int32_t vid, int32_t pid, bool block_osd_spam) { if (!conf) return false; char ident[PATH_MAX], ident_idx[PATH_MAX], input_driver[PATH_MAX]; int input_vid = 0, input_pid = 0; bool cond_found_idx, cond_found_general, cond_found_vid = false, cond_found_pid = false; *ident = *input_driver = '\0'; config_get_array(conf, "input_device", ident, sizeof(ident)); config_get_array(conf, "input_driver", input_driver, sizeof(input_driver)); config_get_int(conf, "input_vendor_id", &input_vid); config_get_int(conf, "input_product_id", &input_pid); snprintf(ident_idx, sizeof(ident_idx), "%s_p%u", ident, index); //RARCH_LOG("ident_idx: %s\n", ident_idx); cond_found_idx = !strcmp(ident_idx, name); cond_found_general = !strcmp(ident, name) && !strcmp(driver, input_driver); if ((vid != 0) && (input_vid != 0)) cond_found_vid = (vid == input_vid); if ((pid != 0) && (input_pid != 0)) cond_found_pid = (pid == input_pid); /* If Vendor ID and Product ID matches, we've found our * entry. */ if (cond_found_vid && cond_found_pid) goto found; /* Check for name match. */ if (cond_found_idx) goto found; else if (cond_found_general) goto found; return false; found: g_settings.input.autoconfigured[index] = true; input_autoconfigure_joypad_conf(conf, g_settings.input.autoconf_binds[index]); char msg[512]; snprintf(msg, sizeof(msg), "Joypad port #%u (%s) configured.", index, name); if (!block_osd_spam) msg_queue_push(g_extern.msg_queue, msg, 0, 60); RARCH_LOG("%s\n", msg); return true; }
HRESULT CRetroArchVideoOptions::OnControlNavigate(XUIMessageControlNavigate *pControlNavigateData, BOOL& bHandled) { bool aspectratio_changed = false; int current_index; current_index = XuiListGetCurSel(m_menulist, NULL); unsigned input = pControlNavigateData->nControlNavigate; unsigned action = xui_input_to_rgui_action(input); switch (current_index) { case MENU_XUI_ITEM_HW_TEXTURE_FILTER: menu_set_settings(RGUI_SETTINGS_VIDEO_FILTER, action); XuiListSetText(m_menulist, MENU_XUI_ITEM_HW_TEXTURE_FILTER, g_settings.video.smooth ? L"Default Filter: Linear" : L"Default Filter: Nearest"); break; case MENU_XUI_ITEM_GAMMA_CORRECTION_ENABLED: if (action == RGUI_ACTION_LEFT || action == RGUI_ACTION_RIGHT || action == RGUI_ACTION_OK) { g_extern.console.screen.gamma_correction = g_extern.console.screen.gamma_correction ? 0 : 1; XuiListSetText(m_menulist, MENU_XUI_ITEM_GAMMA_CORRECTION_ENABLED, g_extern.console.screen.gamma_correction ? L"Gamma correction: ON" : L"Gamma correction: OFF"); msg_queue_push(g_extern.msg_queue, "You need to restart for this change to take effect.\n", 1, 90); } break; case MENU_XUI_ITEM_ASPECT_RATIO: menu_set_settings(RGUI_SETTINGS_VIDEO_ASPECT_RATIO, action); menu_settings_create_menu_item_label_w(strw_buffer, S_LBL_ASPECT_RATIO, sizeof(strw_buffer)); XuiListSetText(m_menulist, MENU_XUI_ITEM_ASPECT_RATIO, strw_buffer); break; case MENU_XUI_ITEM_ORIENTATION: menu_set_settings(RGUI_SETTINGS_VIDEO_ROTATION, action); menu_settings_create_menu_item_label_w(strw_buffer, S_LBL_ROTATION, sizeof(strw_buffer)); XuiListSetText(m_menulist, MENU_XUI_ITEM_ORIENTATION, strw_buffer); driver.video->set_rotation(driver.video_data, g_settings.video.rotation); break; } bHandled = TRUE; switch(action) { case RGUI_ACTION_LEFT: case RGUI_ACTION_RIGHT: case RGUI_ACTION_UP: case RGUI_ACTION_DOWN: pControlNavigateData->hObjDest = pControlNavigateData->hObjSource; break; default: break; } return 0; }
static void gfx_ctx_wgl_update_window_title(void *data) { (void)data; char buf[128], buf_fps[128]; bool fps_draw = g_settings.fps_show; if (gfx_get_fps(buf, sizeof(buf), fps_draw ? buf_fps : NULL, sizeof(buf_fps))) SetWindowText(g_hwnd, buf); if (fps_draw) msg_queue_push(g_extern.msg_queue, buf_fps, 1, 1); }
static bool get_info_spectate(netplay_t *handle) { if (!send_nickname(handle, handle->fd)) { RARCH_ERR("Failed to send nickname to host.\n"); return false; } if (!get_nickname(handle, handle->fd)) { RARCH_ERR("Failed to receive nickname from host.\n"); return false; } char msg[512]; snprintf(msg, sizeof(msg), "Connected to \"%s\"", handle->other_nick); msg_queue_push(g_extern.msg_queue, msg, 1, 180); RARCH_LOG("%s\n", msg); uint32_t header[4]; if (!recv_all(handle->fd, header, sizeof(header))) { RARCH_ERR("Cannot get header from host.\n"); return false; } size_t save_state_size = pretro_serialize_size(); if (!bsv_parse_header(header, implementation_magic_value())) { RARCH_ERR("Received invalid BSV header from host.\n"); return false; } void *buf = malloc(save_state_size); if (!buf) return false; size_t size = save_state_size; if (!recv_all(handle->fd, buf, size)) { RARCH_ERR("Failed to receive save state from host.\n"); free(buf); return false; } bool ret = true; if (save_state_size) ret = pretro_unserialize(buf, save_state_size); free(buf); return ret; }
static void gfx_ctx_glx_update_window_title(void *data) { (void)data; char buf[128], buf_fps[128]; bool fps_draw = g_settings.fps_show; gfx_ctx_glx_data_t *glx = (gfx_ctx_glx_data_t*)driver.video_context_data; if (gfx_get_fps(buf, sizeof(buf), fps_draw ? buf_fps : NULL, sizeof(buf_fps))) XStoreName(glx->g_dpy, glx->g_win, buf); if (fps_draw) msg_queue_push(g_extern.msg_queue, buf_fps, 1, 1); }
bool driver_location_start(void) { if (driver.location && driver.location_data && driver.location->start) { if (g_settings.location.allow) return driver.location->start(driver.location_data); else msg_queue_push(g_extern.msg_queue, "Location is explicitly disabled.\n", 1, 180); return false; } else return false; }
bool driver_camera_start(void) { if (driver.camera && driver.camera_data && driver.camera->start) { if (g_settings.camera.allow) return driver.camera->start(driver.camera_data); else msg_queue_push(g_extern.msg_queue, "Camera is explicitly disabled.\n", 1, 180); return false; } else return false; }
static void gfx_ctx_xegl_update_window_title(void *data) { char buf[128], buf_fps[128]; bool fps_draw = g_settings.fps_show || g_settings.fps_monitor_enable; (void)data; if (video_monitor_get_fps(buf, sizeof(buf), g_settings.fps_show ? buf_fps : NULL, sizeof(buf_fps))) XStoreName(g_dpy, g_win, buf); if (g_settings.fps_show) msg_queue_push(g_extern.msg_queue, buf_fps, 1, 1); }
static void gfx_ctx_vc_update_window_title(void *data) { char buf[128] = {0}; char buf_fps[128] = {0}; settings_t *settings = config_get_ptr(); (void)data; video_monitor_get_fps(buf, sizeof(buf), buf_fps, sizeof(buf_fps)); if (settings->fps_show) msg_queue_push(buf_fps, 1, 1, false); }
static bool check_movie_record(void) { if (!g_extern.bsv.movie) return false; msg_queue_clear(g_extern.msg_queue); msg_queue_push(g_extern.msg_queue, RETRO_MSG_MOVIE_RECORD_STOPPING, 2, 180); RARCH_LOG(RETRO_LOG_MOVIE_RECORD_STOPPING); rarch_main_command(RARCH_CMD_BSV_MOVIE_DEINIT); return true; }
static void gfx_ctx_ps3_update_window_title(void *data) { (void)data; char buf[128], buf_fps[128]; bool fps_draw = g_settings.fps_show || g_settings.fps_monitor_enable; if (!fps_draw) return; video_monitor_get_fps(buf, sizeof(buf), g_settings.fps_show ? buf_fps : NULL, sizeof(buf_fps)); if (g_settings.fps_show) msg_queue_push(g_extern.msg_queue, buf_fps, 1, 1); }
void driver_set_monitor_refresh_rate(float hz) { char msg[256]; snprintf(msg, sizeof(msg), "Setting refresh rate to: %.3f Hz.", hz); msg_queue_push(g_extern.msg_queue, msg, 1, 180); RARCH_LOG("%s\n", msg); g_settings.video.refresh_rate = hz; adjust_system_rates(); g_extern.audio_data.orig_src_ratio = g_extern.audio_data.src_ratio = (double)g_settings.audio.out_rate / g_extern.audio_data.in_rate; }
static void check_slowmotion(bool pressed) { g_extern.is_slowmotion = pressed; if (!g_extern.is_slowmotion) return; if (g_settings.video.black_frame_insertion) rarch_render_cached_frame(); msg_queue_clear(g_extern.msg_queue); msg_queue_push(g_extern.msg_queue, g_extern.frame_is_reverse ? "Slow motion rewind." : "Slow motion.", 0, 30); }
void rarch_main_data_msg_queue_push(unsigned type, const char *msg, const char *msg2, unsigned prio, unsigned duration, bool flush) { char new_msg[PATH_MAX_LENGTH] = {0}; msg_queue_t *queue = NULL; switch(type) { case DATA_TYPE_NONE: break; case DATA_TYPE_FILE: queue = rarch_main_data_nbio_get_msg_queue_ptr(); if (!queue) return; snprintf(new_msg, sizeof(new_msg), "%s|%s", msg, msg2); break; case DATA_TYPE_IMAGE: queue = rarch_main_data_nbio_image_get_msg_queue_ptr(); if (!queue) return; snprintf(new_msg, sizeof(new_msg), "%s|%s", msg, msg2); break; #ifdef HAVE_NETWORKING case DATA_TYPE_HTTP: queue = rarch_main_data_http_get_msg_queue_ptr(); snprintf(new_msg, sizeof(new_msg), "%s|%s", msg, msg2); break; #endif #ifdef HAVE_OVERLAY case DATA_TYPE_OVERLAY: snprintf(new_msg, sizeof(new_msg), "%s|%s", msg, msg2); break; #endif #ifdef HAVE_LIBRETRODB case DATA_TYPE_DB: queue = rarch_main_data_db_get_msg_queue_ptr(); snprintf(new_msg, sizeof(new_msg), "%s|%s", msg, msg2); break; #endif } if (!queue) return; if (flush) msg_queue_clear(queue); msg_queue_push(queue, new_msg, prio, duration); }
static bool netplay_get_cmd(netplay_t *handle) { uint32_t cmd; if (!recv_all(handle->fd, &cmd, sizeof(cmd))) return false; cmd = ntohl(cmd); size_t cmd_size = cmd & 0xffff; cmd = cmd >> 16; switch (cmd) { case NETPLAY_CMD_FLIP_PLAYERS: { if (cmd_size != sizeof(uint32_t)) { RARCH_ERR("CMD_FLIP_PLAYERS has unexpected command size.\n"); return netplay_cmd_nak(handle); } uint32_t flip_frame; if (!recv_all(handle->fd, &flip_frame, sizeof(flip_frame))) { RARCH_ERR("Failed to receive CMD_FLIP_PLAYERS argument.\n"); return netplay_cmd_nak(handle); } flip_frame = ntohl(flip_frame); if (flip_frame < handle->flip_frame) { RARCH_ERR("Host asked us to flip players in the past. Not possible ...\n"); return netplay_cmd_nak(handle); } handle->flip ^= true; handle->flip_frame = flip_frame; RARCH_LOG("Netplay players are flipped.\n"); msg_queue_push(g_extern.msg_queue, "Netplay players are flipped.", 1, 180); return netplay_cmd_ack(handle); } default: RARCH_ERR("Unknown netplay command received.\n"); return netplay_cmd_nak(handle); } }
static int16_t netplay_get_spectate_input(netplay_t *handle, bool port, unsigned device, unsigned index, unsigned id) { int16_t inp; if (recv_all(handle->fd, NONCONST_CAST &inp, sizeof(inp))) return swap_if_big16(inp); else { RARCH_ERR("Connection with host was cut.\n"); msg_queue_clear(g_extern.msg_queue); msg_queue_push(g_extern.msg_queue, "Connection with host was cut.", 1, 180); pretro_set_input_state(g_extern.netplay->cbs.state_cb); return g_extern.netplay->cbs.state_cb(port, device, index, id); } }