diff --git a/ios/RetroArch.xcodeproj/project.pbxproj b/ios/RetroArch.xcodeproj/project.pbxproj index 5277b3293a..69d6264ee3 100644 --- a/ios/RetroArch.xcodeproj/project.pbxproj +++ b/ios/RetroArch.xcodeproj/project.pbxproj @@ -99,6 +99,8 @@ 96AFAF4516C1E00A009DE44C /* bitmap.bin */ = {isa = PBXFileReference; lastKnownFileType = archive.macbinary; path = bitmap.bin; sourceTree = ""; }; 96AFAF4616C1E00A009DE44C /* bitmap.bmp */ = {isa = PBXFileReference; lastKnownFileType = image.bmp; path = bitmap.bmp; sourceTree = ""; }; 96C19C2616D455BE00FE8D5A /* rarch_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rarch_wrapper.h; sourceTree = ""; }; + 96F9C27516FF5E97002455B3 /* btdynamic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = btdynamic.c; sourceTree = ""; }; + 96F9C27616FF5E97002455B3 /* btdynamic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = btdynamic.h; sourceTree = ""; }; D48581DD16F823F9004BEB17 /* griffin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = griffin.c; path = ../griffin/griffin.c; sourceTree = ""; }; /* End PBXFileReference section */ @@ -143,6 +145,8 @@ 966B9C8F16E418B7005B61E1 /* BTStack */ = { isa = PBXGroup; children = ( + 96F9C27516FF5E97002455B3 /* btdynamic.c */, + 96F9C27616FF5E97002455B3 /* btdynamic.h */, 966B9C9016E418B7005B61E1 /* BTDevice.h */, 966B9C9116E418B7005B61E1 /* BTDevice.m */, 966B9C9416E418B7005B61E1 /* btstack */, diff --git a/ios/RetroArch/input/BTStack/btdynamic.c b/ios/RetroArch/input/BTStack/btdynamic.c index d633eb6bbc..fa38259f5e 100644 --- a/ios/RetroArch/input/BTStack/btdynamic.c +++ b/ios/RetroArch/input/BTStack/btdynamic.c @@ -58,27 +58,30 @@ static pthread_t btstack_thread; static bool btstack_tested; static bool btstack_loaded; -// TODO: This may need to be synchronized, but an extra iterate on the bluetooth thread won't kill anybody. -static volatile bool btstack_terminate = true; +// TODO: This may need to be synchronized +static volatile bool btstack_poweron; static void* btstack_thread_function(void* data) -{ +{ + run_loop_init_ptr(RUN_LOOP_COCOA); bt_register_packet_handler_ptr(btstack_packet_handler); - static bool btstack_running = false; - if (!btstack_running) - btstack_running = bt_open_ptr() ? false : true; - - if (btstack_running) - { - bt_send_cmd_ptr(btstack_set_power_mode_ptr, HCI_POWER_ON); + if (bt_open_ptr()) + return 0; - // Loop - while (!btstack_terminate && kCFRunLoopRunTimedOut == CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1, false)); + while (1) + { + static bool poweron = false; - bt_send_cmd_ptr(btstack_set_power_mode_ptr, HCI_POWER_OFF); + CFRunLoopRunInMode(kCFRunLoopDefaultMode, 1, false); + + if (poweron != btstack_poweron) + { + poweron = btstack_poweron; + bt_send_cmd_ptr(btstack_set_power_mode_ptr, poweron ? HCI_POWER_ON : HCI_POWER_OFF); + } } - + return 0; } @@ -109,8 +112,6 @@ bool btstack_load() } } - run_loop_init_ptr(RUN_LOOP_COCOA); - btstack_loaded = true; return true; @@ -118,20 +119,17 @@ bool btstack_load() void btstack_start() { - if (btstack_terminate) - { - btstack_terminate = false; + static bool thread_started = false; + if (!thread_started) pthread_create(&btstack_thread, NULL, btstack_thread_function, 0); - } + thread_started = true; + + btstack_poweron = true; } void btstack_stop() { - if (!btstack_terminate) - { - btstack_terminate = true; - pthread_join(btstack_thread, 0); - } + btstack_poweron = false; } bool btstack_is_loaded() @@ -141,6 +139,6 @@ bool btstack_is_loaded() bool btstack_is_running() { - return !btstack_terminate; + return btstack_poweron; }