@@ -87,6 +87,7 @@ static RTC_NOINIT_ATTR panic_trace_t panicTrace;
8787static RTC_NOINIT_ATTR time_t rtcValue ;
8888static bool panicTraceCleared = false;
8989static bool exitCalled = false;
90+ static int overclockLevel , overclockMhz ;
9091static uint32_t indicators ;
9192static rg_color_t ledColor = -1 ;
9293static rg_stats_t statistics ;
@@ -209,11 +210,12 @@ static void update_statistics(void)
209210 // Hard to fix this sync issue without a lock, which I don't want to use...
210211 ticks = RG_MAX (ticks , frames );
211212
212- statistics .busyPercent = busyTime / totalTime * 100.f ;
213213 statistics .totalFPS = ticks / totalTimeSecs ;
214214 statistics .skippedFPS = (ticks - frames ) / totalTimeSecs ;
215215 statistics .fullFPS = fullFrames / totalTimeSecs ;
216216 statistics .partialFPS = partFrames / totalTimeSecs ;
217+ statistics .busyPercent = busyTime / totalTime * 100.f ;
218+ statistics .speedPercent = app .tickRate > 0 ? (statistics .totalFPS / app .tickRate * 100.f ) : 100.f ;
217219 }
218220 statistics .uptime = rg_system_timer () / 1000000 ;
219221
@@ -276,9 +278,9 @@ static void system_monitor_task(void *arg)
276278
277279 // Auto frameskip
278280 // TODO: Use a rolling average of frameTimes instead of this mess
279- if (statistics .ticks > app .tickRate * 2 )
281+ if (app . tickRate > 0 && statistics .ticks > app .tickRate * 2 )
280282 {
281- float speed = (( float ) statistics .totalFPS / app . tickRate ) * 100.f / app .speed ;
283+ float speed = statistics .speedPercent / app .speed ;
282284 // We don't fully go back to 0 frameskip because if we dip below 95% once, we're clearly
283285 // borderline in power and going back to 0 is just asking for stuttering...
284286 if (speed > 99.f && statistics .busyPercent < 85.f && app .frameskip > 1 )
@@ -411,8 +413,6 @@ rg_app_t *rg_system_init(int sampleRate, const rg_handlers_t *handlers, void *_u
411413 .tickTimeout = 3000000 ,
412414 .frameTime = 1000000 / 60 ,
413415 .frameskip = 1 , // This can be overriden on a per-app basis if needed, do not set 0 here!
414- .overclock_level = 0 ,
415- .overclock_mhz = 240 ,
416416 .lowMemoryMode = false,
417417 .enWatchdog = true,
418418 .isColdBoot = true,
@@ -802,7 +802,7 @@ rg_app_t *rg_system_get_app(void)
802802 return & app ;
803803}
804804
805- rg_stats_t rg_system_get_counters (void )
805+ rg_stats_t rg_system_get_stats (void )
806806{
807807 return statistics ;
808808}
@@ -1092,9 +1092,24 @@ int rg_system_get_log_level(void)
10921092 return app .logLevel ;
10931093}
10941094
1095- int rg_system_get_cpu_speed ( void )
1095+ void rg_system_set_app_speed ( float speed )
10961096{
1097- return app .overclock_mhz ;
1097+ float newSpeed = RG_MIN (2.5f , RG_MAX (0.5f , speed ));
1098+ if (newSpeed == app .speed )
1099+ return ;
1100+ // FIXME: We need to store the actual default frameskip so we can return to it...
1101+ app .frameskip = (newSpeed - 0.5f ) * 3 ;
1102+ app .frameTime = 1000000.f / (app .tickRate * newSpeed );
1103+ app .speed = newSpeed ;
1104+ // There's a bug in esp-idf v4.4.8 where many frequencies play at the wrong speed.
1105+ // Still trying to find how to work around that...
1106+ rg_audio_set_sample_rate (app .sampleRate * newSpeed );
1107+ rg_system_event (RG_EVENT_SPEEDUP , NULL );
1108+ }
1109+
1110+ float rg_system_get_app_speed (void )
1111+ {
1112+ return app .speed ;
10981113}
10991114
11001115void rg_system_set_overclock (int level )
@@ -1157,10 +1172,11 @@ void rg_system_set_overclock(int level)
11571172 if (!original_tickRate )
11581173 original_tickRate = app .tickRate ;
11591174 app .tickRate = original_tickRate * (240.f / real_mhz );
1160- app .overclock_level = level ;
1161- app .overclock_mhz = real_mhz ;
11621175 app .frameskip = 1 ;
11631176
1177+ overclockLevel = level ;
1178+ overclockMhz = real_mhz ;
1179+
11641180 RG_LOGW ("Overclock level %d applied: %dMhz" , level , real_mhz );
11651181#else
11661182 RG_LOGE ("Overclock not supported on this platform!" );
@@ -1169,7 +1185,19 @@ void rg_system_set_overclock(int level)
11691185
11701186int rg_system_get_overclock (void )
11711187{
1172- return app .overclock_level ;
1188+ return overclockLevel ;
1189+ }
1190+
1191+ int rg_system_get_cpu_speed (void )
1192+ {
1193+ if (overclockMhz )
1194+ return overclockMhz ;
1195+ #if CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ
1196+ return CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ ;
1197+ #elif CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ
1198+ return CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ ;
1199+ #endif
1200+ return 0 ;
11731201}
11741202
11751203char * rg_emu_get_path (rg_path_type_t pathType , const char * filename )
@@ -1403,28 +1431,12 @@ rg_emu_states_t *rg_emu_get_states(const char *romPath, size_t slots)
14031431
14041432bool rg_emu_reset (bool hard )
14051433{
1406- if (app .speed != 1.f )
1407- rg_emu_set_speed (1.f );
1434+ rg_system_set_app_speed (1.f );
14081435 if (app .handlers .reset )
14091436 return app .handlers .reset (hard );
14101437 return false;
14111438}
14121439
1413- void rg_emu_set_speed (float speed )
1414- {
1415- app .speed = RG_MIN (2.5f , RG_MAX (0.5f , speed ));
1416- // FIXME: We need to store the actual default frameskip so we can return to it...
1417- app .frameskip = (app .speed - 0.5f ) * 3 ;
1418- app .frameTime = 1000000.f / (app .tickRate * app .speed );
1419- rg_audio_set_sample_rate (app .sampleRate * app .speed );
1420- rg_system_event (RG_EVENT_SPEEDUP , NULL );
1421- }
1422-
1423- float rg_emu_get_speed (void )
1424- {
1425- return app .speed ;
1426- }
1427-
14281440#ifdef RG_ENABLE_PROFILING
14291441// Note this profiler might be inaccurate because of:
14301442// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=28205
0 commit comments