diff --git a/core/src/main/java/dev/quoije/umd/rco/vsmx/objects/MoviePlayer.java b/core/src/main/java/dev/quoije/umd/rco/vsmx/objects/MoviePlayer.java index 6cfaf3b..05f26b2 100644 --- a/core/src/main/java/dev/quoije/umd/rco/vsmx/objects/MoviePlayer.java +++ b/core/src/main/java/dev/quoije/umd/rco/vsmx/objects/MoviePlayer.java @@ -80,6 +80,8 @@ public class MoviePlayer extends BaseNativeObject { if (!previousMenuMode && this.menuMode) { VsmxBaseObject callback = controller.getPropertyValue("onMenu"); + System.err.println("[menu] onMenu fires, callback=" + callback + + " (" + (callback == null ? "null" : callback.getClass().getSimpleName()) + ")"); if (callback instanceof VsmxFunction function) { interpreter.interpretFunction(function, null, new VsmxBaseObject[0]); } diff --git a/ui/src/main/java/dev/quoije/umd/ui/PlayerApp.java b/ui/src/main/java/dev/quoije/umd/ui/PlayerApp.java index 084ec5e..82c7d42 100644 --- a/ui/src/main/java/dev/quoije/umd/ui/PlayerApp.java +++ b/ui/src/main/java/dev/quoije/umd/ui/PlayerApp.java @@ -70,6 +70,7 @@ public final class PlayerApp extends Application { private volatile VsmxInterpreter menuInterpreter; private volatile VsmxBaseObject mmActivate; + private volatile VsmxNativeObject controllerObject; @Override public void start(Stage stage) { @@ -146,11 +147,14 @@ public final class PlayerApp extends Application { } private void openMenuDirectly() { - VsmxBaseObject fn = mmActivate; VsmxInterpreter interpreter = menuInterpreter; - if (fn instanceof VsmxFunction function && interpreter != null) { - System.err.println("[debug] opening menu directly"); - interpreter.interpretFunction(function, null, new VsmxBaseObject[0]); + VsmxNativeObject c = controllerObject; + if (interpreter != null && c != null) { + VsmxBaseObject callback = c.getPropertyValue("onMenu"); + if (callback instanceof VsmxFunction function) { + System.err.println("[debug] returning to menu"); + interpreter.interpretFunction(function, null, new VsmxBaseObject[0]); + } } } @@ -181,7 +185,7 @@ public final class PlayerApp extends Application { int audioFlag, int subtitleNumber, int subtitleFlag) { Playlist.Stream stream = playlist.streamForPlayListNumber(playListNumber); if (stream != null) { - startPlayback(isoPath, stream.name(), playListNumber); + startPlayback(isoPath, stream, playListNumber); } } @@ -209,13 +213,15 @@ public final class PlayerApp extends Application { moviePlayer = (MoviePlayer) movieplayer.getObject(); menuInterpreter = interpreter; mmActivate = globals.getPropertyValue("mm_activate"); + this.controllerObject = controllerObject; controller.callCallback(interpreter, "onAutoPlay", null); } catch (Exception e) { e.printStackTrace(); } } - private void startPlayback(String isoPath, String streamName, int playListNumber) { + private void startPlayback(String isoPath, Playlist.Stream stream, int playListNumber) { + String streamName = stream.name(); Thread player = new Thread(() -> { try (UmdIsoReader iso = new UmdIsoReader(Path.of(isoPath)); PlaybackEngine engine = PlaybackEngine.open(iso, streamName, 0)) { @@ -232,11 +238,22 @@ public final class PlayerApp extends Application { long baseNanos = clockStartNanos; PlaybackEngine.VideoFrame frame; + int lastChapter = -2; while ((frame = engine.nextVideoFrame()) != null) { if (skipRequested) { skipRequested = false; break; } + int chapter = stream.getChapterNumber(frame.pts()); + if (chapter != lastChapter) { + if (lastChapter != -2) { + MoviePlayer mp = moviePlayer; + if (mp != null) { + mp.onChapter(chapter + 1); + } + } + lastChapter = chapter; + } int index = videoBufferIndex++ & 1; int[] argb = argbBuffers[index]; int pixelCount = frame.width() * frame.height();