From acd4dc239b79e9d9cc4f3e823d710ac8bfc743e7 Mon Sep 17 00:00:00 2001 From: kichikuou Date: Sun, 9 Feb 2020 19:22:47 +0900 Subject: [PATCH] Android: Fix loop parameter handling for CD-DA/MIDI The semantics of `loop` parameter of start() is very confusing. Added comments in cdrom.h/midi.h to clarify the meaning. --- .../io/github/kichikuou/xsystem35/GameActivity.kt | 14 +++++++------- src/cdrom.android.c | 4 ++-- src/cdrom.h | 1 + src/midi.android.c | 4 ++-- src/midi.h | 3 ++- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/android/app/src/main/java/io/github/kichikuou/xsystem35/GameActivity.kt b/android/app/src/main/java/io/github/kichikuou/xsystem35/GameActivity.kt index 7e9f74c..da1efce 100644 --- a/android/app/src/main/java/io/github/kichikuou/xsystem35/GameActivity.kt +++ b/android/app/src/main/java/io/github/kichikuou/xsystem35/GameActivity.kt @@ -72,10 +72,10 @@ 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) + @Suppress("unused") fun midiStart(buf: ByteArray, loop: Boolean) = midi.start(buf, loop) @Suppress("unused") fun midiStop() = midi.stop() @Suppress("unused") fun midiCurrentPosition() = midi.currentPosition() } @@ -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() } @@ -148,13 +148,13 @@ private class MidiPlayer { private var playing = false private var playerPaused = false - fun start(buf: ByteArray, loop: Int) { + fun start(buf: ByteArray, loop: Boolean) { val url = "data:audio/midi;base64," + Base64.encodeToString(buf, Base64.DEFAULT) try { player.apply { reset() setDataSource(url) - isLooping = loop == 0 + isLooping = loop prepare() start() } diff --git a/src/cdrom.android.c b/src/cdrom.android.c index a5a5a49..d37f23f 100644 --- a/src/cdrom.android.c +++ b/src/cdrom.android.c @@ -57,8 +57,8 @@ int cdrom_start(int trk, int loop) { } jobject context = SDL_AndroidGetActivity(); jmethodID mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context), - "cddaStart", "(II)V"); - (*env)->CallVoidMethod(env, context, mid, trk, loop); + "cddaStart", "(IZ)V"); + (*env)->CallVoidMethod(env, context, mid, trk, loop == 0); (*env)->PopLocalFrame(env, NULL); return OK; } diff --git a/src/cdrom.h b/src/cdrom.h index 28787b6..7e9a4b3 100644 --- a/src/cdrom.h +++ b/src/cdrom.h @@ -39,6 +39,7 @@ typedef struct { struct _cdromdevice { int (* init)(char *); int (* exit)(void); + // Play through the track loop times. If loop == 0, loops forever. int (* start)(int trk, int loop); int (* stop)(void); int (* getpos)(cd_time *); diff --git a/src/midi.android.c b/src/midi.android.c index 6cafe65..6892c17 100644 --- a/src/midi.android.c +++ b/src/midi.android.c @@ -87,8 +87,8 @@ static int midi_start(int no, int loop, char *data, int datalen) { jobject context = SDL_AndroidGetActivity(); jmethodID mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context), - "midiStart", "([BI)V"); - (*env)->CallVoidMethod(env, context, mid, array, loop); + "midiStart", "([BZ)V"); + (*env)->CallVoidMethod(env, context, mid, array, loop == 0); (*env)->PopLocalFrame(env, NULL); midino = no; diff --git a/src/midi.h b/src/midi.h index 85fffe3..ffd21ff 100644 --- a/src/midi.h +++ b/src/midi.h @@ -36,7 +36,8 @@ typedef struct mididevice mididevice_t; struct mididevice { int (* init)(char *, int); int (* exit)(void); - int (* start)(int, int, char*, int); + // Play through the music loop times. If loop == 0, loops forever. + int (* start)(int no, int loop, char *data, int datalen); int (* stop)(void); int (* pause)(void); int (* unpause)(void);