[PATCH 09/11] dinput: Use a specific buffer for set envelope output report.
Rémi Bernon
rbernon at codeweavers.com
Fri Nov 12 02:49:45 CST 2021
Instead of a generic type_specific_buf[1], and factor code for all
effects that use an envelope.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/dinput/joystick_hid.c | 134 ++++++++++++++++++-------------------
1 file changed, 64 insertions(+), 70 deletions(-)
diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index 500ae05d481..efb90b4e2e9 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -197,7 +197,8 @@ struct hid_joystick_effect
char *effect_control_buf;
char *effect_update_buf;
- char *type_specific_buf[2];
+ char *type_specific_buf;
+ char *set_envelope_buf;
};
static inline struct hid_joystick_effect *impl_from_IDirectInputEffect( IDirectInputEffect *iface )
@@ -1850,8 +1851,8 @@ static ULONG WINAPI hid_joystick_effect_Release( IDirectInputEffect *iface )
list_remove( &impl->entry );
LeaveCriticalSection( &impl->joystick->base.crit );
hid_joystick_release( &impl->joystick->base.IDirectInputDevice8W_iface );
- free( impl->type_specific_buf[1] );
- free( impl->type_specific_buf[0] );
+ free( impl->set_envelope_buf );
+ free( impl->type_specific_buf );
free( impl->effect_update_buf );
free( impl->effect_control_buf );
free( impl );
@@ -1878,8 +1879,8 @@ static HRESULT WINAPI hid_joystick_effect_Initialize( IDirectInputEffect *iface,
joystick->preparsed, impl->effect_update_buf, report_len );
if (status != HIDP_STATUS_SUCCESS) return DIERR_DEVICENOTREG;
- impl->type_specific_buf[0][0] = 0;
- impl->type_specific_buf[1][0] = 0;
+ impl->type_specific_buf[0] = 0;
+ impl->set_envelope_buf[0] = 0;
switch (type)
{
@@ -1889,10 +1890,7 @@ static HRESULT WINAPI hid_joystick_effect_Initialize( IDirectInputEffect *iface,
case PID_USAGE_ET_SAWTOOTH_UP:
case PID_USAGE_ET_SAWTOOTH_DOWN:
status = HidP_InitializeReportForID( HidP_Output, joystick->pid_set_periodic.id,
- joystick->preparsed, impl->type_specific_buf[0], report_len );
- if (status != HIDP_STATUS_SUCCESS) return DIERR_DEVICENOTREG;
- status = HidP_InitializeReportForID( HidP_Output, joystick->pid_set_envelope.id, joystick->preparsed,
- impl->type_specific_buf[1], report_len );
+ joystick->preparsed, impl->type_specific_buf, report_len );
if (status != HIDP_STATUS_SUCCESS) return DIERR_DEVICENOTREG;
break;
case PID_USAGE_ET_SPRING:
@@ -1900,23 +1898,17 @@ static HRESULT WINAPI hid_joystick_effect_Initialize( IDirectInputEffect *iface,
case PID_USAGE_ET_INERTIA:
case PID_USAGE_ET_FRICTION:
status = HidP_InitializeReportForID( HidP_Output, joystick->pid_set_condition.id, joystick->preparsed,
- impl->type_specific_buf[0], report_len );
+ impl->type_specific_buf, report_len );
if (status != HIDP_STATUS_SUCCESS) return DIERR_DEVICENOTREG;
break;
case PID_USAGE_ET_CONSTANT_FORCE:
status = HidP_InitializeReportForID( HidP_Output, joystick->pid_set_constant_force.id, joystick->preparsed,
- impl->type_specific_buf[0], report_len );
- if (status != HIDP_STATUS_SUCCESS) return DIERR_DEVICENOTREG;
- status = HidP_InitializeReportForID( HidP_Output, joystick->pid_set_envelope.id, joystick->preparsed,
- impl->type_specific_buf[1], report_len );
+ impl->type_specific_buf, report_len );
if (status != HIDP_STATUS_SUCCESS) return DIERR_DEVICENOTREG;
break;
case PID_USAGE_ET_RAMP:
status = HidP_InitializeReportForID( HidP_Output, joystick->pid_set_ramp_force.id, joystick->preparsed,
- impl->type_specific_buf[0], report_len );
- if (status != HIDP_STATUS_SUCCESS) return DIERR_DEVICENOTREG;
- status = HidP_InitializeReportForID( HidP_Output, joystick->pid_set_envelope.id, joystick->preparsed,
- impl->type_specific_buf[1], report_len );
+ impl->type_specific_buf, report_len );
if (status != HIDP_STATUS_SUCCESS) return DIERR_DEVICENOTREG;
break;
case PID_USAGE_ET_CUSTOM_FORCE_DATA:
@@ -1924,6 +1916,21 @@ static HRESULT WINAPI hid_joystick_effect_Initialize( IDirectInputEffect *iface,
break;
}
+ switch (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:
+ case PID_USAGE_ET_CONSTANT_FORCE:
+ case PID_USAGE_ET_RAMP:
+ status = HidP_InitializeReportForID( HidP_Output, joystick->pid_set_envelope.id, joystick->preparsed,
+ impl->set_envelope_buf, report_len );
+ if (status != HIDP_STATUS_SUCCESS) return DIERR_DEVICENOTREG;
+ break;
+ }
+
count = 1;
status = HidP_SetUsages( HidP_Output, HID_USAGE_PAGE_PID, joystick->pid_effect_update.type_coll,
&type, &count, joystick->preparsed, impl->effect_update_buf, report_len );
@@ -2576,14 +2583,14 @@ static HRESULT WINAPI hid_joystick_effect_Download( IDirectInputEffect *iface )
hr = DIERR_INCOMPLETEEFFECT;
else if (!impl->index && SUCCEEDED(hr = find_next_effect_id( impl->joystick, &impl->index )))
{
- if (!impl->type_specific_buf[0][0]) status = HIDP_STATUS_SUCCESS;
+ if (!impl->type_specific_buf[0]) status = HIDP_STATUS_SUCCESS;
else status = HidP_SetUsageValue( HidP_Output, HID_USAGE_PAGE_PID, 0, PID_USAGE_EFFECT_BLOCK_INDEX,
- impl->index, impl->joystick->preparsed, impl->type_specific_buf[0], report_len );
+ impl->index, impl->joystick->preparsed, impl->type_specific_buf, report_len );
if (status != HIDP_STATUS_SUCCESS) WARN( "HidP_SetUsageValue returned %#x\n", status );
- if (!impl->type_specific_buf[1][0]) status = HIDP_STATUS_SUCCESS;
+ if (!impl->set_envelope_buf[0]) status = HIDP_STATUS_SUCCESS;
else status = HidP_SetUsageValue( HidP_Output, HID_USAGE_PAGE_PID, 0, PID_USAGE_EFFECT_BLOCK_INDEX,
- impl->index, impl->joystick->preparsed, impl->type_specific_buf[1], report_len );
+ impl->index, impl->joystick->preparsed, impl->set_envelope_buf, report_len );
if (status != HIDP_STATUS_SUCCESS) WARN( "HidP_SetUsageValue returned %#x\n", status );
status = HidP_SetUsageValue( HidP_Output, HID_USAGE_PAGE_PID, 0, PID_USAGE_EFFECT_BLOCK_INDEX,
@@ -2601,28 +2608,16 @@ static HRESULT WINAPI hid_joystick_effect_Download( IDirectInputEffect *iface )
case PID_USAGE_ET_TRIANGLE:
case PID_USAGE_ET_SAWTOOTH_UP:
case PID_USAGE_ET_SAWTOOTH_DOWN:
- set_parameter_value( impl, impl->type_specific_buf[0], set_periodic->magnitude_caps,
+ set_parameter_value( impl, impl->type_specific_buf, set_periodic->magnitude_caps,
impl->periodic.dwMagnitude );
- set_parameter_value_us( impl, impl->type_specific_buf[0], set_periodic->period_caps,
+ set_parameter_value_us( impl, impl->type_specific_buf, set_periodic->period_caps,
impl->periodic.dwPeriod );
- set_parameter_value( impl, impl->type_specific_buf[0], set_periodic->phase_caps,
+ set_parameter_value( impl, impl->type_specific_buf, set_periodic->phase_caps,
impl->periodic.dwPhase );
- set_parameter_value( impl, impl->type_specific_buf[0], set_periodic->offset_caps,
+ set_parameter_value( impl, impl->type_specific_buf, set_periodic->offset_caps,
impl->periodic.lOffset );
- if (WriteFile( device, impl->type_specific_buf[0], report_len, NULL, NULL )) hr = DI_OK;
- else hr = DIERR_INPUTLOST;
-
- set_parameter_value( impl, impl->type_specific_buf[1], set_envelope->attack_level_caps,
- impl->envelope.dwAttackLevel );
- set_parameter_value_us( impl, impl->type_specific_buf[1], set_envelope->attack_time_caps,
- impl->envelope.dwAttackTime );
- set_parameter_value( impl, impl->type_specific_buf[1], set_envelope->fade_level_caps,
- impl->envelope.dwFadeLevel );
- set_parameter_value_us( impl, impl->type_specific_buf[1], set_envelope->fade_time_caps,
- impl->envelope.dwFadeTime );
-
- if (WriteFile( device, impl->type_specific_buf[1], report_len, NULL, NULL )) hr = DI_OK;
+ if (WriteFile( device, impl->type_specific_buf, report_len, NULL, NULL )) hr = DI_OK;
else hr = DIERR_INPUTLOST;
break;
case PID_USAGE_ET_SPRING:
@@ -2631,61 +2626,60 @@ static HRESULT WINAPI hid_joystick_effect_Download( IDirectInputEffect *iface )
case PID_USAGE_ET_FRICTION:
for (i = 0; i < impl->params.cbTypeSpecificParams / sizeof(DICONDITION); ++i)
{
- set_parameter_value( impl, impl->type_specific_buf[0], set_condition->center_point_offset_caps,
+ set_parameter_value( impl, impl->type_specific_buf, set_condition->center_point_offset_caps,
impl->condition[i].lOffset );
- set_parameter_value( impl, impl->type_specific_buf[0], set_condition->positive_coefficient_caps,
+ set_parameter_value( impl, impl->type_specific_buf, set_condition->positive_coefficient_caps,
impl->condition[i].lPositiveCoefficient );
- set_parameter_value( impl, impl->type_specific_buf[0], set_condition->negative_coefficient_caps,
+ set_parameter_value( impl, impl->type_specific_buf, set_condition->negative_coefficient_caps,
impl->condition[i].lNegativeCoefficient );
- set_parameter_value( impl, impl->type_specific_buf[0], set_condition->positive_saturation_caps,
+ set_parameter_value( impl, impl->type_specific_buf, set_condition->positive_saturation_caps,
impl->condition[i].dwPositiveSaturation );
- set_parameter_value( impl, impl->type_specific_buf[0], set_condition->negative_saturation_caps,
+ set_parameter_value( impl, impl->type_specific_buf, set_condition->negative_saturation_caps,
impl->condition[i].dwNegativeSaturation );
- set_parameter_value( impl, impl->type_specific_buf[0], set_condition->dead_band_caps,
+ set_parameter_value( impl, impl->type_specific_buf, set_condition->dead_band_caps,
impl->condition[i].lDeadBand );
- if (WriteFile( device, impl->type_specific_buf[0], report_len, NULL, NULL )) hr = DI_OK;
+ if (WriteFile( device, impl->type_specific_buf, report_len, NULL, NULL )) hr = DI_OK;
else hr = DIERR_INPUTLOST;
}
break;
case PID_USAGE_ET_CONSTANT_FORCE:
- set_parameter_value( impl, impl->type_specific_buf[0], set_constant_force->magnitude_caps,
+ set_parameter_value( impl, impl->type_specific_buf, set_constant_force->magnitude_caps,
impl->constant_force.lMagnitude );
- if (WriteFile( device, impl->type_specific_buf[0], report_len, NULL, NULL )) hr = DI_OK;
- else hr = DIERR_INPUTLOST;
-
- set_parameter_value( impl, impl->type_specific_buf[1], set_envelope->attack_level_caps,
- impl->envelope.dwAttackLevel );
- set_parameter_value_us( impl, impl->type_specific_buf[1], set_envelope->attack_time_caps,
- impl->envelope.dwAttackTime );
- set_parameter_value( impl, impl->type_specific_buf[1], set_envelope->fade_level_caps,
- impl->envelope.dwFadeLevel );
- set_parameter_value_us( impl, impl->type_specific_buf[1], set_envelope->fade_time_caps,
- impl->envelope.dwFadeTime );
-
- if (WriteFile( device, impl->type_specific_buf[1], report_len, NULL, NULL )) hr = DI_OK;
+ if (WriteFile( device, impl->type_specific_buf, report_len, NULL, NULL )) hr = DI_OK;
else hr = DIERR_INPUTLOST;
break;
case PID_USAGE_ET_RAMP:
- set_parameter_value( impl, impl->type_specific_buf[0], set_ramp_force->start_caps,
+ set_parameter_value( impl, impl->type_specific_buf, set_ramp_force->start_caps,
impl->ramp_force.lStart );
- set_parameter_value( impl, impl->type_specific_buf[0], set_ramp_force->end_caps,
+ set_parameter_value( impl, impl->type_specific_buf, set_ramp_force->end_caps,
impl->ramp_force.lEnd );
- if (WriteFile( device, impl->type_specific_buf[0], report_len, NULL, NULL )) hr = DI_OK;
+ if (WriteFile( device, impl->type_specific_buf, report_len, NULL, NULL )) hr = DI_OK;
else hr = DIERR_INPUTLOST;
+ break;
+ }
- set_parameter_value( impl, impl->type_specific_buf[1], set_envelope->attack_level_caps,
+ 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:
+ case PID_USAGE_ET_CONSTANT_FORCE:
+ case PID_USAGE_ET_RAMP:
+ set_parameter_value( impl, impl->set_envelope_buf, set_envelope->attack_level_caps,
impl->envelope.dwAttackLevel );
- set_parameter_value_us( impl, impl->type_specific_buf[1], set_envelope->attack_time_caps,
+ set_parameter_value_us( impl, impl->set_envelope_buf, set_envelope->attack_time_caps,
impl->envelope.dwAttackTime );
- set_parameter_value( impl, impl->type_specific_buf[1], set_envelope->fade_level_caps,
+ set_parameter_value( impl, impl->set_envelope_buf, set_envelope->fade_level_caps,
impl->envelope.dwFadeLevel );
- set_parameter_value_us( impl, impl->type_specific_buf[1], set_envelope->fade_time_caps,
+ set_parameter_value_us( impl, impl->set_envelope_buf, set_envelope->fade_time_caps,
impl->envelope.dwFadeTime );
- if (WriteFile( device, impl->type_specific_buf[1], report_len, NULL, NULL )) hr = DI_OK;
+ if (WriteFile( device, impl->set_envelope_buf, report_len, NULL, NULL )) hr = DI_OK;
else hr = DIERR_INPUTLOST;
break;
}
@@ -2798,8 +2792,8 @@ static HRESULT hid_joystick_create_effect( IDirectInputDevice8W *iface, IDirectI
report_len = joystick->caps.OutputReportByteLength;
if (!(impl->effect_control_buf = malloc( report_len ))) goto failed;
if (!(impl->effect_update_buf = malloc( report_len ))) goto failed;
- if (!(impl->type_specific_buf[0] = malloc( report_len ))) goto failed;
- if (!(impl->type_specific_buf[1] = malloc( report_len ))) goto failed;
+ if (!(impl->type_specific_buf = malloc( report_len ))) goto failed;
+ if (!(impl->set_envelope_buf = malloc( report_len ))) goto failed;
impl->envelope.dwSize = sizeof(DIENVELOPE);
impl->params.dwSize = sizeof(DIEFFECT);
--
2.33.1
More information about the wine-devel
mailing list