X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=frontend%2Flibretro.c;h=fb7c1492718eda191ffbea5a1c616fd910ff8528;hb=37d9bf8315be570a350cd44876ae14f9b0eff20b;hp=255ba3ace1969e1fad16e61964ab6e3e22ce26b2;hpb=e4072f7f86a2ce035593856fd5854f316843fb39;p=pcsx_rearmed.git diff --git a/frontend/libretro.c b/frontend/libretro.c index 255ba3ac..fb7c1492 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -96,17 +96,25 @@ static int show_advanced_gpu_unai_settings = -1; static int show_other_input_settings = -1; static float mouse_sensitivity = 1.0f; -unsigned frameskip_type = 0; -unsigned frameskip_threshold = 0; -unsigned frameskip_counter = 0; -unsigned frameskip_interval = 0; +typedef enum +{ + FRAMESKIP_NONE = 0, + FRAMESKIP_AUTO, + FRAMESKIP_AUTO_THRESHOLD, + FRAMESKIP_FIXED_INTERVAL +} frameskip_type_t; + +static unsigned frameskip_type = FRAMESKIP_NONE; +static unsigned frameskip_threshold = 0; +static unsigned frameskip_interval = 0; +static unsigned frameskip_counter = 0; -int retro_audio_buff_active = false; -unsigned retro_audio_buff_occupancy = 0; -int retro_audio_buff_underrun = false; +static int retro_audio_buff_active = false; +static unsigned retro_audio_buff_occupancy = 0; +static int retro_audio_buff_underrun = false; -unsigned retro_audio_latency = 0; -int update_audio_latency = false; +static unsigned retro_audio_latency = 0; +static int update_audio_latency = false; static unsigned previous_width = 0; static unsigned previous_height = 0; @@ -1217,20 +1225,33 @@ static void retro_audio_buff_status_cb( static void retro_set_audio_buff_status_cb(void) { - if (frameskip_type > 0) + if (frameskip_type == FRAMESKIP_NONE) + { + environ_cb(RETRO_ENVIRONMENT_SET_AUDIO_BUFFER_STATUS_CALLBACK, NULL); + retro_audio_latency = 0; + } + else { - struct retro_audio_buffer_status_callback buf_status_cb; + bool calculate_audio_latency = true; - buf_status_cb.callback = retro_audio_buff_status_cb; - if (!environ_cb(RETRO_ENVIRONMENT_SET_AUDIO_BUFFER_STATUS_CALLBACK, - &buf_status_cb)) + if (frameskip_type == FRAMESKIP_FIXED_INTERVAL) + environ_cb(RETRO_ENVIRONMENT_SET_AUDIO_BUFFER_STATUS_CALLBACK, NULL); + else { - retro_audio_buff_active = false; - retro_audio_buff_occupancy = 0; - retro_audio_buff_underrun = false; - retro_audio_latency = 0; + struct retro_audio_buffer_status_callback buf_status_cb; + buf_status_cb.callback = retro_audio_buff_status_cb; + if (!environ_cb(RETRO_ENVIRONMENT_SET_AUDIO_BUFFER_STATUS_CALLBACK, + &buf_status_cb)) + { + retro_audio_buff_active = false; + retro_audio_buff_occupancy = 0; + retro_audio_buff_underrun = false; + retro_audio_latency = 0; + calculate_audio_latency = false; + } } - else + + if (calculate_audio_latency) { /* Frameskip is enabled - increase frontend * audio latency to minimise potential @@ -1244,13 +1265,9 @@ static void retro_set_audio_buff_status_cb(void) retro_audio_latency = (retro_audio_latency + 0x1F) & ~0x1F; } } - else - { - environ_cb(RETRO_ENVIRONMENT_SET_AUDIO_BUFFER_STATUS_CALLBACK, NULL); - retro_audio_latency = 0; - } update_audio_latency = true; + frameskip_counter = 0; } static void update_variables(bool in_flight); @@ -1281,8 +1298,12 @@ bool retro_load_game(const struct retro_game_info *info) { port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X, "Left Analog X" }, \ { port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y, "Left Analog Y" }, \ { port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X, "Right Analog X" }, \ - { port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y, "Right Analog Y" }, - + { port, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y, "Right Analog Y" }, \ + { port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_TRIGGER, "Gun Trigger" }, \ + { port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_RELOAD, "Gun Reload" }, \ + { port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_AUX_A, "Gun Aux A" }, \ + { port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_AUX_B, "Gun Aux B" }, + JOYP(0) JOYP(1) JOYP(2) @@ -1535,43 +1556,41 @@ static void update_variables(bool in_flight) #ifdef GPU_PEOPS int gpu_peops_fix = 0; #endif - unsigned prev_frameskip_type; + frameskip_type_t prev_frameskip_type; - var.key = "pcsx_rearmed_frameskip_type"; var.value = NULL; + var.key = "pcsx_rearmed_frameskip_type"; prev_frameskip_type = frameskip_type; - frameskip_type = 0; + frameskip_type = FRAMESKIP_NONE; pl_rearmed_cbs.frameskip = 0; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (strcmp(var.value, "auto") == 0) - frameskip_type = 1; + frameskip_type = FRAMESKIP_AUTO; if (strcmp(var.value, "auto_threshold") == 0) - frameskip_type = 2; + frameskip_type = FRAMESKIP_AUTO_THRESHOLD; if (strcmp(var.value, "fixed_interval") == 0) - frameskip_type = 3; + frameskip_type = FRAMESKIP_FIXED_INTERVAL; } if (frameskip_type != 0) pl_rearmed_cbs.frameskip = -1; - - var.key = "pcsx_rearmed_frameskip_threshold"; + var.value = NULL; - - frameskip_threshold = 30; - + var.key = "pcsx_rearmed_frameskip_threshold"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) - frameskip_threshold = strtol(var.value, NULL, 10); + { + frameskip_threshold = strtol(var.value, NULL, 10); + } - var.key = "pcsx_rearmed_frameskip"; var.value = NULL; - - frameskip_interval = 1; - + var.key = "pcsx_rearmed_frameskip_interval"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) - frameskip_interval = strtol(var.value, NULL, 10); + { + frameskip_interval = strtol(var.value, NULL, 10); + } var.value = NULL; var.key = "pcsx_rearmed_region"; @@ -2341,44 +2360,42 @@ unsigned char axis_range_modifier(int16_t axis_value, bool is_square) static void update_input_guncon(int port, int ret) { - //ToDo move across to: - //RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X - //RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y - //RETRO_DEVICE_ID_LIGHTGUN_TRIGGER - //RETRO_DEVICE_ID_LIGHTGUN_RELOAD - //RETRO_DEVICE_ID_LIGHTGUN_AUX_A - //RETRO_DEVICE_ID_LIGHTGUN_AUX_B - //Though not sure these are hooked up properly on the Pi + //ToDo: + //Core option for cursors for both players + //Separate pointer and lightgun control types + //Mouse range is -32767 -> 32767 + //1% is about 655 + //Use the left analog stick field to store the absolute coordinates + //Fix cursor to top-left when gun is detected as "offscreen" + if (input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN) || input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_RELOAD)) + { + in_analog_left[port][0] = -32767; + in_analog_left[port][1] = -32767; + } + else + { + int gunx = input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X); + int guny = input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y); + + in_analog_left[port][0] = (gunx * GunconAdjustRatioX) + (GunconAdjustX * 655); + in_analog_left[port][1] = (guny * GunconAdjustRatioY) + (GunconAdjustY * 655); + } + //GUNCON has 3 controls, Trigger,A,B which equal Circle,Start,Cross // Trigger - //The 1 is hardcoded instead of port to prevent the overlay mouse button libretro crash bug - if (input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT)) - { + if (input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_TRIGGER) || input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_RELOAD)) in_keystate[port] |= (1 << DKEY_CIRCLE); - } // A - if (input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT)) - { + if (input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_AUX_A)) in_keystate[port] |= (1 << DKEY_START); - } // B - if (input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_MIDDLE)) - { + if (input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_AUX_B)) in_keystate[port] |= (1 << DKEY_CROSS); - } - - int gunx = input_state_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_X); - int guny = input_state_cb(port, RETRO_DEVICE_POINTER, 0, RETRO_DEVICE_ID_POINTER_Y); - - //Mouse range is -32767 -> 32767 - //1% is about 655 - //Use the left analog stick field to store the absolute coordinates - in_analog_left[port][0] = (gunx * GunconAdjustRatioX) + (GunconAdjustX * 655); - in_analog_left[port][1] = (guny * GunconAdjustRatioY) + (GunconAdjustY * 655); + } static void update_input_negcon(int port, int ret) @@ -2639,23 +2656,23 @@ void retro_run(void) * be skipped */ pl_rearmed_cbs.fskip_force = 0; pl_rearmed_cbs.fskip_dirty = 0; - if ((frameskip_type > 0) && retro_audio_buff_active) + + if (frameskip_type != FRAMESKIP_NONE) { - bool skip_frame; + bool skip_frame = false; switch (frameskip_type) { - case 1: /* auto */ - skip_frame = retro_audio_buff_underrun; + case FRAMESKIP_AUTO: + skip_frame = retro_audio_buff_active && retro_audio_buff_underrun; break; - case 2: /* threshold */ - skip_frame = (retro_audio_buff_occupancy < frameskip_threshold); + case FRAMESKIP_AUTO_THRESHOLD: + skip_frame = retro_audio_buff_active && (retro_audio_buff_occupancy < frameskip_threshold); break; - case 3: /* fixed */ + case FRAMESKIP_FIXED_INTERVAL: skip_frame = true; break; default: - skip_frame = false; break; } @@ -3005,8 +3022,9 @@ void retro_deinit(void) /* Have to reset disks struct, otherwise * fnames/flabels will leak memory */ disk_init(); - frameskip_type = 0; + frameskip_type = FRAMESKIP_NONE; frameskip_threshold = 0; + frameskip_interval = 0; frameskip_counter = 0; retro_audio_buff_active = false; retro_audio_buff_occupancy = 0;