Tim Clem : dinput: Factor out HID value retrieval in joystick_osx.
Alexandre Julliard
julliard at winehq.org
Thu Sep 30 16:04:41 CDT 2021
Module: wine
Branch: master
Commit: c52645807bf0f4984381397d9d8ec279619d1bfa
URL: https://source.winehq.org/git/wine.git/?a=commit;h=c52645807bf0f4984381397d9d8ec279619d1bfa
Author: Tim Clem <tclem at codeweavers.com>
Date: Wed Sep 29 13:01:53 2021 -0700
dinput: Factor out HID value retrieval in joystick_osx.
Signed-off-by: Tim Clem <tclem at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dinput/joystick_osx.c | 57 +++++++++++++++++++++++++++-------------------
1 file changed, 34 insertions(+), 23 deletions(-)
diff --git a/dlls/dinput/joystick_osx.c b/dlls/dinput/joystick_osx.c
index e8732bd696c..2db9e521a1e 100644
--- a/dlls/dinput/joystick_osx.c
+++ b/dlls/dinput/joystick_osx.c
@@ -110,6 +110,7 @@ struct JoystickImpl
/* osx private */
int id;
CFArrayRef elements;
+ int *element_values;
ObjProps **propmap;
FFDeviceObjectReference ff;
struct list effects;
@@ -753,6 +754,9 @@ static void get_osx_device_elements(JoystickImpl *device, uint64_t axis_map[8])
CFRelease(povs);
CFRelease(buttons);
CFRelease(elements);
+
+ device->element_values = HeapAlloc(GetProcessHeap(), 0,
+ CFArrayGetCount(device->elements) * sizeof(int));
}
else
{
@@ -786,6 +790,29 @@ static void get_osx_device_elements_props(JoystickImpl *device)
}
}
+static IOReturn get_element_values(IOHIDDeviceRef hid_device, JoystickImpl *device)
+{
+ CFIndex i, element_count = CFArrayGetCount(device->elements);
+ IOReturn ret = kIOReturnSuccess;
+ IOHIDElementRef element;
+ IOHIDValueRef valueRef;
+
+ for (i = 0; i < element_count; i++)
+ {
+ element = (IOHIDElementRef)CFArrayGetValueAtIndex(device->elements, i);
+ ret = IOHIDDeviceGetValue(hid_device, element, &valueRef);
+ if (ret != kIOReturnSuccess)
+ {
+ ERR("error getting value of element %s: %08x\n", debugstr_element(element), ret);
+ break;
+ }
+
+ device->element_values[i] = IOHIDValueGetIntegerValue(valueRef);
+ }
+
+ return ret;
+}
+
static void poll_osx_device_state( IDirectInputDevice8W *iface )
{
JoystickImpl *device = impl_from_IDirectInputDevice8W( iface );
@@ -805,6 +832,9 @@ static void poll_osx_device_state( IDirectInputDevice8W *iface )
if (device->elements)
{
+ if (get_element_values(hid_device, device) != kIOReturnSuccess)
+ return;
+
int button_idx = 0;
int pov_idx = 0;
int slider_idx = 0;
@@ -813,8 +843,7 @@ static void poll_osx_device_state( IDirectInputDevice8W *iface )
for ( idx = 0; idx < cnt; idx++ )
{
- IOHIDValueRef valueRef;
- int val, oldVal, newVal;
+ int oldVal, newVal, val = device->element_values[idx];
IOHIDElementRef element = ( IOHIDElementRef ) CFArrayGetValueAtIndex( device->elements, idx );
int type = IOHIDElementGetType( element );
@@ -826,16 +855,10 @@ static void poll_osx_device_state( IDirectInputDevice8W *iface )
TRACE("kIOHIDElementTypeInput_Button\n");
if(button_idx < 128)
{
- valueRef = NULL;
- if (IOHIDDeviceGetValue(hid_device, element, &valueRef) != kIOReturnSuccess)
- return;
- if (valueRef == NULL)
- return;
- val = IOHIDValueGetIntegerValue(valueRef);
newVal = val ? 0x80 : 0x0;
oldVal = device->generic.js.rgbButtons[button_idx];
device->generic.js.rgbButtons[button_idx] = newVal;
- TRACE("valueRef %s val %d oldVal %d newVal %d\n", debugstr_cf(valueRef), val, oldVal, newVal);
+ TRACE("val %d oldVal %d newVal %d\n", val, oldVal, newVal);
if (oldVal != newVal)
{
inst_id = DIDFT_MAKEINSTANCE(button_idx) | DIDFT_PSHBUTTON;
@@ -855,19 +878,13 @@ static void poll_osx_device_state( IDirectInputDevice8W *iface )
case MAKEUINT64(kHIDPage_GenericDesktop, kHIDUsage_GD_Hatswitch):
{
TRACE("kIOHIDElementTypeInput_Misc / kHIDUsage_GD_Hatswitch\n");
- valueRef = NULL;
- if (IOHIDDeviceGetValue(hid_device, element, &valueRef) != kIOReturnSuccess)
- return;
- if (valueRef == NULL)
- return;
- val = IOHIDValueGetIntegerValue(valueRef);
oldVal = device->generic.js.rgdwPOV[pov_idx];
if ((val > device->generic.props[idx].lDevMax) || (val < device->generic.props[idx].lDevMin))
newVal = -1;
else
newVal = (val - device->generic.props[idx].lDevMin) * 4500;
device->generic.js.rgdwPOV[pov_idx] = newVal;
- TRACE("valueRef %s val %d oldVal %d newVal %d\n", debugstr_cf(valueRef), val, oldVal, newVal);
+ TRACE("val %d oldVal %d newVal %d\n", val, oldVal, newVal);
if (oldVal != newVal)
{
inst_id = DIDFT_MAKEINSTANCE(pov_idx) | DIDFT_POV;
@@ -890,12 +907,6 @@ static void poll_osx_device_state( IDirectInputDevice8W *iface )
{
int wine_obj = -1;
- valueRef = NULL;
- if (IOHIDDeviceGetValue(hid_device, element, &valueRef) != kIOReturnSuccess)
- return;
- if (valueRef == NULL)
- return;
- val = IOHIDValueGetIntegerValue(valueRef);
newVal = joystick_map_axis(&device->generic.props[idx], val);
switch (MAKEUINT64(usage_page, usage))
{
@@ -945,7 +956,7 @@ static void poll_osx_device_state( IDirectInputDevice8W *iface )
slider_idx ++;
break;
}
- TRACE("valueRef %s val %d oldVal %d newVal %d\n", debugstr_cf(valueRef), val, oldVal, newVal);
+ TRACE("val %d oldVal %d newVal %d\n", val, oldVal, newVal);
if ((wine_obj != -1) &&
(oldVal != newVal))
{
More information about the wine-cvs
mailing list