From 91a8755ea86f89a898f165502787f357fd6525ab Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Wed, 12 Jan 2011 17:53:06 -0800 Subject: [PATCH] More Android cleanup: * Formalized the interface with Java methods in SDL_android.h * We don't need the feature system, at least right now * Fixed waiting for the SDLMain thread --- .../src/org/libsdl/app/SDLActivity.java | 133 +++++++----------- src/SDL_android.cpp | 36 +---- src/audio/android/SDL_androidaudio.c | 5 +- src/video/android/SDL_androidgl.c | 75 +++++----- 4 files changed, 99 insertions(+), 150 deletions(-) diff --git a/android-project/src/org/libsdl/app/SDLActivity.java b/android-project/src/org/libsdl/app/SDLActivity.java index 1caa07b67..f2a49725c 100644 --- a/android-project/src/org/libsdl/app/SDLActivity.java +++ b/android-project/src/org/libsdl/app/SDLActivity.java @@ -30,14 +30,6 @@ public class SDLActivity extends Activity { // Audio private static AudioTrack mAudioTrack; - private static boolean bAudioIsEnabled; - - // Sensors - private static boolean bAccelIsEnabled; - - // feature IDs. Must match up on the C side as well. - private static int FEATURE_AUDIO = 1; - private static int FEATURE_ACCEL = 2; // Load the .so static { @@ -47,6 +39,7 @@ public class SDLActivity extends Activity { // Setup protected void onCreate(Bundle savedInstanceState) { + //Log.v("SDL", "onCreate()"); super.onCreate(savedInstanceState); // So we can call stuff from static callbacks @@ -57,44 +50,16 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(mSurface); SurfaceHolder holder = mSurface.getHolder(); holder.setType(SurfaceHolder.SURFACE_TYPE_GPU); - - } - - // Audio - public static boolean initAudio(){ - - // blah. Hardcoded things are bad. FIXME when we have more sound stuff - // working properly. - mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, - 11025, - AudioFormat.CHANNEL_CONFIGURATION_MONO, - AudioFormat.ENCODING_PCM_8BIT, - 2048, - AudioTrack.MODE_STREAM); - bAudioIsEnabled = true; - return true; } - // Accel - public static boolean initAccel(){ - mSurface.enableSensor(Sensor.TYPE_ACCELEROMETER, true); - bAccelIsEnabled = true; - return true; - } - - public static boolean closeAccel(){ - mSurface.enableSensor(Sensor.TYPE_ACCELEROMETER, false); - bAccelIsEnabled = false; - return true; - } - - // Events protected void onPause() { + //Log.v("SDL", "onPause()"); super.onPause(); } protected void onResume() { + //Log.v("SDL", "onResume()"); super.onResume(); } @@ -121,39 +86,23 @@ public static void flipBuffers() { public static void updateAudio(byte [] buf) { - if(mAudioTrack == null){ - return; + if(mAudioTrack == null) { + // Hardcoded things are bad. FIXME when we have more sound stuff + // working properly. + mAudioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, + 11025, + AudioFormat.CHANNEL_CONFIGURATION_MONO, + AudioFormat.ENCODING_PCM_8BIT, + 2048, + AudioTrack.MODE_STREAM); } - + mAudioTrack.write(buf, 0, buf.length); mAudioTrack.play(); - Log.v("SDL","Played some audio"); + Log.v("SDL", "Played some audio"); } - public static void enableFeature(int featureid, int enabled) { - Log.v("SDL","Feature " + featureid + " = " + enabled); - - // Yuck. This is all horribly inelegent. If it gets to more than a few - // 'features' I'll rip this out and make something nicer, I promise :) - if(featureid == FEATURE_AUDIO){ - if(enabled == 1){ - initAudio(); - }else{ - // We don't have one of these yet... - //closeAudio(); - } - } - - else if(featureid == FEATURE_ACCEL){ - if(enabled == 1){ - initAccel(); - }else{ - closeAccel(); - } - } - } - } /** @@ -164,7 +113,7 @@ public void run() { // Runs SDL_main() SDLActivity.nativeInit(); - Log.v("SDL","SDL thread terminated"); + //Log.v("SDL", "SDL thread terminated"); } } @@ -205,66 +154,77 @@ public SDLSurface(Context context) { // Called when we have a valid drawing surface public void surfaceCreated(SurfaceHolder holder) { + //Log.v("SDL", "surfaceCreated()"); + + enableSensor(Sensor.TYPE_ACCELEROMETER, true); } // Called when we lose the surface public void surfaceDestroyed(SurfaceHolder holder) { + //Log.v("SDL", "surfaceDestroyed()"); // Send a quit message to the application SDLActivity.nativeQuit(); // Now wait for the SDL thread to quit if (mSDLThread != null) { - try { - mSDLThread.wait(); - } catch(Exception e) { - Log.v("SDL","Problem stopping thread: " + e); - } + //synchronized (mSDLThread) { + try { + mSDLThread.join(); + } catch(Exception e) { + Log.v("SDL", "Problem stopping thread: " + e); + } + //} + mSDLThread = null; + + //Log.v("SDL", "Finished waiting for SDL thread"); } + + enableSensor(Sensor.TYPE_ACCELEROMETER, false); } // Called when the surface is resized public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { - Log.v("SDL","Surface resized"); + //Log.v("SDL", "surfaceChanged()"); int sdlFormat = 0; switch (format) { case PixelFormat.A_8: - Log.v("SDL","pixel format A_8"); + Log.v("SDL", "pixel format A_8"); break; case PixelFormat.LA_88: - Log.v("SDL","pixel format LA_88"); + Log.v("SDL", "pixel format LA_88"); break; case PixelFormat.L_8: - Log.v("SDL","pixel format L_8"); + Log.v("SDL", "pixel format L_8"); break; case PixelFormat.RGBA_4444: - Log.v("SDL","pixel format RGBA_4444"); + Log.v("SDL", "pixel format RGBA_4444"); sdlFormat = 0x85421002; // SDL_PIXELFORMAT_RGBA4444 break; case PixelFormat.RGBA_5551: - Log.v("SDL","pixel format RGBA_5551"); + Log.v("SDL", "pixel format RGBA_5551"); sdlFormat = 0x85441002; // SDL_PIXELFORMAT_RGBA5551 break; case PixelFormat.RGBA_8888: - Log.v("SDL","pixel format RGBA_8888"); + Log.v("SDL", "pixel format RGBA_8888"); sdlFormat = 0x86462004; // SDL_PIXELFORMAT_RGBA8888 break; case PixelFormat.RGBX_8888: - Log.v("SDL","pixel format RGBX_8888"); + Log.v("SDL", "pixel format RGBX_8888"); sdlFormat = 0x86262004; // SDL_PIXELFORMAT_RGBX8888 break; case PixelFormat.RGB_332: - Log.v("SDL","pixel format RGB_332"); + Log.v("SDL", "pixel format RGB_332"); sdlFormat = 0x84110801; // SDL_PIXELFORMAT_RGB332 break; case PixelFormat.RGB_565: - Log.v("SDL","pixel format RGB_565"); + Log.v("SDL", "pixel format RGB_565"); sdlFormat = 0x85151002; // SDL_PIXELFORMAT_RGB565 break; case PixelFormat.RGB_888: - Log.v("SDL","pixel format RGB_888"); + Log.v("SDL", "pixel format RGB_888"); // Not sure this is right, maybe SDL_PIXELFORMAT_RGB24 instead? sdlFormat = 0x86161804; // SDL_PIXELFORMAT_RGB888 break; @@ -316,7 +276,7 @@ public boolean initEGL() { } catch(Exception e) { Log.v("SDL", e + ""); - for(StackTraceElement s : e.getStackTrace()){ + for(StackTraceElement s : e.getStackTrace()) { Log.v("SDL", s.toString()); } } @@ -328,7 +288,6 @@ public boolean initEGL() { public void flipEGL() { try { EGL10 egl = (EGL10)EGLContext.getEGL(); - GL10 gl = (GL10)mEGLContext.getGL(); egl.eglWaitNative(EGL10.EGL_NATIVE_RENDERABLE, null); @@ -341,20 +300,22 @@ public void flipEGL() { } catch(Exception e) { Log.v("SDL", "flipEGL(): " + e); - for(StackTraceElement s : e.getStackTrace()){ + for(StackTraceElement s : e.getStackTrace()) { Log.v("SDL", s.toString()); } } } // Key events - public boolean onKey(View v, int keyCode, KeyEvent event){ + public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { + //Log.v("SDL", "key down: " + keyCode); SDLActivity.onNativeKeyDown(keyCode); return true; } else if (event.getAction() == KeyEvent.ACTION_UP) { + //Log.v("SDL", "key up: " + keyCode); SDLActivity.onNativeKeyUp(keyCode); return true; } diff --git a/src/SDL_android.cpp b/src/SDL_android.cpp index 7c3799d52..efc58e411 100644 --- a/src/SDL_android.cpp +++ b/src/SDL_android.cpp @@ -21,6 +21,8 @@ */ #include "SDL_config.h" +#include "SDL_android.h" + extern "C" { #include "events/SDL_events_c.h" #include "video/android/SDL_androidkeyboard.h" @@ -47,12 +49,8 @@ jclass mActivityInstance; //method signatures jmethodID midCreateGLContext; jmethodID midFlipBuffers; -jmethodID midEnableFeature; jmethodID midUpdateAudio; -//If we're not the active app, don't try to render -bool bRenderingEnabled = false; - //Feature IDs static const int FEATURE_AUDIO = 1; static const int FEATURE_ACCEL = 2; @@ -84,11 +82,9 @@ extern "C" void SDL_Android_Init(JNIEnv* env) mActivityInstance = cls; midCreateGLContext = mEnv->GetStaticMethodID(cls,"createGLContext","()V"); midFlipBuffers = mEnv->GetStaticMethodID(cls,"flipBuffers","()V"); - midEnableFeature = mEnv->GetStaticMethodID(cls,"enableFeature","(II)V"); midUpdateAudio = mEnv->GetStaticMethodID(cls,"updateAudio","([B)V"); - if(!midCreateGLContext || !midFlipBuffers || !midEnableFeature || - !midUpdateAudio) { + if(!midCreateGLContext || !midFlipBuffers || !midUpdateAudio) { __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Bad mids\n"); } else { #ifdef DEBUG @@ -136,9 +132,6 @@ extern "C" void Java_org_libsdl_app_SDLActivity_onNativeTouch(JNIEnv* env, extern "C" void Java_org_libsdl_app_SDLActivity_nativeQuit( JNIEnv* env, jobject obj ) { - // Stop rendering as we're no longer in the foreground - bRenderingEnabled = false; - // Inject a SDL_QUIT event SDL_SendQuit(); } @@ -165,32 +158,17 @@ extern "C" void Java_org_libsdl_app_SDLActivity_onNativeAccel( /******************************************************************************* Functions called by SDL into Java *******************************************************************************/ -extern "C" void Android_CreateContext() +extern "C" void Android_JNI_CreateContext() { - __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: sdl_create_context()\n"); - - bRenderingEnabled = true; - - mEnv->CallStaticVoidMethod(mActivityInstance, midCreateGLContext ); + mEnv->CallStaticVoidMethod(mActivityInstance, midCreateGLContext); } -extern "C" void Android_Render() +extern "C" void Android_JNI_SwapWindow() { - if (!bRenderingEnabled) { - return; - } - - // When we get here, we've accumulated a full frame mEnv->CallStaticVoidMethod(mActivityInstance, midFlipBuffers); } -extern "C" void Android_EnableFeature(int featureid, bool enabled) -{ - mEnv->CallStaticVoidMethod(mActivityInstance, midEnableFeature, - featureid, (int)enabled); -} - -extern "C" void Android_UpdateAudioBuffer(unsigned char *buf, int len) +extern "C" void Android_JNI_UpdateAudioBuffer(unsigned char *buf, int len) { //Annoyingly we can't just call into Java from any thread. Because the audio //callback is dispatched from the SDL audio thread (that wasn't made from diff --git a/src/audio/android/SDL_androidaudio.c b/src/audio/android/SDL_androidaudio.c index cf22e4001..88bb68d95 100644 --- a/src/audio/android/SDL_androidaudio.c +++ b/src/audio/android/SDL_androidaudio.c @@ -28,8 +28,7 @@ #include "SDL_audio.h" #include "../SDL_audio_c.h" #include "SDL_androidaudio.h" - -extern void Android_UpdateAudioBuffer(unsigned char *buf, int len); +#include "../../SDL_android.h" #include @@ -94,7 +93,7 @@ AndroidAUD_GetDeviceBuf(_THIS) // sound->len = this->hidden->mixlen; /* size of raw data pointed to above */ - Android_UpdateAudioBuffer(this->hidden->mixbuf, this->hidden->mixlen); + Android_JNI_UpdateAudioBuffer(this->hidden->mixbuf, this->hidden->mixlen); return this->hidden->mixbuf; /* is this right? */ } diff --git a/src/video/android/SDL_androidgl.c b/src/video/android/SDL_androidgl.c index 0007cc4da..27f1665d5 100644 --- a/src/video/android/SDL_androidgl.c +++ b/src/video/android/SDL_androidgl.c @@ -26,57 +26,68 @@ #include "SDL_video.h" #include "SDL_androidvideo.h" +#include "../../SDL_android.h" #include -#include - -/* -These things are in the JNI android support -*/ -extern void Android_CreateContext(); -extern void Android_Render(); /* GL functions */ -int Android_GL_LoadLibrary(_THIS, const char *path){ - __android_log_print(ANDROID_LOG_INFO, "SDL", "[STUB] GL_LoadLibrary\n"); - return 0; +int +Android_GL_LoadLibrary(_THIS, const char *path) +{ + __android_log_print(ANDROID_LOG_INFO, "SDL", "[STUB] GL_LoadLibrary\n"); + return 0; } -void *Android_GL_GetProcAddress(_THIS, const char *proc){ - __android_log_print(ANDROID_LOG_INFO, "SDL", "[STUB] GL_GetProcAddress\n"); - return 0; +void * +Android_GL_GetProcAddress(_THIS, const char *proc) +{ + __android_log_print(ANDROID_LOG_INFO, "SDL", "[STUB] GL_GetProcAddress\n"); + return 0; } -void Android_GL_UnloadLibrary(_THIS){ - __android_log_print(ANDROID_LOG_INFO, "SDL", "[STUB] GL_UnloadLibrary\n"); +void +Android_GL_UnloadLibrary(_THIS) +{ + __android_log_print(ANDROID_LOG_INFO, "SDL", "[STUB] GL_UnloadLibrary\n"); } -SDL_GLContext Android_GL_CreateContext(_THIS, SDL_Window * window){ - Android_CreateContext(); - return 1; +SDL_GLContext +Android_GL_CreateContext(_THIS, SDL_Window * window) +{ + Android_JNI_CreateContext(); + return 1; } -int Android_GL_MakeCurrent(_THIS, SDL_Window * window, - SDL_GLContext context){ - //__android_log_print(ANDROID_LOG_INFO, "SDL", "[STUB] GL_MakeCurrent\n"); - return 0; +int +Android_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context) +{ + /* There's only one context, nothing to do... */ + return 0; } -int Android_GL_SetSwapInterval(_THIS, int interval){ - __android_log_print(ANDROID_LOG_INFO, "SDL", "[STUB] GL_SetSwapInterval\n"); - return 0; +int +Android_GL_SetSwapInterval(_THIS, int interval) +{ + __android_log_print(ANDROID_LOG_INFO, "SDL", "[STUB] GL_SetSwapInterval\n"); + return 0; } -int Android_GL_GetSwapInterval(_THIS){ - __android_log_print(ANDROID_LOG_INFO, "SDL", "[STUB] GL_GetSwapInterval\n"); - return 0; +int +Android_GL_GetSwapInterval(_THIS) +{ + __android_log_print(ANDROID_LOG_INFO, "SDL", "[STUB] GL_GetSwapInterval\n"); + return 0; } -void Android_GL_SwapWindow(_THIS, SDL_Window * window){ - Android_Render(); +void +Android_GL_SwapWindow(_THIS, SDL_Window * window) +{ + Android_JNI_SwapWindow(); } -void Android_GL_DeleteContext(_THIS, SDL_GLContext context){ - __android_log_print(ANDROID_LOG_INFO, "SDL", "[STUB] GL_DeleteContext\n"); +void +Android_GL_DeleteContext(_THIS, SDL_GLContext context) +{ + __android_log_print(ANDROID_LOG_INFO, "SDL", "[STUB] GL_DeleteContext\n"); }