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 da1efce..666e449 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 @@ -19,7 +19,6 @@ package io.github.kichikuou.xsystem35 import android.media.MediaPlayer import android.os.Bundle -import android.util.Base64 import android.util.Log import org.libsdl.app.SDLActivity import java.io.File @@ -75,7 +74,7 @@ class GameActivity : SDLActivity() { @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: Boolean) = midi.start(buf, loop) + @Suppress("unused") fun midiStart(path: String, loop: Boolean) = midi.start(path, loop) @Suppress("unused") fun midiStop() = midi.stop() @Suppress("unused") fun midiCurrentPosition() = midi.currentPosition() } @@ -148,12 +147,11 @@ private class MidiPlayer { private var playing = false private var playerPaused = false - fun start(buf: ByteArray, loop: Boolean) { - val url = "data:audio/midi;base64," + Base64.encodeToString(buf, Base64.DEFAULT) + fun start(path: String, loop: Boolean) { try { player.apply { reset() - setDataSource(url) + setDataSource(path) isLooping = loop prepare() start() diff --git a/src/midi.android.c b/src/midi.android.c index 6892c17..95fa436 100644 --- a/src/midi.android.c +++ b/src/midi.android.c @@ -75,20 +75,28 @@ static int midi_start(int no, int loop, char *data, int datalen) { return NG; } - jbyteArray array = (*env)->NewByteArray(env, datalen); - if (!array) { - WARNING("Failed to allocate an array"); + char path[PATH_MAX]; + snprintf(path, PATH_MAX, "%s/tmp.mid", SDL_AndroidGetInternalStoragePath()); + FILE* fp = fopen(path, "w"); + if (!fp) { + WARNING("Failed to create temporary file"); + (*env)->PopLocalFrame(env, NULL); + return NG; + } + fwrite(data, datalen, 1, fp); + fclose(fp); + + jstring path_str = (*env)->NewStringUTF(env, path); + if (!path_str) { + WARNING("Failed to allocate a string"); (*env)->PopLocalFrame(env, NULL); return NG; } - jbyte *buf = (*env)->GetByteArrayElements(env, array, NULL); - memcpy(buf, data, datalen); - (*env)->ReleaseByteArrayElements(env, array, buf, 0); jobject context = SDL_AndroidGetActivity(); jmethodID mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context), - "midiStart", "([BZ)V"); - (*env)->CallVoidMethod(env, context, mid, array, loop == 0); + "midiStart", "(Ljava/lang/String;Z)V"); + (*env)->CallVoidMethod(env, context, mid, path_str, loop == 0); (*env)->PopLocalFrame(env, NULL); midino = no;