changeset 4989:58b6bb4a45e9

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
author Sam Lantinga <slouken@libsdl.org>
date Wed, 12 Jan 2011 17:53:06 -0800
parents f9af88a9c823
children 397e748d901a
files android-project/src/org/libsdl/app/SDLActivity.java src/SDL_android.cpp src/audio/android/SDL_androidaudio.c src/video/android/SDL_androidgl.c
diffstat 4 files changed, 101 insertions(+), 152 deletions(-) [+]
line wrap: on
line diff
--- a/android-project/src/org/libsdl/app/SDLActivity.java	Wed Jan 12 16:35:03 2011 -0800
+++ b/android-project/src/org/libsdl/app/SDLActivity.java	Wed Jan 12 17:53:06 2011 -0800
@@ -30,14 +30,6 @@
 
     // 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 @@
 
     // 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 @@
         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 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 @@
         // Runs SDL_main()
         SDLActivity.nativeInit();
 
-        Log.v("SDL","SDL thread terminated");
+        //Log.v("SDL", "SDL thread terminated");
     }
 }
 
@@ -205,66 +154,77 @@
 
     // 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 @@
 
         } 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 void flipEGL() {
         try {
             EGL10 egl = (EGL10)EGLContext.getEGL();
-            GL10 gl = (GL10)mEGLContext.getGL();
 
             egl.eglWaitNative(EGL10.EGL_NATIVE_RENDERABLE, null);
 
@@ -341,20 +300,22 @@
             
         } 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;
         }
--- a/src/SDL_android.cpp	Wed Jan 12 16:35:03 2011 -0800
+++ b/src/SDL_android.cpp	Wed Jan 12 17:53:06 2011 -0800
@@ -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 @@
 //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 @@
     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_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 @@
 /*******************************************************************************
              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
--- a/src/audio/android/SDL_androidaudio.c	Wed Jan 12 16:35:03 2011 -0800
+++ b/src/audio/android/SDL_androidaudio.c	Wed Jan 12 17:53:06 2011 -0800
@@ -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 <android/log.h>
 
@@ -94,7 +93,7 @@
 //    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? */
 }
--- a/src/video/android/SDL_androidgl.c	Wed Jan 12 16:35:03 2011 -0800
+++ b/src/video/android/SDL_androidgl.c	Wed Jan 12 17:53:06 2011 -0800
@@ -26,57 +26,68 @@
 #include "SDL_video.h"
 
 #include "SDL_androidvideo.h"
+#include "../../SDL_android.h"
 
 #include <android/log.h>
 
-#include <pthread.h>
-
-/*
-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_JNI_CreateContext();
+    return 1;
 }
 
-SDL_GLContext Android_GL_CreateContext(_THIS, SDL_Window * window){
-	Android_CreateContext();
-	return 1;
+int
+Android_GL_MakeCurrent(_THIS, SDL_Window * window, SDL_GLContext context)
+{
+    /* There's only one context, nothing to do... */
+    return 0;
 }
 
-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_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_JNI_SwapWindow();
 }
 
-void Android_GL_SwapWindow(_THIS, SDL_Window * window){
-	Android_Render();
+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");
-}