--- /dev/null
+#include <sys/time.h>
+#include "main.h"
+#include "throttle.h"
+
+#if 0
+static uint64 tfreq;
+static uint64 desiredfps;
+
+void RefreshThrottleFPS(void)
+{
+ uint64 f=FCEUI_GetDesiredFPS();
+ // great, a bit faster than before
+ //f = (f*65) >> 6;
+ desiredfps=f>>8;
+ tfreq=1000000;
+ tfreq<<=16; /* Adjustment for fps returned from FCEUI_GetDesiredFPS(). */
+}
+
+static uint64 GetCurTime(void)
+{
+ uint64 ret;
+ struct timeval tv;
+
+ gettimeofday(&tv,0);
+ ret=(uint64)tv.tv_sec*1000000;
+ ret+=tv.tv_usec;
+ return(ret);
+}
+
+INLINE void SpeedThrottle(void)
+{
+ static uint64 ttime,ltime;
+
+ waiter:
+
+ ttime=GetCurTime();
+
+ if( (ttime-ltime) < (tfreq/desiredfps) )
+ {
+ goto waiter;
+ }
+ if( (ttime-ltime) >= (tfreq*4/desiredfps))
+ ltime=ttime;
+ else
+ ltime+=tfreq/desiredfps;
+}
+
+#else
+
+extern uint8 PAL;
+extern int FSkip, FSkip_setting;
+static int usec_aim = 0, usec_done = 0;
+static int skip_count = 0;
+
+INLINE void SpeedThrottle(void)
+{
+ static struct timeval tv_prev;
+ struct timeval tv_now;
+ int delta_nom = PAL ? 19997 : 16639; // ~50.007, 19.997 ms/frame : ~60.1, 16.639 ms/frame
+
+
+ if (usec_done == 0) { // first time
+ usec_done = 1;
+ gettimeofday(&tv_prev, 0);
+ return;
+ }
+
+ gettimeofday(&tv_now, 0);
+
+ usec_aim += delta_nom;
+ if (tv_now.tv_sec != tv_prev.tv_sec)
+ usec_done += 1000000;
+ usec_done += tv_now.tv_usec - tv_prev.tv_usec;
+
+#ifdef FRAMESKIP
+ if (FSkip_setting >= 0)
+ {
+ if (skip_count >= FSkip_setting)
+ skip_count = 0;
+ else {
+ skip_count++;
+ FSkip = 1;
+ }
+ }
+ else if (usec_done > usec_aim)
+ {
+ /* auto frameskip */
+ if (usec_done - usec_aim > 150000)
+ usec_done = usec_aim = 0; // too much behind, try to recover..
+ FSkip = 1;
+ tv_prev = tv_now;
+ return;
+ }
+#endif
+
+ tv_prev = tv_now;
+ while (usec_done < usec_aim)
+ {
+ gettimeofday(&tv_now, 0);
+
+ if (tv_now.tv_sec != tv_prev.tv_sec)
+ usec_done += 1000000;
+ usec_done += tv_now.tv_usec - tv_prev.tv_usec;
+ tv_prev = tv_now;
+ }
+ usec_done = usec_done - usec_aim + 1; // reset to prevent overflows
+ usec_aim = 0;
+}
+#endif
+