7 static uint64 desiredfps;
9 void RefreshThrottleFPS(void)
11 uint64 f=FCEUI_GetDesiredFPS();
12 // great, a bit faster than before
16 tfreq<<=16; /* Adjustment for fps returned from FCEUI_GetDesiredFPS(). */
19 static uint64 GetCurTime(void)
25 ret=(uint64)tv.tv_sec*1000000;
30 INLINE void SpeedThrottle(void)
32 static uint64 ttime,ltime;
38 if( (ttime-ltime) < (tfreq/desiredfps) )
42 if( (ttime-ltime) >= (tfreq*4/desiredfps))
45 ltime+=tfreq/desiredfps;
51 extern int FSkip, FSkip_setting;
52 static int usec_aim = 0, usec_done = 0;
53 static int skip_count = 0;
55 INLINE void SpeedThrottle(void)
57 static struct timeval tv_prev;
58 struct timeval tv_now;
59 int delta_nom = PAL ? 19997 : 16639; // ~50.007, 19.997 ms/frame : ~60.1, 16.639 ms/frame
62 if (usec_done == 0) { // first time
64 gettimeofday(&tv_prev, 0);
68 gettimeofday(&tv_now, 0);
70 usec_aim += delta_nom;
71 if (tv_now.tv_sec != tv_prev.tv_sec)
73 usec_done += tv_now.tv_usec - tv_prev.tv_usec;
76 if (FSkip_setting >= 0)
78 if (skip_count >= FSkip_setting)
85 else if (usec_done > usec_aim + 1024*4)
88 if (usec_done - usec_aim > 150000)
89 usec_done = usec_aim = 1; // too much behind, try to recover..
97 while (usec_done < usec_aim)
99 gettimeofday(&tv_now, 0);
101 if (tv_now.tv_sec != tv_prev.tv_sec)
102 usec_done += 1000000;
103 usec_done += tv_now.tv_usec - tv_prev.tv_usec;
106 usec_done = usec_done - usec_aim + 1; // reset to prevent overflows