From 3d66cd911abb362c483d137a2994145fb044b910 Mon Sep 17 00:00:00 2001 From: pelya Date: Thu, 10 Jun 2010 14:19:17 +0300 Subject: [PATCH] Fixed audio not playing, it still works only for Android 2.1 - 1.6 fails for unknown reason --- .../sdl/src/audio/android/SDL_androidaudio.c | 63 ++++++++++--------- alienblaster/project/src/Audio.java | 3 +- 2 files changed, 35 insertions(+), 31 deletions(-) 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 2918de64a..697902097 100644 --- a/alienblaster/project/jni/sdl/src/audio/android/SDL_androidaudio.c +++ b/alienblaster/project/jni/sdl/src/audio/android/SDL_androidaudio.c @@ -87,9 +87,7 @@ static size_t audioBufferSize = 0; // Extremely wicked JNI environment to call Java functions from C code static jbyteArray audioBufferJNI = NULL; static JavaVM *jniVM = NULL; -static jclass JavaAudioThreadClass = NULL; static jobject JavaAudioThread = NULL; -static jmethodID JavaFillBuffer = NULL; static jmethodID JavaInitAudio = NULL; static jmethodID JavaDeinitAudio = NULL; @@ -99,27 +97,6 @@ static Uint8 *ANDROIDAUD_GetAudioBuf(_THIS) return(audioBuffer); } -static void ANDROIDAUD_CloseAudio(_THIS) -{ - JNIEnv * jniEnv = NULL; - (*jniVM)->AttachCurrentThread(jniVM, &jniEnv, NULL); - - (*jniEnv)->DeleteGlobalRef(jniEnv, audioBufferJNI); - audioBufferJNI = NULL; - audioBuffer = NULL; - audioBufferSize = 0; - - (*jniEnv)->CallIntMethod( jniEnv, JavaAudioThread, JavaDeinitAudio ); - - /* We cannot call DetachCurrentThread() from main thread or we'll crash */ - /* (*jniVM)->DetachCurrentThread(jniVM); */ - - if ( this->hidden != NULL ) { - SDL_free(this->hidden); - this->hidden = NULL; - } -} - static int ANDROIDAUD_OpenAudio(_THIS, const char *devname, int iscapture) { SDL_AudioSpec *audioFormat = &this->spec; @@ -151,9 +128,6 @@ static int ANDROIDAUD_OpenAudio(_THIS, const char *devname, int iscapture) return (-1); // TODO: enable format conversion? Don't know how to do that in SDL } - __android_log_print(ANDROID_LOG_INFO, "libSDL", "ANDROIDAUD_OpenAudio(): jniEnv %p JavaInitAudio %p JavaAudioThread %p", - jniEnv, JavaInitAudio, JavaAudioThread); - audioBufferJNI = (*jniEnv)->CallObjectMethod( jniEnv, JavaAudioThread, JavaInitAudio, (jint)audioFormat->freq, (jint)audioFormat->channels, (jint)(( bytesPerSample == 2 ) ? 1 : 0), (jint)audioFormat->size); @@ -183,6 +157,27 @@ static int ANDROIDAUD_OpenAudio(_THIS, const char *devname, int iscapture) return(1); } +static void ANDROIDAUD_CloseAudio(_THIS) +{ + JNIEnv * jniEnv = NULL; + (*jniVM)->AttachCurrentThread(jniVM, &jniEnv, NULL); + + (*jniEnv)->DeleteGlobalRef(jniEnv, audioBufferJNI); + audioBufferJNI = NULL; + audioBuffer = NULL; + audioBufferSize = 0; + + (*jniEnv)->CallIntMethod( jniEnv, JavaAudioThread, JavaDeinitAudio ); + + /* We cannot call DetachCurrentThread() from main thread or we'll crash */ + /* (*jniVM)->DetachCurrentThread(jniVM); */ + + if ( this->hidden != NULL ) { + SDL_free(this->hidden); + this->hidden = NULL; + } +} + /* This function waits until it is possible to write a full sound buffer */ static void ANDROIDAUD_WaitAudio(_THIS) { @@ -190,10 +185,17 @@ static void ANDROIDAUD_WaitAudio(_THIS) } static JNIEnv * jniEnvPlaying = NULL; +static jmethodID JavaFillBuffer = NULL; static void ANDROIDAUD_ThreadInit(_THIS) { + jclass JavaAudioThreadClass = NULL; + (*jniVM)->AttachCurrentThread(jniVM, &jniEnvPlaying, NULL); + + JavaAudioThreadClass = (*jniEnvPlaying)->GetObjectClass(jniEnvPlaying, JavaAudioThread); + JavaFillBuffer = (*jniEnvPlaying)->GetMethodID(jniEnvPlaying, JavaAudioThreadClass, "fillBuffer", "()I"); + }; static void ANDROIDAUD_ThreadDeinit(_THIS) @@ -208,7 +210,7 @@ static void ANDROIDAUD_PlayAudio(_THIS) (*jniEnvPlaying)->ReleaseByteArrayElements(jniEnvPlaying, audioBufferJNI, (jbyte *)audioBuffer, 0); audioBuffer = NULL; - (*jniEnvPlaying)->CallIntMethod( jniEnvPlaying, JavaAudioThread, JavaDeinitAudio ); + (*jniEnvPlaying)->CallIntMethod( jniEnvPlaying, JavaAudioThread, JavaFillBuffer ); audioBuffer = (unsigned char *) (*jniEnvPlaying)->GetByteArrayElements(jniEnvPlaying, audioBufferJNI, &isCopy); @@ -226,14 +228,15 @@ static void ANDROIDAUD_PlayAudio(_THIS) JNIEXPORT jint JNICALL JAVA_EXPORT_NAME(AudioThread_nativeAudioInitJavaCallbacks) (JNIEnv * jniEnv, jobject thiz) { + jclass JavaAudioThreadClass = NULL; JavaAudioThread = (*jniEnv)->NewGlobalRef(jniEnv, thiz); - - JavaAudioThreadClass = (*jniEnv)->GetObjectClass(jniEnv, thiz); - JavaFillBuffer = (*jniEnv)->GetMethodID(jniEnv, JavaAudioThreadClass, "fillBuffer", "()I"); + JavaAudioThreadClass = (*jniEnv)->GetObjectClass(jniEnv, JavaAudioThread); JavaInitAudio = (*jniEnv)->GetMethodID(jniEnv, JavaAudioThreadClass, "initAudio", "(IIII)[B"); JavaDeinitAudio = (*jniEnv)->GetMethodID(jniEnv, JavaAudioThreadClass, "deinitAudio", "()I"); + /* __android_log_print(ANDROID_LOG_INFO, "libSDL", "nativeAudioInitJavaCallbacks(): JavaAudioThread %p JavaFillBuffer %p JavaInitAudio %p JavaDeinitAudio %p", JavaAudioThread, JavaFillBuffer, JavaInitAudio, JavaDeinitAudio); + */ } JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) diff --git a/alienblaster/project/src/Audio.java b/alienblaster/project/src/Audio.java index 080d57e5f..a5b2edfbf 100644 --- a/alienblaster/project/src/Audio.java +++ b/alienblaster/project/src/Audio.java @@ -14,6 +14,7 @@ import android.media.AudioManager; import android.media.AudioFormat; import java.io.*; import java.nio.ByteBuffer; +import android.util.Log; class AudioThread { @@ -21,7 +22,6 @@ class AudioThread { private Activity mParent; private AudioTrack mAudio; private byte[] mAudioBuffer; - private ByteBuffer mAudioBufferNative; public AudioThread(Activity parent) { @@ -50,6 +50,7 @@ class AudioThread { bufSize = AudioTrack.getMinBufferSize( rate, channels, encoding ); mAudioBuffer = new byte[bufSize]; + mAudio = new AudioTrack(AudioManager.STREAM_MUSIC, rate, channels,