From be18e06e091129f4e8cc327837a91ce88858df6d Mon Sep 17 00:00:00 2001 From: kichikuou Date: Fri, 17 Mar 2023 13:41:50 +0900 Subject: [PATCH] Fix MAKO::check_music() This fixes infinite loop in the opening demo of Only You, waiting for the end of the music. --- .../github/kichikuou/system3/GameActivity.kt | 8 ++++ src/android/mako.cpp | 44 ++++++++++++++----- src/emscripten/mako.cpp | 10 ++++- src/linux/mako.cpp | 14 +++++- src/win/mako.cpp | 14 +++++- 5 files changed, 76 insertions(+), 14 deletions(-) diff --git a/android/app/src/main/java/io/github/kichikuou/system3/GameActivity.kt b/android/app/src/main/java/io/github/kichikuou/system3/GameActivity.kt index e1a886a..c90c489 100644 --- a/android/app/src/main/java/io/github/kichikuou/system3/GameActivity.kt +++ b/android/app/src/main/java/io/github/kichikuou/system3/GameActivity.kt @@ -195,6 +195,10 @@ private class CddaPlayer(private val playlistPath: File) { private val player = MediaPlayer() private var playerPaused = false + init { + player.setOnCompletionListener { currentTrack = 0 } + } + fun start(track: Int, loop: Boolean) { val f = playlist.elementAtOrNull(track - 1) if (f.isNullOrEmpty()) { @@ -251,6 +255,10 @@ private class MidiPlayer { private var playing = false private var playerPaused = false + init { + player.setOnCompletionListener { playing = false } + } + fun start(path: String, loop: Boolean) { try { player.apply { diff --git a/src/android/mako.cpp b/src/android/mako.cpp index 65a1107..1573944 100644 --- a/src/android/mako.cpp +++ b/src/android/mako.cpp @@ -123,25 +123,47 @@ void MAKO::stop_music() return; JNILocalFrame jni(16); - if (!jni.env()) - return; - - if (current_music < 100 && cd_track[current_music]) { - jmethodID mid = jni.GetMethodID("cddaStop", "()V"); - jni.env()->CallVoidMethod(jni.context(), mid); - } else { - jmethodID mid = jni.GetMethodID("midiStop", "()V"); - jni.env()->CallVoidMethod(jni.context(), mid); + if (jni.env()) { + if (current_music < 100 && cd_track[current_music]) { + jmethodID cdda = jni.GetMethodID("cddaStop", "()V"); + jni.env()->CallVoidMethod(jni.context(), cdda); + } else { + jmethodID mid = jni.GetMethodID("midiStop", "()V"); + jni.env()->CallVoidMethod(jni.context(), mid); + } } - if (use_fm) + if (fm) { SDL_PauseAudio(1); + SDL_LockMutex(fm_mutex); + fm = nullptr; + SDL_UnlockMutex(fm_mutex); + } current_music = 0; } bool MAKO::check_music() { - return current_music != 0; + if (!current_music) + return false; + if (fm) { + int mark, loop; + SDL_LockMutex(fm_mutex); + fm->get_mark(&mark, &loop); + SDL_UnlockMutex(fm_mutex); + return !loop; + } + + JNILocalFrame jni(16); + if (!jni.env()) + return false; + if (current_music < 100 && cd_track[current_music]) { + jmethodID cdda = jni.GetMethodID("cddaCurrentPosition", "()I"); + return jni.env()->CallIntMethod(jni.context(), cdda) != 0; + } else { + jmethodID mid = jni.GetMethodID("midiCurrentPosition", "()I"); + return jni.env()->CallIntMethod(jni.context(), mid) != 0; + } } void MAKO::get_mark(int* mark, int* loop) diff --git a/src/emscripten/mako.cpp b/src/emscripten/mako.cpp index 17f1f02..049e00b 100644 --- a/src/emscripten/mako.cpp +++ b/src/emscripten/mako.cpp @@ -70,7 +70,15 @@ void MAKO::stop_music() bool MAKO::check_music() { - return current_music != 0; + if (!current_music) + return false; + if (fm) { + int mark, loop; + fm->get_mark(&mark, &loop); + return !loop; + } + + return EM_ASM_INT_V( return xsystem35.cdPlayer.getPosition(); ) != 0; } void MAKO::get_mark(int* mark, int* loop) diff --git a/src/linux/mako.cpp b/src/linux/mako.cpp index 9d5fa5b..82d353a 100644 --- a/src/linux/mako.cpp +++ b/src/linux/mako.cpp @@ -150,12 +150,24 @@ void MAKO::stop_music() mix_music = NULL; smf.clear(); } - Mix_HookMusic(NULL, NULL); + if (fm) { + Mix_HookMusic(NULL, NULL); + SDL_LockMutex(fm_mutex); + fm = nullptr; + SDL_UnlockMutex(fm_mutex); + } current_music = 0; } bool MAKO::check_music() { + if (fm) { + int mark, loop; + SDL_LockMutex(fm_mutex); + fm->get_mark(&mark, &loop); + SDL_UnlockMutex(fm_mutex); + return !loop; + } return Mix_PlayingMusic(); } diff --git a/src/win/mako.cpp b/src/win/mako.cpp index 6a44429..b51da8c 100644 --- a/src/win/mako.cpp +++ b/src/win/mako.cpp @@ -353,12 +353,24 @@ void MAKO::stop_music() delete music; music = nullptr; } - SDL_PauseAudio(1); + if (fm) { + SDL_PauseAudio(1); + SDL_LockMutex(fm_mutex); + fm = nullptr; + SDL_UnlockMutex(fm_mutex); + } current_music = 0; } bool MAKO::check_music() { + if (fm) { + int mark, loop; + SDL_LockMutex(fm_mutex); + fm->get_mark(&mark, &loop); + SDL_UnlockMutex(fm_mutex); + return !loop; + } return music && music->is_playing(); }