From 85f386c38bec144c993120fb1c3854e04ece8e60 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 25 May 2013 11:44:32 -0700 Subject: [PATCH 1/2] Return number of samples in NativeApp::audioRender(). This way we can try to avoid writing invalid data to the buffer. --- android/.classpath | 1 + android/app-android.cpp | 6 ++++-- android/src/com/henrikrydgard/libnative/NativeApp.java | 2 +- .../src/com/henrikrydgard/libnative/NativeAudioPlayer.java | 7 +++++-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/android/.classpath b/android/.classpath index a4763d1eec..bb0c759770 100644 --- a/android/.classpath +++ b/android/.classpath @@ -4,5 +4,6 @@ + diff --git a/android/app-android.cpp b/android/app-android.cpp index 2a9314899a..210fa34a8a 100644 --- a/android/app-android.cpp +++ b/android/app-android.cpp @@ -294,7 +294,7 @@ extern "C" void Java_com_henrikrydgard_libnative_NativeRenderer_displayRender(JN } } -extern "C" void Java_com_henrikrydgard_libnative_NativeApp_audioRender(JNIEnv* env, jclass clazz, jshortArray array) { +extern "C" jint Java_com_henrikrydgard_libnative_NativeApp_audioRender(JNIEnv* env, jclass clazz, jshortArray array) { // Too spammy // ILOG("NativeApp.audioRender"); @@ -305,9 +305,11 @@ extern "C" void Java_com_henrikrydgard_libnative_NativeApp_audioRender(JNIEnv* e if (buf_size) { short *data = env->GetShortArrayElements(array, 0); int samples = buf_size / 2; - NativeMix(data, samples); + samples = NativeMix(data, samples); env->ReleaseShortArrayElements(array, data, 0); + return samples * 2; } + return 0; } extern "C" void JNICALL Java_com_henrikrydgard_libnative_NativeApp_touch diff --git a/android/src/com/henrikrydgard/libnative/NativeApp.java b/android/src/com/henrikrydgard/libnative/NativeApp.java index 4e02203621..79fa414ff5 100644 --- a/android/src/com/henrikrydgard/libnative/NativeApp.java +++ b/android/src/com/henrikrydgard/libnative/NativeApp.java @@ -21,7 +21,7 @@ public class NativeApp { public static native void joystickEvent(float x, float y); // will only be called between init() and shutdown() - public static native void audioRender(short[] buffer); + public static native int audioRender(short[] buffer); // Sensor/input data. These are asynchronous, beware! public static native void touch(float x, float y, int data, int pointerId); diff --git a/android/src/com/henrikrydgard/libnative/NativeAudioPlayer.java b/android/src/com/henrikrydgard/libnative/NativeAudioPlayer.java index d6fd249407..4b1c7a2fd7 100644 --- a/android/src/com/henrikrydgard/libnative/NativeAudioPlayer.java +++ b/android/src/com/henrikrydgard/libnative/NativeAudioPlayer.java @@ -81,8 +81,11 @@ public class NativeAudioPlayer { audioTrack.play(); Log.i(TAG, "Playing... minBuffersize = " + buffer_size); while (playing_) { - NativeApp.audioRender(buffer); - audioTrack.write(buffer, 0, buffer_size); + int validShorts = NativeApp.audioRender(buffer); + if (validShorts != 0) { + audioTrack.write(buffer, 0, validShorts); + } + Thread.yield(); } audioTrack.stop(); audioTrack.release(); From a17a16eda2d7c0fd9d729dcd9d416f17fa285527 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 25 May 2013 12:11:06 -0700 Subject: [PATCH 2/2] Avoid a memory copy when audio is ahead. --- android/app-android.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/android/app-android.cpp b/android/app-android.cpp index 210fa34a8a..2d9a7dc322 100644 --- a/android/app-android.cpp +++ b/android/app-android.cpp @@ -306,8 +306,13 @@ extern "C" jint Java_com_henrikrydgard_libnative_NativeApp_audioRender(JNIEnv* e short *data = env->GetShortArrayElements(array, 0); int samples = buf_size / 2; samples = NativeMix(data, samples); - env->ReleaseShortArrayElements(array, data, 0); - return samples * 2; + if (samples != 0) { + env->ReleaseShortArrayElements(array, data, 0); + return samples * 2; + } else { + env->ReleaseShortArrayElements(array, data, JNI_ABORT); + return 0; + } } return 0; }