From 1e24da2d9a8a366db314559fdbeced948226c298 Mon Sep 17 00:00:00 2001 From: Paul Hunkin Date: Tue, 27 Jul 2010 21:58:18 +0200 Subject: [PATCH] More joystick stuff --- android/testproject/jni/app-android.cpp | 6 +- android/testproject/jni/lesson05.c | 2 +- .../src/org/libsdl/android/SDLActivity.java | 75 +++++++++++++++++-- 3 files changed, 72 insertions(+), 11 deletions(-) diff --git a/android/testproject/jni/app-android.cpp b/android/testproject/jni/app-android.cpp index d8811caa6..2df3706a1 100644 --- a/android/testproject/jni/app-android.cpp +++ b/android/testproject/jni/app-android.cpp @@ -48,7 +48,7 @@ extern "C" void Android_EnableFeature(int featureid, bool enabled); bool bRenderingEnabled = false; //Feature IDs -static const int FEATURE_SOUND = 1; +static const int FEATURE_AUDIO = 1; static const int FEATURE_ACCEL = 2; //Accelerometer data storage @@ -76,7 +76,7 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved){ mActivityInstance = cls; midCreateGLContext = mEnv->GetStaticMethodID(cls,"createGLContext","()V"); midFlipBuffers = mEnv->GetStaticMethodID(cls,"flipBuffers","()V"); - midEnableFeature = mEnv->GetStaticMethodID(cls,"enableFeature","(I, I)V"); + midEnableFeature = mEnv->GetStaticMethodID(cls,"enableFeature","(II)V"); if(!midCreateGLContext || !midFlipBuffers || !midEnableFeature){ __android_log_print(ANDROID_LOG_INFO, "SDL", "SDL: Bad mids\n"); @@ -196,7 +196,7 @@ extern "C" void Android_Render(){ extern "C" void Android_EnableFeature(int featureid, bool enabled){ - mEnv->CallStaticVoidMethod(mActivityInstance, midFlipBuffers, + mEnv->CallStaticVoidMethod(mActivityInstance, midEnableFeature, featureid, (int)enabled); } diff --git a/android/testproject/jni/lesson05.c b/android/testproject/jni/lesson05.c index c53aab4c1..60ceb596b 100644 --- a/android/testproject/jni/lesson05.c +++ b/android/testproject/jni/lesson05.c @@ -511,7 +511,7 @@ int SDL_main( int argc, char **argv ) resizeWindow( SCREEN_WIDTH, SCREEN_HEIGHT ); - testAudio(); + //testAudio(); /* wait for events */ diff --git a/android/testproject/src/org/libsdl/android/SDLActivity.java b/android/testproject/src/org/libsdl/android/SDLActivity.java index d821f9ffe..de2a1850b 100644 --- a/android/testproject/src/org/libsdl/android/SDLActivity.java +++ b/android/testproject/src/org/libsdl/android/SDLActivity.java @@ -13,6 +13,8 @@ import android.text.method.*; import android.text.*; import android.media.*; +import android.hardware.*; +import android.content.*; import java.lang.*; @@ -25,11 +27,16 @@ public class SDLActivity extends Activity { //Main components private static SDLActivity mSingleton; private static SDLSurface mSurface; - + + //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_SOUND = 1; + private static int FEATURE_AUDIO = 1; private static int FEATURE_ACCEL = 2; //Load the .so @@ -52,6 +59,7 @@ protected void onCreate(Bundle savedInstanceState) { } + //Audio public static boolean initAudio(){ //blah. Hardcoded things are bad. FIXME when we have more sound stuff @@ -61,9 +69,24 @@ public static boolean initAudio(){ AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_8BIT, 2048, - AudioTrack.MODE_STREAM); + 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() { @@ -87,7 +110,7 @@ protected void onResume() { public static native void onNativeTouch(int action, float x, float y, float p); public static native void onNativeResize(int x, int y, int format); - + public static native void onNativeAccel(float x, float y, float z); @@ -117,7 +140,7 @@ public static void enableFeature(int featureid, int 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_SOUND){ + if(featureid == FEATURE_AUDIO){ if(enabled == 1){ initAudio(); }else{ @@ -125,6 +148,14 @@ public static void enableFeature(int featureid, int enabled){ //closeAudio(); } } + + else if(featureid == FEATURE_ACCEL){ + if(enabled == 1){ + initAccel(); + }else{ + closeAccel(); + } + } } @@ -157,7 +188,7 @@ public void run(){ Because of this, that's where we set up the SDL thread */ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, - View.OnKeyListener, View.OnTouchListener { + View.OnKeyListener, View.OnTouchListener, SensorEventListener { //This is what SDL runs in. It invokes SDL_main(), eventually private Thread mSDLThread; @@ -167,6 +198,9 @@ class SDLSurface extends SurfaceView implements SurfaceHolder.Callback, private EGLSurface mEGLSurface; private EGLDisplay mEGLDisplay; + //Sensors + private static SensorManager mSensorManager; + //Startup public SDLSurface(Context context) { super(context); @@ -176,7 +210,9 @@ public SDLSurface(Context context) { setFocusableInTouchMode(true); requestFocus(); setOnKeyListener(this); - setOnTouchListener(this); + setOnTouchListener(this); + + mSensorManager = (SensorManager)context.getSystemService("sensor"); } //Called when we have a valid drawing surface @@ -321,6 +357,31 @@ public boolean onTouch(View v, MotionEvent event){ return true; } + //Sensor events + public void enableSensor(int sensortype, boolean enabled){ + //TODO: This uses getDefaultSensor - what if we have >1 accels? + if(enabled){ + mSensorManager.registerListener(this, + mSensorManager.getDefaultSensor(sensortype), + SensorManager.SENSOR_DELAY_GAME, null); + }else{ + mSensorManager.unregisterListener(this, + mSensorManager.getDefaultSensor(sensortype)); + } + } + + public void onAccuracyChanged(Sensor sensor, int accuracy){ + //TODO + } + + public void onSensorChanged(SensorEvent event){ + if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){ + SDLActivity.onNativeAccel( event.values[0], + event.values[1], + event.values[2] ); + } + } + }