From 858bd2c40b7bdb68b45f8469fe59393eb5304c6b Mon Sep 17 00:00:00 2001 From: TwistedUmbrella Date: Tue, 11 Feb 2014 21:21:39 -0500 Subject: [PATCH 1/3] If you can't combine the activity, share the static functions --- .../com/reicast/emulator/GL2JNIActivity.java | 12 +- .../src/com/reicast/emulator/GL2JNIView.java | 88 +------- .../com/reicast/emulator/GL2JNIViewV6.java | 209 ++---------------- .../src/com/reicast/emulator/VJoy.java | 72 ++++++ 4 files changed, 112 insertions(+), 269 deletions(-) create mode 100644 shell/android/src/com/reicast/emulator/VJoy.java diff --git a/shell/android/src/com/reicast/emulator/GL2JNIActivity.java b/shell/android/src/com/reicast/emulator/GL2JNIActivity.java index 6c47af8b3..8a2f119ad 100644 --- a/shell/android/src/com/reicast/emulator/GL2JNIActivity.java +++ b/shell/android/src/com/reicast/emulator/GL2JNIActivity.java @@ -374,7 +374,11 @@ public class GL2JNIActivity extends Activity { } } - mView.pushInput(); + if (MainActivity.force_gpu) { + mView6.pushInput(); + } else { + mView.pushInput(); + } if ((jsCompat[playerNum] || xbox[playerNum] || nVidia[playerNum]) && ((globalLS_X[playerNum] == previousLS_X[playerNum] && globalLS_Y[playerNum] == previousLS_Y[playerNum]) || (previousLS_X[playerNum] == 0.0f && previousLS_Y[playerNum] == 0.0f))) // Only handle Left Stick on an Xbox 360 controller if there was @@ -489,7 +493,11 @@ public class GL2JNIActivity extends Activity { break; } } - mView.pushInput(); + if (MainActivity.force_gpu) { + mView6.pushInput(); + } else { + mView.pushInput(); + } return rav; } else { diff --git a/shell/android/src/com/reicast/emulator/GL2JNIView.java b/shell/android/src/com/reicast/emulator/GL2JNIView.java index 9ff4a700f..1586b5fd1 100644 --- a/shell/android/src/com/reicast/emulator/GL2JNIView.java +++ b/shell/android/src/com/reicast/emulator/GL2JNIView.java @@ -26,7 +26,6 @@ import android.util.Log; import android.view.MotionEvent; import android.view.ScaleGestureDetector; import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener; -import android.view.View.OnSystemUiVisibilityChangeListener; import android.view.View; @@ -56,18 +55,6 @@ class GL2JNIView extends GLSurfaceView private EmuThread ethd = new EmuThread(); private static final boolean DEBUG = false; - private static final int key_CONT_B = 0x0002; - private static final int key_CONT_A = 0x0004; - private static final int key_CONT_START = 0x0008; - private static final int key_CONT_DPAD_UP = 0x0010; - private static final int key_CONT_DPAD_DOWN = 0x0020; - private static final int key_CONT_DPAD_LEFT = 0x0040; - private static final int key_CONT_DPAD_RIGHT = 0x0080; - private static final int key_CONT_Y = 0x0200; - private static final int key_CONT_X = 0x0400; - - public static final int LAYER_TYPE_SOFTWARE = 1; - public static final int LAYER_TYPE_HARDWARE = 2; Vibrator vib; @@ -79,17 +66,17 @@ class GL2JNIView extends GLSurfaceView private static final float[][] vjoy = new float[][] { - new float[] { 24+0, 24+64, 64,64, key_CONT_DPAD_LEFT, 0}, - new float[] { 24+64, 24+0, 64,64, key_CONT_DPAD_UP, 0}, - new float[] { 24+128, 24+64, 64,64, key_CONT_DPAD_RIGHT, 0}, - new float[] { 24+64, 24+128, 64,64, key_CONT_DPAD_DOWN, 0}, + new float[] { 24+0, 24+64, 64,64, VJoy.key_CONT_DPAD_LEFT, 0}, + new float[] { 24+64, 24+0, 64,64, VJoy.key_CONT_DPAD_UP, 0}, + new float[] { 24+128, 24+64, 64,64, VJoy.key_CONT_DPAD_RIGHT, 0}, + new float[] { 24+64, 24+128, 64,64, VJoy.key_CONT_DPAD_DOWN, 0}, - new float[] { 440+0, 280+64, 64,64, key_CONT_X, 0}, - new float[] { 440+64, 280+0, 64,64, key_CONT_Y, 0}, - new float[] { 440+128, 280+64, 64,64, key_CONT_B, 0}, - new float[] { 440+64, 280+128, 64,64, key_CONT_A, 0}, + new float[] { 440+0, 280+64, 64,64, VJoy.key_CONT_X, 0}, + new float[] { 440+64, 280+0, 64,64, VJoy.key_CONT_Y, 0}, + new float[] { 440+128, 280+64, 64,64, VJoy.key_CONT_B, 0}, + new float[] { 440+64, 280+128, 64,64, VJoy.key_CONT_A, 0}, - new float[] { 320-32, 360+32, 64,64, key_CONT_START, 0}, + new float[] { 320-32, 360+32, 64,64, VJoy.key_CONT_START, 0}, new float[] { 440, 200, 90,64, -1, 0}, new float[] { 542, 200, 90,64, -2, 0}, @@ -105,57 +92,6 @@ class GL2JNIView extends GLSurfaceView private boolean touchVibrationEnabled; Context context; - private static float[][] getVjoy_d(float[][] vjoy_d_custom) { - return new float[][] - { - new float[] { 20+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_LEFT}, - new float[] { 20+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_UP}, - new float[] { 20+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_RIGHT}, - new float[] { 20+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_DOWN}, - - new float[] { 448+0*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_X}, - new float[] { 448+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+0*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_Y}, - new float[] { 448+128*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_B}, - new float[] { 448+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+128*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_A}, - - new float[] { 320-32+vjoy_d_custom[2][0], 288+128+vjoy_d_custom[2][1], 64*vjoy_d_custom[2][2],64*vjoy_d_custom[2][2], key_CONT_START}, - - new float[] { 440+vjoy_d_custom[3][0], 200+vjoy_d_custom[3][1], 90*vjoy_d_custom[3][2],64*vjoy_d_custom[3][2], -1}, - new float[] { 542+vjoy_d_custom[4][0], 200+vjoy_d_custom[4][1], 90*vjoy_d_custom[4][2],64*vjoy_d_custom[4][2], -2}, - - new float[] { 16+vjoy_d_custom[5][0], 24+32+vjoy_d_custom[5][1], 128*vjoy_d_custom[5][2],128*vjoy_d_custom[5][2], -3}, - new float[] { 96+vjoy_d_custom[5][0], 320+vjoy_d_custom[5][1], 32*vjoy_d_custom[5][2],32*vjoy_d_custom[5][2], -4}, - }; - } - - private static void writeCustomVjoyValues(float[][] vjoy_d_custom, Context context) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - - prefs.edit().putFloat("touch_x_shift_dpad", vjoy_d_custom[0][0]).commit(); - prefs.edit().putFloat("touch_y_shift_dpad", vjoy_d_custom[0][1]).commit(); - prefs.edit().putFloat("touch_scale_dpad", vjoy_d_custom[0][2]).commit(); - - prefs.edit().putFloat("touch_x_shift_buttons", vjoy_d_custom[1][0]).commit(); - prefs.edit().putFloat("touch_y_shift_buttons", vjoy_d_custom[1][1]).commit(); - prefs.edit().putFloat("touch_scale_buttons", vjoy_d_custom[1][2]).commit(); - - prefs.edit().putFloat("touch_x_shift_start", vjoy_d_custom[2][0]).commit(); - prefs.edit().putFloat("touch_y_shift_start", vjoy_d_custom[2][1]).commit(); - prefs.edit().putFloat("touch_scale_start", vjoy_d_custom[2][2]).commit(); - - prefs.edit().putFloat("touch_x_shift_left_trigger", vjoy_d_custom[3][0]).commit(); - prefs.edit().putFloat("touch_y_shift_left_trigger", vjoy_d_custom[3][1]).commit(); - prefs.edit().putFloat("touch_scale_left_trigger", vjoy_d_custom[3][2]).commit(); - - prefs.edit().putFloat("touch_x_shift_right_trigger", vjoy_d_custom[4][0]).commit(); - prefs.edit().putFloat("touch_y_shift_right_trigger", vjoy_d_custom[4][1]).commit(); - prefs.edit().putFloat("touch_scale_right_trigger", vjoy_d_custom[4][2]).commit(); - - prefs.edit().putFloat("touch_x_shift_analog", vjoy_d_custom[5][0]).commit(); - prefs.edit().putFloat("touch_y_shift_analog", vjoy_d_custom[5][1]).commit(); - prefs.edit().putFloat("touch_scale_analog", vjoy_d_custom[5][2]).commit(); - } - public static float[][] readCustomVjoyValues(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); @@ -206,7 +142,7 @@ class GL2JNIView extends GLSurfaceView public void restoreCustomVjoyValues(float[][] vjoy_d_cached) { vjoy_d_custom = vjoy_d_cached; - writeCustomVjoyValues(vjoy_d_cached, context); + VJoy.writeCustomVjoyValues(vjoy_d_cached, context); resetEditMode(); requestLayout(); @@ -356,7 +292,7 @@ class GL2JNIView extends GLSurfaceView float a_x = -tx+ 24*scl; float a_y=- 24*scl; - float[][] vjoy_d = getVjoy_d(vjoy_d_custom); + float[][] vjoy_d = VJoy.getVjoy_d(vjoy_d_custom); for(int i=0;i check for freed analog * */ int anal_id=-1, lt_id=-1, rt_id=-1; - /* - bool intersects(CircleType circle, RectType rect) - { - circleDistance.x = abs(circle.x - rect.x); - circleDistance.y = abs(circle.y - rect.y); - - if (circleDistance.x > (rect.width/2 + circle.r)) { return false; } - if (circleDistance.y > (rect.height/2 + circle.r)) { return false; } - - if (circleDistance.x <= (rect.width/2)) { return true; } - if (circleDistance.y <= (rect.height/2)) { return true; } - - cornerDistance_sq = (circleDistance.x - rect.width/2)^2 + - (circleDistance.y - rect.height/2)^2; - - return (cornerDistance_sq <= (circle.r^2)); - } - */ private void resetEditMode() { editLastX = 0; @@ -604,6 +514,7 @@ class GL2JNIViewV6 extends GLSurfaceView kcode_raw[0] = rv; jx[0] = get_anal(11, 0); jy[0] = get_anal(11, 1); + pushInput(); return(true); } @@ -766,17 +677,6 @@ private static class ContextFactory implements GLSurfaceView.EGLContextFactory { return(egl.eglGetConfigAttrib(display,config,attribute,mValue)? mValue[0] : defaultValue); } - - private void printConfigs(EGL10 egl,EGLDisplay display,EGLConfig[] configs) - { - LOGW(String.format("%d configurations",configs.length)); - - for(int i=0 ; i=8192)? AudioRate:8192; - Latency = AudioLatency>=50? AudioLatency:50; - Chunk = 2048; - Data = new short[Chunk*2]; - start(); - } - - public void stopPlayback() - { Rate=0; } - - public void pausePlayback(boolean Switch) - { - // Must have a valid player - if((Player==null) || (Player.getState()!=AudioTrack.STATE_INITIALIZED)) return; - - // Switch between playback and pause - if(Switch) { if(Player.getPlayState()==AudioTrack.PLAYSTATE_PLAYING) Player.pause(); } - else { if(Player.getPlayState()!=AudioTrack.PLAYSTATE_PLAYING) Player.play(); } - } - - @Override public void run() - { - int Size,Min; - - LOGI("Starting audio thread for Rate="+Rate+"Hz, Latency="+Latency+"ms"); - - // When no audio sampling rate supplied, do not play - if(Rate<=0) return; - - // Compute minimal and requested buffer sizes - Min = AudioTrack.getMinBufferSize(Rate,AudioFormat.CHANNEL_OUT_STEREO,AudioFormat.ENCODING_PCM_16BIT); - Size = 2*2*Chunk*2; - - // Create audio player - Player = new AudioTrack( - AudioManager.STREAM_MUSIC, - Rate, - AudioFormat.CHANNEL_OUT_STEREO, - AudioFormat.ENCODING_PCM_16BIT, - Min>Size? Min:Size, - AudioTrack.MODE_STREAM - ); - - // Start playback - Player.play(); - - // Continue writing data, until requested to quit - while(Rate>0) - { - //Size = JNIdc.play(Data,Chunk); - if(Size>0) Player.write(Data,0,2*Size); else yield(); - } - - // Stop playback - Player.stop(); - Player.flush(); - Player.release(); - - LOGI("Exiting audio thread"); - } - } public void onStop() { // TODO Auto-generated method stub diff --git a/shell/android/src/com/reicast/emulator/VJoy.java b/shell/android/src/com/reicast/emulator/VJoy.java new file mode 100644 index 000000000..a6fdeef2d --- /dev/null +++ b/shell/android/src/com/reicast/emulator/VJoy.java @@ -0,0 +1,72 @@ +package com.reicast.emulator; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +public class VJoy { + + public static final int key_CONT_B = 0x0002; + public static final int key_CONT_A = 0x0004; + public static final int key_CONT_START = 0x0008; + public static final int key_CONT_DPAD_UP = 0x0010; + public static final int key_CONT_DPAD_DOWN = 0x0020; + public static final int key_CONT_DPAD_LEFT = 0x0040; + public static final int key_CONT_DPAD_RIGHT = 0x0080; + public static final int key_CONT_Y = 0x0200; + public static final int key_CONT_X = 0x0400; + + public static final int LAYER_TYPE_SOFTWARE = 1; + public static final int LAYER_TYPE_HARDWARE = 2; + + public static float[][] getVjoy_d(float[][] vjoy_d_custom) { + return new float[][] + { + new float[] { 20+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_LEFT}, + new float[] { 20+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_UP}, + new float[] { 20+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_RIGHT}, + new float[] { 20+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_DOWN}, + + new float[] { 448+0*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_X}, + new float[] { 448+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+0*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_Y}, + new float[] { 448+128*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_B}, + new float[] { 448+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+128*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_A}, + + new float[] { 320-32+vjoy_d_custom[2][0], 288+128+vjoy_d_custom[2][1], 64*vjoy_d_custom[2][2],64*vjoy_d_custom[2][2], key_CONT_START}, + + new float[] { 440+vjoy_d_custom[3][0], 200+vjoy_d_custom[3][1], 90*vjoy_d_custom[3][2],64*vjoy_d_custom[3][2], -1}, + new float[] { 542+vjoy_d_custom[4][0], 200+vjoy_d_custom[4][1], 90*vjoy_d_custom[4][2],64*vjoy_d_custom[4][2], -2}, + + new float[] { 16+vjoy_d_custom[5][0], 24+32+vjoy_d_custom[5][1], 128*vjoy_d_custom[5][2],128*vjoy_d_custom[5][2], -3}, + new float[] { 96+vjoy_d_custom[5][0], 320+vjoy_d_custom[5][1], 32*vjoy_d_custom[5][2],32*vjoy_d_custom[5][2], -4}, + }; + } + + public static void writeCustomVjoyValues(float[][] vjoy_d_custom, Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + prefs.edit().putFloat("touch_x_shift_dpad", vjoy_d_custom[0][0]).commit(); + prefs.edit().putFloat("touch_y_shift_dpad", vjoy_d_custom[0][1]).commit(); + prefs.edit().putFloat("touch_scale_dpad", vjoy_d_custom[0][2]).commit(); + + prefs.edit().putFloat("touch_x_shift_buttons", vjoy_d_custom[1][0]).commit(); + prefs.edit().putFloat("touch_y_shift_buttons", vjoy_d_custom[1][1]).commit(); + prefs.edit().putFloat("touch_scale_buttons", vjoy_d_custom[1][2]).commit(); + + prefs.edit().putFloat("touch_x_shift_start", vjoy_d_custom[2][0]).commit(); + prefs.edit().putFloat("touch_y_shift_start", vjoy_d_custom[2][1]).commit(); + prefs.edit().putFloat("touch_scale_start", vjoy_d_custom[2][2]).commit(); + + prefs.edit().putFloat("touch_x_shift_left_trigger", vjoy_d_custom[3][0]).commit(); + prefs.edit().putFloat("touch_y_shift_left_trigger", vjoy_d_custom[3][1]).commit(); + prefs.edit().putFloat("touch_scale_left_trigger", vjoy_d_custom[3][2]).commit(); + + prefs.edit().putFloat("touch_x_shift_right_trigger", vjoy_d_custom[4][0]).commit(); + prefs.edit().putFloat("touch_y_shift_right_trigger", vjoy_d_custom[4][1]).commit(); + prefs.edit().putFloat("touch_scale_right_trigger", vjoy_d_custom[4][2]).commit(); + + prefs.edit().putFloat("touch_x_shift_analog", vjoy_d_custom[5][0]).commit(); + prefs.edit().putFloat("touch_y_shift_analog", vjoy_d_custom[5][1]).commit(); + prefs.edit().putFloat("touch_scale_analog", vjoy_d_custom[5][2]).commit(); + } +} From 1e6c050d3d495522be1a605b63700ebb11faadab Mon Sep 17 00:00:00 2001 From: TwistedUmbrella Date: Tue, 11 Feb 2014 22:30:17 -0500 Subject: [PATCH 2/3] Finish subclassing VJoy, EGL, OSD, Add runtime muting --- shell/android/psd/dctemplate.psd | Bin 169912 -> 189016 bytes shell/android/res/drawable/enable_sound.png | Bin 0 -> 9492 bytes shell/android/res/drawable/mute_sound.png | Bin 0 -> 12801 bytes .../reicast/emulator/EditVJoyActivity.java | 56 +- .../com/reicast/emulator/GL2JNIActivity.java | 98 +- .../src/com/reicast/emulator/GL2JNIView.java | 122 +-- .../com/reicast/emulator/GL2JNIViewV6.java | 869 ------------------ .../src/com/reicast/emulator/GLCFactory6.java | 243 +++++ .../src/com/reicast/emulator/MOGAInput.java | 47 +- .../com/reicast/emulator/OnScreenMenu.java | 22 + .../src/com/reicast/emulator/VJoy.java | 164 +++- 11 files changed, 460 insertions(+), 1161 deletions(-) create mode 100644 shell/android/res/drawable/enable_sound.png create mode 100644 shell/android/res/drawable/mute_sound.png delete mode 100644 shell/android/src/com/reicast/emulator/GL2JNIViewV6.java create mode 100644 shell/android/src/com/reicast/emulator/GLCFactory6.java diff --git a/shell/android/psd/dctemplate.psd b/shell/android/psd/dctemplate.psd index a5ef4461f5523cd18d503cde7b884e0218784f79..481bb87cfe268f97153816609466a0e629c716bc 100644 GIT binary patch delta 17645 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 Y+kAg<^-pa>53jQjs$FrGrjX_T0jF*}xBvhE delta 266 zcmca{gnP$&t_g~~6D*uOeOXu-KtO$>p5nxCVS!nlYhyKXcPTQRIK48R)&BOvDkg3N z%Me3DD?atqnz|ae8W~R3V3%R^oGidCvYCl}CM&93 z8;9rQ4?L{MCT!xBGudq7sLIHz1$GV-*g0X73!TDvzybzf0qw~Tom3`&aAKd#>MX?Q zG+DygoY8c0fV24Ii(cZJCpkCsGdgb;3-;gunymnLZDw>ohiV4{lWNTWtD9o}yEQkj S-rl^LG5+56U8kAmi2(rj4NNuw diff --git a/shell/android/res/drawable/enable_sound.png b/shell/android/res/drawable/enable_sound.png new file mode 100644 index 0000000000000000000000000000000000000000..ca73d733ce01cb1c80d139720f159b4f990084eb GIT binary patch literal 9492 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 literal 0 HcmV?d00001 diff --git a/shell/android/res/drawable/mute_sound.png b/shell/android/res/drawable/mute_sound.png new file mode 100644 index 0000000000000000000000000000000000000000..18e7f21eec9de9e8464ce47aa98883919c6e2ea2 GIT binary patch literal 12801 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 Build.VERSION_CODES.KITKAT) { - setOnSystemUiVisibilityChangeListener (new OnSystemUiVisibilityChangeListener() { - public void onSystemUiVisibilityChange(int visibility) { - if ((visibility & SYSTEM_UI_FLAG_FULLSCREEN) == 0) { - GL2JNIViewV6.this.setSystemUiVisibility( - SYSTEM_UI_FLAG_IMMERSIVE_STICKY - | SYSTEM_UI_FLAG_FULLSCREEN - | SYSTEM_UI_FLAG_HIDE_NAVIGATION); - } - } - }); - } - - vib=(Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); - - Runtime.getRuntime().freeMemory(); - System.gc(); - - Thread.currentThread().setPriority(Thread.MAX_PRIORITY); - - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - touchVibrationEnabled = prefs.getBoolean("touch_vibration_enabled", true); - - vjoy_d_custom = readCustomVjoyValues(context); - - scaleGestureDetector = new ScaleGestureDetector(context, new OscOnScaleGestureListener()); - - // This is the game we are going to run - fileName = newFileName; - - if (GL2JNIActivity.syms != null) - JNIdc.data(1, GL2JNIActivity.syms); - - JNIdc.init(fileName); - - // By default, GLSurfaceView() creates a RGB_565 opaque surface. - // If we want a translucent one, we should change the surface's - // format here, using PixelFormat.TRANSLUCENT for GL Surfaces - // is interpreted as any 32-bit surface with alpha by SurfaceFlinger. - if(translucent) this.getHolder().setFormat(PixelFormat.TRANSLUCENT); - - // Setup the context factory for 2.0 rendering. - // See ContextFactory class definition below - setEGLContextFactory(new ContextFactory()); - - // We need to choose an EGLConfig that matches the format of - // our surface exactly. This is going to be done in our - // custom config chooser. See ConfigChooser class definition - // below. - setEGLConfigChooser( - translucent? - new ConfigChooser(8, 8, 8, 8, depth, stencil) - : new ConfigChooser(5, 6, 5, 0, depth, stencil) - ); - - // Set the renderer responsible for frame rendering - setRenderer(rend=new Renderer()); - - ethd.start(); - } - - public GLSurfaceView.Renderer getRenderer() - { - return rend; - } - - private static void LOGI(String S) { Log.i("GL2JNIView",S); } - private static void LOGW(String S) { Log.w("GL2JNIView",S); } - private static void LOGE(String S) { Log.e("GL2JNIView",S); } - - private void reset_analog() - { - - int j=11; - vjoy[j+1][0]=vjoy[j][0]+vjoy[j][2]/2-vjoy[j+1][2]/2; - vjoy[j+1][1]=vjoy[j][1]+vjoy[j][3]/2-vjoy[j+1][3]/2; - JNIdc.vjoy(j+1, vjoy[j+1][0], vjoy[j+1][1], vjoy[j+1][2], vjoy[j+1][3]); - } - - int get_anal(int j, int axis) - { - return (int) (((vjoy[j+1][axis]+vjoy[j+1][axis+2]/2) - vjoy[j][axis] - vjoy[j][axis+2]/2)*254/vjoy[j][axis+2]); - } - - float vbase(float p, float m, float scl) - { - return (int) ( m - (m -p)*scl); - } - - float vbase(float p, float scl) - { - return (int) (p*scl ); - } - - public boolean isTablet() { - return (getContext().getResources().getConfiguration().screenLayout - & Configuration.SCREENLAYOUT_SIZE_MASK) - >= Configuration.SCREENLAYOUT_SIZE_LARGE; - } - - @Override - protected void onLayout(boolean changed, int left, int top, int right, int bottom) - { - super.onLayout(changed, left, top, right, bottom); - //dcpx/cm = dcpx/px * px/cm - float magic = isTablet() ? 0.8f : 0.7f; - float scl=480.0f/getHeight() * getContext().getResources().getDisplayMetrics().density * magic; - float scl_dc=getHeight()/480.0f; - float tx = ((getWidth()-640.0f*scl_dc)/2)/scl_dc; - - float a_x = -tx+ 24*scl; - float a_y=- 24*scl; - - float[][] vjoy_d = VJoy.getVjoy_d(vjoy_d_custom); - - for(int i=0;i reset state - * POINTER_UP -> check for freed analog - * */ - int anal_id=-1, lt_id=-1, rt_id=-1; - - private void resetEditMode() { - editLastX = 0; - editLastY = 0; - } - - private static int getElementIdFromButtonId(int buttonId) { - if (buttonId <= 3) - return 0; // DPAD - else if (buttonId <= 7) - return 1; // X, Y, B, A Buttons - else if (buttonId == 8) - return 2; // Start - else if (buttonId == 9) - return 3; // Left Trigger - else if (buttonId == 10) - return 4; // Right Trigger - else if (buttonId <= 12) - return 5; // Analog - else - return -1; // Invalid - } - - static int[] kcode_raw = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF }; - static int[] lt = new int[4], rt = new int[4], jx = new int[4], jy = new int[4]; - - float editLastX = 0, editLastY = 0; - - @Override public boolean onTouchEvent(final MotionEvent event) - { - JNIdc.show_osd(); - - scaleGestureDetector.onTouchEvent(event); - - float ty = 0.0f; - float scl = getHeight()/480.0f; - float tx = (getWidth()-640.0f*scl)/2; - - int rv = 0xFFFF; - - int aid = event.getActionMasked(); - int pid = event.getActionIndex(); - - if (editVjoyMode && selectedVjoyElement != -1 && aid == MotionEvent.ACTION_MOVE && !scaleGestureDetector.isInProgress()) { - float x = (event.getX()-tx)/scl; - float y = (event.getY()-ty)/scl; - - if (editLastX != 0 && editLastY != 0) { - float deltaX = x - editLastX; - float deltaY = y - editLastY; - - vjoy_d_custom[selectedVjoyElement][0] += isTablet() ? deltaX * 2 : deltaX; - vjoy_d_custom[selectedVjoyElement][1] += isTablet() ? deltaY * 2 : deltaY; - - requestLayout(); - } - - editLastX = x; - editLastY = y; - - return true; - } - - //LOGI("Touch: " + aid + ", " + pid); - - for(int i=0;ivjoy[j][0] && x<=(vjoy[j][0]+vjoy[j][2])) - { - int pre=(int)(event.getPressure(i)*255); - if (pre>20) - { - pre-=20; - pre*=7; - } - if (pre>255) pre=255; - - if(y>vjoy[j][1] && y<=(vjoy[j][1]+vjoy[j][3])) - { - if (vjoy[j][4]>=-2) - { - if (vjoy[j][5]==0) - if (!editVjoyMode && touchVibrationEnabled) - vib.vibrate(50); - vjoy[j][5]=2; - } - - - if(vjoy[j][4]==-3) - { - if (editVjoyMode) { - selectedVjoyElement = 5; // Analog - resetEditMode(); - } else { - vjoy[j+1][0]=x-vjoy[j+1][2]/2; - vjoy[j+1][1]=y-vjoy[j+1][3]/2; - - JNIdc.vjoy(j+1, vjoy[j+1][0], vjoy[j+1][1] , vjoy[j+1][2], vjoy[j+1][3]); - anal_id=event.getPointerId(i); - } - } - else if (vjoy[j][4]==-4); - else if(vjoy[j][4]==-1) { - if (editVjoyMode) { - selectedVjoyElement = 3; // Left Trigger - resetEditMode(); - } else { - lt[0]=pre; - lt_id=event.getPointerId(i); - } - } - else if(vjoy[j][4]==-2) { - if (editVjoyMode) { - selectedVjoyElement = 4; // Right Trigger - resetEditMode(); - } else{ - rt[0]=pre; - rt_id=event.getPointerId(i); - } - } - else { - if (editVjoyMode) { - selectedVjoyElement = getElementIdFromButtonId(j); - resetEditMode(); - } else - rv&=~(int)vjoy[j][4]; - } - } - } - } - } - else - { - if (x(vjoy[11][0]+vjoy[11][2])) - x=vjoy[11][0]+vjoy[11][2]; - - if (y(vjoy[11][1]+vjoy[11][3])) - y=vjoy[11][1]+vjoy[11][3]; - - int j=11; - vjoy[j+1][0]=x-vjoy[j+1][2]/2; - vjoy[j+1][1]=y-vjoy[j+1][3]/2; - - JNIdc.vjoy(j+1, vjoy[j+1][0], vjoy[j+1][1] , vjoy[j+1][2], vjoy[j+1][3]); - - } - } - - for(int j=0;j= mDepthSize || s >= mStencilSize) { - // We want an *exact* match for red/green/blue/alpha - int r = findConfigAttrib(egl, display, config, - EGL14.EGL_RED_SIZE, 0); - int g = findConfigAttrib(egl, display, config, - EGL14.EGL_GREEN_SIZE, 0); - int b = findConfigAttrib(egl, display, config, - EGL14.EGL_BLUE_SIZE, 0); - int a = findConfigAttrib(egl, display, config, - EGL14.EGL_ALPHA_SIZE, 0); - - if (r == mRedSize && g == mGreenSize && b == mBlueSize - && a == mAlphaSize) - if (DEBUG) { - LOGW(String.format("Configuration %d:", i)); - printConfig(egl, display, configs[i]); - } - return config; - } - } - - throw new IllegalArgumentException("Could not find suitable EGL config"); - } - - private int findConfigAttrib(EGL10 egl,EGLDisplay display,EGLConfig config,int attribute,int defaultValue) - { - return(egl.eglGetConfigAttrib(display,config,attribute,mValue)? mValue[0] : defaultValue); - } - - private void printConfig(EGL10 egl,EGLDisplay display,EGLConfig config) - { - final int[] attributes = - { - EGL14.EGL_BUFFER_SIZE, - EGL14.EGL_ALPHA_SIZE, - EGL14.EGL_BLUE_SIZE, - EGL14.EGL_GREEN_SIZE, - EGL14.EGL_RED_SIZE, - EGL14.EGL_DEPTH_SIZE, - EGL14.EGL_STENCIL_SIZE, - EGL14.EGL_CONFIG_CAVEAT, - EGL14.EGL_CONFIG_ID, - EGL14.EGL_LEVEL, - EGL14.EGL_MAX_PBUFFER_HEIGHT, - EGL14.EGL_MAX_PBUFFER_PIXELS, - EGL14.EGL_MAX_PBUFFER_WIDTH, - EGL14.EGL_NATIVE_RENDERABLE, - EGL14.EGL_NATIVE_VISUAL_ID, - EGL14.EGL_NATIVE_VISUAL_TYPE, - 0x3030, // EGL14.EGL_PRESERVED_RESOURCES, - EGL14.EGL_SAMPLES, - EGL14.EGL_SAMPLE_BUFFERS, - EGL14.EGL_SURFACE_TYPE, - EGL14.EGL_TRANSPARENT_TYPE, - EGL14.EGL_TRANSPARENT_RED_VALUE, - EGL14.EGL_TRANSPARENT_GREEN_VALUE, - EGL14.EGL_TRANSPARENT_BLUE_VALUE, - 0x3039, // EGL14.EGL_BIND_TO_TEXTURE_RGB, - 0x303A, // EGL14.EGL_BIND_TO_TEXTURE_RGBA, - 0x303B, // EGL14.EGL_MIN_SWAP_INTERVAL, - 0x303C, // EGL14.EGL_MAX_SWAP_INTERVAL, - EGL14.EGL_LUMINANCE_SIZE, - EGL14.EGL_ALPHA_MASK_SIZE, - EGL14.EGL_COLOR_BUFFER_TYPE, - EGL14.EGL_RENDERABLE_TYPE, - 0x3042 // EGL14.EGL_CONFORMANT - }; - - final String[] names = - { - "EGL_BUFFER_SIZE", - "EGL_ALPHA_SIZE", - "EGL_BLUE_SIZE", - "EGL_GREEN_SIZE", - "EGL_RED_SIZE", - "EGL_DEPTH_SIZE", - "EGL_STENCIL_SIZE", - "EGL_CONFIG_CAVEAT", - "EGL_CONFIG_ID", - "EGL_LEVEL", - "EGL_MAX_PBUFFER_HEIGHT", - "EGL_MAX_PBUFFER_PIXELS", - "EGL_MAX_PBUFFER_WIDTH", - "EGL_NATIVE_RENDERABLE", - "EGL_NATIVE_VISUAL_ID", - "EGL_NATIVE_VISUAL_TYPE", - "EGL_PRESERVED_RESOURCES", - "EGL_SAMPLES", - "EGL_SAMPLE_BUFFERS", - "EGL_SURFACE_TYPE", - "EGL_TRANSPARENT_TYPE", - "EGL_TRANSPARENT_RED_VALUE", - "EGL_TRANSPARENT_GREEN_VALUE", - "EGL_TRANSPARENT_BLUE_VALUE", - "EGL_BIND_TO_TEXTURE_RGB", - "EGL_BIND_TO_TEXTURE_RGBA", - "EGL_MIN_SWAP_INTERVAL", - "EGL_MAX_SWAP_INTERVAL", - "EGL_LUMINANCE_SIZE", - "EGL_ALPHA_MASK_SIZE", - "EGL_COLOR_BUFFER_TYPE", - "EGL_RENDERABLE_TYPE", - "EGL_CONFORMANT" - }; - - int[] value = new int[1]; - - for(int i=0 ; imin) - min=2048; - - Player = new AudioTrack( - AudioManager.STREAM_MUSIC, - 44100, - AudioFormat.CHANNEL_OUT_STEREO, - AudioFormat.ENCODING_PCM_16BIT, - min, - AudioTrack.MODE_STREAM - ); - - size=min/4; - pos=0; - - Log.i("audcfg", "Audio streaming: buffer size " + min + " samples / " + min/44100.0 + " ms"); - Player.play(); - - JNIdc.run(this); - } - - int WriteBuffer(short[] samples, int wait) - { - int newdata=samples.length/2; - - if (wait==0) - { - //user bytes = write-read - //available = size - (write - play) - long used=pos-Player.getPlaybackHeadPosition(); - long avail=size-used; - - //Log.i("AUD", "u: " + used + " a: " + avail); - if (avail= Build.VERSION_CODES.KITKAT) { - GL2JNIViewV6.this.setSystemUiVisibility( - View.SYSTEM_UI_FLAG_LAYOUT_STABLE - | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_FULLSCREEN - | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);} - } -} diff --git a/shell/android/src/com/reicast/emulator/GLCFactory6.java b/shell/android/src/com/reicast/emulator/GLCFactory6.java new file mode 100644 index 000000000..783761986 --- /dev/null +++ b/shell/android/src/com/reicast/emulator/GLCFactory6.java @@ -0,0 +1,243 @@ +package com.reicast.emulator; + +import javax.microedition.khronos.egl.EGL10; +import javax.microedition.khronos.egl.EGLConfig; +import javax.microedition.khronos.egl.EGLContext; +import javax.microedition.khronos.egl.EGLDisplay; + +import android.opengl.EGL14; +import android.opengl.EGLExt; +import android.opengl.GLSurfaceView; +import android.util.Log; + +public class GLCFactory6 { + + private static void LOGI(String S) { Log.i("GL2JNIView-v6",S); } + private static void LOGW(String S) { Log.w("GL2JNIView-v6",S); } + private static void LOGE(String S) { Log.e("GL2JNIView-v6",S); } + + public static class ContextFactory implements GLSurfaceView.EGLContextFactory + { + private static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098; + + public EGLContext createContext(EGL10 egl,EGLDisplay display,EGLConfig eglConfig) + { + int[] attrList = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL14.EGL_NONE }; + + LOGI("Creating OpenGL ES X context"); + + checkEglError("Before eglCreateContext",egl); + EGLContext context = egl.eglCreateContext(display,eglConfig,EGL10.EGL_NO_CONTEXT,attrList); + checkEglError("After eglCreateContext",egl); + return(context); + } + + public void destroyContext(EGL10 egl,EGLDisplay display,EGLContext context) + { + LOGI("Destroying OpenGL ES X context"); + egl.eglDestroyContext(display,context); + } + } + + private static void checkEglError(String prompt,EGL10 egl) + { + int error; + + while((error=egl.eglGetError()) != EGL14.EGL_SUCCESS) + LOGE(String.format("%s: EGL error: 0x%x",prompt,error)); + } + + public static class ConfigChooser implements GLSurfaceView.EGLConfigChooser + { + // Subclasses can adjust these values: + protected int mRedSize; + protected int mGreenSize; + protected int mBlueSize; + protected int mAlphaSize; + protected int mDepthSize; + protected int mStencilSize; + private int[] mValue = new int[1]; + + public ConfigChooser(int r,int g,int b,int a,int depth,int stencil) + { + mRedSize = r; + mGreenSize = g; + mBlueSize = b; + mAlphaSize = a; + mDepthSize = depth; + mStencilSize = stencil; + } + + public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) { + mValue = new int[1]; + + int glAPIToTry = EGLExt.EGL_OPENGL_ES3_BIT_KHR; + int[] configSpec = null; + + do { + EGL14.eglBindAPI(glAPIToTry); + + int renderableType; + if (glAPIToTry == EGLExt.EGL_OPENGL_ES3_BIT_KHR) { + renderableType = EGLExt.EGL_OPENGL_ES3_BIT_KHR; + // If this API does not work, try ES2 next. + glAPIToTry = EGL14.EGL_OPENGL_ES2_BIT; + } else { + renderableType = EGL14.EGL_OPENGL_ES2_BIT; + // If this API does not work, try ES next. + glAPIToTry = EGL14.EGL_OPENGL_ES_API; + } + + configSpec = new int[] { + EGL14.EGL_RED_SIZE, 4, + EGL14.EGL_GREEN_SIZE, 4, + EGL14.EGL_BLUE_SIZE, 4, + EGL14.EGL_RENDERABLE_TYPE, renderableType, + EGL14.EGL_DEPTH_SIZE, 24, + EGL14.EGL_NONE + }; + + if (!egl.eglChooseConfig(display, configSpec, null, 0, mValue)) { + configSpec[9] = 16; + if (!egl.eglChooseConfig(display, configSpec, null, 0, mValue)) { + throw new IllegalArgumentException("Could not get context count"); + } + } + + } while (glAPIToTry != EGL14.EGL_OPENGL_ES_API && mValue[0]<=0); + + if (mValue[0]<=0) { + throw new IllegalArgumentException("No configs match configSpec"); + } + + // Get all matching configurations. + EGLConfig[] configs = new EGLConfig[mValue[0]]; + if (GL2JNIView.DEBUG) + LOGW(String.format("%d configurations", configs.length)); + if (!egl.eglChooseConfig(display, configSpec, configs, mValue[0], mValue)) { + throw new IllegalArgumentException("Could not get config data"); + } + + for (int i = 0; i < configs.length; ++i) { + EGLConfig config = configs[i]; + int d = findConfigAttrib(egl, display, config, + EGL14.EGL_DEPTH_SIZE, 0); + int s = findConfigAttrib(egl, display, config, + EGL14.EGL_STENCIL_SIZE, 0); + + // We need at least mDepthSize and mStencilSize bits + if (d >= mDepthSize || s >= mStencilSize) { + // We want an *exact* match for red/green/blue/alpha + int r = findConfigAttrib(egl, display, config, + EGL14.EGL_RED_SIZE, 0); + int g = findConfigAttrib(egl, display, config, + EGL14.EGL_GREEN_SIZE, 0); + int b = findConfigAttrib(egl, display, config, + EGL14.EGL_BLUE_SIZE, 0); + int a = findConfigAttrib(egl, display, config, + EGL14.EGL_ALPHA_SIZE, 0); + + if (r == mRedSize && g == mGreenSize && b == mBlueSize + && a == mAlphaSize) + if (GL2JNIView.DEBUG) { + LOGW(String.format("Configuration %d:", i)); + printConfig(egl, display, configs[i]); + } + return config; + } + } + + throw new IllegalArgumentException("Could not find suitable EGL config"); + } + + private int findConfigAttrib(EGL10 egl,EGLDisplay display,EGLConfig config,int attribute,int defaultValue) + { + return(egl.eglGetConfigAttrib(display,config,attribute,mValue)? mValue[0] : defaultValue); + } + + private void printConfig(EGL10 egl,EGLDisplay display,EGLConfig config) + { + final int[] attributes = + { + EGL14.EGL_BUFFER_SIZE, + EGL14.EGL_ALPHA_SIZE, + EGL14.EGL_BLUE_SIZE, + EGL14.EGL_GREEN_SIZE, + EGL14.EGL_RED_SIZE, + EGL14.EGL_DEPTH_SIZE, + EGL14.EGL_STENCIL_SIZE, + EGL14.EGL_CONFIG_CAVEAT, + EGL14.EGL_CONFIG_ID, + EGL14.EGL_LEVEL, + EGL14.EGL_MAX_PBUFFER_HEIGHT, + EGL14.EGL_MAX_PBUFFER_PIXELS, + EGL14.EGL_MAX_PBUFFER_WIDTH, + EGL14.EGL_NATIVE_RENDERABLE, + EGL14.EGL_NATIVE_VISUAL_ID, + EGL14.EGL_NATIVE_VISUAL_TYPE, + 0x3030, // EGL14.EGL_PRESERVED_RESOURCES, + EGL14.EGL_SAMPLES, + EGL14.EGL_SAMPLE_BUFFERS, + EGL14.EGL_SURFACE_TYPE, + EGL14.EGL_TRANSPARENT_TYPE, + EGL14.EGL_TRANSPARENT_RED_VALUE, + EGL14.EGL_TRANSPARENT_GREEN_VALUE, + EGL14.EGL_TRANSPARENT_BLUE_VALUE, + 0x3039, // EGL14.EGL_BIND_TO_TEXTURE_RGB, + 0x303A, // EGL14.EGL_BIND_TO_TEXTURE_RGBA, + 0x303B, // EGL14.EGL_MIN_SWAP_INTERVAL, + 0x303C, // EGL14.EGL_MAX_SWAP_INTERVAL, + EGL14.EGL_LUMINANCE_SIZE, + EGL14.EGL_ALPHA_MASK_SIZE, + EGL14.EGL_COLOR_BUFFER_TYPE, + EGL14.EGL_RENDERABLE_TYPE, + 0x3042 // EGL14.EGL_CONFORMANT + }; + + final String[] names = + { + "EGL_BUFFER_SIZE", + "EGL_ALPHA_SIZE", + "EGL_BLUE_SIZE", + "EGL_GREEN_SIZE", + "EGL_RED_SIZE", + "EGL_DEPTH_SIZE", + "EGL_STENCIL_SIZE", + "EGL_CONFIG_CAVEAT", + "EGL_CONFIG_ID", + "EGL_LEVEL", + "EGL_MAX_PBUFFER_HEIGHT", + "EGL_MAX_PBUFFER_PIXELS", + "EGL_MAX_PBUFFER_WIDTH", + "EGL_NATIVE_RENDERABLE", + "EGL_NATIVE_VISUAL_ID", + "EGL_NATIVE_VISUAL_TYPE", + "EGL_PRESERVED_RESOURCES", + "EGL_SAMPLES", + "EGL_SAMPLE_BUFFERS", + "EGL_SURFACE_TYPE", + "EGL_TRANSPARENT_TYPE", + "EGL_TRANSPARENT_RED_VALUE", + "EGL_TRANSPARENT_GREEN_VALUE", + "EGL_TRANSPARENT_BLUE_VALUE", + "EGL_BIND_TO_TEXTURE_RGB", + "EGL_BIND_TO_TEXTURE_RGBA", + "EGL_MIN_SWAP_INTERVAL", + "EGL_MAX_SWAP_INTERVAL", + "EGL_LUMINANCE_SIZE", + "EGL_ALPHA_MASK_SIZE", + "EGL_COLOR_BUFFER_TYPE", + "EGL_RENDERABLE_TYPE", + "EGL_CONFORMANT" + }; + + int[] value = new int[1]; + + for(int i=0 ; i entry : mMotions.entrySet()) diff --git a/shell/android/src/com/reicast/emulator/OnScreenMenu.java b/shell/android/src/com/reicast/emulator/OnScreenMenu.java index 28793580c..c306e4881 100644 --- a/shell/android/src/com/reicast/emulator/OnScreenMenu.java +++ b/shell/android/src/com/reicast/emulator/OnScreenMenu.java @@ -23,6 +23,7 @@ public class OnScreenMenu { private int frameskip; private boolean widescreen; private boolean limitframes; + private boolean audioenabled; private File sdcard = Environment.getExternalStorageDirectory(); private String home_directory = sdcard + "/dc"; @@ -197,6 +198,27 @@ public class OnScreenMenu { }); } hlay.addView(framelimit, params); + View audiosetting; + if (!audioenabled) { + audiosetting = addbut(R.drawable.enable_sound, + new OnClickListener() { + public void onClick(View v) { + mContext.mView.audioConfigure(true); + popUpConfig.dismiss(); + audioenabled = true; + } + }); + } else { + audiosetting = addbut(R.drawable.mute_sound, + new OnClickListener() { + public void onClick(View v) { + mContext.mView.audioConfigure(false); + popUpConfig.dismiss(); + audioenabled = false; + } + }); + } + hlay.addView(audiosetting, params); hlay.addView(addbut(R.drawable.up, new OnClickListener() { public void onClick(View v) { popUpConfig.dismiss(); diff --git a/shell/android/src/com/reicast/emulator/VJoy.java b/shell/android/src/com/reicast/emulator/VJoy.java index a6fdeef2d..a516ce580 100644 --- a/shell/android/src/com/reicast/emulator/VJoy.java +++ b/shell/android/src/com/reicast/emulator/VJoy.java @@ -5,68 +5,130 @@ import android.content.SharedPreferences; import android.preference.PreferenceManager; public class VJoy { - + public static final int key_CONT_B = 0x0002; - public static final int key_CONT_A = 0x0004; - public static final int key_CONT_START = 0x0008; - public static final int key_CONT_DPAD_UP = 0x0010; - public static final int key_CONT_DPAD_DOWN = 0x0020; - public static final int key_CONT_DPAD_LEFT = 0x0040; - public static final int key_CONT_DPAD_RIGHT = 0x0080; - public static final int key_CONT_Y = 0x0200; - public static final int key_CONT_X = 0x0400; - - public static final int LAYER_TYPE_SOFTWARE = 1; - public static final int LAYER_TYPE_HARDWARE = 2; - + public static final int key_CONT_A = 0x0004; + public static final int key_CONT_START = 0x0008; + public static final int key_CONT_DPAD_UP = 0x0010; + public static final int key_CONT_DPAD_DOWN = 0x0020; + public static final int key_CONT_DPAD_LEFT = 0x0040; + public static final int key_CONT_DPAD_RIGHT = 0x0080; + public static final int key_CONT_Y = 0x0200; + public static final int key_CONT_X = 0x0400; + + public static final int LAYER_TYPE_SOFTWARE = 1; + public static final int LAYER_TYPE_HARDWARE = 2; + + public static float[][] baseVJoy() { + return new float[][] { + new float[] { 24+0, 24+64, 64,64, VJoy.key_CONT_DPAD_LEFT, 0}, + new float[] { 24+64, 24+0, 64,64, VJoy.key_CONT_DPAD_UP, 0}, + new float[] { 24+128, 24+64, 64,64, VJoy.key_CONT_DPAD_RIGHT, 0}, + new float[] { 24+64, 24+128, 64,64, VJoy.key_CONT_DPAD_DOWN, 0}, + + new float[] { 440+0, 280+64, 64,64, VJoy.key_CONT_X, 0}, + new float[] { 440+64, 280+0, 64,64, VJoy.key_CONT_Y, 0}, + new float[] { 440+128, 280+64, 64,64, VJoy.key_CONT_B, 0}, + new float[] { 440+64, 280+128, 64,64, VJoy.key_CONT_A, 0}, + + new float[] { 320-32, 360+32, 64,64, VJoy.key_CONT_START, 0}, + + new float[] { 440, 200, 90,64, -1, 0}, + new float[] { 542, 200, 90,64, -2, 0}, + + new float[] { 0, 128+224, 128,128, -3, 0}, + new float[] { 96, 320, 32,32, -4, 0}, + }; + } + + public static float[][] readCustomVjoyValues(Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + return new float[][] { + // x-shift, y-shift, sizing-factor + new float[] { prefs.getFloat("touch_x_shift_dpad", 0), prefs.getFloat("touch_y_shift_dpad", 0), prefs.getFloat("touch_scale_dpad", 1) }, // DPAD + new float[] { prefs.getFloat("touch_x_shift_buttons", 0), prefs.getFloat("touch_y_shift_buttons", 0), prefs.getFloat("touch_scale_buttons", 1) }, // X, Y, B, A Buttons + new float[] { prefs.getFloat("touch_x_shift_start", 0), prefs.getFloat("touch_y_shift_start", 0), prefs.getFloat("touch_scale_start", 1) }, // Start + new float[] { prefs.getFloat("touch_x_shift_left_trigger", 0), prefs.getFloat("touch_y_shift_left_trigger", 0), prefs.getFloat("touch_scale_left_trigger", 1) }, // Left Trigger + new float[] { prefs.getFloat("touch_x_shift_right_trigger", 0), prefs.getFloat("touch_y_shift_right_trigger", 0), prefs.getFloat("touch_scale_right_trigger", 1) }, // Right Trigger + new float[] { prefs.getFloat("touch_x_shift_analog", 0), prefs.getFloat("touch_y_shift_analog", 0), prefs.getFloat("touch_scale_analog", 1) } // Analog Stick + }; + } + public static float[][] getVjoy_d(float[][] vjoy_d_custom) { - return new float[][] - { - new float[] { 20+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_LEFT}, - new float[] { 20+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_UP}, - new float[] { 20+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_RIGHT}, - new float[] { 20+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_DOWN}, + return new float[][] { + new float[] { 20+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_LEFT}, + new float[] { 20+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+0*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_UP}, + new float[] { 20+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_RIGHT}, + new float[] { 20+64*vjoy_d_custom[0][2]+vjoy_d_custom[0][0], 288+128*vjoy_d_custom[0][2]+vjoy_d_custom[0][1], 64*vjoy_d_custom[0][2],64*vjoy_d_custom[0][2], key_CONT_DPAD_DOWN}, - new float[] { 448+0*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_X}, - new float[] { 448+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+0*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_Y}, - new float[] { 448+128*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_B}, - new float[] { 448+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+128*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_A}, + new float[] { 448+0*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_X}, + new float[] { 448+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+0*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_Y}, + new float[] { 448+128*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_B}, + new float[] { 448+64*vjoy_d_custom[1][2]+vjoy_d_custom[1][0], 288+128*vjoy_d_custom[1][2]+vjoy_d_custom[1][1], 64*vjoy_d_custom[1][2],64*vjoy_d_custom[1][2], key_CONT_A}, - new float[] { 320-32+vjoy_d_custom[2][0], 288+128+vjoy_d_custom[2][1], 64*vjoy_d_custom[2][2],64*vjoy_d_custom[2][2], key_CONT_START}, - - new float[] { 440+vjoy_d_custom[3][0], 200+vjoy_d_custom[3][1], 90*vjoy_d_custom[3][2],64*vjoy_d_custom[3][2], -1}, - new float[] { 542+vjoy_d_custom[4][0], 200+vjoy_d_custom[4][1], 90*vjoy_d_custom[4][2],64*vjoy_d_custom[4][2], -2}, - - new float[] { 16+vjoy_d_custom[5][0], 24+32+vjoy_d_custom[5][1], 128*vjoy_d_custom[5][2],128*vjoy_d_custom[5][2], -3}, - new float[] { 96+vjoy_d_custom[5][0], 320+vjoy_d_custom[5][1], 32*vjoy_d_custom[5][2],32*vjoy_d_custom[5][2], -4}, - }; - } + new float[] { 320-32+vjoy_d_custom[2][0], 288+128+vjoy_d_custom[2][1], 64*vjoy_d_custom[2][2],64*vjoy_d_custom[2][2], key_CONT_START}, - public static void writeCustomVjoyValues(float[][] vjoy_d_custom, Context context) { + new float[] { 440+vjoy_d_custom[3][0], 200+vjoy_d_custom[3][1], 90*vjoy_d_custom[3][2],64*vjoy_d_custom[3][2], -1}, + new float[] { 542+vjoy_d_custom[4][0], 200+vjoy_d_custom[4][1], 90*vjoy_d_custom[4][2],64*vjoy_d_custom[4][2], -2}, + + new float[] { 16+vjoy_d_custom[5][0], 24+32+vjoy_d_custom[5][1], 128*vjoy_d_custom[5][2],128*vjoy_d_custom[5][2], -3}, + new float[] { 96+vjoy_d_custom[5][0], 320+vjoy_d_custom[5][1], 32*vjoy_d_custom[5][2],32*vjoy_d_custom[5][2], -4}, + }; + } + + public static void writeCustomVjoyValues(float[][] vjoy_d_custom, Context context) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + + prefs.edit().putFloat("touch_x_shift_dpad", vjoy_d_custom[0][0]).commit(); + prefs.edit().putFloat("touch_y_shift_dpad", vjoy_d_custom[0][1]).commit(); + prefs.edit().putFloat("touch_scale_dpad", vjoy_d_custom[0][2]).commit(); + + prefs.edit().putFloat("touch_x_shift_buttons", vjoy_d_custom[1][0]).commit(); + prefs.edit().putFloat("touch_y_shift_buttons", vjoy_d_custom[1][1]).commit(); + prefs.edit().putFloat("touch_scale_buttons", vjoy_d_custom[1][2]).commit(); + + prefs.edit().putFloat("touch_x_shift_start", vjoy_d_custom[2][0]).commit(); + prefs.edit().putFloat("touch_y_shift_start", vjoy_d_custom[2][1]).commit(); + prefs.edit().putFloat("touch_scale_start", vjoy_d_custom[2][2]).commit(); + + prefs.edit().putFloat("touch_x_shift_left_trigger", vjoy_d_custom[3][0]).commit(); + prefs.edit().putFloat("touch_y_shift_left_trigger", vjoy_d_custom[3][1]).commit(); + prefs.edit().putFloat("touch_scale_left_trigger", vjoy_d_custom[3][2]).commit(); + + prefs.edit().putFloat("touch_x_shift_right_trigger", vjoy_d_custom[4][0]).commit(); + prefs.edit().putFloat("touch_y_shift_right_trigger", vjoy_d_custom[4][1]).commit(); + prefs.edit().putFloat("touch_scale_right_trigger", vjoy_d_custom[4][2]).commit(); + + prefs.edit().putFloat("touch_x_shift_analog", vjoy_d_custom[5][0]).commit(); + prefs.edit().putFloat("touch_y_shift_analog", vjoy_d_custom[5][1]).commit(); + prefs.edit().putFloat("touch_scale_analog", vjoy_d_custom[5][2]).commit(); + } + + public static void resetCustomVjoyValues(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); - prefs.edit().putFloat("touch_x_shift_dpad", vjoy_d_custom[0][0]).commit(); - prefs.edit().putFloat("touch_y_shift_dpad", vjoy_d_custom[0][1]).commit(); - prefs.edit().putFloat("touch_scale_dpad", vjoy_d_custom[0][2]).commit(); + prefs.edit().remove("touch_x_shift_dpad").commit(); + prefs.edit().remove("touch_y_shift_dpad").commit(); + prefs.edit().remove("touch_scale_dpad").commit(); - prefs.edit().putFloat("touch_x_shift_buttons", vjoy_d_custom[1][0]).commit(); - prefs.edit().putFloat("touch_y_shift_buttons", vjoy_d_custom[1][1]).commit(); - prefs.edit().putFloat("touch_scale_buttons", vjoy_d_custom[1][2]).commit(); + prefs.edit().remove("touch_x_shift_buttons").commit(); + prefs.edit().remove("touch_y_shift_buttons").commit(); + prefs.edit().remove("touch_scale_buttons").commit(); - prefs.edit().putFloat("touch_x_shift_start", vjoy_d_custom[2][0]).commit(); - prefs.edit().putFloat("touch_y_shift_start", vjoy_d_custom[2][1]).commit(); - prefs.edit().putFloat("touch_scale_start", vjoy_d_custom[2][2]).commit(); + prefs.edit().remove("touch_x_shift_start").commit(); + prefs.edit().remove("touch_y_shift_start").commit(); + prefs.edit().remove("touch_scale_start").commit(); - prefs.edit().putFloat("touch_x_shift_left_trigger", vjoy_d_custom[3][0]).commit(); - prefs.edit().putFloat("touch_y_shift_left_trigger", vjoy_d_custom[3][1]).commit(); - prefs.edit().putFloat("touch_scale_left_trigger", vjoy_d_custom[3][2]).commit(); + prefs.edit().remove("touch_x_shift_left_trigger").commit(); + prefs.edit().remove("touch_y_shift_left_trigger").commit(); + prefs.edit().remove("touch_scale_left_trigger").commit(); - prefs.edit().putFloat("touch_x_shift_right_trigger", vjoy_d_custom[4][0]).commit(); - prefs.edit().putFloat("touch_y_shift_right_trigger", vjoy_d_custom[4][1]).commit(); - prefs.edit().putFloat("touch_scale_right_trigger", vjoy_d_custom[4][2]).commit(); + prefs.edit().remove("touch_x_shift_right_trigger").commit(); + prefs.edit().remove("touch_y_shift_right_trigger").commit(); + prefs.edit().remove("touch_scale_right_trigger").commit(); - prefs.edit().putFloat("touch_x_shift_analog", vjoy_d_custom[5][0]).commit(); - prefs.edit().putFloat("touch_y_shift_analog", vjoy_d_custom[5][1]).commit(); - prefs.edit().putFloat("touch_scale_analog", vjoy_d_custom[5][2]).commit(); + prefs.edit().remove("touch_x_shift_analog").commit(); + prefs.edit().remove("touch_y_shift_analog").commit(); + prefs.edit().remove("touch_scale_analog").commit(); } } From ec57499863dd423b402a40677c13a985f752f2f6 Mon Sep 17 00:00:00 2001 From: TwistedUmbrella Date: Tue, 11 Feb 2014 22:55:35 -0500 Subject: [PATCH 3/3] Account for the default value of unset boolean being false --- .../src/com/reicast/emulator/GL2JNIView.java | 4 +-- .../com/reicast/emulator/OnScreenMenu.java | 26 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/shell/android/src/com/reicast/emulator/GL2JNIView.java b/shell/android/src/com/reicast/emulator/GL2JNIView.java index 5b97fbcb7..3a8f9adcc 100644 --- a/shell/android/src/com/reicast/emulator/GL2JNIView.java +++ b/shell/android/src/com/reicast/emulator/GL2JNIView.java @@ -791,8 +791,8 @@ private static class ContextFactory implements GLSurfaceView.EGLContextFactory } } - public void audioConfigure(boolean enabled) { - if (!enabled) { + public void audioDisable(boolean disabled) { + if (disabled) { ethd.Player.pause(); } else { ethd.Player.play(); diff --git a/shell/android/src/com/reicast/emulator/OnScreenMenu.java b/shell/android/src/com/reicast/emulator/OnScreenMenu.java index c306e4881..fdd9f4b7d 100644 --- a/shell/android/src/com/reicast/emulator/OnScreenMenu.java +++ b/shell/android/src/com/reicast/emulator/OnScreenMenu.java @@ -23,7 +23,7 @@ public class OnScreenMenu { private int frameskip; private boolean widescreen; private boolean limitframes; - private boolean audioenabled; + private boolean audiodisabled; private File sdcard = Environment.getExternalStorageDirectory(); private String home_directory = sdcard + "/dc"; @@ -199,22 +199,22 @@ public class OnScreenMenu { } hlay.addView(framelimit, params); View audiosetting; - if (!audioenabled) { - audiosetting = addbut(R.drawable.enable_sound, - new OnClickListener() { - public void onClick(View v) { - mContext.mView.audioConfigure(true); - popUpConfig.dismiss(); - audioenabled = true; - } - }); - } else { + if (!audiodisabled) { audiosetting = addbut(R.drawable.mute_sound, new OnClickListener() { public void onClick(View v) { - mContext.mView.audioConfigure(false); + mContext.mView.audioDisable(true); popUpConfig.dismiss(); - audioenabled = false; + audiodisabled = true; + } + }); + } else { + audiosetting = addbut(R.drawable.enable_sound, + new OnClickListener() { + public void onClick(View v) { + mContext.mView.audioDisable(false); + popUpConfig.dismiss(); + audiodisabled = false; } }); }