diff --git a/ios/RetroArch/RAGameView.m b/ios/RetroArch/RAGameView.m
index 4343e78f94..7d6d730ee9 100644
--- a/ios/RetroArch/RAGameView.m
+++ b/ios/RetroArch/RAGameView.m
@@ -15,6 +15,7 @@
#include "general.h"
#include "rarch_wrapper.h"
+#include "input/ios_input.h"
static const float ALMOST_INVISIBLE = .021f;
static float g_screen_scale;
@@ -158,6 +159,9 @@ void ios_flip_game_view()
{
dispatch_sync(dispatch_get_main_queue(), ^{
[g_view display];
+
+ // HACK: While here, copy input structures
+ ios_copy_input(&g_ios_input_data);
});
g_fast_forward_skips = g_is_syncing ? 0 : 3;
}
diff --git a/ios/RetroArch/input/BTStack/btpad.c b/ios/RetroArch/input/BTStack/btpad.c
index 6fd751ff99..01a7f4f671 100644
--- a/ios/RetroArch/input/BTStack/btpad.c
+++ b/ios/RetroArch/input/BTStack/btpad.c
@@ -13,7 +13,6 @@
* If not, see .
*/
-#include
#include
#include
#include
@@ -27,50 +26,34 @@
static struct btpad_interface* btpad_iface;
static void* btpad_device;
static bool btpad_want_wiimote;
-static pthread_mutex_t btpad_lock = PTHREAD_MUTEX_INITIALIZER;
// MAIN THREAD ONLY
uint32_t btpad_get_buttons()
{
- pthread_mutex_lock(&btpad_lock);
- uint32_t result = (btpad_device && btpad_iface) ? btpad_iface->get_buttons(btpad_device) : 0;
- pthread_mutex_unlock(&btpad_lock);
-
- return result;
+ return (btpad_device && btpad_iface) ? btpad_iface->get_buttons(btpad_device) : 0;
}
int16_t btpad_get_axis(unsigned axis)
{
- pthread_mutex_lock(&btpad_lock);
- int16_t result = (btpad_device && btpad_iface) ? btpad_iface->get_axis(btpad_device, axis) : 0;
- pthread_mutex_unlock(&btpad_lock);
- return result;
+ return (btpad_device && btpad_iface) ? btpad_iface->get_axis(btpad_device, axis) : 0;
}
void btpad_set_pad_type(bool wiimote)
{
- pthread_mutex_lock(&btpad_lock);
btpad_want_wiimote = wiimote;
- pthread_mutex_unlock(&btpad_lock);
}
-// BT THREAD ONLY
static void btpad_connect_pad(bool wiimote)
{
- pthread_mutex_lock(&btpad_lock);
ios_add_log_message("BTpad: Connecting to %s", wiimote ? "WiiMote" : "PS3");
btpad_iface = (wiimote) ? &btpad_wii : &btpad_ps3;
btpad_device = btpad_iface->connect();
-
- pthread_mutex_unlock(&btpad_lock);
}
static void btpad_disconnect_pad()
{
- pthread_mutex_lock(&btpad_lock);
-
if (btpad_iface && btpad_device)
{
ios_add_log_message("BTpad: Disconnecting");
@@ -79,8 +62,6 @@ static void btpad_disconnect_pad()
btpad_device = 0;
btpad_iface = 0;
}
-
- pthread_mutex_unlock(&btpad_lock);
}
void btpad_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size)
@@ -94,9 +75,5 @@ void btpad_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet
}
if (btpad_device && btpad_iface)
- {
- pthread_mutex_lock(&btpad_lock);
btpad_iface->packet_handler(btpad_device, packet_type, channel, packet, size);
- pthread_mutex_unlock(&btpad_lock);
- }
}
diff --git a/ios/RetroArch/input/ios_input.c b/ios/RetroArch/input/ios_input.c
index 763b1745bf..aba13ce1de 100644
--- a/ios/RetroArch/input/ios_input.c
+++ b/ios/RetroArch/input/ios_input.c
@@ -24,6 +24,8 @@ static const rarch_joypad_driver_t* const g_joydriver = &ios_joypad;
static const struct rarch_key_map rarch_key_map_hidusage[];
+ios_input_data_t g_ios_input_data;
+
// Key event data, called in main.m
#define MAX_KEY_EVENTS 32
@@ -58,7 +60,7 @@ void ios_add_key_event(bool down, unsigned keycode, uint32_t character, uint16_t
static bool ios_key_pressed(enum retro_key key)
{
if ((int)key >= 0 && key < RETROK_LAST)
- return ios_key_list[input_translate_rk_to_keysym(key)];
+ return g_ios_input_data.keys[input_translate_rk_to_keysym(key)];
return false;
}
@@ -90,11 +92,11 @@ static void ios_input_poll(void *data)
g_pending_key_events = 0;
- for (int i = 0; i != ios_touch_count; i ++)
+ for (int i = 0; i != g_ios_input_data.touch_count; i ++)
{
- input_translate_coord_viewport(ios_touch_list[i].screen_x, ios_touch_list[i].screen_y,
- &ios_touch_list[i].fixed_x, &ios_touch_list[i].fixed_y,
- &ios_touch_list[i].full_x, &ios_touch_list[i].full_y);
+ input_translate_coord_viewport(g_ios_input_data.touches[i].screen_x, g_ios_input_data.touches[i].screen_y,
+ &g_ios_input_data.touches[i].fixed_x, &g_ios_input_data.touches[i].fixed_y,
+ &g_ios_input_data.touches[i].full_x, &g_ios_input_data.touches[i].full_y);
}
input_joypad_poll(g_joydriver);
@@ -118,9 +120,9 @@ static int16_t ios_input_state(void *data, const struct retro_keybind **binds, u
{
const bool want_full = device == RARCH_DEVICE_POINTER_SCREEN;
- if (index < ios_touch_count && index < MAX_TOUCHES)
+ if (index < g_ios_input_data.touch_count && index < MAX_TOUCHES)
{
- const touch_data_t* touch = &ios_touch_list[index];
+ const ios_touch_data_t* touch = &g_ios_input_data.touches[index];
switch (id)
{
diff --git a/ios/RetroArch/input/ios_input.h b/ios/RetroArch/input/ios_input.h
index 58ff5ae0dc..336a407f24 100644
--- a/ios/RetroArch/input/ios_input.h
+++ b/ios/RetroArch/input/ios_input.h
@@ -20,18 +20,30 @@
#define MAX_TOUCHES 16
#define MAX_KEYS 256
-typedef struct touch_data
+typedef struct
{
int16_t screen_x, screen_y;
int16_t fixed_x, fixed_y;
int16_t full_x, full_y;
-} touch_data_t;
+} ios_touch_data_t;
-// Defined in main.m, lists are filled by the sendEvent selector
-extern uint32_t ios_key_list[MAX_KEYS];
-extern uint32_t ios_touch_count;
-extern touch_data_t ios_touch_list[MAX_TOUCHES];
+typedef struct
+{
+ ios_touch_data_t touches[MAX_TOUCHES];
+ uint32_t touch_count;
+ uint32_t keys[MAX_KEYS];
+
+ uint32_t pad_buttons;
+ int16_t pad_axis[4];
+} ios_input_data_t;
+
+extern ios_input_data_t g_ios_input_data;
+
+// Defined in main.m, must be called on the emu thread in a dispatch_sync block
+void ios_copy_input(ios_input_data_t* data);
+
+// Called from main.m, defined in ios_input.c
void ios_add_key_event(bool down, unsigned keycode, uint32_t character, uint16_t keyModifiers);
#endif
diff --git a/ios/RetroArch/input/ios_joypad.c b/ios/RetroArch/input/ios_joypad.c
index e367c26cbd..f74c64041e 100644
--- a/ios/RetroArch/input/ios_joypad.c
+++ b/ios/RetroArch/input/ios_joypad.c
@@ -14,11 +14,10 @@
*/
#include "input/input_common.h"
+#include "ios_input.h"
#include "BTStack/btpad.h"
#include "general.h"
-static uint32_t g_buttons[MAX_PLAYERS];
-
static bool ios_joypad_init(void)
{
return true;
@@ -42,23 +41,23 @@ static bool ios_joypad_button(unsigned port, uint16_t joykey)
if (GET_HAT_DIR(joykey))
return false;
else // Check the button
- return (port < MAX_PLAYERS && joykey < 32) ? (g_buttons[port] & (1 << joykey)) != 0 : false;
+ return (port == 0 && joykey < 32) ? (g_ios_input_data.pad_buttons & (1 << joykey)) != 0 : false;
}
static int16_t ios_joypad_axis(unsigned port, uint32_t joyaxis)
{
- if (joyaxis == AXIS_NONE)
+ if (joyaxis == AXIS_NONE || port != 0)
return 0;
int16_t val = 0;
if (AXIS_NEG_GET(joyaxis) < 4)
{
- val = btpad_get_axis(AXIS_NEG_GET(joyaxis));
+ val = g_ios_input_data.pad_axis[AXIS_NEG_GET(joyaxis)];
val = (val < 0) ? val : 0;
}
else if(AXIS_POS_GET(joyaxis) < 4)
{
- val = btpad_get_axis(AXIS_POS_GET(joyaxis));
+ val = g_ios_input_data.pad_axis[AXIS_POS_GET(joyaxis)];
val = (val > 0) ? val : 0;
}
@@ -67,7 +66,6 @@ static int16_t ios_joypad_axis(unsigned port, uint32_t joyaxis)
static void ios_joypad_poll(void)
{
- g_buttons[0] = btpad_get_buttons();
}
const rarch_joypad_driver_t ios_joypad = {
diff --git a/ios/RetroArch/main.m b/ios/RetroArch/main.m
index 15d534c87f..9f21350a70 100644
--- a/ios/RetroArch/main.m
+++ b/ios/RetroArch/main.m
@@ -16,6 +16,7 @@
#import
#include "input/ios_input.h"
#include "input/keycode.h"
+#include "input/BTStack/btpad.h"
#include "libretro.h"
#include
@@ -39,11 +40,20 @@
#define GSEVENT_MOD_ALT (1 << 19)
#define GSEVENT_MOD_CTRL (1 << 20)
-uint32_t ios_key_list[MAX_KEYS];
-uint32_t ios_touch_count;
-touch_data_t ios_touch_list[MAX_TOUCHES];
+static ios_input_data_t g_input_data;
// Input helpers
+void ios_copy_input(ios_input_data_t* data)
+{
+ // Call only from main thread
+
+ memcpy(data, &g_input_data, sizeof(g_input_data));
+ data->pad_buttons = btpad_get_buttons();
+
+ for (int i = 0; i < 4; i ++)
+ data->pad_axis[i] = btpad_get_axis(i);
+}
+
static uint32_t translate_mods(uint32_t flags)
{
uint32_t result = 0;
@@ -69,21 +79,22 @@ static uint32_t translate_mods(uint32_t flags)
const int numTouches = [touches count];
const float scale = [[UIScreen mainScreen] scale];
- ios_touch_count = 0;
+ g_input_data.touch_count = 0;
- for(int i = 0; i != numTouches && ios_touch_count < MAX_TOUCHES; i ++)
+ for(int i = 0; i != numTouches && g_input_data.touch_count < MAX_TOUCHES; i ++)
{
UITouch* touch = [touches objectAtIndex:i];
const CGPoint coord = [touch locationInView:touch.view];
if (touch.phase != UITouchPhaseEnded && touch.phase != UITouchPhaseCancelled)
{
- ios_touch_list[ios_touch_count ].screen_x = coord.x * scale;
- ios_touch_list[ios_touch_count ++].screen_y = coord.y * scale;
+ g_input_data.touches[g_input_data.touch_count ].screen_x = coord.x * scale;
+ g_input_data.touches[g_input_data.touch_count ++].screen_y = coord.y * scale;
}
}
}
// Stolen from: http://nacho4d-nacho4d.blogspot.com/2012/01/catching-keyboard-events-in-ios.html
+ // TODO: Key events need to be synced, I just disabled them because the data isn't available on device (only in simulator)
else if ([event respondsToSelector:@selector(_gsEvent)])
{
uint8_t* eventMem = (uint8_t*)(void*)CFBridgingRetain([event performSelector:@selector(_gsEvent)]);
@@ -94,12 +105,13 @@ static uint32_t translate_mods(uint32_t flags)
uint16_t* data = (uint16_t*)&eventMem[0x3C];
if (data[0] < MAX_KEYS)
- ios_key_list[data[0]] = (eventType == GSEVENT_TYPE_KEYDOWN) ? 1 : 0;
+ g_input_data.keys[data[0]] = (eventType == GSEVENT_TYPE_KEYDOWN) ? 1 : 0;
// Key events
- ios_add_key_event(eventType == GSEVENT_TYPE_KEYDOWN, data[0], data[1], translate_mods(*(uint32_t*)&eventMem[0x30]));
+ // ios_add_key_event(eventType == GSEVENT_TYPE_KEYDOWN, data[0], data[1], translate_mods(*(uint32_t*)&eventMem[0x30]));
// printf("%d %d %d %08X\n", data[0], data[1], data[2], *(uint32_t*)&eventMem[0x30]);
}
+#if 0
else if(eventType == GSEVENT_TYPE_MODS)
{
static const struct
@@ -138,11 +150,12 @@ static uint32_t translate_mods(uint32_t flags)
if (key == modmap[i].key)
{
keystate[i] = !keystate[i];
- ios_key_list[modmap[i].hidid] = keystate[i];
- ios_add_key_event(keystate[i], modmap[i].retrokey, 0, translate_mods(*(uint32_t*)&eventMem[0x30]));
+ g_input_data.keys[modmap[i].hidid] = keystate[i];
+ // ios_add_key_event(keystate[i], modmap[i].retrokey, 0, translate_mods(*(uint32_t*)&eventMem[0x30]));
}
}
}
+#endif
CFBridgingRelease(eventMem);
}
diff --git a/ios/RetroArch/settings/settings.m b/ios/RetroArch/settings/settings.m
index 92c7930b6e..fad4320747 100644
--- a/ios/RetroArch/settings/settings.m
+++ b/ios/RetroArch/settings/settings.m
@@ -373,10 +373,13 @@ static const struct
- (void)checkInput
{
+ ios_input_data_t data;
+ ios_copy_input(&data);
+
// Keyboard
for (int i = 0; ios_key_name_map[i].hid_id; i++)
{
- if (ios_key_list[ios_key_name_map[i].hid_id])
+ if (data.keys[ios_key_name_map[i].hid_id])
{
_value.msubValues[0] = [NSString stringWithUTF8String:ios_key_name_map[i].keyname];
[self finish];
@@ -385,11 +388,9 @@ static const struct
}
// Pad Buttons
- uint32_t buttons = btpad_get_buttons();
-
- for (int i = 0; buttons && i < sizeof(buttons) * 8; i++)
+ for (int i = 0; data.pad_buttons && i < sizeof(data.pad_buttons) * 8; i++)
{
- if (buttons & (1 << i))
+ if (data.pad_buttons & (1 << i))
{
_value.msubValues[1] = [NSString stringWithFormat:@"%d", i];
[self finish];
@@ -400,7 +401,7 @@ static const struct
// Pad Axis
for (int i = 0; i < 4; i++)
{
- int16_t value = btpad_get_axis(i);
+ int16_t value = data.pad_axis[i];
if (abs(value) > 0x1000)
{