From 4a0ba9800dd8c3ae9014dca62f2bc99a769779b8 Mon Sep 17 00:00:00 2001 From: Edgar Simo Date: Sun, 10 Aug 2008 19:45:38 +0000 Subject: [PATCH] First draft of darwin haptic<->joystick stuff. --- src/haptic/darwin/SDL_syshaptic.c | 7 ++++++- src/joystick/darwin/SDL_sysjoystick.c | 18 ++++++++++++++++-- src/joystick/darwin/SDL_sysjoystick_c.h | 1 + 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/haptic/darwin/SDL_syshaptic.c b/src/haptic/darwin/SDL_syshaptic.c index f8a0ecb59..8fb9c8628 100644 --- a/src/haptic/darwin/SDL_syshaptic.c +++ b/src/haptic/darwin/SDL_syshaptic.c @@ -447,6 +447,8 @@ SDL_SYS_HapticMouse(void) int SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick) { + if (joystick->hwdata->ffservice != 0) + return SDL_TRUE; return SDL_FALSE; } @@ -457,6 +459,8 @@ SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick) int SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick) { + if (IOObjectIsEqualTo(haptic->hwdata->device, joystick->hwdata->ffservice)) + return 1; return 0; } @@ -467,7 +471,8 @@ SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick) int SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick) { - return -1; + return SDL_SYS_HapticOpenFromService(haptic, + joystick->hwdata->ffservice); } diff --git a/src/joystick/darwin/SDL_sysjoystick.c b/src/joystick/darwin/SDL_sysjoystick.c index 8f498e82e..4429dd176 100644 --- a/src/joystick/darwin/SDL_sysjoystick.c +++ b/src/joystick/darwin/SDL_sysjoystick.c @@ -545,6 +545,12 @@ HIDDisposeDevice(recDevice ** ppDevice) /* save next device prior to disposing of this device */ pDeviceNext = (*ppDevice)->pNext; + /* free posible io_service_t */ + if ((*ppDevice)->ffservice) { + IOObjectRelease((*ppDevice)->ffservice); + (*ppDevice)->ffservice = 0; + } + /* free element lists */ HIDDisposeElementList(&(*ppDevice)->firstAxis); HIDDisposeElementList(&(*ppDevice)->firstButton); @@ -637,8 +643,16 @@ SDL_SYS_JoystickInit(void) if (!device) continue; - /* dump device object, it is no longer needed */ - result = IOObjectRelease(ioHIDDeviceObject); + /* We have to do some storage of the io_service_t for + * SDL_HapticOpenFromJoystick */ + if (FFIsForceFeedback(device) == FF_OK) { + device->ffservice = ioHIDDeviceObject; + } + else { + device->ffservice = 0; + /* dump device object, it is no longer needed */ + result = IOObjectRelease(ioHIDDeviceObject); + } /* if (KERN_SUCCESS != result) HIDReportErrorNum ("IOObjectRelease error with ioHIDDeviceObject.", result); */ diff --git a/src/joystick/darwin/SDL_sysjoystick_c.h b/src/joystick/darwin/SDL_sysjoystick_c.h index 17b8c4631..809f8b626 100644 --- a/src/joystick/darwin/SDL_sysjoystick_c.h +++ b/src/joystick/darwin/SDL_sysjoystick_c.h @@ -60,6 +60,7 @@ typedef struct recElement recElement; struct joystick_hwdata { + io_service_t ffservice; /* Interface for force feedback, 0 = no ff */ IOHIDDeviceInterface **interface; /* interface to device, NULL = no interface */ char product[256]; /* name of product */