Fix crash on macOS (AS) when dualshock4 is removed

(cherry picked from commit 283e31a3e2)
This commit is contained in:
Will Jordan 2021-11-16 21:10:19 +01:00 committed by Rémi Verschelde
parent 0a519fed25
commit e2cf151560
No known key found for this signature in database
GPG key ID: C3336907360768E1
2 changed files with 11 additions and 8 deletions

View file

@ -66,6 +66,7 @@ void joypad::free() {
if (ff_device) { if (ff_device) {
FFDeviceReleaseEffect(ff_device, ff_object); FFDeviceReleaseEffect(ff_device, ff_object);
FFReleaseDevice(ff_device); FFReleaseDevice(ff_device);
ff_device = nullptr;
memfree(ff_axes); memfree(ff_axes);
memfree(ff_directions); memfree(ff_directions);
} }
@ -250,7 +251,7 @@ void JoypadOSX::_device_added(IOReturn p_res, IOHIDDeviceRef p_device) {
if (is_joypad(p_device)) { if (is_joypad(p_device)) {
configure_joypad(p_device, &new_joypad); configure_joypad(p_device, &new_joypad);
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 #if MAC_OS_X_VERSION_MIN_REQUIRED < 1060
if (IOHIDDeviceGetService != NULL) { if (IOHIDDeviceGetService) {
#endif #endif
const io_service_t ioservice = IOHIDDeviceGetService(p_device); const io_service_t ioservice = IOHIDDeviceGetService(p_device);
if ((ioservice) && (FFIsForceFeedback(ioservice) == FF_OK) && new_joypad.config_force_feedback(ioservice)) { if ((ioservice) && (FFIsForceFeedback(ioservice) == FF_OK) && new_joypad.config_force_feedback(ioservice)) {
@ -355,6 +356,7 @@ bool JoypadOSX::configure_joypad(IOHIDDeviceRef p_device_ref, joypad *p_joy) {
{ \ { \
if (ret != FF_OK) { \ if (ret != FF_OK) { \
FFReleaseDevice(ff_device); \ FFReleaseDevice(ff_device); \
ff_device = nullptr; \
return false; \ return false; \
} \ } \
} }
@ -374,6 +376,7 @@ bool joypad::config_force_feedback(io_service_t p_service) {
return true; return true;
} }
FFReleaseDevice(ff_device); FFReleaseDevice(ff_device);
ff_device = nullptr;
return false; return false;
} }
#undef FF_ERR #undef FF_ERR
@ -608,7 +611,7 @@ JoypadOSX::JoypadOSX() {
if (array) { if (array) {
hid_manager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); hid_manager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
if (hid_manager != NULL) { if (hid_manager) {
config_hid_manager(array); config_hid_manager(array);
} }
CFRelease(array); CFRelease(array);

View file

@ -66,14 +66,14 @@ struct joypad {
int id = 0; int id = 0;
bool offset_hat = false; bool offset_hat = false;
io_service_t ffservice; /* Interface for force feedback, 0 = no ff */ io_service_t ffservice = 0; /* Interface for force feedback, 0 = no ff */
FFCONSTANTFORCE ff_constant_force; FFCONSTANTFORCE ff_constant_force;
FFDeviceObjectReference ff_device; FFDeviceObjectReference ff_device = nullptr;
FFEffectObjectReference ff_object; FFEffectObjectReference ff_object = nullptr;
uint64_t ff_timestamp; uint64_t ff_timestamp = 0;
LONG *ff_directions; LONG *ff_directions = nullptr;
FFEFFECT ff_effect; FFEFFECT ff_effect;
DWORD *ff_axes; DWORD *ff_axes = nullptr;
void add_hid_elements(CFArrayRef p_array); void add_hid_elements(CFArrayRef p_array);
void add_hid_element(IOHIDElementRef p_element); void add_hid_element(IOHIDElementRef p_element);