@@ -438,13 +438,38 @@ static void apple_gamecontroller_joypad_connect(GCController *controller)
438438
439439 /* Prevent same controller getting set twice */
440440 if ([mfiControllers containsObject: controller])
441+ {
442+ RARCH_DBG (" [mfi] got connected notice for controller already connected\n " );
441443 return ;
444+ }
445+
446+ if (@available (macOS 11 , iOS 14 , tvOS 14 , *))
447+ {
448+ RARCH_DBG (" [mfi] new controller connected:\n " );
449+ RARCH_DBG (" [mfi] name: %s \n " , [controller.vendorName UTF8String ]);
450+ RARCH_DBG (" [mfi] category: %s \n " , [controller.productCategory UTF8String ]);
451+ RARCH_DBG (" [mfi] has battery info: %s \n " , controller.battery != nil ? " yes" : " no" );
452+ RARCH_DBG (" [mfi] has haptics: %s \n " , controller.haptics != nil ? " yes" : " no" );
453+ RARCH_DBG (" [mfi] has light: %s \n " , controller.light != nil ? " yes" : " no" );
454+ RARCH_DBG (" [mfi] has motion: %s \n " , controller.motion != nil ? " yes" : " no" );
455+ RARCH_DBG (" [mfi] has microGamepad: %s \n " , controller.microGamepad != nil ? " yes" : " no" );
456+ RARCH_DBG (" [mfi] has extendedGamepad: %s \n " , controller.extendedGamepad != nil ? " yes" : " no" );
457+ RARCH_DBG (" [mfi] input profile:\n " );
458+ for (NSString *elem in controller.physicalInputProfile .elements .allKeys )
459+ {
460+ RARCH_DBG (" [mfi] %s \n " , [elem UTF8String ]);
461+ GCControllerElement *element = controller.physicalInputProfile .elements [elem];
462+ RARCH_DBG (" [mfi] analog: %s \n " , element.analog ? " yes" : " no" );
463+ RARCH_DBG (" [mfi] localizedName: %s \n " , [element.localizedName UTF8String ]);
464+ }
465+ }
442466
443467 if (mfi_controllers[desired_index] != (uint32_t )controller.hash )
444468 {
445469 /* Desired slot is unused, take it */
446470 if (!mfi_controllers[desired_index])
447471 {
472+ RARCH_LOG (" [mfi] controller given desired index %d \n " , desired_index);
448473 controller.playerIndex = desired_index;
449474 mfi_controllers[desired_index] = (uint32_t )controller.hash ;
450475 }
@@ -458,46 +483,58 @@ static void apple_gamecontroller_joypad_connect(GCController *controller)
458483 if (mfi_controllers[i])
459484 continue ;
460485
486+ RARCH_LOG (" [mfi] controller reassigned from desired %d to %d \n " , desired_index, i);
461487 mfi_controllers[i] = (uint32_t )controller.hash ;
462488 controller.playerIndex = i;
463489 break ;
464490 }
465- }
466491
467- [mfiControllers addObject: controller];
492+ if (i == MAX_MFI_CONTROLLERS)
493+ {
494+ /* shouldn't ever get here, this is an Apple limit */
495+ RARCH_ERR (" [mfi] too many connected controllers, ignoring\n " );
496+ return ;
497+ }
498+ }
499+ }
468500
469- /* Move any non-game controllers (like the Siri remote) to the end */
470- if (mfiControllers.count > 1 )
471- {
472- int newPlayerIndex = 0 ;
473- NSInteger connectedNonGameControllerIndex = NSNotFound ;
474- NSUInteger index = 0 ;
501+ [mfiControllers addObject: controller];
475502
476- for (GCController *connectedController in mfiControllers)
477- {
478- if ( connectedController.microGamepad != nil
479- && connectedController.extendedGamepad == nil )
480- connectedNonGameControllerIndex = index;
481- index++;
482- }
503+ /* Move any non-game controllers (like the Siri remote) to the end */
504+ if (mfiControllers.count > 1 )
505+ {
506+ int newPlayerIndex = 0 ;
507+ NSInteger connectedNonGameControllerIndex = NSNotFound ;
508+ NSUInteger index = 0 ;
483509
484- if (connectedNonGameControllerIndex != NSNotFound )
485- {
486- GCController *nonGameController = [mfiControllers objectAtIndex: connectedNonGameControllerIndex];
487- [mfiControllers removeObjectAtIndex: connectedNonGameControllerIndex];
488- [mfiControllers addObject: nonGameController];
489- }
490- for (GCController *gc in mfiControllers)
491- gc.playerIndex = newPlayerIndex++;
510+ for (GCController *connectedController in mfiControllers)
511+ {
512+ if ( connectedController.microGamepad != nil
513+ && connectedController.extendedGamepad == nil )
514+ connectedNonGameControllerIndex = index;
515+ index++;
492516 }
493517
494- if (mfi_controller_is_siri_remote (controller))
495- return ;
518+ if (connectedNonGameControllerIndex != NSNotFound )
519+ {
520+ GCController *nonGameController = [mfiControllers objectAtIndex: connectedNonGameControllerIndex];
521+ [mfiControllers removeObjectAtIndex: connectedNonGameControllerIndex];
522+ [mfiControllers addObject: nonGameController];
523+ }
524+ for (GCController *gc in mfiControllers)
525+ gc.playerIndex = newPlayerIndex++;
526+ }
496527
497- apple_gamecontroller_joypad_register (controller);
498- apple_gamecontroller_joypad_setup_haptics (controller);
499- mfi_joypad_autodetect_add ((unsigned )controller.playerIndex , [controller.vendorName cStringUsingEncoding: NSUTF8StringEncoding]);
528+ if (mfi_controller_is_siri_remote (controller))
529+ {
530+ RARCH_WARN (" [mfi] ignoring siri remote as a controller\n " );
531+ return ;
500532 }
533+
534+ RARCH_LOG (" [mfi] controller connected, beginning setup and autodetect\n " );
535+ apple_gamecontroller_joypad_register (controller);
536+ apple_gamecontroller_joypad_setup_haptics (controller);
537+ mfi_joypad_autodetect_add ((unsigned )controller.playerIndex , [controller.vendorName cStringUsingEncoding: NSUTF8StringEncoding]);
501538}
502539
503540static void apple_gamecontroller_joypad_disconnect (GCController* controller)
0 commit comments