From e53e2b40c18dd4c80a7e1960cf9200bbba8ef3d2 Mon Sep 17 00:00:00 2001 From: kichikuou Date: Sun, 23 Apr 2017 19:35:03 +0900 Subject: [PATCH] Prevent busy loop by CDDA play time sync --- src/cdrom.emscripten.c | 3 +++ src/nact.c | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/src/cdrom.emscripten.c b/src/cdrom.emscripten.c index 975748a..653416c 100644 --- a/src/cdrom.emscripten.c +++ b/src/cdrom.emscripten.c @@ -23,6 +23,8 @@ #include "portab.h" #include "cdrom.h" +int cdrom_getpos_count; + static int cdrom_init(char *); static int cdrom_exit(); static int cdrom_start(int, boolean); @@ -60,6 +62,7 @@ int cdrom_stop() { } int cdrom_getPlayingInfo(cd_time *info) { + cdrom_getpos_count++; int t = EM_ASM_INT_V( return xsystem35.cdPlayer.getPosition(); ); info->t = t & 0xff; FRAMES_TO_MSF(t >> 8, &info->m, &info->s, &info->f); diff --git a/src/nact.c b/src/nact.c index 4e2a046..b6525c7 100644 --- a/src/nact.c +++ b/src/nact.c @@ -185,10 +185,14 @@ static int checkMessage() { #ifdef __EMSCRIPTEN__ +extern int cdrom_getpos_count; + static void mainloop() { if (nact->is_quit) emscripten_cancel_main_loop(); + cdrom_getpos_count = 0; + for (int cnt = 0; cnt < 10000; cnt++) { nact->input_state = InputNotChecked; @@ -201,6 +205,8 @@ static void mainloop() { if (nact->input_state == InputCheckMissed) break; + if (cdrom_getpos_count >= 2) + break; } if (!nact->is_message_locked && nact->input_state == InputNotChecked) sys_getInputInfo();