[PATCH 09/11] dinput: Partially implement HID joystick IDirectInputEffect_SetParameters.
Rémi Bernon
rbernon at codeweavers.com
Thu Oct 7 03:40:06 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/dinput/joystick_hid.c | 176 ++++++++++++++++++++++++++++++++++++-
dlls/dinput8/tests/hid.c | 85 ++----------------
2 files changed, 177 insertions(+), 84 deletions(-)
diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index 3014e76603b..87fe27afadd 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -155,6 +155,8 @@ struct hid_joystick_effect
DIENVELOPE envelope;
DIPERIODIC periodic;
DIEFFECT params;
+ BOOL modified;
+ DWORD flags;
char *effect_control_buf;
char *effect_update_buf;
@@ -2193,7 +2195,6 @@ static HRESULT WINAPI hid_joystick_effect_GetParameters( IDirectInputEffect *ifa
if (flags & DIEP_DIRECTION)
{
if (!direction_flags) return DIERR_INVALIDPARAM;
- params->dwFlags &= ~(DIEFF_CARTESIAN | DIEFF_POLAR | DIEFF_SPHERICAL);
count = params->cAxes = impl->params.cAxes;
if (capacity < params->cAxes) return DIERR_MOREDATA;
@@ -2218,7 +2219,8 @@ static HRESULT WINAPI hid_joystick_effect_GetParameters( IDirectInputEffect *ifa
}
}
- if (!params->rglDirection) return DIERR_INVALIDPARAM;
+ if (!count) params->rglDirection = NULL;
+ else if (!params->rglDirection) return DIERR_INVALIDPARAM;
else memcpy( params->rglDirection, directions, count * sizeof(LONG) );
}
@@ -2277,11 +2279,177 @@ static HRESULT WINAPI hid_joystick_effect_GetParameters( IDirectInputEffect *ifa
return DI_OK;
}
+static BOOL set_parameters_object( struct hid_joystick *impl, struct hid_value_caps *caps,
+ DIDEVICEOBJECTINSTANCEW *instance, void *data )
+{
+ DWORD usages = MAKELONG( instance->wUsage, instance->wUsagePage );
+ *(DWORD *)data = usages;
+ return DIENUM_STOP;
+}
+
static HRESULT WINAPI hid_joystick_effect_SetParameters( IDirectInputEffect *iface,
const DIEFFECT *params, DWORD flags )
{
- FIXME( "iface %p, params %p, flags %#x stub!\n", iface, params, flags );
- return DIERR_UNSUPPORTED;
+ DIPROPHEADER filter =
+ {
+ .dwSize = sizeof(DIPROPHEADER),
+ .dwHeaderSize = sizeof(DIPROPHEADER),
+ .dwHow = DIPH_BYUSAGE,
+ };
+ struct hid_joystick_effect *impl = impl_from_IDirectInputEffect( iface );
+ ULONG i, count, old_value, object_flags, direction_flags;
+ LONG directions[6] = {0};
+ HRESULT hr;
+ BOOL ret;
+
+ TRACE( "iface %p, params %p, flags %#x.\n", iface, params, flags );
+
+ if (!params) return E_POINTER;
+ if (params->dwSize != sizeof(DIEFFECT)) return DIERR_INVALIDPARAM;
+ object_flags = params->dwFlags & (DIEFF_OBJECTIDS | DIEFF_OBJECTOFFSETS);
+ direction_flags = params->dwFlags & (DIEFF_CARTESIAN | DIEFF_POLAR | DIEFF_SPHERICAL);
+
+ if (object_flags & DIEFF_OBJECTIDS) filter.dwHow = DIPH_BYID;
+ else filter.dwHow = DIPH_BYOFFSET;
+
+ if (flags & DIEP_AXES)
+ {
+ if (!object_flags) return DIERR_INVALIDPARAM;
+ if (!params->rgdwAxes) return DIERR_INVALIDPARAM;
+ if (impl->params.cAxes) return DIERR_ALREADYINITIALIZED;
+ count = impl->joystick->pid_effect_update.axis_count;
+ if (params->cAxes > count) return DIERR_INVALIDPARAM;
+
+ impl->params.cAxes = params->cAxes;
+ for (i = 0; i < params->cAxes; ++i)
+ {
+ filter.dwObj = params->rgdwAxes[i];
+ ret = enum_objects( impl->joystick, &filter, DIDFT_AXIS, set_parameters_object,
+ &impl->params.rgdwAxes[i] );
+ if (ret != DIENUM_STOP) impl->params.rgdwAxes[i] = 0;
+ }
+
+ impl->modified = TRUE;
+ }
+
+ if (flags & DIEP_DIRECTION)
+ {
+ if (!direction_flags) return DIERR_INVALIDPARAM;
+ if (!params->rglDirection) return DIERR_INVALIDPARAM;
+
+ count = impl->params.cAxes;
+ if (params->cAxes < count) return DIERR_INVALIDPARAM;
+ if ((direction_flags & DIEFF_POLAR) && count != 2) return DIERR_INVALIDPARAM;
+ if ((direction_flags & DIEFF_CARTESIAN) && count < 2) return DIERR_INVALIDPARAM;
+
+ if (!count) memset( directions, 0, sizeof(directions) );
+ else if (direction_flags & DIEFF_POLAR)
+ {
+ directions[0] = (params->rglDirection[0] % 36000) - 9000;
+ if (directions[0] < 0) directions[0] += 36000;
+ for (i = 1; i < count; ++i) directions[i] = 0;
+ }
+ else if (direction_flags & DIEFF_CARTESIAN)
+ {
+ for (i = 1; i < count; ++i)
+ directions[i - 1] = atan2( params->rglDirection[i], params->rglDirection[0] );
+ directions[count - 1] = 0;
+ }
+ else
+ {
+ for (i = 0; i < count; ++i)
+ {
+ directions[i] = params->rglDirection[i] % 36000;
+ if (directions[i] < 0) directions[i] += 36000;
+ }
+ }
+
+ if (memcmp( impl->params.rglDirection, directions, count * sizeof(LONG) ))
+ impl->modified = TRUE;
+ memcpy( impl->params.rglDirection, directions, count * sizeof(LONG) );
+ }
+
+ if (flags & DIEP_TYPESPECIFICPARAMS)
+ {
+ switch (impl->type)
+ {
+ case PID_USAGE_ET_SQUARE:
+ case PID_USAGE_ET_SINE:
+ case PID_USAGE_ET_TRIANGLE:
+ case PID_USAGE_ET_SAWTOOTH_UP:
+ case PID_USAGE_ET_SAWTOOTH_DOWN:
+ if (!params->lpvTypeSpecificParams) return E_POINTER;
+ if (params->cbTypeSpecificParams != sizeof(DIPERIODIC)) return DIERR_INVALIDPARAM;
+ if (memcmp( &impl->periodic, params->lpvTypeSpecificParams, sizeof(DIPERIODIC) ))
+ impl->modified = TRUE;
+ memcpy( &impl->periodic, params->lpvTypeSpecificParams, sizeof(DIPERIODIC) );
+ break;
+ case PID_USAGE_ET_SPRING:
+ case PID_USAGE_ET_DAMPER:
+ case PID_USAGE_ET_INERTIA:
+ case PID_USAGE_ET_FRICTION:
+ case PID_USAGE_ET_CONSTANT_FORCE:
+ case PID_USAGE_ET_RAMP:
+ case PID_USAGE_ET_CUSTOM_FORCE_DATA:
+ FIXME( "DIEP_TYPESPECIFICPARAMS not implemented!\n" );
+ return DIERR_UNSUPPORTED;
+ }
+ }
+
+ if ((flags & DIEP_ENVELOPE) && params->lpEnvelope)
+ {
+ if (params->lpEnvelope->dwSize != sizeof(DIENVELOPE)) return DIERR_INVALIDPARAM;
+ if (memcmp( &impl->envelope, params->lpEnvelope, sizeof(DIENVELOPE) ))
+ impl->modified = TRUE;
+ memcpy( &impl->envelope, params->lpEnvelope, sizeof(DIENVELOPE) );
+ }
+
+ if (flags & DIEP_DURATION)
+ {
+ if (impl->params.dwDuration != params->dwDuration) impl->modified = TRUE;
+ impl->params.dwDuration = params->dwDuration;
+ }
+ if (flags & DIEP_GAIN)
+ {
+ if (impl->params.dwGain != params->dwGain) impl->modified = TRUE;
+ impl->params.dwGain = params->dwGain;
+ }
+ if (flags & DIEP_SAMPLEPERIOD)
+ {
+ if (impl->params.dwSamplePeriod != params->dwSamplePeriod) impl->modified = TRUE;
+ impl->params.dwSamplePeriod = params->dwSamplePeriod;
+ }
+ if (flags & DIEP_STARTDELAY)
+ {
+ if (impl->params.dwStartDelay != params->dwStartDelay) impl->modified = TRUE;
+ impl->params.dwStartDelay = params->dwStartDelay;
+ }
+ if (flags & DIEP_TRIGGERREPEATINTERVAL)
+ {
+ if (impl->params.dwTriggerRepeatInterval != params->dwTriggerRepeatInterval)
+ impl->modified = TRUE;
+ impl->params.dwTriggerRepeatInterval = params->dwTriggerRepeatInterval;
+ }
+
+ if (flags & DIEP_TRIGGERBUTTON)
+ {
+ if (!object_flags) return DIERR_INVALIDPARAM;
+
+ filter.dwObj = params->dwTriggerButton;
+ old_value = impl->params.dwTriggerButton;
+ ret = enum_objects( impl->joystick, &filter, DIDFT_BUTTON, set_parameters_object,
+ &impl->params.dwTriggerButton );
+ if (ret != DIENUM_STOP) impl->params.dwTriggerButton = -1;
+ if (impl->params.dwTriggerButton != old_value) impl->modified = TRUE;
+ }
+
+ impl->flags |= flags;
+
+ if (flags & DIEP_NODOWNLOAD) return DI_DOWNLOADSKIPPED;
+ if (flags & DIEP_START) return IDirectInputEffect_Start( iface, 1, 0 );
+ if (FAILED(hr = IDirectInputEffect_Download( iface ))) return hr;
+ if (hr == DI_NOEFFECT) return DI_DOWNLOADSKIPPED;
+ return DI_OK;
}
static HRESULT WINAPI hid_joystick_effect_Start( IDirectInputEffect *iface, DWORD iterations, DWORD flags )
diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c
index fc6a235617c..70c55136602 100644
--- a/dlls/dinput8/tests/hid.c
+++ b/dlls/dinput8/tests/hid.c
@@ -5370,7 +5370,6 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
check_member( desc, expect_desc_init, "%u", cAxes );
desc.dwFlags |= DIEFF_CARTESIAN;
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
- todo_wine
ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
ok( desc.dwFlags == DIEFF_OBJECTIDS, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_OBJECTIDS );
desc.dwFlags |= DIEFF_POLAR;
@@ -5379,7 +5378,6 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
ok( desc.dwFlags == DIEFF_OBJECTIDS, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_OBJECTIDS );
desc.dwFlags |= DIEFF_SPHERICAL;
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
- todo_wine
ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
check_member( desc, expect_desc_init, "%u", cAxes );
ok( desc.dwFlags == DIEFF_OBJECTIDS, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_OBJECTIDS );
@@ -5393,7 +5391,6 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
check_member( desc, expect_desc_init, "%u", cAxes );
check_member( desc, expect_desc_init, "%u", rgdwAxes[0] );
check_member( desc, expect_desc_init, "%u", rgdwAxes[1] );
- todo_wine
check_member( desc, expect_desc_init, "%p", rglDirection );
ok( desc.dwFlags == DIEFF_OBJECTIDS, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_OBJECTIDS );
@@ -5411,7 +5408,6 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
check_member( desc, expect_desc_init, "%u", cAxes );
check_member( desc, expect_desc_init, "%u", rgdwAxes[0] );
check_member( desc, expect_desc_init, "%u", rgdwAxes[1] );
- todo_wine
check_member( desc, expect_desc_init, "%p", rglDirection );
todo_wine
check_member( desc, expect_desc_init, "%p", lpEnvelope );
@@ -5439,15 +5435,12 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
ok( hr == DI_NOEFFECT, "Unload returned %#x\n", hr );
hr = IDirectInputEffect_SetParameters( effect, NULL, DIEP_NODOWNLOAD );
- todo_wine
ok( hr == E_POINTER, "SetParameters returned %#x\n", hr );
memset( &desc, 0, sizeof(desc) );
hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
desc.dwSize = sizeof(DIEFFECT);
hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
set_hid_expect( file, &expect_dc_reset, sizeof(expect_dc_reset) );
@@ -5455,7 +5448,6 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
ok( hr == DI_OK, "Unacquire returned: %#x\n", hr );
set_hid_expect( file, NULL, 0 );
hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_DURATION | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
set_hid_expect( file, &expect_dc_reset, sizeof(expect_dc_reset) );
hr = IDirectInputDevice8_Acquire( device );
@@ -5463,13 +5455,11 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
set_hid_expect( file, NULL, 0 );
hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_DURATION | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
desc.dwTriggerButton = -1;
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DURATION );
ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
- todo_wine
check_member( desc, expect_desc, "%u", dwDuration );
check_member( desc, expect_desc_init, "%u", dwSamplePeriod );
check_member( desc, expect_desc_init, "%u", dwGain );
@@ -5491,26 +5481,20 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
hr = IDirectInputEffect_SetParameters( effect, &expect_desc,
DIEP_GAIN | DIEP_SAMPLEPERIOD | DIEP_STARTDELAY |
DIEP_TRIGGERREPEATINTERVAL | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
desc.dwDuration = 0;
flags = DIEP_DURATION | DIEP_GAIN | DIEP_SAMPLEPERIOD | DIEP_STARTDELAY | DIEP_TRIGGERREPEATINTERVAL;
hr = IDirectInputEffect_GetParameters( effect, &desc, flags );
ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
- todo_wine
check_member( desc, expect_desc, "%u", dwDuration );
- todo_wine
check_member( desc, expect_desc, "%u", dwSamplePeriod );
- todo_wine
check_member( desc, expect_desc, "%u", dwGain );
check_member( desc, expect_desc_init, "%#x", dwTriggerButton );
- todo_wine
check_member( desc, expect_desc, "%u", dwTriggerRepeatInterval );
check_member( desc, expect_desc_init, "%u", cAxes );
check_member( desc, expect_desc_init, "%p", rglDirection );
check_member( desc, expect_desc_init, "%p", lpEnvelope );
check_member( desc, expect_desc_init, "%u", cbTypeSpecificParams );
- todo_wine
check_member( desc, expect_desc, "%u", dwStartDelay );
hr = IDirectInputEffect_Download( effect );
@@ -5522,29 +5506,22 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
desc.lpEnvelope = NULL;
hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_ENVELOPE | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
desc.lpEnvelope = &envelope;
envelope.dwSize = 0;
hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_ENVELOPE | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_ENVELOPE | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
desc.lpEnvelope = &envelope;
envelope.dwSize = sizeof(DIENVELOPE);
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_ENVELOPE );
ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
- todo_wine
check_member( envelope, expect_envelope, "%u", dwAttackLevel );
- todo_wine
check_member( envelope, expect_envelope, "%u", dwAttackTime );
- todo_wine
check_member( envelope, expect_envelope, "%u", dwFadeLevel );
- todo_wine
check_member( envelope, expect_envelope, "%u", dwFadeTime );
hr = IDirectInputEffect_Download( effect );
@@ -5562,13 +5539,10 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
desc.cbTypeSpecificParams = 0;
desc.lpvTypeSpecificParams = NULL;
hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_ALLPARAMS | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_TRIGGERBUTTON | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_AXES | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
desc.dwFlags = DIEFF_OBJECTOFFSETS;
@@ -5577,45 +5551,32 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
desc.rgdwAxes[0] = DIJOFS_X;
desc.dwTriggerButton = DIJOFS_BUTTON( 1 );
hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_DIRECTION | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_AXES | DIEP_TRIGGERBUTTON | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_AXES | DIEP_TRIGGERBUTTON | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DIERR_ALREADYINITIALIZED, "SetParameters returned %#x\n", hr );
desc.cAxes = 0;
desc.dwFlags = DIEFF_OBJECTIDS;
desc.rgdwAxes = axes;
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_AXES | DIEP_TRIGGERBUTTON );
- todo_wine
ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
- todo_wine
check_member( desc, expect_desc, "%u", cAxes );
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_AXES | DIEP_TRIGGERBUTTON );
ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
- todo_wine
check_member( desc, expect_desc, "%#x", dwTriggerButton );
- todo_wine
check_member( desc, expect_desc, "%u", cAxes );
- todo_wine
check_member( desc, expect_desc, "%u", rgdwAxes[0] );
- todo_wine
check_member( desc, expect_desc, "%u", rgdwAxes[1] );
- todo_wine
check_member( desc, expect_desc, "%u", rgdwAxes[2] );
desc.dwFlags = DIEFF_OBJECTOFFSETS;
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_AXES | DIEP_TRIGGERBUTTON );
ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
- todo_wine
ok( desc.dwTriggerButton == 0x30, "got %#x expected %#x\n", desc.dwTriggerButton, 0x30 );
- todo_wine
ok( desc.rgdwAxes[0] == 8, "got %#x expected %#x\n", desc.rgdwAxes[0], 8 );
ok( desc.rgdwAxes[1] == 0, "got %#x expected %#x\n", desc.rgdwAxes[1], 0 );
- todo_wine
ok( desc.rgdwAxes[2] == 4, "got %#x expected %#x\n", desc.rgdwAxes[2], 4 );
hr = IDirectInputEffect_Download( effect );
@@ -5629,56 +5590,41 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
desc.cAxes = 0;
desc.rglDirection = directions;
hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_DIRECTION | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
desc.cAxes = 3;
hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_DIRECTION | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
desc.dwFlags = DIEFF_POLAR;
desc.cAxes = 3;
hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_DIRECTION | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_DIRECTION | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
desc.dwFlags = DIEFF_SPHERICAL;
desc.cAxes = 1;
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
- todo_wine
ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
- todo_wine
+ ok( desc.dwFlags == DIEFF_SPHERICAL, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_SPHERICAL );
check_member( desc, expect_desc, "%u", cAxes );
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
- todo_wine
ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
- todo_wine
check_member( desc, expect_desc, "%u", cAxes );
- todo_wine
ok( desc.rglDirection[0] == 3000, "got rglDirection[0] %d expected %d\n", desc.rglDirection[0], 3000 );
- todo_wine
ok( desc.rglDirection[1] == 30000, "got rglDirection[1] %d expected %d\n", desc.rglDirection[1], 30000 );
ok( desc.rglDirection[2] == 0, "got rglDirection[2] %d expected %d\n", desc.rglDirection[2], 0 );
desc.dwFlags = DIEFF_CARTESIAN;
desc.cAxes = 2;
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
- todo_wine
ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
- todo_wine
+ ok( desc.dwFlags == DIEFF_CARTESIAN, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_CARTESIAN );
check_member( desc, expect_desc, "%u", cAxes );
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
- todo_wine
ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
- todo_wine
check_member( desc, expect_desc, "%u", cAxes );
- todo_wine
ok( desc.rglDirection[0] == 4330, "got rglDirection[0] %d expected %d\n", desc.rglDirection[0], 4330 );
- todo_wine
ok( desc.rglDirection[1] == 2500, "got rglDirection[1] %d expected %d\n", desc.rglDirection[1], 2500 );
- todo_wine
ok( desc.rglDirection[2] == -8660, "got rglDirection[2] %d expected %d\n", desc.rglDirection[2], -8660 );
desc.dwFlags = DIEFF_POLAR;
desc.cAxes = 3;
@@ -5695,25 +5641,18 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
desc.cbTypeSpecificParams = 0;
desc.lpvTypeSpecificParams = &periodic;
hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_TYPESPECIFICPARAMS | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DIERR_INVALIDPARAM, "SetParameters returned %#x\n", hr );
desc.cbTypeSpecificParams = sizeof(DIPERIODIC);
hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_TYPESPECIFICPARAMS | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
hr = IDirectInputEffect_SetParameters( effect, &expect_desc, DIEP_TYPESPECIFICPARAMS | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_TYPESPECIFICPARAMS );
ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
- todo_wine
check_member( periodic, expect_periodic, "%u", dwMagnitude );
- todo_wine
check_member( periodic, expect_periodic, "%d", lOffset );
- todo_wine
check_member( periodic, expect_periodic, "%u", dwPhase );
- todo_wine
check_member( periodic, expect_periodic, "%u", dwPeriod );
hr = IDirectInputEffect_Start( effect, 1, DIES_NODOWNLOAD );
@@ -5821,23 +5760,18 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
desc.rglDirection[1] = 0;
desc.rglDirection[2] = 0;
hr = IDirectInputEffect_SetParameters( effect, &desc, DIEP_AXES | DIEP_DIRECTION | DIEP_NODOWNLOAD );
- todo_wine
ok( hr == DI_DOWNLOADSKIPPED, "SetParameters returned %#x\n", hr );
desc.rglDirection[0] = 0;
desc.dwFlags = DIEFF_SPHERICAL;
desc.cAxes = 1;
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
- todo_wine
ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
- todo_wine
+ ok( desc.dwFlags == DIEFF_SPHERICAL, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_SPHERICAL );
ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
- todo_wine
ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
- todo_wine
ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
- todo_wine
ok( desc.rglDirection[0] == 30000, "got rglDirection[0] %d expected %d\n", desc.rglDirection[0], 30000 );
ok( desc.rglDirection[1] == 0, "got rglDirection[1] %d expected %d\n", desc.rglDirection[1], 0 );
ok( desc.rglDirection[2] == 0, "got rglDirection[2] %d expected %d\n", desc.rglDirection[2], 0 );
@@ -5845,34 +5779,25 @@ static void test_periodic_effect( IDirectInputDevice8W *device, HANDLE file )
desc.dwFlags = DIEFF_CARTESIAN;
desc.cAxes = 1;
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
- todo_wine
ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
- todo_wine
+ ok( desc.dwFlags == DIEFF_CARTESIAN, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_CARTESIAN );
ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
- todo_wine
ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
- todo_wine
ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
- todo_wine
ok( desc.rglDirection[0] == 5000, "got rglDirection[0] %d expected %d\n", desc.rglDirection[0], 5000 );
- todo_wine
ok( desc.rglDirection[1] == -8660, "got rglDirection[1] %d expected %d\n", desc.rglDirection[1], -8660 );
ok( desc.rglDirection[2] == 0, "got rglDirection[2] %d expected %d\n", desc.rglDirection[2], 0 );
desc.dwFlags = DIEFF_POLAR;
desc.cAxes = 1;
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
- todo_wine
ok( hr == DIERR_MOREDATA, "GetParameters returned %#x\n", hr );
- todo_wine
+ ok( desc.dwFlags == DIEFF_POLAR, "got flags %#x, expected %#x\n", desc.dwFlags, DIEFF_POLAR );
ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
hr = IDirectInputEffect_GetParameters( effect, &desc, DIEP_DIRECTION );
- todo_wine
ok( hr == DI_OK, "GetParameters returned %#x\n", hr );
- todo_wine
ok( desc.cAxes == 2, "got cAxes %u expected 2\n", desc.cAxes );
- todo_wine
ok( desc.rglDirection[0] == 3000, "got rglDirection[0] %d expected %d\n", desc.rglDirection[0], 3000 );
ok( desc.rglDirection[1] == 0, "got rglDirection[1] %d expected %d\n", desc.rglDirection[1], 0 );
ok( desc.rglDirection[2] == 0, "got rglDirection[2] %d expected %d\n", desc.rglDirection[2], 0 );
--
2.33.0
More information about the wine-devel
mailing list