(iOS) Fix brutal BTstack lag

This commit is contained in:
meancoot 2014-01-05 20:12:04 -05:00
parent f2a8a73322
commit e2ffb51c2d
7 changed files with 82 additions and 32 deletions

View File

@ -120,6 +120,9 @@ void setting_data_reset_setting(const rarch_setting_t* setting)
default: break; default: break;
} }
if (setting->change_handler)
setting->change_handler(setting);
} }
void setting_data_reset(const rarch_setting_t* settings) void setting_data_reset(const rarch_setting_t* settings)
@ -284,6 +287,9 @@ void setting_data_set_with_string_representation(const rarch_setting_t* setting,
default: return; default: return;
} }
if (setting->change_handler)
setting->change_handler(setting);
} }
const char* setting_data_get_string_representation(const rarch_setting_t* setting, char* buffer, size_t length) const char* setting_data_get_string_representation(const rarch_setting_t* setting, char* buffer, size_t length)

View File

@ -41,7 +41,7 @@ enum setting_flags
SD_FLAG_HAS_RANGE = 16 SD_FLAG_HAS_RANGE = 16
}; };
typedef struct typedef struct rarch_setting_t
{ {
enum setting_type type; enum setting_type type;
@ -58,6 +58,8 @@ typedef struct
const char* values; const char* values;
uint64_t flags; uint64_t flags;
void (*change_handler)(const struct rarch_setting_t* setting);
union union
{ {
bool boolean; bool boolean;

View File

@ -12,6 +12,7 @@
* You should have received a copy of the GNU General Public License along with RetroArch. * You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <pthread.h>
#include <stdio.h> #include <stdio.h>
#include <assert.h> #include <assert.h>
#include <dlfcn.h> #include <dlfcn.h>
@ -30,6 +31,7 @@ static struct
} grabbers[] = } grabbers[] =
{ {
GRAB(bt_open), GRAB(bt_open),
GRAB(bt_close),
GRAB(bt_flip_addr), GRAB(bt_flip_addr),
GRAB(bd_addr_to_str), GRAB(bd_addr_to_str),
GRAB(bt_register_packet_handler), GRAB(bt_register_packet_handler),
@ -61,8 +63,9 @@ extern void btpad_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t
static bool btstack_tested; static bool btstack_tested;
static bool btstack_loaded; static bool btstack_loaded;
static bool btstack_open;
static bool btstack_poweron; static pthread_t btstack_thread;
static CFRunLoopSourceRef btstack_quit_source;
bool btstack_try_load() bool btstack_try_load()
{ {
@ -108,28 +111,54 @@ bool btstack_try_load()
return true; return true;
} }
void btstack_thread_stop()
{
bt_send_cmd_ptr(btstack_set_power_mode_ptr, HCI_POWER_OFF);
}
static void* btstack_thread_func(void* data)
{
RARCH_LOG("BTstack: Thread started");
if (bt_open_ptr())
{
RARCH_LOG("BTstack: bt_open() failed\n");
return 0;
}
CFRunLoopSourceContext ctx = { 0, 0, 0, 0, 0, 0, 0, 0, 0, btstack_thread_stop };
btstack_quit_source = CFRunLoopSourceCreate(0, 0, &ctx);
CFRunLoopAddSource(CFRunLoopGetCurrent(), btstack_quit_source, kCFRunLoopCommonModes);
RARCH_LOG("BTstack: Turning on\n");
bt_send_cmd_ptr(btstack_set_power_mode_ptr, HCI_POWER_ON);
RARCH_LOG("BTstack: Running\n");
CFRunLoopRun();
RARCH_LOG("BTstack: Done\n");
CFRunLoopSourceInvalidate(btstack_quit_source);
CFRelease(btstack_quit_source);
return 0;
}
void btstack_set_poweron(bool on) void btstack_set_poweron(bool on)
{ {
if (!btstack_try_load()) if (!btstack_try_load())
return; return;
if (!btstack_open && bt_open_ptr()) if (on && !btstack_thread)
pthread_create(&btstack_thread, 0, btstack_thread_func, 0);
else if (!on && btstack_thread && btstack_quit_source)
{ {
RARCH_LOG("BTstack: bt_open failed\n"); CFRunLoopSourceSignal(btstack_quit_source);
btstack_loaded = false; pthread_join(btstack_thread, 0);
return; btstack_thread = 0;
}
btstack_open = true;
if (on != btstack_poweron)
{
btstack_poweron = on;
RARCH_LOG("BTstack: Turning %s\n", on ? "on" : "off");
bt_send_cmd_ptr(btstack_set_power_mode_ptr, on ? HCI_POWER_ON : HCI_POWER_OFF);
} }
} }
bool btstack_is_running() bool btstack_is_running()
{ {
return btstack_poweron; return btstack_thread;
} }

View File

@ -31,6 +31,7 @@ bool btstack_is_running();
#endif #endif
BTDIMPORT int (*bt_open_ptr)(void); BTDIMPORT int (*bt_open_ptr)(void);
BTDIMPORT void (*bt_close_ptr)(void);
BTDIMPORT void (*bt_flip_addr_ptr)(bd_addr_t dest, bd_addr_t src); BTDIMPORT void (*bt_flip_addr_ptr)(bd_addr_t dest, bd_addr_t src);
BTDIMPORT char* (*bd_addr_to_str_ptr)(bd_addr_t addr); BTDIMPORT char* (*bd_addr_to_str_ptr)(bd_addr_t addr);
BTDIMPORT btstack_packet_handler_t (*bt_register_packet_handler_ptr)(btstack_packet_handler_t handler); BTDIMPORT btstack_packet_handler_t (*bt_register_packet_handler_ptr)(btstack_packet_handler_t handler);

View File

@ -114,20 +114,25 @@ void btpad_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet
{ {
case BTSTACK_EVENT_STATE: case BTSTACK_EVENT_STATE:
{ {
if (packet[2] == HCI_STATE_WORKING) RARCH_LOG("BTstack: HCI State %d\n", packet[2]);
{
btpad_queue_reset();
btpad_queue_hci_read_bd_addr(); switch (packet[2])
bt_send_cmd_ptr(l2cap_register_service_ptr, PSM_HID_CONTROL, 672); // TODO: Where did I get 672 for mtu?
bt_send_cmd_ptr(l2cap_register_service_ptr, PSM_HID_INTERRUPT, 672);
btpad_queue_hci_inquiry(HCI_INQUIRY_LAP, 3, 1);
btpad_queue_run(1);
}
else if(packet[2] > HCI_STATE_WORKING)
{ {
btpad_close_all_connections(); case HCI_STATE_WORKING:
btpad_queue_reset();
btpad_queue_hci_read_bd_addr();
bt_send_cmd_ptr(l2cap_register_service_ptr, PSM_HID_CONTROL, 672); // TODO: Where did I get 672 for mtu?
bt_send_cmd_ptr(l2cap_register_service_ptr, PSM_HID_INTERRUPT, 672);
btpad_queue_hci_inquiry(HCI_INQUIRY_LAP, 3, 1);
btpad_queue_run(1);
break;
case HCI_STATE_HALTING:
btpad_close_all_connections();
CFRunLoopStop(CFRunLoopGetCurrent());
break;
} }
} }
break; break;
@ -303,7 +308,7 @@ void btpad_packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet
case L2CAP_EVENT_SERVICE_REGISTERED: case L2CAP_EVENT_SERVICE_REGISTERED:
{ {
if (!packet[2]) if (packet[2])
RARCH_LOG("BTpad: Got failed 'Service Registered' event (PSM: %02X, Status: %02X)\n", READ_BT_16(packet, 3), packet[2]); RARCH_LOG("BTpad: Got failed 'Service Registered' event (PSM: %02X, Status: %02X)\n", READ_BT_16(packet, 3), packet[2]);
} }
break; break;

View File

@ -391,6 +391,8 @@ static void RunActionSheet(const char* title, const struct string_list* items, U
- (void)wasSelectedOnTableView:(UITableView*)tableView ofController:(UIViewController*)controller - (void)wasSelectedOnTableView:(UITableView*)tableView ofController:(UIViewController*)controller
{ {
RAMenuItemEnumSetting __weak* weakSelf = self;
struct string_list* items = string_split(self.setting->values, "|"); struct string_list* items = string_split(self.setting->values, "|");
RunActionSheet(self.setting->short_description, items, self.parentTable, RunActionSheet(self.setting->short_description, items, self.parentTable,
^(UIActionSheet* actionSheet, NSInteger buttonIndex) ^(UIActionSheet* actionSheet, NSInteger buttonIndex)
@ -398,7 +400,7 @@ static void RunActionSheet(const char* title, const struct string_list* items, U
if (buttonIndex != actionSheet.cancelButtonIndex) if (buttonIndex != actionSheet.cancelButtonIndex)
{ {
setting_data_set_with_string_representation(self.setting, [[actionSheet buttonTitleAtIndex:buttonIndex] UTF8String]); setting_data_set_with_string_representation(self.setting, [[actionSheet buttonTitleAtIndex:buttonIndex] UTF8String]);
[self.parentTable reloadData]; [weakSelf.parentTable reloadData];
} }
}); });
string_list_free(items); string_list_free(items);

View File

@ -32,7 +32,6 @@
apple_frontend_settings_t apple_frontend_settings; apple_frontend_settings_t apple_frontend_settings;
#ifdef IOS
int get_ios_version_major(void) int get_ios_version_major(void)
{ {
static int version = -1; static int version = -1;
@ -48,7 +47,11 @@ void ios_set_bluetooth_mode(NSString* mode)
apple_input_enable_icade([mode isEqualToString:@"icade"]); apple_input_enable_icade([mode isEqualToString:@"icade"]);
btstack_set_poweron([mode isEqualToString:@"btstack"]); btstack_set_poweron([mode isEqualToString:@"btstack"]);
} }
#endif
static void apple_refresh_frontend_config(const rarch_setting_t* setting)
{
[[RetroArch_iOS get] refreshSystemConfig];
}
const void* apple_get_frontend_settings(void) const void* apple_get_frontend_settings(void)
{ {
@ -60,9 +63,11 @@ const void* apple_get_frontend_settings(void)
settings[1] = setting_data_group_setting(ST_SUB_GROUP, "Frontend"); settings[1] = setting_data_group_setting(ST_SUB_GROUP, "Frontend");
settings[2] = setting_data_bool_setting("ios_use_file_log", "Enable File Logging", settings[2] = setting_data_bool_setting("ios_use_file_log", "Enable File Logging",
&apple_frontend_settings.logging_enabled, false); &apple_frontend_settings.logging_enabled, false);
settings[2].change_handler = apple_refresh_frontend_config;
settings[3] = setting_data_bool_setting("ios_tv_mode", "TV Mode", &apple_use_tv_mode, false); settings[3] = setting_data_bool_setting("ios_tv_mode", "TV Mode", &apple_use_tv_mode, false);
settings[4] = setting_data_string_setting(ST_STRING, "ios_btmode", "Bluetooth Input Type", apple_frontend_settings.bluetooth_mode, settings[4] = setting_data_string_setting(ST_STRING, "ios_btmode", "Bluetooth Input Type", apple_frontend_settings.bluetooth_mode,
sizeof(apple_frontend_settings.bluetooth_mode), "none"); sizeof(apple_frontend_settings.bluetooth_mode), "none");
settings[4].change_handler = apple_refresh_frontend_config;
// Set ios_btmode options based on runtime environment // Set ios_btmode options based on runtime environment
if (btstack_try_load()) if (btstack_try_load())