bugfixes, cd/Memory.s
[picodrive.git] / platform / gp2x / emu.c
index 033f275..632ad18 100644 (file)
@@ -973,21 +973,11 @@ static void updateSound(int len)
 }\r
 \r
 \r
-static void SkipFrame(int do_sound)\r
+static void SkipFrame(void)\r
 {\r
-       void *sndbuff_tmp = 0;\r
-       if (PsndOut && !do_sound) {\r
-               sndbuff_tmp = PsndOut;\r
-               PsndOut = 0;\r
-       }\r
-\r
        PicoSkipFrame=1;\r
        PicoFrame();\r
        PicoSkipFrame=0;\r
-\r
-       if (sndbuff_tmp && !do_sound) {\r
-               PsndOut = sndbuff_tmp;\r
-       }\r
 }\r
 \r
 \r
@@ -1166,7 +1156,7 @@ void emu_Loop(void)
                                // when second changes, but we don't want buffer to starve.\r
                                if(PsndOut && frames_done < target_fps && frames_done > target_fps-5) {\r
                                        updateKeys();\r
-                                       SkipFrame(1); frames_done++;\r
+                                       SkipFrame(); frames_done++;\r
                                }\r
 \r
                                frames_done  -= target_fps; if (frames_done  < 0) frames_done  = 0;\r
@@ -1179,7 +1169,7 @@ void emu_Loop(void)
                if(currentConfig.Frameskip >= 0) { // frameskip enabled\r
                        for(i = 0; i < currentConfig.Frameskip; i++) {\r
                                updateKeys();\r
-                               SkipFrame(1); frames_done++;\r
+                               SkipFrame(); frames_done++;\r
                                if (PsndOut) { // do framelimitting if sound is enabled\r
                                        gettimeofday(&tval, 0);\r
                                        if(thissec != tval.tv_sec) tval.tv_usec+=1000000;\r
@@ -1191,8 +1181,14 @@ void emu_Loop(void)
                        }\r
                } else if(tval.tv_usec > lim_time) { // auto frameskip\r
                        // no time left for this frame - skip\r
+                       if (tval.tv_usec - lim_time >= 0x300000) {\r
+                               /* something caused a slowdown for us (disk access? cache flush?)\r
+                                * try to recover by resetting timing... */\r
+                               reset_timing = 1;\r
+                               continue;\r
+                       }\r
                        updateKeys();\r
-                       SkipFrame(tval.tv_usec < lim_time+target_frametime); frames_done++;\r
+                       SkipFrame(/*tval.tv_usec < lim_time+target_frametime*/); frames_done++;\r
                        continue;\r
                }\r
 \r
@@ -1259,14 +1255,14 @@ if (Pico.m.frame_count == 31563) {
 \r
                // check time\r
                gettimeofday(&tval, 0);\r
-               if(thissec != tval.tv_sec) tval.tv_usec+=1000000;\r
+               if (thissec != tval.tv_sec) tval.tv_usec+=1000000;\r
 \r
-               // sleep if we are still too fast\r
-               if(PsndOut != 0 || currentConfig.Frameskip < 0)\r
+               if (currentConfig.Frameskip < 0 && tval.tv_usec - lim_time >= 0x300000) // slowdown detection\r
+                       reset_timing = 1;\r
+               else if (PsndOut != NULL || currentConfig.Frameskip < 0)\r
                {\r
+                       // sleep if we are still too fast\r
                        // usleep sleeps for ~20ms minimum, so it is not a solution here\r
-                       gettimeofday(&tval, 0);\r
-                       if(thissec != tval.tv_sec) tval.tv_usec+=1000000;\r
                        if(tval.tv_usec < lim_time)\r
                        {\r
                                // we are too fast\r