From 91993ef4a3b43e6c5821189d85649dfe45f5b1f1 Mon Sep 17 00:00:00 2001 From: kichikuou Date: Sun, 9 Feb 2020 18:33:20 +0900 Subject: [PATCH] Android: CD-DA emulation support --- .../github/kichikuou/system3/GameActivity.kt | 8 +-- src/CMakeLists.txt | 9 ++-- src/android/mako.cpp | 53 +++++++++++++++++++ src/sys/mako.h | 4 +- 4 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 src/android/mako.cpp 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 9b95544..154eeec 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 @@ -72,7 +72,7 @@ class GameActivity : SDLActivity() { } // These functions are called in the SDL thread by JNI. - @Suppress("unused") fun cddaStart(track: Int, loop: Int) = cdda.start(track, loop) + @Suppress("unused") fun cddaStart(track: Int, loop: Boolean) = cdda.start(track, loop) @Suppress("unused") fun cddaStop() = cdda.stop() @Suppress("unused") fun cddaCurrentPosition() = cdda.currentPosition() @Suppress("unused") fun midiStart(buf: ByteArray, loop: Int) = midi.start(buf, loop) @@ -92,18 +92,18 @@ private class CddaPlayer(private val playlistPath: File) { private val player = MediaPlayer() private var playerPaused = false - fun start(track: Int, loop: Int) { + fun start(track: Int, loop: Boolean) { val f = playlist.elementAtOrNull(track) if (f.isNullOrEmpty()) { Log.w("cddaStart", "No playlist entry for track $track") return } - Log.v("cddaStart", f) + Log.v("cddaStart", "${f} Loop:${loop}") try { player.apply { reset() setDataSource(File(playlistPath.parent, f).path) - isLooping = loop == 0 + isLooping = loop prepare() start() } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9df3491..827f796 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -30,10 +30,13 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Emscripten") linux/nact_linux.cpp emscripten/mako.cpp ) +elseif (CMAKE_SYSTEM_NAME STREQUAL "Android") + set(SRC_PLATFORM + linux/nact_linux.cpp + android/mako.cpp + ) else() - if (NOT ANDROID) - set(DEFAULT_FONT_PATH ${CMAKE_INSTALL_PREFIX}/share/system3/fonts/) - endif() + set(DEFAULT_FONT_PATH ${CMAKE_INSTALL_PREFIX}/share/system3/fonts/) set(SRC_MAKO sys/mako.cpp diff --git a/src/android/mako.cpp b/src/android/mako.cpp new file mode 100644 index 0000000..31124f1 --- /dev/null +++ b/src/android/mako.cpp @@ -0,0 +1,53 @@ +#include +#include +#include +#include "mako.h" + +MAKO::MAKO(NACT* parent) + : current_music(0) + , next_loop(0) +{ + for (int i = 1; i <= 99; i++) + cd_track[i] = i; +} + +void MAKO::play_music(int page) +{ + if (current_music == page) + return; + + JNIEnv* env = (JNIEnv*)SDL_AndroidGetJNIEnv(); + if (env->PushLocalFrame(16) < 0) { + __android_log_write(ANDROID_LOG_ERROR, "system3", + "Failed to allocate JVM local references"); + return; + } + jobject context = (jobject)SDL_AndroidGetActivity(); + jmethodID mid = env->GetMethodID(env->GetObjectClass(context), + "cddaStart", "(IZ)V"); + env->CallVoidMethod(context, mid, cd_track[page] + 1, next_loop ? 0 : 1); + env->PopLocalFrame(NULL); + + current_music = page; + next_loop = 0; +} + +void MAKO::stop_music() +{ + if (!current_music) + return; + + JNIEnv* env = (JNIEnv*)SDL_AndroidGetJNIEnv(); + if (env->PushLocalFrame(16) < 0) { + __android_log_write(ANDROID_LOG_ERROR, "system3", + "Failed to allocate JVM local references"); + return; + } + jobject context = (jobject)SDL_AndroidGetActivity(); + jmethodID mid = env->GetMethodID(env->GetObjectClass(context), + "cddaStop", "()V"); + env->CallVoidMethod(context, mid); + env->PopLocalFrame(NULL); + + current_music = 0; +} diff --git a/src/sys/mako.h b/src/sys/mako.h index 2fe9606..f6dd0d0 100644 --- a/src/sys/mako.h +++ b/src/sys/mako.h @@ -13,7 +13,7 @@ #include "../common.h" #include "nact.h" -#ifndef EMSCRIPTEN +#if !defined(__EMSCRIPTEN__) && !defined(__ANDROID__) #define MAX_SAMPLES (128 * 1024) #define MAX_MMLS (128 * 1024) @@ -128,7 +128,7 @@ public: int cd_track[100]; // Z }; -#else // EMSCRIPTEN +#else // Emscripten or Android class MAKO { public: