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;
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
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);
{ 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)
#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";
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)
* 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;
}
/* 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;