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)