Implement hid_write_control, so we can use HidD_SetOutputReport on win, all others are just a wrapper until tested

This commit is contained in:
Jake 2017-04-28 19:32:22 -05:00 committed by Megamouse
parent d3013f0af3
commit 9c712bbe82
6 changed files with 36 additions and 0 deletions

View File

@ -617,6 +617,11 @@ extern "C" {
*/
HID_API_EXPORT const char* HID_API_CALL hid_version_str(void);
/** RPCS3 EDIT: This attempts to write the output on the 'control' channel
Otherwise it's the exact same as hid_write
*/
int HID_API_EXPORT HID_API_CALL hid_write_control(hid_device *device, const unsigned char *data, size_t length);
#ifdef __cplusplus
}
#endif

View File

@ -1197,6 +1197,11 @@ hid_device * HID_API_EXPORT hid_open_path(const char *path)
}
}
int HID_API_EXPORT hid_write_control(hid_device *dev, const unsigned char *data, size_t length)
{
//RPCS3 TODO: Test if this needs to be changed for control if we ever use it
return hid_write(dev, data, length);
}
HID_API_EXPORT hid_device * HID_API_CALL hid_libusb_wrap_sys_device(intptr_t sys_dev, int interface_num)
{

View File

@ -1039,6 +1039,12 @@ int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t
return bytes_written;
}
int HID_API_EXPORT hid_write_control(hid_device *dev, const unsigned char *data, size_t length)
{
//RPCS3 TODO: Test if this needs to be changed for control if we ever use it
return hid_write(dev, data, length);
}
int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds)
{

View File

@ -1176,6 +1176,12 @@ static int get_report(hid_device *dev, IOHIDReportType type, unsigned char *data
return (int) report_length;
}
int HID_API_EXPORT hid_write_control(hid_device *dev, const unsigned char *data, size_t length)
{
//RPCS3 TODO: Test if this needs to be changed for control on mac if we ever use it
return hid_write(dev, data, length);
}
int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length)
{
return set_report(dev, kIOHIDReportTypeOutput, data, length);

View File

@ -94,6 +94,7 @@ static HidD_GetPreparsedData_ HidD_GetPreparsedData;
static HidD_FreePreparsedData_ HidD_FreePreparsedData;
static HidP_GetCaps_ HidP_GetCaps;
static HidD_SetNumInputBuffers_ HidD_SetNumInputBuffers;
static HidD_SetOutputReport_ HidD_SetOutputReport;
static CM_Locate_DevNodeW_ CM_Locate_DevNodeW = NULL;
static CM_Get_Parent_ CM_Get_Parent = NULL;
@ -147,6 +148,7 @@ static int lookup_functions()
RESOLVE(hid_lib_handle, HidD_FreePreparsedData);
RESOLVE(hid_lib_handle, HidP_GetCaps);
RESOLVE(hid_lib_handle, HidD_SetNumInputBuffers);
RESOLVE(hid_lib_handle, HidD_SetOutputReport);
RESOLVE(cfgmgr32_lib_handle, CM_Locate_DevNodeW);
RESOLVE(cfgmgr32_lib_handle, CM_Get_Parent);
@ -1074,6 +1076,17 @@ end_of_function:
return function_result;
}
int HID_API_EXPORT HID_API_CALL hid_write_control(hid_device *dev, const unsigned char *data, size_t length)
{
BOOL res = HidD_SetOutputReport(dev->device_handle, (PVOID)data, (ULONG)length);
if (!res) {
register_winapi_error(dev, L"SetOutputReport");
return -1;
}
return (int)length;
}
int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds)
{

View File

@ -54,6 +54,7 @@ typedef BOOLEAN (__stdcall *HidD_GetIndexedString_)(HANDLE handle, ULONG string_
typedef BOOLEAN (__stdcall *HidD_GetPreparsedData_)(HANDLE handle, PHIDP_PREPARSED_DATA *preparsed_data);
typedef BOOLEAN (__stdcall *HidD_FreePreparsedData_)(PHIDP_PREPARSED_DATA preparsed_data);
typedef BOOLEAN (__stdcall *HidD_SetNumInputBuffers_)(HANDLE handle, ULONG number_buffers);
typedef BOOLEAN (__stdcall *HidD_SetOutputReport_)(HANDLE handle, PVOID data, ULONG length);
#endif