aboutsummaryrefslogtreecommitdiff
path: root/patches/snes9x2005/1000-frameskip-interval.patch
blob: eb920c73928aaa5712992f3f3573f0b00776ca9a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
diff --git a/libretro.c b/libretro.c
index c368d8f..305adee 100644
--- a/libretro.c
+++ b/libretro.c
@@ -57,13 +57,11 @@ static int32_t samplerate = (((SNES_CLOCK_SPEED * 6) / (32 * ONE_APU_CYCLE)));
 static unsigned frameskip_type             = 0;
 static unsigned frameskip_threshold        = 0;
 static uint16_t frameskip_counter          = 0;
+static unsigned frameskip_interval         = 0;
 
 static bool retro_audio_buff_active        = false;
 static unsigned retro_audio_buff_occupancy = 0;
 static bool retro_audio_buff_underrun      = false;
-/* Maximum number of consecutive frames that
- * can be skipped */
-#define FRAMESKIP_MAX 30
 
 static unsigned retro_audio_latency        = 0;
 static bool update_audio_latency           = false;
@@ -341,6 +339,7 @@ void retro_deinit(void)
    frameskip_type             = 0;
    frameskip_threshold        = 0;
    frameskip_counter          = 0;
+   frameskip_interval         = 0;
    retro_audio_buff_active    = false;
    retro_audio_buff_occupancy = 0;
    retro_audio_buff_underrun  = false;
@@ -414,7 +413,7 @@ static void check_variables(bool first_run)
    {
       if (strcmp(var.value, "auto") == 0)
          frameskip_type = 1;
-      else if (strcmp(var.value, "manual") == 0)
+      else if (strcmp(var.value, "auto_threshold") == 0)
          frameskip_type = 2;
    }
 
@@ -426,6 +425,14 @@ static void check_variables(bool first_run)
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
       frameskip_threshold = strtol(var.value, NULL, 10);
 
+   var.key = "catsfc_frameskip_interval";
+   var.value = NULL;
+
+   frameskip_interval = 4;
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+      frameskip_interval = strtol(var.value, NULL, 10);
+
    var.key = "catsfc_overclock_cycles";
    var.value = NULL;
 
@@ -531,7 +538,7 @@ void retro_run(void)
 
       if (skip_frame)
       {
-         if(frameskip_counter < FRAMESKIP_MAX)
+         if(frameskip_counter < frameskip_interval)
          {
             IPPU.RenderThisFrame = false;
             frameskip_counter++;
diff --git a/libretro_core_options.h b/libretro_core_options.h
index b32864a..b69d19a 100644
--- a/libretro_core_options.h
+++ b/libretro_core_options.h
@@ -71,9 +71,9 @@ struct retro_core_option_definition option_defs_us[] = {
       "Frameskip",
       "Skip frames to avoid audio crackling. Improves performance at the expense of visual smoothness.",
       {
-         { "disabled", NULL },
-         { "auto",     "Auto" },
-         { "manual",   "Manual" },
+         { "disabled",       NULL },
+         { "auto",           "Auto" },
+         { "auto_threshold", "Threshold" },
          { NULL, NULL },
       },
       "auto"
@@ -103,6 +103,26 @@ struct retro_core_option_definition option_defs_us[] = {
       },
       "33"
    },
+   {
+      "catsfc_frameskip_interval",
+      "FS Interval",
+      "The maximum number of frames that can be skipped before a new frame is rendered.",
+      {
+         { "0",  NULL },
+         { "1",  NULL },
+         { "2",  NULL },
+         { "3",  NULL },
+         { "4",  NULL },
+         { "5",  NULL },
+         { "6",  NULL },
+         { "7",  NULL },
+         { "8",  NULL },
+         { "9",  NULL },
+         { "10", NULL },
+         { NULL, NULL },
+      },
+      "4"
+   },
    {
       "catsfc_overclock_cycles",
       "Overclock (Restart)",