diff --git a/android/native/jni/input_android.c b/android/native/jni/input_android.c
index 3b91bd94f5..f34b69c8ff 100644
--- a/android/native/jni/input_android.c
+++ b/android/native/jni/input_android.c
@@ -27,12 +27,6 @@
#define MAX_TOUCH 16
-typedef struct
-{
- float dzone_min;
- float dzone_max;
-} dpad_values_t;
-
typedef struct
{
int16_t lx, ly;
@@ -48,7 +42,6 @@ static unsigned pads_connected;
static int state_device_ids[MAX_PADS];
static uint64_t state[MAX_PADS];
static uint64_t keycode_lut[LAST_KEYCODE];
-dpad_values_t dpad_state[MAX_PADS];
analog_t analog_state[MAX_PADS];
struct input_pointer
@@ -194,8 +187,8 @@ static void engine_handle_dpad_default(AInputEvent *event,
int source, bool debug_enable, unsigned emulation)
{
uint64_t *state_cur = &state[state_id];
- float dzone_min = dpad_state[state_id].dzone_min;
- float dzone_max = dpad_state[state_id].dzone_max;
+ float dzone_min = -g_settings.input.axis_threshold;
+ float dzone_max = g_settings.input.axis_threshold;
float x = AMotionEvent_getX(event, motion_pointer);
float y = AMotionEvent_getY(event, motion_pointer);
@@ -221,8 +214,8 @@ static void engine_handle_dpad_getaxisvalue(AInputEvent *event,
bool debug_enable, unsigned emulation)
{
uint64_t *state_cur = &state[state_id];
- float dzone_min = dpad_state[state_id].dzone_min;
- float dzone_max = dpad_state[state_id].dzone_max;
+ float dzone_min = -g_settings.input.axis_threshold;
+ float dzone_max = g_settings.input.axis_threshold;
float x = AMotionEvent_getAxisValue(event, AXIS_X, motion_pointer);
float y = AMotionEvent_getAxisValue(event, AXIS_Y, motion_pointer);
float z = AMotionEvent_getAxisValue(event, AXIS_Z, motion_pointer);
@@ -320,8 +313,6 @@ static void *android_input_init(void)
g_settings.input.binds[i][RETRO_DEVICE_ID_JOYPAD_L3].joykey = (1ULL << RETRO_DEVICE_ID_JOYPAD_L3);
g_settings.input.binds[i][RETRO_DEVICE_ID_JOYPAD_R3].joykey = (1ULL << RETRO_DEVICE_ID_JOYPAD_R3);
- dpad_state[i].dzone_min = -0.99f;
- dpad_state[i].dzone_max = 0.99f;
g_settings.input.dpad_emulation[i] = ANALOG_DPAD_LSTICK;
}
@@ -511,9 +502,6 @@ static void android_input_set_keybinds(void *data, unsigned device,
g_settings.input.device[port] = device;
strlcpy(g_settings.input.device_names[port], "TTT THT Arcade",
sizeof(g_settings.input.device_names[port]));
- dpad_state[id].dzone_min = -2.00f;
- dpad_state[id].dzone_max = 1.00f;
-
/* same as Rumblepad 2 - merge? */
//keycode_lut[AKEYCODE_BUTTON_7] |= ((RETRO_DEVICE_ID_JOYPAD_L2+1) << shift);
@@ -652,8 +640,6 @@ static void android_input_set_keybinds(void *data, unsigned device,
g_settings.input.device[port] = device;
strlcpy(g_settings.input.device_names[port], "Huijia USB SNES",
sizeof(g_settings.input.device_names[port]));
- dpad_state[id].dzone_min = -1.00f;
- dpad_state[id].dzone_max = 1.00f;
keycode_lut[AKEYCODE_BUTTON_3] |= ((RETRO_DEVICE_ID_JOYPAD_B+1) << shift);
keycode_lut[AKEYCODE_BUTTON_4] |= ((RETRO_DEVICE_ID_JOYPAD_Y+1) << shift);
@@ -668,8 +654,6 @@ static void android_input_set_keybinds(void *data, unsigned device,
g_settings.input.device[port] = device;
strlcpy(g_settings.input.device_names[port], "Super Smartjoy",
sizeof(g_settings.input.device_names[port]));
- dpad_state[id].dzone_min = -1.00f;
- dpad_state[id].dzone_max = 1.00f;
keycode_lut[AKEYCODE_BUTTON_3] |= ((RETRO_DEVICE_ID_JOYPAD_B+1) << shift);
keycode_lut[AKEYCODE_BUTTON_4] |= ((RETRO_DEVICE_ID_JOYPAD_Y+1) << shift);
@@ -738,6 +722,7 @@ static void android_input_set_keybinds(void *data, unsigned device,
sizeof(g_settings.input.device_names[port]));
g_settings.input.dpad_emulation[port] = ANALOG_DPAD_DUALANALOG;
+ keycode_lut[AKEYCODE_BUTTON_MODE] |= ((RARCH_MENU_TOGGLE + 1) << shift);
keycode_lut[AKEYCODE_BACK] |= ((RETRO_DEVICE_ID_JOYPAD_SELECT+1) << shift);
keycode_lut[AKEYCODE_BUTTON_SELECT] |= ((RETRO_DEVICE_ID_JOYPAD_SELECT+1) << shift);
keycode_lut[AKEYCODE_BUTTON_START] |= ((RETRO_DEVICE_ID_JOYPAD_START+1) << shift);
@@ -854,52 +839,29 @@ static void android_input_set_keybinds(void *data, unsigned device,
keycode_lut[AKEYCODE_ESCAPE] |= ((RARCH_QUIT_KEY+1) << shift);
break;
case DEVICE_PLAYSTATION3_VERSION1:
- g_settings.input.device[port] = device;
- strlcpy(g_settings.input.device_names[port], "PlayStation3 Ver.1",
- sizeof(g_settings.input.device_names[port]));
-
- g_settings.input.dpad_emulation[port] = ANALOG_DPAD_NONE;
- keycode_lut[AKEYCODE_DPAD_UP] |= ((RETRO_DEVICE_ID_JOYPAD_UP+1) << shift);
- keycode_lut[AKEYCODE_DPAD_DOWN] |= ((RETRO_DEVICE_ID_JOYPAD_DOWN+1) << shift);
- keycode_lut[AKEYCODE_DPAD_LEFT] |= ((RETRO_DEVICE_ID_JOYPAD_LEFT+1) << shift);
- keycode_lut[AKEYCODE_DPAD_RIGHT] |= ((RETRO_DEVICE_ID_JOYPAD_RIGHT+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_A] |= ((RETRO_DEVICE_ID_JOYPAD_B+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_X] |= ((RETRO_DEVICE_ID_JOYPAD_Y+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_SELECT] |= ((RETRO_DEVICE_ID_JOYPAD_SELECT+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_START] |= ((RETRO_DEVICE_ID_JOYPAD_START+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_Y] |= ((RETRO_DEVICE_ID_JOYPAD_X+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_B] |= ((RETRO_DEVICE_ID_JOYPAD_A+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_L1] |= ((RETRO_DEVICE_ID_JOYPAD_L+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_R1] |= ((RETRO_DEVICE_ID_JOYPAD_R+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_L2] |= ((RETRO_DEVICE_ID_JOYPAD_L2+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_R2] |= ((RETRO_DEVICE_ID_JOYPAD_R2+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_THUMBL] |= ((RETRO_DEVICE_ID_JOYPAD_L3+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_THUMBR] |= ((RETRO_DEVICE_ID_JOYPAD_R3+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_1] |= ((RARCH_MENU_TOGGLE+1) << shift);
- break;
case DEVICE_PLAYSTATION3_VERSION2:
g_settings.input.device[port] = device;
- g_settings.input.dpad_emulation[port] = ANALOG_DPAD_NONE;
- strlcpy(g_settings.input.device_names[port], "PlayStation3 Ver.2",
+ strlcpy(g_settings.input.device_names[port], "PlayStation3",
sizeof(g_settings.input.device_names[port]));
+ g_settings.input.dpad_emulation[port] = ANALOG_DPAD_NONE;
keycode_lut[AKEYCODE_DPAD_UP] |= ((RETRO_DEVICE_ID_JOYPAD_UP+1) << shift);
keycode_lut[AKEYCODE_DPAD_DOWN] |= ((RETRO_DEVICE_ID_JOYPAD_DOWN+1) << shift);
keycode_lut[AKEYCODE_DPAD_LEFT] |= ((RETRO_DEVICE_ID_JOYPAD_LEFT+1) << shift);
keycode_lut[AKEYCODE_DPAD_RIGHT] |= ((RETRO_DEVICE_ID_JOYPAD_RIGHT+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_1] |= ((RARCH_MENU_TOGGLE+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_A] |= ((RETRO_DEVICE_ID_JOYPAD_A+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_X] |= ((RETRO_DEVICE_ID_JOYPAD_X+1) << shift);
+ keycode_lut[AKEYCODE_BUTTON_A] |= ((RETRO_DEVICE_ID_JOYPAD_Y+1) << shift);
+ keycode_lut[AKEYCODE_BUTTON_X] |= ((RETRO_DEVICE_ID_JOYPAD_B+1) << shift);
keycode_lut[AKEYCODE_BUTTON_SELECT] |= ((RETRO_DEVICE_ID_JOYPAD_SELECT+1) << shift);
keycode_lut[AKEYCODE_BUTTON_START] |= ((RETRO_DEVICE_ID_JOYPAD_START+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_Y] |= ((RETRO_DEVICE_ID_JOYPAD_Y+1) << shift);
- keycode_lut[AKEYCODE_BUTTON_B] |= ((RETRO_DEVICE_ID_JOYPAD_B+1) << shift);
+ keycode_lut[AKEYCODE_BUTTON_B] |= ((RETRO_DEVICE_ID_JOYPAD_X+1) << shift);
+ keycode_lut[AKEYCODE_BUTTON_Y] |= ((RETRO_DEVICE_ID_JOYPAD_A+1) << shift);
keycode_lut[AKEYCODE_BUTTON_L1] |= ((RETRO_DEVICE_ID_JOYPAD_L+1) << shift);
keycode_lut[AKEYCODE_BUTTON_R1] |= ((RETRO_DEVICE_ID_JOYPAD_R+1) << shift);
keycode_lut[AKEYCODE_BUTTON_L2] |= ((RETRO_DEVICE_ID_JOYPAD_L2+1) << shift);
keycode_lut[AKEYCODE_BUTTON_R2] |= ((RETRO_DEVICE_ID_JOYPAD_R2+1) << shift);
keycode_lut[AKEYCODE_BUTTON_THUMBL] |= ((RETRO_DEVICE_ID_JOYPAD_L3+1) << shift);
keycode_lut[AKEYCODE_BUTTON_THUMBR] |= ((RETRO_DEVICE_ID_JOYPAD_R3+1) << shift);
+ keycode_lut[AKEYCODE_BUTTON_1] |= ((RARCH_MENU_TOGGLE+1) << shift);
break;
case DEVICE_MOGA:
g_settings.input.device[port] = device;
@@ -1076,8 +1038,6 @@ static void android_input_set_keybinds(void *data, unsigned device,
g_settings.input.device[port] = device;
strlcpy(g_settings.input.device_names[port], "Buffalo BGC FC801",
sizeof(g_settings.input.device_names[port]));
- dpad_state[id].dzone_min = -1.00f;
- dpad_state[id].dzone_max = 1.00f;
keycode_lut[AKEYCODE_BUTTON_1] |= ((RETRO_DEVICE_ID_JOYPAD_A+1) << shift);
keycode_lut[AKEYCODE_BUTTON_2] |= ((RETRO_DEVICE_ID_JOYPAD_B+1) << shift);
diff --git a/android/phoenix/AndroidManifest.xml b/android/phoenix/AndroidManifest.xml
index f6166bedd4..d0dc0587b0 100644
--- a/android/phoenix/AndroidManifest.xml
+++ b/android/phoenix/AndroidManifest.xml
@@ -15,7 +15,7 @@
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:hasCode="true">
-
+
@@ -24,7 +24,12 @@
+
+
+
+
+
diff --git a/android/phoenix/res/menu/context_menu.xml b/android/phoenix/res/menu/context_menu.xml
index 43b5055191..aa7695fc78 100644
--- a/android/phoenix/res/menu/context_menu.xml
+++ b/android/phoenix/res/menu/context_menu.xml
@@ -1,6 +1,4 @@
diff --git a/android/phoenix/res/xml/prefs.xml b/android/phoenix/res/xml/prefs.xml
index 1d7eab953f..0b3142b73c 100644
--- a/android/phoenix/res/xml/prefs.xml
+++ b/android/phoenix/res/xml/prefs.xml
@@ -4,7 +4,7 @@
@@ -34,7 +34,7 @@
@@ -98,6 +98,12 @@
android:summary="Enable dynamic rate control (recommended)."
android:title="Dynamic Rate Control"
android:dependency="audio_enable" />
+
@@ -383,6 +389,14 @@
android:title="R3 Button" />
+
+
+
+
+
diff --git a/android/phoenix/src/org/retroarch/browser/RetroArch.java b/android/phoenix/src/org/retroarch/browser/CoreSelection.java
similarity index 79%
rename from android/phoenix/src/org/retroarch/browser/RetroArch.java
rename to android/phoenix/src/org/retroarch/browser/CoreSelection.java
index ae80922648..44f59f267e 100644
--- a/android/phoenix/src/org/retroarch/browser/RetroArch.java
+++ b/android/phoenix/src/org/retroarch/browser/CoreSelection.java
@@ -17,50 +17,14 @@ import android.util.Log;
import android.view.*;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.inputmethod.*;
-import android.graphics.drawable.*;
// JELLY_BEAN_MR1 = 17
-class ModuleWrapper implements IconAdapterItem {
- public final File file;
- private ConfigFile config;
-
- public ModuleWrapper(Context aContext, File aFile, ConfigFile config) throws IOException {
- file = aFile;
- this.config = config;
- }
-
- @Override
- public boolean isEnabled() {
- return true;
- }
-
- @Override
- public String getText() {
- String stripped = file.getName().replace(".so", "");
- if (config.keyExists(stripped)) {
- return config.getString(stripped);
- } else
- return stripped;
- }
-
- @Override
- public int getIconResourceId() {
- return 0;
- }
-
- @Override
- public Drawable getIconDrawable() {
- return null;
- }
-}
-
-public class RetroArch extends Activity implements
+public class CoreSelection extends Activity implements
AdapterView.OnItemClickListener {
private IconAdapter adapter;
static private final int ACTIVITY_LOAD_ROM = 0;
static private String libretro_path;
- static private Double report_refreshrate;
static private final String TAG = "CoreSelection";
private ConfigFile config;
private ConfigFile core_config;
@@ -140,7 +104,6 @@ public class RetroArch extends Activity implements
String cpuInfo = readCPUInfo();
boolean cpuIsNeon = cpuInfoIsNeon(cpuInfo);
- report_refreshrate = getDisplayRefreshRate();
setContentView(R.layout.line_list);
@@ -256,6 +219,7 @@ public class RetroArch extends Activity implements
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
config.setBoolean("audio_rate_control", prefs.getBoolean("audio_rate_control", true));
config.setInt("audio_out_rate", getOptimalSamplingRate());
+ config.setInt("audio_latency", prefs.getBoolean("audio_high_latency", false) ? 160 : 64);
config.setBoolean("audio_enable", prefs.getBoolean("audio_enable", true));
config.setBoolean("video_smooth", prefs.getBoolean("video_smooth", true));
config.setBoolean("video_allow_rotate", prefs.getBoolean("video_allow_rotate", true));
@@ -272,7 +236,7 @@ public class RetroArch extends Activity implements
config.setInt("input_autodetect_icade_profile_pad4", Integer.valueOf(prefs.getString("input_autodetect_icade_profile_pad4", "0")));
config.setDouble("video_refresh_rate", getRefreshRate());
- config.setBoolean("video_threaded", prefs.getBoolean("video_threaded", false));
+ config.setBoolean("video_threaded", prefs.getBoolean("video_threaded", true));
String aspect = prefs.getString("video_aspect_ratio", "auto");
if (aspect.equals("full")) {
@@ -414,118 +378,8 @@ public class RetroArch extends Activity implements
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showInputMethodPicker();
return true;
- case R.id.report_ime:
- String current_ime = Settings.Secure.getString(getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
- new AlertDialog.Builder(this).setMessage(current_ime).setNeutralButton("Close", null).show();
- return true;
- case R.id.report_refreshrate:
- String current_rate = "Screen Refresh Rate: " + Double.valueOf(report_refreshrate).toString();
- new AlertDialog.Builder(this).setMessage(current_rate).setNeutralButton("Close", null).show();
- return true;
default:
return false;
}
}
}
-
-abstract class LazyPopupMenu {
- public abstract Menu getMenu();
- public abstract MenuInflater getMenuInflater();
- public abstract void setOnMenuItemClickListener(LazyPopupMenu.OnMenuItemClickListener listener);
- public abstract void show();
- public interface OnMenuItemClickListener {
- public abstract boolean onMenuItemClick(MenuItem item);
- }
-}
-
-@TargetApi(Build.VERSION_CODES.HONEYCOMB)
-class HoneycombPopupMenu extends LazyPopupMenu {
- private PopupMenu instance;
- HoneycombPopupMenu.OnMenuItemClickListener listen;
-
- public HoneycombPopupMenu(Context context, View anchor)
- {
- instance = new PopupMenu(context, anchor);
- }
-
- @Override
- public void setOnMenuItemClickListener(HoneycombPopupMenu.OnMenuItemClickListener listener)
- {
- listen = listener;
- instance.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- return listen.onMenuItemClick(item);
- }
-
- });
- }
-
- @Override
- public Menu getMenu() {
- return instance.getMenu();
- }
-
- @Override
- public MenuInflater getMenuInflater() {
- return instance.getMenuInflater();
- }
-
- @Override
- public void show() {
- instance.show();
- }
-}
-
-class PopupMenuAbstract extends LazyPopupMenu
-{
- private LazyPopupMenu lazy;
-
- public PopupMenuAbstract(Context context, View anchor)
- {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
- {
- lazy = new HoneycombPopupMenu(context, anchor);
- }
- }
-
- @Override
- public Menu getMenu() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
- {
- return lazy.getMenu();
- }
- else
- {
- return null;
- }
- }
-
- @Override
- public MenuInflater getMenuInflater() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
- {
- return lazy.getMenuInflater();
- }
- else
- {
- return null;
- }
- }
-
- @Override
- public void setOnMenuItemClickListener(PopupMenuAbstract.OnMenuItemClickListener listener) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
- {
- lazy.setOnMenuItemClickListener(listener);
- }
- }
-
- @Override
- public void show() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
- {
- lazy.show();
- }
- }
-}
diff --git a/android/phoenix/src/org/retroarch/browser/DirectoryActivity.java b/android/phoenix/src/org/retroarch/browser/DirectoryActivity.java
index 96bdfb0b36..5199054ff1 100644
--- a/android/phoenix/src/org/retroarch/browser/DirectoryActivity.java
+++ b/android/phoenix/src/org/retroarch/browser/DirectoryActivity.java
@@ -12,75 +12,7 @@ import android.os.*;
import android.preference.PreferenceManager;
import android.widget.*;
import android.view.*;
-import android.graphics.drawable.*;
-class FileWrapper implements IconAdapterItem {
- public final File file;
- public final boolean parentItem;
- public final boolean dirSelectItem;
-
- protected final boolean enabled;
-
- public static final int DIRSELECT = 0;
- public static final int PARENT = 1;
- public static final int FILE = 2;
-
- protected final int typeIndex;
-
- public FileWrapper(File aFile, int type, boolean aIsEnabled) {
- file = aFile;
-
- parentItem = type == PARENT;
- dirSelectItem = type == DIRSELECT;
- typeIndex = type == FILE ? (FILE + (file.isDirectory() ? 0 : 1)) : type;
-
- enabled = parentItem || dirSelectItem || aIsEnabled;
- }
-
- @Override
- public boolean isEnabled() {
- return enabled;
- }
-
- @Override
- public String getText() {
- if (dirSelectItem)
- return "[[Use this directory]]";
- else if (parentItem)
- return "[Parent Directory]";
- else
- return file.getName();
- }
-
- @Override
- public int getIconResourceId() {
- if (!parentItem && !dirSelectItem) {
- return file.isFile() ? R.drawable.ic_file : R.drawable.ic_dir;
- } else {
- return R.drawable.ic_dir;
- }
- }
-
- @Override
- public Drawable getIconDrawable() {
- return null;
- }
-
- public int compareTo(FileWrapper aOther) {
- if (aOther != null) {
- // Who says ternary is hard to follow
- if (isEnabled() == aOther.isEnabled()) {
- return (typeIndex == aOther.typeIndex) ? file
- .compareTo(aOther.file)
- : ((typeIndex < aOther.typeIndex) ? -1 : 1);
- } else {
- return isEnabled() ? -1 : 1;
- }
- }
-
- return -1;
- }
-}
public class DirectoryActivity extends Activity implements
AdapterView.OnItemClickListener {
diff --git a/android/phoenix/src/org/retroarch/browser/FileWrapper.java b/android/phoenix/src/org/retroarch/browser/FileWrapper.java
new file mode 100644
index 0000000000..8af274db16
--- /dev/null
+++ b/android/phoenix/src/org/retroarch/browser/FileWrapper.java
@@ -0,0 +1,75 @@
+package org.retroarch.browser;
+
+import java.io.File;
+
+import org.retroarch.R;
+
+import android.graphics.drawable.Drawable;
+
+class FileWrapper implements IconAdapterItem {
+ public final File file;
+ public final boolean parentItem;
+ public final boolean dirSelectItem;
+
+ protected final boolean enabled;
+
+ public static final int DIRSELECT = 0;
+ public static final int PARENT = 1;
+ public static final int FILE = 2;
+
+ protected final int typeIndex;
+
+ public FileWrapper(File aFile, int type, boolean aIsEnabled) {
+ file = aFile;
+
+ parentItem = type == PARENT;
+ dirSelectItem = type == DIRSELECT;
+ typeIndex = type == FILE ? (FILE + (file.isDirectory() ? 0 : 1)) : type;
+
+ enabled = parentItem || dirSelectItem || aIsEnabled;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ @Override
+ public String getText() {
+ if (dirSelectItem)
+ return "[[Use this directory]]";
+ else if (parentItem)
+ return "[Parent Directory]";
+ else
+ return file.getName();
+ }
+
+ @Override
+ public int getIconResourceId() {
+ if (!parentItem && !dirSelectItem) {
+ return file.isFile() ? R.drawable.ic_file : R.drawable.ic_dir;
+ } else {
+ return R.drawable.ic_dir;
+ }
+ }
+
+ @Override
+ public Drawable getIconDrawable() {
+ return null;
+ }
+
+ public int compareTo(FileWrapper aOther) {
+ if (aOther != null) {
+ // Who says ternary is hard to follow
+ if (isEnabled() == aOther.isEnabled()) {
+ return (typeIndex == aOther.typeIndex) ? file
+ .compareTo(aOther.file)
+ : ((typeIndex < aOther.typeIndex) ? -1 : 1);
+ } else {
+ return isEnabled() ? -1 : 1;
+ }
+ }
+
+ return -1;
+ }
+}
diff --git a/android/phoenix/src/org/retroarch/browser/HoneycombPopupMenu.java b/android/phoenix/src/org/retroarch/browser/HoneycombPopupMenu.java
new file mode 100644
index 0000000000..ca4026a913
--- /dev/null
+++ b/android/phoenix/src/org/retroarch/browser/HoneycombPopupMenu.java
@@ -0,0 +1,49 @@
+package org.retroarch.browser;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.os.Build;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.widget.PopupMenu;
+
+@TargetApi(Build.VERSION_CODES.HONEYCOMB)
+class HoneycombPopupMenu extends LazyPopupMenu {
+ private PopupMenu instance;
+ HoneycombPopupMenu.OnMenuItemClickListener listen;
+
+ public HoneycombPopupMenu(Context context, View anchor)
+ {
+ instance = new PopupMenu(context, anchor);
+ }
+
+ @Override
+ public void setOnMenuItemClickListener(HoneycombPopupMenu.OnMenuItemClickListener listener)
+ {
+ listen = listener;
+ instance.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(MenuItem item) {
+ return listen.onMenuItemClick(item);
+ }
+
+ });
+ }
+
+ @Override
+ public Menu getMenu() {
+ return instance.getMenu();
+ }
+
+ @Override
+ public MenuInflater getMenuInflater() {
+ return instance.getMenuInflater();
+ }
+
+ @Override
+ public void show() {
+ instance.show();
+ }
+}
diff --git a/android/phoenix/src/org/retroarch/browser/LazyPopupMenu.java b/android/phoenix/src/org/retroarch/browser/LazyPopupMenu.java
new file mode 100644
index 0000000000..9e72cb5622
--- /dev/null
+++ b/android/phoenix/src/org/retroarch/browser/LazyPopupMenu.java
@@ -0,0 +1,15 @@
+package org.retroarch.browser;
+
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+
+abstract class LazyPopupMenu {
+ public abstract Menu getMenu();
+ public abstract MenuInflater getMenuInflater();
+ public abstract void setOnMenuItemClickListener(LazyPopupMenu.OnMenuItemClickListener listener);
+ public abstract void show();
+ public interface OnMenuItemClickListener {
+ public abstract boolean onMenuItemClick(MenuItem item);
+ }
+}
\ No newline at end of file
diff --git a/android/phoenix/src/org/retroarch/browser/MainMenuActivity.java b/android/phoenix/src/org/retroarch/browser/MainMenuActivity.java
index b8db113a75..1e8f81284f 100644
--- a/android/phoenix/src/org/retroarch/browser/MainMenuActivity.java
+++ b/android/phoenix/src/org/retroarch/browser/MainMenuActivity.java
@@ -13,7 +13,6 @@ import org.retroarch.R;
import android.app.AlertDialog;
import android.content.DialogInterface;
-import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.AssetManager;
@@ -155,18 +154,15 @@ public class MainMenuActivity extends PreferenceActivity {
boolean detectDevice(boolean show_dialog)
{
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
- SharedPreferences.Editor edit = prefs.edit();
- edit.putBoolean("video_threaded", true);
- edit.commit();
+ boolean retval = false;
Log.i("Device MODEL", android.os.Build.MODEL);
if (android.os.Build.MODEL.equals("SHIELD"))
{
AlertDialog.Builder alert = new AlertDialog.Builder(this)
.setTitle("NVidia Shield detected")
- .setMessage("Would you like to set up the ideal configuration options for your device?\nNOTE: For optimal performance, turn off Google Account sync, Google Play Store auto-updates, GPS and Wifi in your Android settings menu.")
- .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
+ .setMessage("The ideal configuration options for your device will now be preconfigured.\nNOTE: For optimal performance, turn off Google Account sync, Google Play Store auto-updates, GPS and Wifi in your Android settings menu.")
+ .setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
@@ -176,17 +172,34 @@ public class MainMenuActivity extends PreferenceActivity {
edit.putBoolean("input_autodetect_enable", true);
edit.commit();
}
- })
- .setNegativeButton("No", null);
+ });
alert.show();
- return true;
+ retval = true;
+ }
+ else if (android.os.Build.MODEL.equals( "OUYA Console"))
+ {
+ AlertDialog.Builder alert = new AlertDialog.Builder(this)
+ .setTitle("OUYA detected")
+ .setMessage("The ideal configuration options for your device will now be preconfigured.\nNOTE: For optimal performance, turn off Google Account sync, GPS and Wifi in your Android settings menu.")
+ .setPositiveButton("OK", new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
+ SharedPreferences.Editor edit = prefs.edit();
+ edit.putBoolean("input_overlay_enable", false);
+ edit.putBoolean("input_autodetect_enable", true);
+ edit.commit();
+ }
+ });
+ alert.show();
+ retval = true;
}
else if (android.os.Build.ID.equals("JSS15J"))
{
AlertDialog.Builder alert = new AlertDialog.Builder(this)
.setTitle("Nexus 7 2013 detected")
- .setMessage("Would you like to set up the ideal configuration options for your device?\nNOTE: For optimal performance, turn off Google Account sync, Google Play Store auto-updates, GPS and Wifi in your Android settings menu.")
- .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
+ .setMessage("The ideal configuration options for your device will now be preconfigured.\nNOTE: For optimal performance, turn off Google Account sync, Google Play Store auto-updates, GPS and Wifi in your Android settings menu.")
+ .setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
@@ -194,10 +207,9 @@ public class MainMenuActivity extends PreferenceActivity {
edit.putString("video_refresh_rate", Double.valueOf(59.65).toString());
edit.commit();
}
- })
- .setNegativeButton("No", null);
+ });
alert.show();
- return true;
+ retval = true;
}
if (show_dialog) {
@@ -206,7 +218,7 @@ public class MainMenuActivity extends PreferenceActivity {
Toast.LENGTH_SHORT).show();
}
- return false;
+ return retval;
}
@Override
diff --git a/android/phoenix/src/org/retroarch/browser/ModuleWrapper.java b/android/phoenix/src/org/retroarch/browser/ModuleWrapper.java
new file mode 100644
index 0000000000..c741c28af5
--- /dev/null
+++ b/android/phoenix/src/org/retroarch/browser/ModuleWrapper.java
@@ -0,0 +1,41 @@
+package org.retroarch.browser;
+
+import java.io.File;
+import java.io.IOException;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+
+class ModuleWrapper implements IconAdapterItem {
+ public final File file;
+ private ConfigFile config;
+
+ public ModuleWrapper(Context aContext, File aFile, ConfigFile config) throws IOException {
+ file = aFile;
+ this.config = config;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ @Override
+ public String getText() {
+ String stripped = file.getName().replace(".so", "");
+ if (config.keyExists(stripped)) {
+ return config.getString(stripped);
+ } else
+ return stripped;
+ }
+
+ @Override
+ public int getIconResourceId() {
+ return 0;
+ }
+
+ @Override
+ public Drawable getIconDrawable() {
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/android/phoenix/src/org/retroarch/browser/PopupMenuAbstract.java b/android/phoenix/src/org/retroarch/browser/PopupMenuAbstract.java
new file mode 100644
index 0000000000..5477a187d7
--- /dev/null
+++ b/android/phoenix/src/org/retroarch/browser/PopupMenuAbstract.java
@@ -0,0 +1,60 @@
+package org.retroarch.browser;
+
+import android.content.Context;
+import android.os.Build;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.View;
+
+class PopupMenuAbstract extends LazyPopupMenu
+{
+ private LazyPopupMenu lazy;
+
+ public PopupMenuAbstract(Context context, View anchor)
+ {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
+ {
+ lazy = new HoneycombPopupMenu(context, anchor);
+ }
+ }
+
+ @Override
+ public Menu getMenu() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
+ {
+ return lazy.getMenu();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ @Override
+ public MenuInflater getMenuInflater() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
+ {
+ return lazy.getMenuInflater();
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ @Override
+ public void setOnMenuItemClickListener(PopupMenuAbstract.OnMenuItemClickListener listener) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
+ {
+ lazy.setOnMenuItemClickListener(listener);
+ }
+ }
+
+ @Override
+ public void show() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
+ {
+ lazy.show();
+ }
+ }
+}
diff --git a/android/phoenix/src/org/retroarch/browser/ReportIME.java b/android/phoenix/src/org/retroarch/browser/ReportIME.java
new file mode 100644
index 0000000000..1a85b393ee
--- /dev/null
+++ b/android/phoenix/src/org/retroarch/browser/ReportIME.java
@@ -0,0 +1,15 @@
+package org.retroarch.browser;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.os.Bundle;
+import android.provider.Settings;
+
+public class ReportIME extends Activity {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ String current_ime = Settings.Secure.getString(getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
+ new AlertDialog.Builder(this).setMessage(current_ime).setNeutralButton("Close", null).show();
+ }
+}
diff --git a/apple/OSX/hid_pad.c b/apple/OSX/hid_pad.c
index b3bf370491..79c453e9b3 100644
--- a/apple/OSX/hid_pad.c
+++ b/apple/OSX/hid_pad.c
@@ -62,7 +62,7 @@ static void hid_input_callback(void* inContext, IOReturn inResult, void* inSende
if (state) g_current_input_data.pad_buttons[slot] |= (1 << (use - 1));
else g_current_input_data.pad_buttons[slot] &= ~(1 << (use - 1));
}
- else if (type == kIOHIDElementTypeInput_Axis && page == kHIDPage_GenericDesktop)
+ else if (type == kIOHIDElementTypeInput_Misc && page == kHIDPage_GenericDesktop)
{
static const uint32_t axis_use_ids[4] = { 48, 49, 50, 53 };
for (int i = 0; i < 4; i ++)
diff --git a/apple/RetroArch/apple_input.c b/apple/RetroArch/apple_input.c
index 771701176a..07a1bdecfa 100644
--- a/apple/RetroArch/apple_input.c
+++ b/apple/RetroArch/apple_input.c
@@ -86,6 +86,11 @@ void apple_input_enable_icade(bool on)
icade_buttons = 0;
}
+uint32_t apple_input_get_icade_buttons()
+{
+ return icade_enabled ? icade_buttons : 0;
+}
+
void apple_input_handle_key_event(unsigned keycode, bool down)
{
keycode = HIDKEY(keycode);
@@ -131,7 +136,7 @@ static void apple_input_poll(void *data)
}
input_joypad_poll(g_joydriver);
- g_polled_input_data.pad_buttons[0] |= icade_buttons;
+ g_polled_input_data.pad_buttons[0] |= apple_input_get_icade_buttons();
g_current_input_data.mouse_delta[0] = 0;
g_current_input_data.mouse_delta[1] = 0;
diff --git a/apple/RetroArch/apple_input.h b/apple/RetroArch/apple_input.h
index 2f606fd9c9..4a1ee13788 100644
--- a/apple/RetroArch/apple_input.h
+++ b/apple/RetroArch/apple_input.h
@@ -47,6 +47,7 @@ extern apple_input_data_t g_polled_input_data; //< Game thread data
// Main thread only
void apple_input_enable_icade(bool on);
+uint32_t apple_input_get_icade_buttons();
void apple_input_handle_key_event(unsigned keycode, bool down);
#endif
diff --git a/apple/iOS/settings.m b/apple/iOS/settings.m
index e452d636bb..65b4c025eb 100644
--- a/apple/iOS/settings.m
+++ b/apple/iOS/settings.m
@@ -755,7 +755,6 @@ static NSArray* build_input_port_group(config_file_t* config, uint32_t player)
{ "nul", 0x00},
};
-
for (int i = 0; ios_key_name_map[i].hid_id; i++)
{
if (g_current_input_data.keys[ios_key_name_map[i].hid_id])
@@ -767,9 +766,12 @@ static NSArray* build_input_port_group(config_file_t* config, uint32_t player)
}
// Pad Buttons
- for (int i = 0; g_current_input_data.pad_buttons[_value.player] && i < sizeof(g_current_input_data.pad_buttons[_value.player]) * 8; i++)
+ uint32_t buttons = g_current_input_data.pad_buttons[_value.player] |
+ ((_value.player == 0) ? apple_input_get_icade_buttons() : 0);
+
+ for (int i = 0; buttons && i < sizeof(buttons) * 8; i++)
{
- if (g_current_input_data.pad_buttons[_value.player] & (1 << i))
+ if (buttons & (1 << i))
{
_value.msubValues[1] = [NSString stringWithFormat:@"%d", i];
[self finish];
diff --git a/audio/opensl.c b/audio/opensl.c
index 5339bbb3b6..068e42a7a2 100644
--- a/audio/opensl.c
+++ b/audio/opensl.c
@@ -33,13 +33,10 @@
#define SLPlayItf_SetPlayState(a, ...) ((*(a))->SetPlayState(a, __VA_ARGS__))
-// TODO: Are these sane?
-#define BUFFER_SIZE (2 * 1024)
-#define BUFFER_COUNT 16
-
typedef struct sl
{
- uint8_t buffer[BUFFER_COUNT][BUFFER_SIZE];
+ uint8_t **buffer;
+ uint8_t *buffer_chunk;
unsigned buffer_index;
unsigned buffer_ptr;
volatile unsigned buffered_blocks;
@@ -55,6 +52,7 @@ typedef struct sl
slock_t *lock;
scond_t *cond;
bool nonblock;
+ unsigned buf_size;
unsigned buf_count;
} sl_t;
@@ -93,6 +91,8 @@ static void sl_free(void *data)
if (sl->cond)
scond_free(sl->cond);
+ free(sl->buffer);
+ free(sl->buffer_chunk);
free(sl);
}
@@ -122,11 +122,23 @@ static void *sl_init(const char *device, unsigned rate, unsigned latency)
GOTO_IF_FAIL(SLEngineItf_CreateOutputMix(sl->engine, &sl->output_mix, 0, NULL, NULL));
GOTO_IF_FAIL(SLObjectItf_Realize(sl->output_mix, SL_BOOLEAN_FALSE));
+ sl->buf_size = next_pow2(32 * latency);
sl->buf_count = (latency * 4 * out_rate + 500) / 1000;
- sl->buf_count = (sl->buf_count + BUFFER_SIZE / 2) / BUFFER_SIZE;
- sl->buf_count = min(sl->buf_count, BUFFER_COUNT);
+ sl->buf_count = (sl->buf_count + sl->buf_size / 2) / sl->buf_size;
- RARCH_LOG("[SLES] : Setting audio latency (buffer size: [%d]) ...\n", sl->buf_count * BUFFER_SIZE);
+ sl->buffer = (uint8_t**)calloc(sizeof(uint8_t*), sl->buf_count);
+ if (!sl->buffer)
+ goto error;
+
+ sl->buffer_chunk = (uint8_t*)calloc(sl->buf_count, sl->buf_size);
+ if (!sl->buffer_chunk)
+ goto error;
+
+ for (unsigned i = 0; i < sl->buf_count; i++)
+ sl->buffer[i] = sl->buffer_chunk + i * sl->buf_size;
+
+ RARCH_LOG("[SLES] : Setting audio latency: Block size = %u, Blocks = %u, Total = %u ...\n",
+ sl->buf_size, sl->buf_count, sl->buf_size * sl->buf_count);
fmt_pcm.formatType = SL_DATAFORMAT_PCM;
fmt_pcm.numChannels = 2;
@@ -164,7 +176,7 @@ static void *sl_init(const char *device, unsigned rate, unsigned latency)
sl->buffered_blocks = sl->buf_count;
sl->buffer_index = 0;
for (unsigned i = 0; i < sl->buf_count; i++)
- (*sl->buffer_queue)->Enqueue(sl->buffer_queue, sl->buffer[i], BUFFER_SIZE);
+ (*sl->buffer_queue)->Enqueue(sl->buffer_queue, sl->buffer[i], sl->buf_size);
GOTO_IF_FAIL(SLObjectItf_GetInterface(sl->buffer_queue_object, SL_IID_PLAY, &sl->player));
GOTO_IF_FAIL(SLPlayItf_SetPlayState(sl->player, SL_PLAYSTATE_PLAYING));
@@ -218,7 +230,7 @@ static ssize_t sl_write(void *data, const void *buf_, size_t size)
slock_unlock(sl->lock);
}
- size_t avail_write = min(BUFFER_SIZE - sl->buffer_ptr, size);
+ size_t avail_write = min(sl->buf_size - sl->buffer_ptr, size);
if (avail_write)
{
memcpy(sl->buffer[sl->buffer_index] + sl->buffer_ptr, buf, avail_write);
@@ -228,9 +240,9 @@ static ssize_t sl_write(void *data, const void *buf_, size_t size)
written += avail_write;
}
- if (sl->buffer_ptr >= BUFFER_SIZE)
+ if (sl->buffer_ptr >= sl->buf_size)
{
- SLresult res = (*sl->buffer_queue)->Enqueue(sl->buffer_queue, sl->buffer[sl->buffer_index], BUFFER_SIZE);
+ SLresult res = (*sl->buffer_queue)->Enqueue(sl->buffer_queue, sl->buffer[sl->buffer_index], sl->buf_size);
sl->buffer_index = (sl->buffer_index + 1) % sl->buf_count;
__sync_fetch_and_add(&sl->buffered_blocks, 1);
sl->buffer_ptr = 0;
@@ -243,22 +255,20 @@ static ssize_t sl_write(void *data, const void *buf_, size_t size)
}
}
- //RARCH_LOG("Blocks: %u\n", sl->buffered_blocks);
-
return written;
}
static size_t sl_write_avail(void *data)
{
sl_t *sl = (sl_t*)data;
- size_t avail = (sl->buf_count - (int)sl->buffered_blocks - 1) * BUFFER_SIZE + (BUFFER_SIZE - (int)sl->buffer_ptr);
+ size_t avail = (sl->buf_count - (int)sl->buffered_blocks - 1) * sl->buf_size + (sl->buf_size - (int)sl->buffer_ptr);
return avail;
}
static size_t sl_buffer_size(void *data)
{
sl_t *sl = (sl_t*)data;
- return BUFFER_SIZE * sl->buf_count;
+ return sl->buf_size * sl->buf_count;
}
static bool sl_use_float(void *data)