diff --git a/alienblaster/project/jni/sdl/src/audio/android/SDL_androidaudio.c b/alienblaster/project/jni/sdl/src/audio/android/SDL_androidaudio.c index 697902097..1b8733d4d 100644 --- a/alienblaster/project/jni/sdl/src/audio/android/SDL_androidaudio.c +++ b/alienblaster/project/jni/sdl/src/audio/android/SDL_androidaudio.c @@ -35,6 +35,7 @@ #include #include #include // for memset() +#include #define _THIS SDL_AudioDevice *this @@ -190,12 +191,18 @@ static jmethodID JavaFillBuffer = NULL; static void ANDROIDAUD_ThreadInit(_THIS) { jclass JavaAudioThreadClass = NULL; + jmethodID JavaInitThread = NULL; + struct sched_param param; (*jniVM)->AttachCurrentThread(jniVM, &jniEnvPlaying, NULL); + JavaAudioThreadClass = (*jniEnvPlaying)->GetObjectClass(jniEnvPlaying, JavaAudioThread); JavaFillBuffer = (*jniEnvPlaying)->GetMethodID(jniEnvPlaying, JavaAudioThreadClass, "fillBuffer", "()I"); + /* HACK: raise our own thread priority to max to get rid of "W/AudioFlinger: write blocked for 54 msecs" errors */ + JavaInitThread = (*jniEnvPlaying)->GetMethodID(jniEnvPlaying, JavaAudioThreadClass, "initAudioThread", "()I"); + (*jniEnvPlaying)->CallIntMethod( jniEnvPlaying, JavaAudioThread, JavaInitThread ); }; static void ANDROIDAUD_ThreadDeinit(_THIS) diff --git a/alienblaster/project/src/Audio.java b/alienblaster/project/src/Audio.java index a5b2edfbf..54a8568c7 100644 --- a/alienblaster/project/src/Audio.java +++ b/alienblaster/project/src/Audio.java @@ -15,6 +15,7 @@ import android.media.AudioFormat; import java.io.*; import java.nio.ByteBuffer; import android.util.Log; +import java.lang.Thread; class AudioThread { @@ -74,6 +75,13 @@ class AudioThread { return 1; } + public int initAudioThread() + { + // Make audio thread priority higher so audio thread won't get underrun + Thread.currentThread().setPriority(Thread.MAX_PRIORITY); + return 1; + } + private native int nativeAudioInitJavaCallbacks(); }