/* Registry callbacks. */ static void registry_handle_global(void *data, struct wl_registry *reg, uint32_t id, const char *interface, uint32_t version) { struct wl_output *output = NULL; gfx_ctx_wayland_data_t *wl = (gfx_ctx_wayland_data_t*)data; (void)version; if (string_is_equal_fast(interface, "wl_compositor", 13)) wl->compositor = (struct wl_compositor*)wl_registry_bind(reg, id, &wl_compositor_interface, 3); else if (string_is_equal_fast(interface, "wl_output", 9)) { output = (struct wl_output*)wl_registry_bind(reg, id, &wl_output_interface, 2); wl_output_add_listener(output, &output_listener, wl); wl_display_roundtrip(wl->input.dpy); } else if (string_is_equal_fast(interface, "wl_shell", 8)) wl->shell = (struct wl_shell*) wl_registry_bind(reg, id, &wl_shell_interface, 1); else if (string_is_equal_fast(interface, "wl_shm", 6)) wl->shm = (struct wl_shm*)wl_registry_bind(reg, id, &wl_shm_interface, 1); else if (string_is_equal_fast(interface, "wl_seat", 7)) { wl->seat = (struct wl_seat*)wl_registry_bind(reg, id, &wl_seat_interface, 4); wl_seat_add_listener(wl->seat, &seat_listener, wl); } }
int detect_system(const char *track_path, const char **system_name) { int rv; char magic[MAGIC_LEN]; int i; RFILE *fd = filestream_open(track_path, RFILE_MODE_READ, -1); if (!fd) { RARCH_LOG("Could not open data track of file '%s': %s\n", track_path, strerror(errno)); rv = -errno; goto clean; } RARCH_LOG("%s\n", msg_hash_to_str(MSG_COMPARING_WITH_KNOWN_MAGIC_NUMBERS)); for (i = 0; MAGIC_NUMBERS[i].system_name != NULL; i++) { filestream_seek(fd, MAGIC_NUMBERS[i].offset, SEEK_SET); if (filestream_read(fd, magic, MAGIC_LEN) < MAGIC_LEN) { RARCH_LOG("Could not read data from file '%s' at offset %d: %s\n", track_path, MAGIC_NUMBERS[i].offset, strerror(errno)); rv = -errno; goto clean; } if (!string_is_empty(MAGIC_NUMBERS[i].magic) && !string_is_empty(magic) && string_is_equal_fast(MAGIC_NUMBERS[i].magic, magic, MAGIC_LEN)) { *system_name = MAGIC_NUMBERS[i].system_name; rv = 0; goto clean; } } filestream_seek(fd, 0x8008, SEEK_SET); if (filestream_read(fd, magic, 8) > 0) { magic[8] = '\0'; if (!string_is_empty(magic) && string_is_equal_fast(magic, "PSP GAME", 8)) { *system_name = "psp\0"; rv = 0; goto clean; } } RARCH_LOG("%s\n", msg_hash_to_str(MSG_COULD_NOT_FIND_COMPATIBLE_SYSTEM)); rv = -EINVAL; clean: filestream_close(fd); return rv; }
static void *hlsl_init(void *data, const char *path) { unsigned i; d3d_video_t *d3d = (d3d_video_t*)data; hlsl_shader_data_t *hlsl_data = (hlsl_shader_data_t*) calloc(1, sizeof(hlsl_shader_data_t)); if (!hlsl_data) return NULL; if (path && (string_is_equal_fast(path_get_extension(path), ".cgp", 4))) { if (!hlsl_load_preset(hlsl_data, d3d, path)) goto error; } else { if (!hlsl_load_plain(hlsl_data, d3d, path)) goto error; } for(i = 1; i <= hlsl_data->cg_shader->passes; i++) hlsl_set_program_attributes(hlsl_data, i); d3d_set_vertex_shader(d3d->dev, 1, hlsl_data->prg[1].vprg); d3d->dev->SetPixelShader(hlsl_data->prg[1].fprg); return hlsl_data; error: if (hlsl_data) free(hlsl_data); return NULL; }
/* Find the index of a compatible DRM device. */ static int exynos_get_device_index(void) { drmVersionPtr ver; char buf[32] = {0}; int index = 0; bool found = false; while (!found) { int fd; snprintf(buf, sizeof(buf), "/dev/dri/card%d", index); fd = open(buf, O_RDWR); if (fd < 0) break; ver = drmGetVersion(fd); if (string_is_equal_fast(ver->name, "exynos", 6)) found = true; else ++index; drmFreeVersion(ver); close(fd); } if (!found) return -1; return index; }
static void udev_input_handle_hotplug(udev_input_t *udev) { const char *devtype = NULL; const char *val_keyboard = NULL; const char *val_mouse = NULL; const char *val_touchpad = NULL; const char *action = NULL; const char *devnode = NULL; struct udev_device *dev = udev_monitor_receive_device(udev->monitor); if (!dev) return; val_keyboard = udev_device_get_property_value(dev, "ID_INPUT_KEYBOARD"); val_mouse = udev_device_get_property_value(dev, "ID_INPUT_MOUSE"); val_touchpad = udev_device_get_property_value(dev, "ID_INPUT_TOUCHPAD"); action = udev_device_get_action(dev); devnode = udev_device_get_devnode(dev); if (val_keyboard && string_is_equal_fast(val_keyboard, "1", 1) && devnode) devtype = "keyboard"; if (val_mouse && string_is_equal_fast(val_mouse, "1", 1) && devnode) devtype = "mouse"; if (val_touchpad && string_is_equal_fast(val_touchpad, "1", 1) && devnode) devtype = "touchpad"; if (!devtype) goto end; if (string_is_equal_fast(action, "add", 3)) { device_handle_cb cb = NULL; if (string_is_equal_fast(devtype, "keyboard", 8)) cb = udev_handle_keyboard; else if (string_is_equal_fast(devtype, "touchpad", 8)) cb = udev_handle_touchpad; else if (string_is_equal_fast(devtype, "mouse", 5)) cb = udev_handle_mouse; RARCH_LOG("[udev]: Hotplug add %s: %s.\n", devtype, devnode); udev_input_add_device(udev, devnode, cb); } else if (string_is_equal_fast(action, "remove", 6)) { RARCH_LOG("[udev]: Hotplug remove %s: %s.\n", devtype, devnode); udev_input_remove_device(udev, devnode); } end: udev_device_unref(dev); }
static int stream_get_serial(database_state_handle_t *db_state, database_info_handle_t *db, intfstream_t *fd, char* serial) { const char* system_name = NULL; /* Check if the system was not auto-detected. */ if (detect_system(fd, &system_name) < 0) { /* Attempt to read an ASCII serial, like Wii. */ if (detect_serial_ascii_game(fd, serial)) { /* ASCII serial (Wii) was detected. */ RARCH_LOG("%s '%s'\n", msg_hash_to_str(MSG_FOUND_DISK_LABEL), serial); return 0; } /* Any other non-system specific detection methods? */ return 0; } if (string_is_equal_fast(system_name, "psp", 3)) { if (detect_psp_game(fd, serial) == 0) return 0; RARCH_LOG("%s '%s'\n", msg_hash_to_str(MSG_FOUND_DISK_LABEL), serial); } else if (string_is_equal_fast(system_name, "ps1", 3)) { if (detect_ps1_game(fd, serial) == 0) return 0; RARCH_LOG("%s '%s'\n", msg_hash_to_str(MSG_FOUND_DISK_LABEL), serial); } else { return 0; } return 1; }
static void gfx_ctx_wgl_input_driver(void *data, const char *joypad_name, const input_driver_t **input, void **input_data) { settings_t *settings = config_get_ptr(); #if _WIN32_WINNT >= 0x0501 /* winraw only available since XP */ if (string_is_equal_fast(settings->arrays.input_driver, "raw", 4)) { *input_data = input_winraw.init(joypad_name); if (*input_data) { *input = &input_winraw; dinput_wgl = NULL; return; } } #endif dinput_wgl = input_dinput.init(joypad_name); *input = dinput_wgl ? &input_dinput : NULL; *input_data = dinput_wgl; }
static void *gl_glsl_init(void *data, const char *path) { unsigned i; struct shader_program_info shader_prog_info; bool shader_support = false; #ifdef GLSL_DEBUG char *error_string = NULL; #endif config_file_t *conf = NULL; const char *stock_vertex = NULL; const char *stock_fragment = NULL; glsl_shader_data_t *glsl = (glsl_shader_data_t*) calloc(1, sizeof(glsl_shader_data_t)); if (!glsl) return NULL; (void)shader_support; #ifndef HAVE_OPENGLES RARCH_LOG("[GLSL]: Checking GLSL shader support ...\n"); shader_support = glCreateProgram && glUseProgram && glCreateShader && glDeleteShader && glShaderSource && glCompileShader && glAttachShader && glDetachShader && glLinkProgram && glGetUniformLocation && glUniform1i && glUniform1f && glUniform2fv && glUniform4fv && glUniformMatrix4fv && glGetShaderiv && glGetShaderInfoLog && glGetProgramiv && glGetProgramInfoLog && glDeleteProgram && glGetAttachedShaders && glGetAttribLocation && glEnableVertexAttribArray && glDisableVertexAttribArray && glVertexAttribPointer && glGenBuffers && glBufferData && glDeleteBuffers && glBindBuffer; if (!shader_support) { RARCH_ERR("GLSL shaders aren't supported by your OpenGL driver.\n"); goto error; } #endif glsl->shader = (struct video_shader*)calloc(1, sizeof(*glsl->shader)); if (!glsl->shader) goto error; if (!string_is_empty(path)) { bool ret = false; const char *path_ext = path_get_extension(path); if (string_is_equal_fast(path_ext, "glslp", 5)) { conf = config_file_new(path); if (conf) { ret = video_shader_read_conf_cgp(conf, glsl->shader); glsl->shader->modern = true; } } else if (string_is_equal_fast(path_ext, "glsl", 4)) { strlcpy(glsl->shader->pass[0].source.path, path, sizeof(glsl->shader->pass[0].source.path)); glsl->shader->passes = 1; glsl->shader->modern = true; ret = true; } if (!ret) { RARCH_ERR("[GL]: Failed to parse GLSL shader.\n"); goto error; } } else { RARCH_WARN("[GL]: Stock GLSL shaders will be used.\n"); glsl->shader->passes = 1; glsl->shader->pass[0].source.string.vertex = strdup(glsl_core ? stock_vertex_core : stock_vertex_modern); glsl->shader->pass[0].source.string.fragment = strdup(glsl_core ? stock_fragment_core : stock_fragment_modern); glsl->shader->modern = true; } if (!string_is_empty(path)) video_shader_resolve_relative(glsl->shader, path); video_shader_resolve_parameters(conf, glsl->shader); if (conf) { config_file_free(conf); conf = NULL; } stock_vertex = (glsl->shader->modern) ? stock_vertex_modern : stock_vertex_legacy; stock_fragment = (glsl->shader->modern) ? stock_fragment_modern : stock_fragment_legacy; if (glsl_core) { stock_vertex = stock_vertex_core; stock_fragment = stock_fragment_core; } #ifdef HAVE_OPENGLES if (!glsl->shader->modern) { RARCH_ERR("[GL]: GLES context is used, but shader is not modern. Cannot use it.\n"); goto error; } #else if (glsl_core && !glsl->shader->modern) { RARCH_ERR("[GL]: GL core context is used, but shader is not core compatible. Cannot use it.\n"); goto error; } #endif /* Find all aliases we use in our GLSLP and add #defines for them so * that a shader can choose a fallback if we are not using a preset. */ *glsl->alias_define = '\0'; for (i = 0; i < glsl->shader->passes; i++) { if (*glsl->shader->pass[i].alias) { char define[128]; define[0] = '\0'; snprintf(define, sizeof(define), "#define %s_ALIAS\n", glsl->shader->pass[i].alias); strlcat(glsl->alias_define, define, sizeof(glsl->alias_define)); } } shader_prog_info.vertex = stock_vertex; shader_prog_info.fragment = stock_fragment; shader_prog_info.is_file = false; if (!gl_glsl_compile_program(glsl, 0, &glsl->prg[0], &shader_prog_info)) { RARCH_ERR("GLSL stock programs failed to compile.\n"); goto error; } if (!gl_glsl_compile_programs(glsl, &glsl->prg[1])) goto error; if (!gl_load_luts(glsl->shader, glsl->lut_textures)) { RARCH_ERR("[GL]: Failed to load LUTs.\n"); goto error; } for (i = 0; i <= glsl->shader->passes; i++) gl_glsl_find_uniforms(glsl, i, glsl->prg[i].id, &glsl->uniforms[i]); #ifdef GLSL_DEBUG if (!gl_check_error(&error_string)) { RARCH_ERR("%s\n", error_string); free(error_string); RARCH_WARN("Detected GL error in GLSL.\n"); } #endif if (glsl->shader->variables) { retro_ctx_memory_info_t mem_info; struct state_tracker_info info; mem_info.id = RETRO_MEMORY_SYSTEM_RAM; core_get_memory(&mem_info); info.wram = (uint8_t*)mem_info.data; info.info = glsl->shader->variable; info.info_elem = glsl->shader->variables; info.script = NULL; info.script_class = NULL; #ifdef HAVE_PYTHON info.script = glsl->shader->script; if (*glsl->shader->script_class) info.script_class= glsl->shader->script_class; #endif info.script_is_file = NULL; glsl->state_tracker = state_tracker_init(&info); if (!glsl->state_tracker) RARCH_WARN("Failed to init state tracker.\n"); } glsl->prg[glsl->shader->passes + 1] = glsl->prg[0]; glsl->uniforms[glsl->shader->passes + 1] = glsl->uniforms[0]; if (glsl->shader->modern) { shader_prog_info.vertex = glsl_core ? stock_vertex_core_blend : stock_vertex_modern_blend; shader_prog_info.fragment = glsl_core ? stock_fragment_core_blend : stock_fragment_modern_blend; shader_prog_info.is_file = false; gl_glsl_compile_program( glsl, VIDEO_SHADER_STOCK_BLEND, &glsl->prg[VIDEO_SHADER_STOCK_BLEND], &shader_prog_info ); gl_glsl_find_uniforms(glsl, 0, glsl->prg[VIDEO_SHADER_STOCK_BLEND].id, &glsl->uniforms[VIDEO_SHADER_STOCK_BLEND]); } else { glsl->prg[VIDEO_SHADER_STOCK_BLEND] = glsl->prg[0]; glsl->uniforms[VIDEO_SHADER_STOCK_BLEND] = glsl->uniforms[0]; } #ifdef HAVE_SHADERPIPELINE #ifdef HAVE_OPENGLES if (gl_query_extension("GL_OES_standard_derivatives")) { shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_ribbon_modern : stock_vertex_xmb_ribbon_legacy; shader_prog_info.fragment = stock_fragment_xmb; } else { shader_prog_info.vertex = stock_vertex_xmb_ribbon_simple_legacy; shader_prog_info.fragment = stock_fragment_xmb_ribbon_simple; } #else shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_ribbon_modern : stock_vertex_xmb_ribbon_legacy; shader_prog_info.fragment = stock_fragment_xmb; #endif shader_prog_info.is_file = false; gl_glsl_compile_program( glsl, VIDEO_SHADER_MENU, &glsl->prg[VIDEO_SHADER_MENU], &shader_prog_info); gl_glsl_find_uniforms(glsl, 0, glsl->prg[VIDEO_SHADER_MENU].id, &glsl->uniforms[VIDEO_SHADER_MENU]); shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_simple_modern : stock_vertex_xmb_ribbon_simple_legacy; shader_prog_info.fragment = stock_fragment_xmb_ribbon_simple; gl_glsl_compile_program( glsl, VIDEO_SHADER_MENU_2, &glsl->prg[VIDEO_SHADER_MENU_2], &shader_prog_info); gl_glsl_find_uniforms(glsl, 0, glsl->prg[VIDEO_SHADER_MENU_2].id, &glsl->uniforms[VIDEO_SHADER_MENU_2]); #if defined(HAVE_OPENGLES) shader_prog_info.vertex = stock_vertex_xmb_snow_modern; #else shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_snow_modern : stock_vertex_xmb_snow_legacy; #endif shader_prog_info.fragment = stock_fragment_xmb_simple_snow; gl_glsl_compile_program( glsl, VIDEO_SHADER_MENU_3, &glsl->prg[VIDEO_SHADER_MENU_3], &shader_prog_info); gl_glsl_find_uniforms(glsl, 0, glsl->prg[VIDEO_SHADER_MENU_3].id, &glsl->uniforms[VIDEO_SHADER_MENU_3]); #if defined(HAVE_OPENGLES) shader_prog_info.vertex = stock_vertex_xmb_snow_modern; #else shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_snow_modern : stock_vertex_xmb_snow_legacy; #endif shader_prog_info.fragment = stock_fragment_xmb_snow; gl_glsl_compile_program( glsl, VIDEO_SHADER_MENU_4, &glsl->prg[VIDEO_SHADER_MENU_4], &shader_prog_info); gl_glsl_find_uniforms(glsl, 0, glsl->prg[VIDEO_SHADER_MENU_4].id, &glsl->uniforms[VIDEO_SHADER_MENU_4]); #if defined(HAVE_OPENGLES) shader_prog_info.vertex = stock_vertex_xmb_snow_modern; #else shader_prog_info.vertex = glsl_core ? stock_vertex_xmb_snow_modern : stock_vertex_xmb_snow_legacy; #endif shader_prog_info.fragment = stock_fragment_xmb_bokeh; gl_glsl_compile_program( glsl, VIDEO_SHADER_MENU_5, &glsl->prg[VIDEO_SHADER_MENU_5], &shader_prog_info); gl_glsl_find_uniforms(glsl, 0, glsl->prg[VIDEO_SHADER_MENU_5].id, &glsl->uniforms[VIDEO_SHADER_MENU_5]); #endif gl_glsl_reset_attrib(glsl); for (i = 0; i < GFX_MAX_SHADERS; i++) { glGenBuffers(1, &glsl->vbo[i].vbo_primary); glGenBuffers(1, &glsl->vbo[i].vbo_secondary); } return glsl; error: gl_glsl_destroy_resources(glsl); if (conf) config_file_free(conf); if (glsl) free(glsl); return NULL; }
static bool d3d9_cg_renderchain_init_shader_fvf( d3d9_renderchain_t *chain, struct shader_pass *pass) { CGparameter param; unsigned index, i, count; unsigned tex_index = 0; bool texcoord0_taken = false; bool texcoord1_taken = false; bool stream_taken[4] = {false}; static const D3DVERTEXELEMENT9 decl_end = D3DDECL_END(); D3DVERTEXELEMENT9 decl[MAXD3DDECLLENGTH] = {{0}}; bool *indices = NULL; if (cgD3D9GetVertexDeclaration(pass->vprg, decl) == CG_FALSE) return false; for (count = 0; count < MAXD3DDECLLENGTH; count++) { if (string_is_equal_fast(&decl_end, &decl[count], sizeof(decl_end))) break; } /* This is completely insane. * We do not have a good and easy way of setting up our * attribute streams, so we have to do it ourselves, yay! * * Stream 0 => POSITION * Stream 1 => TEXCOORD0 * Stream 2 => TEXCOORD1 * Stream 3 => COLOR (Not really used for anything.) * Stream {4..N} => Texture coord streams for varying resources * which have no semantics. */ indices = (bool*)calloc(1, count * sizeof(*indices)); param = d3d9_cg_find_param_from_semantic(cgGetFirstParameter(pass->vprg, CG_PROGRAM), "POSITION"); if (!param) param = d3d9_cg_find_param_from_semantic(cgGetFirstParameter(pass->vprg, CG_PROGRAM), "POSITION0"); if (param) { static const D3DVERTEXELEMENT9 element = { 0, 0 * sizeof(float), D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }; stream_taken[0] = true; index = cgGetParameterResourceIndex(param); decl[index] = element; indices[index] = true; RARCH_LOG("[D3D9 Cg]: FVF POSITION semantic found.\n"); } param = d3d9_cg_find_param_from_semantic(cgGetFirstParameter(pass->vprg, CG_PROGRAM), "TEXCOORD"); if (!param) param = d3d9_cg_find_param_from_semantic(cgGetFirstParameter(pass->vprg, CG_PROGRAM), "TEXCOORD0"); if (param) { static const D3DVERTEXELEMENT9 tex_coord0 = D3D9_DECL_FVF_TEXCOORD(1, 3, 0); stream_taken[1] = true; texcoord0_taken = true; RARCH_LOG("[D3D9 Cg]: FVF TEXCOORD0 semantic found.\n"); index = cgGetParameterResourceIndex(param); decl[index] = tex_coord0; indices[index] = true; } param = d3d9_cg_find_param_from_semantic(cgGetFirstParameter(pass->vprg, CG_PROGRAM), "TEXCOORD1"); if (param) { static const D3DVERTEXELEMENT9 tex_coord1 = D3D9_DECL_FVF_TEXCOORD(2, 5, 1); stream_taken[2] = true; texcoord1_taken = true; RARCH_LOG("[D3D9 Cg]: FVF TEXCOORD1 semantic found.\n"); index = cgGetParameterResourceIndex(param); decl[index] = tex_coord1; indices[index] = true; } param = d3d9_cg_find_param_from_semantic(cgGetFirstParameter(pass->vprg, CG_PROGRAM), "COLOR"); if (!param) param = d3d9_cg_find_param_from_semantic(cgGetFirstParameter(pass->vprg, CG_PROGRAM), "COLOR0"); if (param) { static const D3DVERTEXELEMENT9 color = DECL_FVF_COLOR(3, 7, 0); stream_taken[3] = true; RARCH_LOG("[D3D9 Cg]: FVF COLOR0 semantic found.\n"); index = cgGetParameterResourceIndex(param); decl[index] = color; indices[index] = true; } /* Stream {0, 1, 2, 3} might be already taken. Find first vacant stream. */ for (index = 0; index < 4; index++) { if (stream_taken[index] == false) break; } /* Find first vacant texcoord declaration. */ if (texcoord0_taken && texcoord1_taken) tex_index = 2; else if (texcoord1_taken && !texcoord0_taken) tex_index = 0; else if (texcoord0_taken && !texcoord1_taken) tex_index = 1; for (i = 0; i < count; i++) { if (indices[i]) unsigned_vector_list_append((struct unsigned_vector_list *) pass->attrib_map, 0); else { D3DVERTEXELEMENT9 elem = D3D9_DECL_FVF_TEXCOORD(index, 3, tex_index); unsigned_vector_list_append((struct unsigned_vector_list *) pass->attrib_map, index); decl[i] = elem; /* Find next vacant stream. */ while ((++index < 4) && stream_taken[index]) index++; /* Find next vacant texcoord declaration. */ if ((++tex_index == 1) && texcoord1_taken) tex_index++; } } free(indices); return d3d9_vertex_declaration_new(chain->dev, decl, (void**)&pass->vertex_decl); }
/* Based on SDL2's implementation. */ static bool guid_is_xinput_device(const GUID* product_guid) { unsigned i, num_raw_devs = 0; PRAWINPUTDEVICELIST raw_devs = NULL; /* Check for well known XInput device GUIDs, * thereby removing the need for the IG_ check. * This lets us skip RAWINPUT for popular devices. * * Also, we need to do this for the Valve Streaming Gamepad * because it's virtualized and doesn't show up in the device list. */ for (i = 0; i < ARRAY_SIZE(common_xinput_guids); ++i) { if (string_is_equal_fast(product_guid, &common_xinput_guids[i], sizeof(GUID))) return true; } /* Go through RAWINPUT (WinXP and later) to find HID devices. */ if (!raw_devs) { if ((GetRawInputDeviceList(NULL, &num_raw_devs, sizeof(RAWINPUTDEVICELIST)) == (UINT)-1) || (!num_raw_devs)) return false; raw_devs = (PRAWINPUTDEVICELIST) malloc(sizeof(RAWINPUTDEVICELIST) * num_raw_devs); if (!raw_devs) return false; if (GetRawInputDeviceList(raw_devs, &num_raw_devs, sizeof(RAWINPUTDEVICELIST)) == (UINT)-1) { free(raw_devs); raw_devs = NULL; return false; } } for (i = 0; i < num_raw_devs; i++) { RID_DEVICE_INFO rdi; char devName[128] = {0}; UINT rdiSize = sizeof(rdi); UINT nameSize = sizeof(devName); rdi.cbSize = sizeof (rdi); if ((raw_devs[i].dwType == RIM_TYPEHID) && (GetRawInputDeviceInfoA(raw_devs[i].hDevice, RIDI_DEVICEINFO, &rdi, &rdiSize) != ((UINT)-1)) && (MAKELONG(rdi.hid.dwVendorId, rdi.hid.dwProductId) == ((LONG)product_guid->Data1)) && (GetRawInputDeviceInfoA(raw_devs[i].hDevice, RIDI_DEVICENAME, devName, &nameSize) != ((UINT)-1)) && (strstr(devName, "IG_") != NULL) ) { free(raw_devs); raw_devs = NULL; return true; } } free(raw_devs); raw_devs = NULL; return false; }
int find_first_data_track(const char *cue_path, int32_t *offset, char *track_path, size_t max_len) { int rv; char tmp_token[MAX_TOKEN_LEN]; RFILE *fd = filestream_open(cue_path, RFILE_MODE_READ, -1); if (!fd) { RARCH_LOG("Could not open CUE file '%s': %s\n", cue_path, strerror(errno)); return -errno; } RARCH_LOG("Parsing CUE file '%s'...\n", cue_path); tmp_token[0] = '\0'; while (get_token(fd, tmp_token, MAX_TOKEN_LEN) > 0) { if (!string_is_empty(tmp_token)) { if (string_is_equal_fast(tmp_token, "FILE", 4)) { char cue_dir[PATH_MAX_LENGTH]; cue_dir[0] = '\0'; fill_pathname_basedir(cue_dir, cue_path, sizeof(cue_dir)); get_token(fd, tmp_token, MAX_TOKEN_LEN); fill_pathname_join(track_path, cue_dir, tmp_token, max_len); } else if (string_is_equal_fast(tmp_token, "TRACK", 5)) { int m, s, f; get_token(fd, tmp_token, MAX_TOKEN_LEN); get_token(fd, tmp_token, MAX_TOKEN_LEN); if (string_is_equal_fast(tmp_token, "AUDIO", 5)) continue; find_token(fd, "INDEX"); get_token(fd, tmp_token, MAX_TOKEN_LEN); get_token(fd, tmp_token, MAX_TOKEN_LEN); if (sscanf(tmp_token, "%02d:%02d:%02d", &m, &s, &f) < 3) { RARCH_LOG("Error parsing time stamp '%s'\n", tmp_token); filestream_close(fd); return -errno; } *offset = ((m * 60) * (s * 75) * f) * 25; RARCH_LOG("%s '%s+%d'\n", msg_hash_to_str(MSG_FOUND_FIRST_DATA_TRACK_ON_FILE), track_path, *offset); rv = 0; goto clean; } } } rv = -EINVAL; clean: filestream_close(fd); return rv; }
int detect_psp_game(const char *track_path, char *game_id) { unsigned pos; bool rv = false; RFILE *fd = filestream_open(track_path, RFILE_MODE_READ, -1); if (!fd) { RARCH_LOG("%s: %s\n", msg_hash_to_str(MSG_COULD_NOT_OPEN_DATA_TRACK), strerror(errno)); return -errno; } for (pos = 0; pos < 100000; pos++) { filestream_seek(fd, pos, SEEK_SET); if (filestream_read(fd, game_id, 5) > 0) { game_id[5] = '\0'; if (!string_is_empty(game_id)) { if ( (string_is_equal_fast(game_id, "ULES-", 5)) || (string_is_equal_fast(game_id, "ULUS-", 5)) || (string_is_equal_fast(game_id, "ULJS-", 5)) || (string_is_equal_fast(game_id, "ULEM-", 5)) || (string_is_equal_fast(game_id, "ULUM-", 5)) || (string_is_equal_fast(game_id, "ULJM-", 5)) || (string_is_equal_fast(game_id, "UCES-", 5)) || (string_is_equal_fast(game_id, "UCUS-", 5)) || (string_is_equal_fast(game_id, "UCJS-", 5)) || (string_is_equal_fast(game_id, "UCAS-", 5)) || (string_is_equal_fast(game_id, "NPEH-", 5)) || (string_is_equal_fast(game_id, "NPUH-", 5)) || (string_is_equal_fast(game_id, "NPJH-", 5)) || (string_is_equal_fast(game_id, "NPEG-", 5)) || (string_is_equal_fast(game_id, "NPUG-", 5)) || (string_is_equal_fast(game_id, "NPJG-", 5)) || (string_is_equal_fast(game_id, "NPHG-", 5)) || (string_is_equal_fast(game_id, "NPEZ-", 5)) || (string_is_equal_fast(game_id, "NPUZ-", 5)) || (string_is_equal_fast(game_id, "NPJZ-", 5)) ) { filestream_seek(fd, pos, SEEK_SET); if (filestream_read(fd, game_id, 10) > 0) { #if 0 game_id[4] = '-'; game_id[8] = game_id[9]; game_id[9] = game_id[10]; #endif game_id[10] = '\0'; rv = true; } break; } } } else break; } filestream_close(fd); return rv; }