Wine-Devel
Threads by month
- ----- 2026 -----
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 20 participants
- 84526 discussions
Hey,
I downloaded the Wine package for Android ARM in the most recent version:
wine-6.17-arm.apk, last updated on September 10th, 2021. I installed it on
a Motorola G4 with Android 11 in a standard way, just clicking on the
downloaded file and letting Android install it. When I open it, it gives a
warning that the app is for an older version of Android, and when it
finishes loading, it exits and returns to the home screen.
Does anyone know why this might be?
I did accidentally install version 3.0 first, which opened but was just a
grey screen with no command prompt, but then I uninstalled it. I don't know
if the previous installation is affecting the new one somehow.
Thank you very much,
Julius
2
1
I'm sending this as an RFC for now as there's been some discussion
already about how to handle PE dependencies. I think the approach I'm
taking here, by including FAudio headers directly in the source and
loading it dynamically is the easiest way, and the least disruptive for
building and running Wine, if not the cleanest. All the other solutions
have higher friction, either on third party packages, or on the system
distribution.
Upstream FAudio now has a pure Win32 backend, which makes it much easier
to build as PE. This was never a requirement, and this series should
work too with the SDL2 backend, as it tries to load Wine Mono SDL2 and
FAudio as a fallback after trying from the prefix system libraries.
It could help the transition though, and is going to be required anyway
to support WMA decoding. Right now, with or without the Win32 backend,
this would also introduce a functional regression as although supported
by the new FAudio Win32 backend, it also depends on the WMA decoder MF
transform to be implemented, which isn't the case yet in Wine.
Cheers,
Rémi Bernon (5):
xactengine3_7: Move sources to xaudio2_7.
xaudio2_7: Load FAudio dynamically.
xaudio2_7: Import FAudio headers for private use.
xaudio2_7: Build with msvcrt.
xaudio2_7: Use msvcrt allocation functions.
configure.ac | 55 -
dlls/x3daudio1_0/Makefile.in | 4 +-
dlls/x3daudio1_1/Makefile.in | 4 +-
dlls/x3daudio1_2/Makefile.in | 4 +-
dlls/x3daudio1_3/Makefile.in | 4 +-
dlls/x3daudio1_4/Makefile.in | 4 +-
dlls/x3daudio1_5/Makefile.in | 4 +-
dlls/x3daudio1_6/Makefile.in | 4 +-
dlls/x3daudio1_7/Makefile.in | 4 +-
dlls/xactengine2_0/Makefile.in | 6 +-
dlls/xactengine2_4/Makefile.in | 6 +-
dlls/xactengine2_7/Makefile.in | 6 +-
dlls/xactengine2_9/Makefile.in | 6 +-
dlls/xactengine3_0/Makefile.in | 6 +-
dlls/xactengine3_1/Makefile.in | 6 +-
dlls/xactengine3_2/Makefile.in | 6 +-
dlls/xactengine3_3/Makefile.in | 6 +-
dlls/xactengine3_4/Makefile.in | 6 +-
dlls/xactengine3_5/Makefile.in | 6 +-
dlls/xactengine3_6/Makefile.in | 6 +-
dlls/xactengine3_7/Makefile.in | 5 +-
dlls/xapofx1_1/Makefile.in | 4 +-
dlls/xapofx1_2/Makefile.in | 4 +-
dlls/xapofx1_3/Makefile.in | 4 +-
dlls/xapofx1_4/Makefile.in | 4 +-
dlls/xapofx1_5/Makefile.in | 4 +-
dlls/xaudio2_0/Makefile.in | 4 +-
dlls/xaudio2_1/Makefile.in | 4 +-
dlls/xaudio2_2/Makefile.in | 4 +-
dlls/xaudio2_3/Makefile.in | 4 +-
dlls/xaudio2_4/Makefile.in | 4 +-
dlls/xaudio2_5/Makefile.in | 4 +-
dlls/xaudio2_6/Makefile.in | 4 +-
dlls/xaudio2_7/FAudio/F3DAudio.h | 262 ++++
dlls/xaudio2_7/FAudio/FACT.h | 814 ++++++++++
dlls/xaudio2_7/FAudio/FACT3D.h | 127 ++
dlls/xaudio2_7/FAudio/FAPO.h | 207 +++
dlls/xaudio2_7/FAudio/FAPOBase.h | 264 ++++
dlls/xaudio2_7/FAudio/FAPOFX.h | 178 +++
dlls/xaudio2_7/FAudio/FAudio.h | 1322 +++++++++++++++++
dlls/xaudio2_7/FAudio/FAudioFX.h | 308 ++++
dlls/xaudio2_7/Makefile.in | 4 +-
dlls/xaudio2_7/compat.c | 92 +-
dlls/xaudio2_7/faudio.c | 326 ++++
dlls/xaudio2_7/x3daudio.c | 35 +-
.../xact_classes.idl | 0
dlls/{xactengine3_7 => xaudio2_7}/xact_dll.c | 182 ++-
dlls/xaudio2_7/xapo.c | 29 +-
dlls/xaudio2_7/xapofx.c | 21 +-
dlls/xaudio2_7/xaudio_allocator.c | 2 -
dlls/xaudio2_7/xaudio_dll.c | 267 ++--
dlls/xaudio2_7/xaudio_private.h | 149 +-
dlls/xaudio2_8/Makefile.in | 4 +-
dlls/xaudio2_9/Makefile.in | 4 +-
54 files changed, 4298 insertions(+), 505 deletions(-)
create mode 100644 dlls/xaudio2_7/FAudio/F3DAudio.h
create mode 100644 dlls/xaudio2_7/FAudio/FACT.h
create mode 100644 dlls/xaudio2_7/FAudio/FACT3D.h
create mode 100644 dlls/xaudio2_7/FAudio/FAPO.h
create mode 100644 dlls/xaudio2_7/FAudio/FAPOBase.h
create mode 100644 dlls/xaudio2_7/FAudio/FAPOFX.h
create mode 100644 dlls/xaudio2_7/FAudio/FAudio.h
create mode 100644 dlls/xaudio2_7/FAudio/FAudioFX.h
create mode 100644 dlls/xaudio2_7/faudio.c
rename dlls/{xactengine3_7 => xaudio2_7}/xact_classes.idl (100%)
rename dlls/{xactengine3_7 => xaudio2_7}/xact_dll.c (87%)
--
2.31.0
16
85
Sept. 22, 2021
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51631
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/winhttp/tests/notification.c | 16 ++++++++++++++--
dlls/winhttp/tests/winhttp.c | 19 ++++++++++++++-----
2 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/dlls/winhttp/tests/notification.c b/dlls/winhttp/tests/notification.c
index 4cfffe6687e..ca2adfb098b 100644
--- a/dlls/winhttp/tests/notification.c
+++ b/dlls/winhttp/tests/notification.c
@@ -660,6 +660,7 @@ static const struct notification websocket_test[] =
{ winhttp_websocket_complete_upgrade, WINHTTP_CALLBACK_STATUS_HANDLE_CREATED, NF_SIGNAL },
{ winhttp_websocket_send, WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE, NF_SIGNAL },
{ winhttp_websocket_receive, WINHTTP_CALLBACK_STATUS_READ_COMPLETE, NF_SIGNAL },
+ { winhttp_websocket_receive, WINHTTP_CALLBACK_STATUS_READ_COMPLETE, NF_SIGNAL },
{ winhttp_websocket_shutdown, WINHTTP_CALLBACK_STATUS_SHUTDOWN_COMPLETE, NF_SIGNAL },
{ winhttp_websocket_close, WINHTTP_CALLBACK_STATUS_CLOSE_COMPLETE, NF_SIGNAL },
{ winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING },
@@ -715,7 +716,7 @@ static void test_websocket(void)
setup_test( &info, winhttp_connect, __LINE__ );
SetLastError( 0xdeadbeef );
- connection = WinHttpConnect( session, L"echo.websocket.org", 0, 0 );
+ connection = WinHttpConnect( session, L"ws.ifelse.io", 0, 0 );
err = GetLastError();
ok( connection != NULL, "got %u\n", err);
ok( err == ERROR_SUCCESS || broken(err == WSAEINVAL) /* < win7 */, "got %u\n", err );
@@ -785,7 +786,18 @@ static void test_websocket(void)
WaitForSingleObject( info.wait, INFINITE );
ok( size == 0xdeadbeef, "got %u\n", size );
ok( type == 0xdeadbeef, "got %u\n", type );
- ok( buffer[0], "unexpected data\n" );
+ ok( buffer[0] == 'R', "unexpected data\n" );
+
+ setup_test( &info, winhttp_websocket_receive, __LINE__ );
+ buffer[0] = 0;
+ size = 0xdeadbeef;
+ type = 0xdeadbeef;
+ err = pWinHttpWebSocketReceive( socket, buffer, sizeof(buffer), &size, &type );
+ ok( err == ERROR_SUCCESS, "got %u\n", err );
+ WaitForSingleObject( info.wait, INFINITE );
+ ok( size == 0xdeadbeef, "got %u\n", size );
+ ok( type == 0xdeadbeef, "got %u\n", type );
+ ok( buffer[0] == 'h', "unexpected data\n" );
setup_test( &info, winhttp_websocket_shutdown, __LINE__ );
err = pWinHttpWebSocketShutdown( socket, 1000, (void *)"success", sizeof("success") );
diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c
index 60204f6536f..ab8b444ad3f 100644
--- a/dlls/winhttp/tests/winhttp.c
+++ b/dlls/winhttp/tests/winhttp.c
@@ -3291,7 +3291,7 @@ static void test_websocket(int port)
session = WinHttpOpen(L"winetest", 0, NULL, NULL, 0);
ok(session != NULL, "got %u\n", GetLastError());
- connection = WinHttpConnect(session, L"echo.websocket.org", 0, 0);
+ connection = WinHttpConnect(session, L"ws.ifelse.io", 0, 0);
ok(connection != NULL, "got %u\n", GetLastError());
request = WinHttpOpenRequest(connection, L"GET", L"/", NULL, NULL, NULL, 0);
@@ -3316,6 +3316,15 @@ static void test_websocket(int port)
socket = pWinHttpWebSocketCompleteUpgrade(request, 0);
ok(socket != NULL, "got %u\n", GetLastError());
+ buf[0] = 0;
+ count = 0;
+ type = 0xdeadbeef;
+ error = pWinHttpWebSocketReceive(socket, buf, sizeof(buf), &count, &type);
+ ok(!error, "got %u\n", error);
+ ok(buf[0] == 'R', "got %c\n", buf[0]);
+ ok(count == 26, "got %u\n", count);
+ ok(type == WINHTTP_WEB_SOCKET_UTF8_MESSAGE_BUFFER_TYPE, "got %u\n", type);
+
error = pWinHttpWebSocketSend(socket, WINHTTP_WEB_SOCKET_BINARY_MESSAGE_BUFFER_TYPE, NULL, 1);
ok(error == ERROR_INVALID_PARAMETER, "got %u\n", error);
@@ -3388,10 +3397,10 @@ static void test_websocket(int port)
error = pWinHttpWebSocketQueryCloseStatus(socket, NULL, NULL, 0, &len);
ok(error == ERROR_INVALID_PARAMETER, "got %u\n", error);
- len = 0;
+ len = 0xdeadbeef;
error = pWinHttpWebSocketQueryCloseStatus(socket, &close_status, NULL, 0, &len);
- ok(error == ERROR_INSUFFICIENT_BUFFER, "got %u\n", error);
- ok(len, "len not set\n");
+ ok(!error, "got %u\n", error);
+ ok(!len, "got %u\n", len);
error = pWinHttpWebSocketQueryCloseStatus(socket, &close_status, NULL, 1, &len);
ok(error == ERROR_INVALID_PARAMETER, "got %u\n", error);
@@ -3402,7 +3411,7 @@ static void test_websocket(int port)
error = pWinHttpWebSocketQueryCloseStatus(socket, &close_status, buf, sizeof(buf), &len);
ok(!error, "got %u\n", error);
ok(close_status == 1000, "got %08x\n", close_status);
- ok(len == sizeof("success"), "got %u\n", len);
+ ok(!len, "got %u\n", len);
WinHttpCloseHandle(socket);
WinHttpCloseHandle(request);
--
2.30.2
2
1
[PATCH 2/3] winhttp: Read any data left in the request buffer for websocket connections.
by Hans Leidekker Sept. 22, 2021
by Hans Leidekker Sept. 22, 2021
Sept. 22, 2021
Fixes the case where a websocket server sends an unsolicited frame with the upgrade response.
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/winhttp/request.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index 85b6db6c8e0..028be61a172 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -3306,9 +3306,20 @@ DWORD WINAPI WinHttpWebSocketSend( HINTERNET hsocket, WINHTTP_WEB_SOCKET_BUFFER_
static DWORD receive_bytes( struct socket *socket, char *buf, DWORD len, DWORD *ret_len )
{
- DWORD err;
- if ((err = netconn_recv( socket->request->netconn, buf, len, 0, (int *)ret_len ))) return err;
- if (*ret_len != len) return ERROR_WINHTTP_INVALID_SERVER_RESPONSE;
+ DWORD err, size = 0, needed = len;
+ char *ptr = buf;
+ int received;
+
+ if (socket->request->read_size)
+ {
+ size = min( needed, socket->request->read_size );
+ memcpy( ptr, socket->request->read_buf + socket->request->read_pos, size );
+ remove_data( socket->request, size );
+ needed -= size;
+ ptr += size;
+ }
+ if ((err = netconn_recv( socket->request->netconn, ptr, needed, 0, &received ))) return err;
+ if ((*ret_len = size + received) != len) return ERROR_WINHTTP_INVALID_SERVER_RESPONSE;
return ERROR_SUCCESS;
}
--
2.30.2
1
0
[PATCH 1/3] winhttp: Pass a socket pointer to send_bytes() and receive_bytes().
by Hans Leidekker Sept. 22, 2021
by Hans Leidekker Sept. 22, 2021
Sept. 22, 2021
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/winhttp/request.c | 54 +++++++++++++++++++-----------------------
1 file changed, 25 insertions(+), 29 deletions(-)
diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c
index f2cb24d4486..85b6db6c8e0 100644
--- a/dlls/winhttp/request.c
+++ b/dlls/winhttp/request.c
@@ -3132,11 +3132,11 @@ HINTERNET WINAPI WinHttpWebSocketCompleteUpgrade( HINTERNET hrequest, DWORD_PTR
return hsocket;
}
-static DWORD send_bytes( struct netconn *netconn, char *bytes, int len )
+static DWORD send_bytes( struct socket *socket, char *bytes, int len )
{
int count;
DWORD err;
- if ((err = netconn_send( netconn, bytes, len, &count ))) return err;
+ if ((err = netconn_send( socket->request->netconn, bytes, len, &count ))) return err;
return (count == len) ? ERROR_SUCCESS : ERROR_INTERNAL_ERROR;
}
@@ -3145,7 +3145,7 @@ static DWORD send_bytes( struct netconn *netconn, char *bytes, int len )
#define RESERVED_BIT (7 << 4)
#define CONTROL_BIT (1 << 3)
-static DWORD send_frame( struct netconn *netconn, enum socket_opcode opcode, USHORT status, const char *buf,
+static DWORD send_frame( struct socket *socket, enum socket_opcode opcode, USHORT status, const char *buf,
DWORD buflen, BOOL final )
{
DWORD i = 0, j, ret, offset = 2, len = buflen;
@@ -3177,27 +3177,27 @@ static DWORD send_frame( struct netconn *netconn, enum socket_opcode opcode, USH
offset += 8;
}
- if ((ret = send_bytes( netconn, hdr, offset ))) return ret;
+ if ((ret = send_bytes( socket, hdr, offset ))) return ret;
if (len)
{
mask = &hdr[offset];
RtlGenRandom( mask, 4 );
- if ((ret = send_bytes( netconn, mask, 4 ))) return ret;
+ if ((ret = send_bytes( socket, mask, 4 ))) return ret;
}
if (opcode == SOCKET_OPCODE_CLOSE) /* prepend status code */
{
byte = (status >> 8) ^ mask[i++ % 4];
- if ((ret = send_bytes( netconn, &byte, 1 ))) return ret;
+ if ((ret = send_bytes( socket, &byte, 1 ))) return ret;
byte = (status & 0xff) ^ mask[i++ % 4];
- if ((ret = send_bytes( netconn, &byte, 1 ))) return ret;
+ if ((ret = send_bytes( socket, &byte, 1 ))) return ret;
}
for (j = 0; j < buflen; j++)
{
byte = buf[j] ^ mask[i++ % 4];
- if ((ret = send_bytes( netconn, &byte, 1 ))) return ret;
+ if ((ret = send_bytes( socket, &byte, 1 ))) return ret;
}
return ERROR_SUCCESS;
@@ -3222,7 +3222,7 @@ static DWORD socket_send( struct socket *socket, WINHTTP_WEB_SOCKET_BUFFER_TYPE
enum socket_opcode opcode = map_buffer_type( type );
DWORD ret;
- ret = send_frame( socket->request->netconn, opcode, 0, buf, len, TRUE );
+ ret = send_frame( socket, opcode, 0, buf, len, TRUE );
if (async)
{
if (!ret)
@@ -3304,10 +3304,10 @@ DWORD WINAPI WinHttpWebSocketSend( HINTERNET hsocket, WINHTTP_WEB_SOCKET_BUFFER_
return ret;
}
-static DWORD receive_bytes( struct netconn *netconn, char *buf, DWORD len, DWORD *ret_len )
+static DWORD receive_bytes( struct socket *socket, char *buf, DWORD len, DWORD *ret_len )
{
DWORD err;
- if ((err = netconn_recv( netconn, buf, len, 0, (int *)ret_len ))) return err;
+ if ((err = netconn_recv( socket->request->netconn, buf, len, 0, (int *)ret_len ))) return err;
if (*ret_len != len) return ERROR_WINHTTP_INVALID_SERVER_RESPONSE;
return ERROR_SUCCESS;
}
@@ -3328,12 +3328,12 @@ static BOOL is_supported_opcode( enum socket_opcode opcode )
}
}
-static DWORD receive_frame( struct netconn *netconn, DWORD *ret_len, enum socket_opcode *opcode )
+static DWORD receive_frame( struct socket *socket, DWORD *ret_len, enum socket_opcode *opcode )
{
DWORD ret, len, count;
char hdr[2];
- if ((ret = receive_bytes( netconn, hdr, sizeof(hdr), &count ))) return ret;
+ if ((ret = receive_bytes( socket, hdr, sizeof(hdr), &count ))) return ret;
if ((hdr[0] & RESERVED_BIT) || (hdr[1] & MASK_BIT) || !is_supported_opcode( hdr[0] & 0xf ))
{
return ERROR_WINHTTP_INVALID_SERVER_RESPONSE;
@@ -3345,13 +3345,13 @@ static DWORD receive_frame( struct netconn *netconn, DWORD *ret_len, enum socket
if (len == 126)
{
USHORT len16;
- if ((ret = receive_bytes( netconn, (char *)&len16, sizeof(len16), &count ))) return ret;
+ if ((ret = receive_bytes( socket, (char *)&len16, sizeof(len16), &count ))) return ret;
len = RtlUshortByteSwap( len16 );
}
else if (len == 127)
{
ULONGLONG len64;
- if ((ret = receive_bytes( netconn, (char *)&len64, sizeof(len64), &count ))) return ret;
+ if ((ret = receive_bytes( socket, (char *)&len64, sizeof(len64), &count ))) return ret;
if ((len64 = RtlUlonglongByteSwap( len64 )) > ~0u) return ERROR_NOT_SUPPORTED;
len = len64;
}
@@ -3365,7 +3365,7 @@ static void CALLBACK task_socket_send_pong( TP_CALLBACK_INSTANCE *instance, void
struct socket_send *s = ctx;
TRACE("running %p\n", work);
- send_frame( s->socket->request->netconn, SOCKET_OPCODE_PONG, 0, NULL, 0, TRUE );
+ send_frame( s->socket, SOCKET_OPCODE_PONG, 0, NULL, 0, TRUE );
release_object( &s->socket->hdr );
free( s );
@@ -3389,18 +3389,17 @@ static DWORD socket_send_pong( struct socket *socket )
}
return ret;
}
- return send_frame( socket->request->netconn, SOCKET_OPCODE_PONG, 0, NULL, 0, TRUE );
+ return send_frame( socket, SOCKET_OPCODE_PONG, 0, NULL, 0, TRUE );
}
static DWORD socket_drain( struct socket *socket )
{
- struct netconn *netconn = socket->request->netconn;
DWORD ret, count;
while (socket->read_size)
{
char buf[1024];
- if ((ret = receive_bytes( netconn, buf, min(socket->read_size, sizeof(buf)), &count ))) return ret;
+ if ((ret = receive_bytes( socket, buf, min(socket->read_size, sizeof(buf)), &count ))) return ret;
socket->read_size -= count;
}
return ERROR_SUCCESS;
@@ -3448,14 +3447,13 @@ static WINHTTP_WEB_SOCKET_BUFFER_TYPE map_opcode( enum socket_opcode opcode, BOO
static DWORD socket_receive( struct socket *socket, void *buf, DWORD len, DWORD *ret_len,
WINHTTP_WEB_SOCKET_BUFFER_TYPE *ret_type, BOOL async )
{
- struct netconn *netconn = socket->request->netconn;
DWORD count, ret = ERROR_SUCCESS;
if (!socket->read_size)
{
for (;;)
{
- if (!(ret = receive_frame( netconn, &socket->read_size, &socket->opcode )))
+ if (!(ret = receive_frame( socket, &socket->read_size, &socket->opcode )))
{
if (!(socket->opcode & CONTROL_BIT) || (ret = handle_control_frame( socket ))) break;
}
@@ -3463,7 +3461,7 @@ static DWORD socket_receive( struct socket *socket, void *buf, DWORD len, DWORD
if (ret) break;
}
}
- if (!ret) ret = receive_bytes( netconn, buf, min(len, socket->read_size), &count );
+ if (!ret) ret = receive_bytes( socket, buf, min(len, socket->read_size), &count );
if (!ret)
{
socket->read_size -= count;
@@ -3551,11 +3549,10 @@ DWORD WINAPI WinHttpWebSocketReceive( HINTERNET hsocket, void *buf, DWORD len, D
static DWORD socket_shutdown( struct socket *socket, USHORT status, const void *reason, DWORD len, BOOL async )
{
- struct netconn *netconn = socket->request->netconn;
DWORD ret;
stop_queue( &socket->send_q );
- if (!(ret = send_frame( netconn, SOCKET_OPCODE_CLOSE, status, reason, len, TRUE )))
+ if (!(ret = send_frame( socket, SOCKET_OPCODE_CLOSE, status, reason, len, TRUE )))
{
socket->state = SOCKET_STATE_SHUTDOWN;
}
@@ -3631,7 +3628,6 @@ DWORD WINAPI WinHttpWebSocketShutdown( HINTERNET hsocket, USHORT status, void *r
static DWORD socket_close( struct socket *socket, USHORT status, const void *reason, DWORD len, BOOL async )
{
- struct netconn *netconn = socket->request->netconn;
DWORD ret, count;
if ((ret = socket_drain( socket ))) goto done;
@@ -3639,11 +3635,11 @@ static DWORD socket_close( struct socket *socket, USHORT status, const void *rea
if (socket->state < SOCKET_STATE_SHUTDOWN)
{
stop_queue( &socket->send_q );
- if ((ret = send_frame( netconn, SOCKET_OPCODE_CLOSE, status, reason, len, TRUE ))) goto done;
+ if ((ret = send_frame( socket, SOCKET_OPCODE_CLOSE, status, reason, len, TRUE ))) goto done;
socket->state = SOCKET_STATE_SHUTDOWN;
}
- if ((ret = receive_frame( netconn, &count, &socket->opcode ))) goto done;
+ if ((ret = receive_frame( socket, &count, &socket->opcode ))) goto done;
if (socket->opcode != SOCKET_OPCODE_CLOSE ||
(count && (count < sizeof(socket->status) || count > sizeof(socket->status) + sizeof(socket->reason))))
{
@@ -3654,9 +3650,9 @@ static DWORD socket_close( struct socket *socket, USHORT status, const void *rea
if (count)
{
DWORD reason_len = count - sizeof(socket->status);
- if ((ret = receive_bytes( netconn, (char *)&socket->status, sizeof(socket->status), &count ))) goto done;
+ if ((ret = receive_bytes( socket, (char *)&socket->status, sizeof(socket->status), &count ))) goto done;
socket->status = RtlUshortByteSwap( socket->status );
- if ((ret = receive_bytes( netconn, socket->reason, reason_len, &socket->reason_len ))) goto done;
+ if ((ret = receive_bytes( socket, socket->reason, reason_len, &socket->reason_len ))) goto done;
}
socket->state = SOCKET_STATE_CLOSED;
--
2.30.2
1
0
Sept. 22, 2021
And not for the internal WINEXINPUT devices.
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
This should fix a high CPU usage introduced by the winexinput devices,
especially for controller which send a lot of reports.
Sending the messages makes __wine_send_input try finding a device with
the provided rawinput handle, and as it only lists HID, mouse and
keyboard device class interfaces, it never finds it. This makes it
re-enumerate the device list every time, looking for a possible new
device, in vain.
We don't use WM_INPUT messages in xinput, so they aren't needed and we
can just save a few wineserver requests. The &IG_00 device will send its
own WM_INPUT messages anyway.
dlls/hidclass.sys/device.c | 43 ++++++++++++++++++++------------------
1 file changed, 23 insertions(+), 20 deletions(-)
diff --git a/dlls/hidclass.sys/device.c b/dlls/hidclass.sys/device.c
index 8e998bd71be..848f8da906a 100644
--- a/dlls/hidclass.sys/device.c
+++ b/dlls/hidclass.sys/device.c
@@ -190,27 +190,30 @@ static void hid_device_queue_input( DEVICE_OBJECT *device, HID_XFER_PACKET *pack
KIRQL irql;
IRP *irp;
- size = offsetof( RAWINPUT, data.hid.bRawData[packet->reportBufferLen] );
- if (!(rawinput = malloc( size ))) ERR( "Failed to allocate rawinput data!\n" );
- else
+ if (IsEqualGUID( ext->class_guid, &GUID_DEVINTERFACE_HID ))
{
- INPUT input;
-
- rawinput->header.dwType = RIM_TYPEHID;
- rawinput->header.dwSize = size;
- rawinput->header.hDevice = ULongToHandle( ext->u.pdo.rawinput_handle );
- rawinput->header.wParam = RIM_INPUT;
- rawinput->data.hid.dwCount = 1;
- rawinput->data.hid.dwSizeHid = packet->reportBufferLen;
- memcpy( rawinput->data.hid.bRawData, packet->reportBuffer, packet->reportBufferLen );
-
- input.type = INPUT_HARDWARE;
- input.hi.uMsg = WM_INPUT;
- input.hi.wParamH = 0;
- input.hi.wParamL = 0;
- __wine_send_input( 0, &input, rawinput );
-
- free( rawinput );
+ size = offsetof( RAWINPUT, data.hid.bRawData[packet->reportBufferLen] );
+ if (!(rawinput = malloc( size ))) ERR( "Failed to allocate rawinput data!\n" );
+ else
+ {
+ INPUT input;
+
+ rawinput->header.dwType = RIM_TYPEHID;
+ rawinput->header.dwSize = size;
+ rawinput->header.hDevice = ULongToHandle( ext->u.pdo.rawinput_handle );
+ rawinput->header.wParam = RIM_INPUT;
+ rawinput->data.hid.dwCount = 1;
+ rawinput->data.hid.dwSizeHid = packet->reportBufferLen;
+ memcpy( rawinput->data.hid.bRawData, packet->reportBuffer, packet->reportBufferLen );
+
+ input.type = INPUT_HARDWARE;
+ input.hi.uMsg = WM_INPUT;
+ input.hi.wParamH = 0;
+ input.hi.wParamL = 0;
+ __wine_send_input( 0, &input, rawinput );
+
+ free( rawinput );
+ }
}
if (!(last_report = hid_report_create( packet )))
--
2.33.0
1
0
[PATCH 1/7] winegstreamer: Emit absolute timestamp in media source.
by Giovanni Mascellani Sept. 22, 2021
by Giovanni Mascellani Sept. 22, 2021
Sept. 22, 2021
Signed-off-by: Giovanni Mascellani <gmascellani(a)codeweavers.com>
---
dlls/winegstreamer/media_source.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
index 01ab626254a..cd8957db7b1 100644
--- a/dlls/winegstreamer/media_source.c
+++ b/dlls/winegstreamer/media_source.c
@@ -100,8 +100,6 @@ struct media_source
SOURCE_SHUTDOWN,
} state;
- LONGLONG start_time;
-
HANDLE read_thread;
bool read_thread_shutdown;
};
@@ -274,7 +272,6 @@ static void start_pipeline(struct media_source *source, struct source_async_comm
position->vt = VT_I8;
position->hVal.QuadPart = 0;
}
- source->start_time = position->hVal.QuadPart;
for (i = 0; i < source->stream_count; i++)
{
@@ -427,7 +424,7 @@ static void send_buffer(struct media_stream *stream, const struct wg_parser_even
goto out;
}
- if (FAILED(hr = IMFSample_SetSampleTime(sample, event->u.buffer.pts - stream->parent_source->start_time)))
+ if (FAILED(hr = IMFSample_SetSampleTime(sample, event->u.buffer.pts)))
{
ERR("Failed to set sample time, hr %#x.\n", hr);
goto out;
--
2.33.0
4
16
[PATCH v2 1/6] winebus.sys: Rename SDL bus device to struct sdl_device.
by Rémi Bernon Sept. 22, 2021
by Rémi Bernon Sept. 22, 2021
Sept. 22, 2021
And use impl everywhere instead of inconsistent private / ext / device.
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
v2: Rebased the IOHID changes, thanks for fixing the typo.
dlls/winebus.sys/bus_sdl.c | 254 ++++++++++++++++++-------------------
1 file changed, 127 insertions(+), 127 deletions(-)
diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c
index 9f6596f5c7d..eaa0ed9329e 100644
--- a/dlls/winebus.sys/bus_sdl.c
+++ b/dlls/winebus.sys/bus_sdl.c
@@ -115,7 +115,7 @@ static Uint16 (*pSDL_JoystickGetProduct)(SDL_Joystick * joystick);
static Uint16 (*pSDL_JoystickGetProductVersion)(SDL_Joystick * joystick);
static Uint16 (*pSDL_JoystickGetVendor)(SDL_Joystick * joystick);
-struct platform_private
+struct sdl_device
{
struct unix_device unix_device;
@@ -137,55 +137,55 @@ struct platform_private
int haptic_effect_id;
};
-static inline struct platform_private *impl_from_unix_device(struct unix_device *iface)
+static inline struct sdl_device *impl_from_unix_device(struct unix_device *iface)
{
- return CONTAINING_RECORD(iface, struct platform_private, unix_device);
+ return CONTAINING_RECORD(iface, struct sdl_device, unix_device);
}
-static struct platform_private *find_device_from_id(SDL_JoystickID id)
+static struct sdl_device *find_device_from_id(SDL_JoystickID id)
{
- struct platform_private *device;
+ struct sdl_device *impl;
- LIST_FOR_EACH_ENTRY(device, &device_list, struct platform_private, unix_device.entry)
- if (device->id == id) return device;
+ LIST_FOR_EACH_ENTRY(impl, &device_list, struct sdl_device, unix_device.entry)
+ if (impl->id == id) return impl;
return NULL;
}
-static void set_button_value(struct platform_private *ext, int index, int value)
+static void set_button_value(struct sdl_device *impl, int index, int value)
{
- int byte_index = ext->button_start + index / 8;
+ int byte_index = impl->button_start + index / 8;
int bit_index = index % 8;
BYTE mask = 1 << bit_index;
if (value)
{
- ext->report_buffer[byte_index] = ext->report_buffer[byte_index] | mask;
+ impl->report_buffer[byte_index] = impl->report_buffer[byte_index] | mask;
}
else
{
mask = ~mask;
- ext->report_buffer[byte_index] = ext->report_buffer[byte_index] & mask;
+ impl->report_buffer[byte_index] = impl->report_buffer[byte_index] & mask;
}
}
-static void set_axis_value(struct platform_private *ext, int index, short value)
+static void set_axis_value(struct sdl_device *impl, int index, short value)
{
- DWORD *report = (DWORD *)(ext->report_buffer + ext->axis_start);
+ DWORD *report = (DWORD *)(impl->report_buffer + impl->axis_start);
report[index] = LE_DWORD(value);
}
-static void set_ball_value(struct platform_private *ext, int index, int value1, int value2)
+static void set_ball_value(struct sdl_device *impl, int index, int value1, int value2)
{
int offset;
- offset = ext->ball_start + (index * sizeof(DWORD));
- *(DWORD *)&ext->report_buffer[offset] = LE_DWORD(value1);
- *(DWORD *)&ext->report_buffer[offset + sizeof(DWORD)] = LE_DWORD(value2);
+ offset = impl->ball_start + (index * sizeof(DWORD));
+ *(DWORD *)&impl->report_buffer[offset] = LE_DWORD(value1);
+ *(DWORD *)&impl->report_buffer[offset + sizeof(DWORD)] = LE_DWORD(value2);
}
-static void set_hat_value(struct platform_private *ext, int index, int value)
+static void set_hat_value(struct sdl_device *impl, int index, int value)
{
- int byte = ext->hat_start + index;
+ int byte = impl->hat_start + index;
unsigned char val;
switch (value)
@@ -205,35 +205,35 @@ static void set_hat_value(struct platform_private *ext, int index, int value)
default: return;
}
- ext->report_buffer[byte] = val;
+ impl->report_buffer[byte] = val;
}
-static BOOL descriptor_add_haptic(struct platform_private *ext)
+static BOOL descriptor_add_haptic(struct sdl_device *impl)
{
- if (pSDL_JoystickIsHaptic(ext->sdl_joystick))
+ if (pSDL_JoystickIsHaptic(impl->sdl_joystick))
{
- ext->sdl_haptic = pSDL_HapticOpenFromJoystick(ext->sdl_joystick);
- if (ext->sdl_haptic &&
- ((pSDL_HapticQuery(ext->sdl_haptic) & SDL_HAPTIC_LEFTRIGHT) != 0 ||
- pSDL_HapticRumbleSupported(ext->sdl_haptic)))
+ impl->sdl_haptic = pSDL_HapticOpenFromJoystick(impl->sdl_joystick);
+ if (impl->sdl_haptic &&
+ ((pSDL_HapticQuery(impl->sdl_haptic) & SDL_HAPTIC_LEFTRIGHT) != 0 ||
+ pSDL_HapticRumbleSupported(impl->sdl_haptic)))
{
- pSDL_HapticStopAll(ext->sdl_haptic);
- pSDL_HapticRumbleInit(ext->sdl_haptic);
- if (!hid_descriptor_add_haptics(&ext->desc))
+ pSDL_HapticStopAll(impl->sdl_haptic);
+ pSDL_HapticRumbleInit(impl->sdl_haptic);
+ if (!hid_descriptor_add_haptics(&impl->desc))
return FALSE;
- ext->haptic_effect_id = -1;
+ impl->haptic_effect_id = -1;
}
else
{
- pSDL_HapticClose(ext->sdl_haptic);
- ext->sdl_haptic = NULL;
+ pSDL_HapticClose(impl->sdl_haptic);
+ impl->sdl_haptic = NULL;
}
}
return TRUE;
}
-static NTSTATUS build_joystick_report_descriptor(struct platform_private *ext)
+static NTSTATUS build_joystick_report_descriptor(struct sdl_device *impl)
{
static const USAGE joystick_usages[] =
{
@@ -251,72 +251,72 @@ static NTSTATUS build_joystick_report_descriptor(struct platform_private *ext)
int i, report_size = 1;
int button_count, axis_count, ball_count, hat_count;
- axis_count = pSDL_JoystickNumAxes(ext->sdl_joystick);
+ axis_count = pSDL_JoystickNumAxes(impl->sdl_joystick);
if (axis_count > 6)
{
FIXME("Clamping joystick to 6 axis\n");
axis_count = 6;
}
- ext->axis_start = report_size;
+ impl->axis_start = report_size;
report_size += (sizeof(DWORD) * axis_count);
- ball_count = pSDL_JoystickNumBalls(ext->sdl_joystick);
+ ball_count = pSDL_JoystickNumBalls(impl->sdl_joystick);
if (axis_count + ball_count * 2 > ARRAY_SIZE(joystick_usages))
{
FIXME("Capping ball + axis at 9\n");
ball_count = (ARRAY_SIZE(joystick_usages) - axis_count) / 2;
}
- ext->ball_start = report_size;
+ impl->ball_start = report_size;
report_size += (sizeof(DWORD) * 2 * ball_count);
- hat_count = pSDL_JoystickNumHats(ext->sdl_joystick);
- ext->hat_start = report_size;
+ hat_count = pSDL_JoystickNumHats(impl->sdl_joystick);
+ impl->hat_start = report_size;
report_size += hat_count;
/* For now lump all buttons just into incremental usages, Ignore Keys */
- button_count = pSDL_JoystickNumButtons(ext->sdl_joystick);
- ext->button_start = report_size;
+ button_count = pSDL_JoystickNumButtons(impl->sdl_joystick);
+ impl->button_start = report_size;
report_size += (button_count + 7) / 8;
TRACE("Report will be %i bytes\n", report_size);
- if (!hid_descriptor_begin(&ext->desc, HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_JOYSTICK))
+ if (!hid_descriptor_begin(&impl->desc, HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_JOYSTICK))
return STATUS_NO_MEMORY;
- if (axis_count && !hid_descriptor_add_axes(&ext->desc, axis_count, HID_USAGE_PAGE_GENERIC,
+ if (axis_count && !hid_descriptor_add_axes(&impl->desc, axis_count, HID_USAGE_PAGE_GENERIC,
joystick_usages, FALSE, -32768, 32767))
return STATUS_NO_MEMORY;
- if (ball_count && !hid_descriptor_add_axes(&ext->desc, ball_count * 2, HID_USAGE_PAGE_GENERIC,
+ if (ball_count && !hid_descriptor_add_axes(&impl->desc, ball_count * 2, HID_USAGE_PAGE_GENERIC,
&joystick_usages[axis_count], TRUE, INT32_MIN, INT32_MAX))
return STATUS_NO_MEMORY;
- if (hat_count && !hid_descriptor_add_hatswitch(&ext->desc, hat_count))
+ if (hat_count && !hid_descriptor_add_hatswitch(&impl->desc, hat_count))
return STATUS_NO_MEMORY;
- if (button_count && !hid_descriptor_add_buttons(&ext->desc, HID_USAGE_PAGE_BUTTON, 1, button_count))
+ if (button_count && !hid_descriptor_add_buttons(&impl->desc, HID_USAGE_PAGE_BUTTON, 1, button_count))
return STATUS_NO_MEMORY;
- if (!descriptor_add_haptic(ext))
+ if (!descriptor_add_haptic(impl))
return STATUS_NO_MEMORY;
- if (!hid_descriptor_end(&ext->desc))
+ if (!hid_descriptor_end(&impl->desc))
return STATUS_NO_MEMORY;
- ext->buffer_length = report_size;
- if (!(ext->report_buffer = calloc(1, report_size))) goto failed;
+ impl->buffer_length = report_size;
+ if (!(impl->report_buffer = calloc(1, report_size))) goto failed;
/* Initialize axis in the report */
for (i = 0; i < axis_count; i++)
- set_axis_value(ext, i, pSDL_JoystickGetAxis(ext->sdl_joystick, i));
+ set_axis_value(impl, i, pSDL_JoystickGetAxis(impl->sdl_joystick, i));
for (i = 0; i < hat_count; i++)
- set_hat_value(ext, i, pSDL_JoystickGetHat(ext->sdl_joystick, i));
+ set_hat_value(impl, i, pSDL_JoystickGetHat(impl->sdl_joystick, i));
return STATUS_SUCCESS;
failed:
- free(ext->report_buffer);
- hid_descriptor_free(&ext->desc);
+ free(impl->report_buffer);
+ hid_descriptor_free(&impl->desc);
return STATUS_NO_MEMORY;
}
@@ -347,7 +347,7 @@ static SHORT compose_dpad_value(SDL_GameController *joystick)
return SDL_HAT_CENTERED;
}
-static NTSTATUS build_controller_report_descriptor(struct platform_private *ext)
+static NTSTATUS build_controller_report_descriptor(struct sdl_device *impl)
{
static const USAGE left_axis_usages[] = {HID_USAGE_GENERIC_X, HID_USAGE_GENERIC_Y};
static const USAGE right_axis_usages[] = {HID_USAGE_GENERIC_RX, HID_USAGE_GENERIC_RY};
@@ -355,52 +355,52 @@ static NTSTATUS build_controller_report_descriptor(struct platform_private *ext)
ULONG i, button_count = SDL_CONTROLLER_BUTTON_MAX - 1;
C_ASSERT(SDL_CONTROLLER_AXIS_MAX == 6);
- ext->axis_start = 0;
- ext->hat_start = SDL_CONTROLLER_AXIS_MAX * sizeof(DWORD);
- ext->button_start = ext->hat_start + 1;
- ext->buffer_length = ext->button_start + (button_count + 7) / 8;
+ impl->axis_start = 0;
+ impl->hat_start = SDL_CONTROLLER_AXIS_MAX * sizeof(DWORD);
+ impl->button_start = impl->hat_start + 1;
+ impl->buffer_length = impl->button_start + (button_count + 7) / 8;
- TRACE("Report will be %i bytes\n", ext->buffer_length);
+ TRACE("Report will be %i bytes\n", impl->buffer_length);
- if (!hid_descriptor_begin(&ext->desc, HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_GAMEPAD))
+ if (!hid_descriptor_begin(&impl->desc, HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_GAMEPAD))
return STATUS_NO_MEMORY;
- if (!hid_descriptor_add_axes(&ext->desc, 2, HID_USAGE_PAGE_GENERIC, left_axis_usages,
+ if (!hid_descriptor_add_axes(&impl->desc, 2, HID_USAGE_PAGE_GENERIC, left_axis_usages,
FALSE, -32768, 32767))
return STATUS_NO_MEMORY;
- if (!hid_descriptor_add_axes(&ext->desc, 2, HID_USAGE_PAGE_GENERIC, right_axis_usages,
+ if (!hid_descriptor_add_axes(&impl->desc, 2, HID_USAGE_PAGE_GENERIC, right_axis_usages,
FALSE, -32768, 32767))
return STATUS_NO_MEMORY;
- if (!hid_descriptor_add_axes(&ext->desc, 2, HID_USAGE_PAGE_GENERIC, trigger_axis_usages,
+ if (!hid_descriptor_add_axes(&impl->desc, 2, HID_USAGE_PAGE_GENERIC, trigger_axis_usages,
FALSE, 0, 32767))
return STATUS_NO_MEMORY;
- if (!hid_descriptor_add_hatswitch(&ext->desc, 1))
+ if (!hid_descriptor_add_hatswitch(&impl->desc, 1))
return STATUS_NO_MEMORY;
- if (!hid_descriptor_add_buttons(&ext->desc, HID_USAGE_PAGE_BUTTON, 1, button_count))
+ if (!hid_descriptor_add_buttons(&impl->desc, HID_USAGE_PAGE_BUTTON, 1, button_count))
return STATUS_NO_MEMORY;
- if (!descriptor_add_haptic(ext))
+ if (!descriptor_add_haptic(impl))
return STATUS_NO_MEMORY;
- if (!hid_descriptor_end(&ext->desc))
+ if (!hid_descriptor_end(&impl->desc))
return STATUS_NO_MEMORY;
- if (!(ext->report_buffer = calloc(1, ext->buffer_length))) goto failed;
+ if (!(impl->report_buffer = calloc(1, impl->buffer_length))) goto failed;
/* Initialize axis in the report */
for (i = SDL_CONTROLLER_AXIS_LEFTX; i < SDL_CONTROLLER_AXIS_MAX; i++)
- set_axis_value(ext, i, pSDL_GameControllerGetAxis(ext->sdl_controller, i));
- set_hat_value(ext, 0, compose_dpad_value(ext->sdl_controller));
+ set_axis_value(impl, i, pSDL_GameControllerGetAxis(impl->sdl_controller, i));
+ set_hat_value(impl, 0, compose_dpad_value(impl->sdl_controller));
return STATUS_SUCCESS;
failed:
- free(ext->report_buffer);
- hid_descriptor_free(&ext->desc);
+ free(impl->report_buffer);
+ hid_descriptor_free(&impl->desc);
return STATUS_NO_MEMORY;
}
@@ -410,51 +410,51 @@ static void sdl_device_destroy(struct unix_device *iface)
static NTSTATUS sdl_device_start(struct unix_device *iface)
{
- struct platform_private *ext = impl_from_unix_device(iface);
- if (ext->sdl_controller) return build_controller_report_descriptor(ext);
- return build_joystick_report_descriptor(ext);
+ struct sdl_device *impl = impl_from_unix_device(iface);
+ if (impl->sdl_controller) return build_controller_report_descriptor(impl);
+ return build_joystick_report_descriptor(impl);
}
static void sdl_device_stop(struct unix_device *iface)
{
- struct platform_private *private = impl_from_unix_device(iface);
+ struct sdl_device *impl = impl_from_unix_device(iface);
- pSDL_JoystickClose(private->sdl_joystick);
- if (private->sdl_controller) pSDL_GameControllerClose(private->sdl_controller);
- if (private->sdl_haptic) pSDL_HapticClose(private->sdl_haptic);
+ pSDL_JoystickClose(impl->sdl_joystick);
+ if (impl->sdl_controller) pSDL_GameControllerClose(impl->sdl_controller);
+ if (impl->sdl_haptic) pSDL_HapticClose(impl->sdl_haptic);
pthread_mutex_lock(&sdl_cs);
- list_remove(&private->unix_device.entry);
+ list_remove(&impl->unix_device.entry);
pthread_mutex_unlock(&sdl_cs);
}
static NTSTATUS sdl_device_get_reportdescriptor(struct unix_device *iface, BYTE *buffer,
DWORD length, DWORD *out_length)
{
- struct platform_private *ext = impl_from_unix_device(iface);
+ struct sdl_device *impl = impl_from_unix_device(iface);
- *out_length = ext->desc.size;
- if (length < ext->desc.size) return STATUS_BUFFER_TOO_SMALL;
+ *out_length = impl->desc.size;
+ if (length < impl->desc.size) return STATUS_BUFFER_TOO_SMALL;
- memcpy(buffer, ext->desc.data, ext->desc.size);
+ memcpy(buffer, impl->desc.data, impl->desc.size);
return STATUS_SUCCESS;
}
static void sdl_device_set_output_report(struct unix_device *iface, HID_XFER_PACKET *packet, IO_STATUS_BLOCK *io)
{
- struct platform_private *ext = impl_from_unix_device(iface);
+ struct sdl_device *impl = impl_from_unix_device(iface);
- if (ext->sdl_haptic && packet->reportId == 0)
+ if (impl->sdl_haptic && packet->reportId == 0)
{
WORD left = packet->reportBuffer[2] * 128;
WORD right = packet->reportBuffer[3] * 128;
- if (ext->haptic_effect_id >= 0)
+ if (impl->haptic_effect_id >= 0)
{
- pSDL_HapticDestroyEffect(ext->sdl_haptic, ext->haptic_effect_id);
- ext->haptic_effect_id = -1;
+ pSDL_HapticDestroyEffect(impl->sdl_haptic, impl->haptic_effect_id);
+ impl->haptic_effect_id = -1;
}
- pSDL_HapticStopAll(ext->sdl_haptic);
+ pSDL_HapticStopAll(impl->sdl_haptic);
if (left != 0 || right != 0)
{
SDL_HapticEffect effect;
@@ -465,15 +465,15 @@ static void sdl_device_set_output_report(struct unix_device *iface, HID_XFER_PAC
effect.leftright.large_magnitude = left;
effect.leftright.small_magnitude = right;
- ext->haptic_effect_id = pSDL_HapticNewEffect(ext->sdl_haptic, &effect);
- if (ext->haptic_effect_id >= 0)
+ impl->haptic_effect_id = pSDL_HapticNewEffect(impl->sdl_haptic, &effect);
+ if (impl->haptic_effect_id >= 0)
{
- pSDL_HapticRunEffect(ext->sdl_haptic, ext->haptic_effect_id, 1);
+ pSDL_HapticRunEffect(impl->sdl_haptic, impl->haptic_effect_id, 1);
}
else
{
float i = (float)((left + right)/2.0) / 32767.0;
- pSDL_HapticRumblePlay(ext->sdl_haptic, i, -1);
+ pSDL_HapticRumblePlay(impl->sdl_haptic, i, -1);
}
}
@@ -510,11 +510,11 @@ static const struct unix_device_vtbl sdl_device_vtbl =
sdl_device_set_feature_report,
};
-static BOOL set_report_from_joystick_event(struct platform_private *device, SDL_Event *event)
+static BOOL set_report_from_joystick_event(struct sdl_device *impl, SDL_Event *event)
{
- struct unix_device *iface = &device->unix_device;
+ struct unix_device *iface = &impl->unix_device;
- if (device->sdl_controller) return TRUE; /* use controller events instead */
+ if (impl->sdl_controller) return TRUE; /* use controller events instead */
switch(event->type)
{
@@ -523,9 +523,9 @@ static BOOL set_report_from_joystick_event(struct platform_private *device, SDL_
{
SDL_JoyButtonEvent *ie = &event->jbutton;
- set_button_value(device, ie->button, ie->state);
+ set_button_value(impl, ie->button, ie->state);
- bus_event_queue_input_report(&event_queue, iface, device->report_buffer, device->buffer_length);
+ bus_event_queue_input_report(&event_queue, iface, impl->report_buffer, impl->buffer_length);
break;
}
case SDL_JOYAXISMOTION:
@@ -534,8 +534,8 @@ static BOOL set_report_from_joystick_event(struct platform_private *device, SDL_
if (ie->axis < 6)
{
- set_axis_value(device, ie->axis, ie->value);
- bus_event_queue_input_report(&event_queue, iface, device->report_buffer, device->buffer_length);
+ set_axis_value(impl, ie->axis, ie->value);
+ bus_event_queue_input_report(&event_queue, iface, impl->report_buffer, impl->buffer_length);
}
break;
}
@@ -543,16 +543,16 @@ static BOOL set_report_from_joystick_event(struct platform_private *device, SDL_
{
SDL_JoyBallEvent *ie = &event->jball;
- set_ball_value(device, ie->ball, ie->xrel, ie->yrel);
- bus_event_queue_input_report(&event_queue, iface, device->report_buffer, device->buffer_length);
+ set_ball_value(impl, ie->ball, ie->xrel, ie->yrel);
+ bus_event_queue_input_report(&event_queue, iface, impl->report_buffer, impl->buffer_length);
break;
}
case SDL_JOYHATMOTION:
{
SDL_JoyHatEvent *ie = &event->jhat;
- set_hat_value(device, ie->hat, ie->value);
- bus_event_queue_input_report(&event_queue, iface, device->report_buffer, device->buffer_length);
+ set_hat_value(impl, ie->hat, ie->value);
+ bus_event_queue_input_report(&event_queue, iface, impl->report_buffer, impl->buffer_length);
break;
}
default:
@@ -561,9 +561,9 @@ static BOOL set_report_from_joystick_event(struct platform_private *device, SDL_
return FALSE;
}
-static BOOL set_report_from_controller_event(struct platform_private *device, SDL_Event *event)
+static BOOL set_report_from_controller_event(struct sdl_device *impl, SDL_Event *event)
{
- struct unix_device *iface = &device->unix_device;
+ struct unix_device *iface = &impl->unix_device;
switch(event->type)
{
@@ -579,7 +579,7 @@ static BOOL set_report_from_controller_event(struct platform_private *device, SD
case SDL_CONTROLLER_BUTTON_DPAD_DOWN:
case SDL_CONTROLLER_BUTTON_DPAD_LEFT:
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT:
- set_hat_value(device, 0, compose_dpad_value(device->sdl_controller));
+ set_hat_value(impl, 0, compose_dpad_value(impl->sdl_controller));
break;
case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: button = 4; break;
case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: button = 5; break;
@@ -590,16 +590,16 @@ static BOOL set_report_from_controller_event(struct platform_private *device, SD
case SDL_CONTROLLER_BUTTON_GUIDE: button = 10; break;
}
- set_button_value(device, button, ie->state);
- bus_event_queue_input_report(&event_queue, iface, device->report_buffer, device->buffer_length);
+ set_button_value(impl, button, ie->state);
+ bus_event_queue_input_report(&event_queue, iface, impl->report_buffer, impl->buffer_length);
break;
}
case SDL_CONTROLLERAXISMOTION:
{
SDL_ControllerAxisEvent *ie = &event->caxis;
- set_axis_value(device, ie->axis, ie->value);
- bus_event_queue_input_report(&event_queue, iface, device->report_buffer, device->buffer_length);
+ set_axis_value(impl, ie->axis, ie->value);
+ bus_event_queue_input_report(&event_queue, iface, impl->report_buffer, impl->buffer_length);
break;
}
default:
@@ -616,7 +616,7 @@ static void sdl_add_device(unsigned int index)
.manufacturer = {"SDL"},
.serialnumber = {"0000"},
};
- struct platform_private *private;
+ struct sdl_device *impl;
SDL_Joystick* joystick;
SDL_JoystickID id;
@@ -664,18 +664,18 @@ static void sdl_add_device(unsigned int index)
TRACE("%s id %d, desc %s.\n", controller ? "controller" : "joystick", id, debugstr_device_desc(&desc));
- if (!(private = unix_device_create(&sdl_device_vtbl, sizeof(struct platform_private)))) return;
- list_add_tail(&device_list, &private->unix_device.entry);
- private->sdl_joystick = joystick;
- private->sdl_controller = controller;
- private->id = id;
+ if (!(impl = unix_device_create(&sdl_device_vtbl, sizeof(struct sdl_device)))) return;
+ list_add_tail(&device_list, &impl->unix_device.entry);
+ impl->sdl_joystick = joystick;
+ impl->sdl_controller = controller;
+ impl->id = id;
- bus_event_queue_device_created(&event_queue, &private->unix_device, &desc);
+ bus_event_queue_device_created(&event_queue, &impl->unix_device, &desc);
}
static void process_device_event(SDL_Event *event)
{
- struct platform_private *device;
+ struct sdl_device *impl;
SDL_JoystickID id;
TRACE_(hid_report)("Received action %x\n", event->type);
@@ -687,22 +687,22 @@ static void process_device_event(SDL_Event *event)
else if (event->type == SDL_JOYDEVICEREMOVED)
{
id = ((SDL_JoyDeviceEvent *)event)->which;
- device = find_device_from_id(id);
- if (device) bus_event_queue_device_removed(&event_queue, &device->unix_device);
+ impl = find_device_from_id(id);
+ if (impl) bus_event_queue_device_removed(&event_queue, &impl->unix_device);
else WARN("failed to find device with id %d\n", id);
}
else if (event->type >= SDL_JOYAXISMOTION && event->type <= SDL_JOYBUTTONUP)
{
id = ((SDL_JoyButtonEvent *)event)->which;
- device = find_device_from_id(id);
- if (device) set_report_from_joystick_event(device, event);
+ impl = find_device_from_id(id);
+ if (impl) set_report_from_joystick_event(impl, event);
else WARN("failed to find device with id %d\n", id);
}
else if (event->type >= SDL_CONTROLLERAXISMOTION && event->type <= SDL_CONTROLLERBUTTONUP)
{
id = ((SDL_ControllerButtonEvent *)event)->which;
- device = find_device_from_id(id);
- if (device) set_report_from_controller_event(device, event);
+ impl = find_device_from_id(id);
+ if (impl) set_report_from_controller_event(impl, event);
else WARN("failed to find device with id %d\n", id);
}
--
2.33.0
1
5
Sept. 22, 2021
And use impl everywhere instead of inconsistent private / ext / device.
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/winebus.sys/bus_sdl.c | 254 ++++++++++++++++++-------------------
1 file changed, 127 insertions(+), 127 deletions(-)
diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c
index 9f6596f5c7d..eaa0ed9329e 100644
--- a/dlls/winebus.sys/bus_sdl.c
+++ b/dlls/winebus.sys/bus_sdl.c
@@ -115,7 +115,7 @@ static Uint16 (*pSDL_JoystickGetProduct)(SDL_Joystick * joystick);
static Uint16 (*pSDL_JoystickGetProductVersion)(SDL_Joystick * joystick);
static Uint16 (*pSDL_JoystickGetVendor)(SDL_Joystick * joystick);
-struct platform_private
+struct sdl_device
{
struct unix_device unix_device;
@@ -137,55 +137,55 @@ struct platform_private
int haptic_effect_id;
};
-static inline struct platform_private *impl_from_unix_device(struct unix_device *iface)
+static inline struct sdl_device *impl_from_unix_device(struct unix_device *iface)
{
- return CONTAINING_RECORD(iface, struct platform_private, unix_device);
+ return CONTAINING_RECORD(iface, struct sdl_device, unix_device);
}
-static struct platform_private *find_device_from_id(SDL_JoystickID id)
+static struct sdl_device *find_device_from_id(SDL_JoystickID id)
{
- struct platform_private *device;
+ struct sdl_device *impl;
- LIST_FOR_EACH_ENTRY(device, &device_list, struct platform_private, unix_device.entry)
- if (device->id == id) return device;
+ LIST_FOR_EACH_ENTRY(impl, &device_list, struct sdl_device, unix_device.entry)
+ if (impl->id == id) return impl;
return NULL;
}
-static void set_button_value(struct platform_private *ext, int index, int value)
+static void set_button_value(struct sdl_device *impl, int index, int value)
{
- int byte_index = ext->button_start + index / 8;
+ int byte_index = impl->button_start + index / 8;
int bit_index = index % 8;
BYTE mask = 1 << bit_index;
if (value)
{
- ext->report_buffer[byte_index] = ext->report_buffer[byte_index] | mask;
+ impl->report_buffer[byte_index] = impl->report_buffer[byte_index] | mask;
}
else
{
mask = ~mask;
- ext->report_buffer[byte_index] = ext->report_buffer[byte_index] & mask;
+ impl->report_buffer[byte_index] = impl->report_buffer[byte_index] & mask;
}
}
-static void set_axis_value(struct platform_private *ext, int index, short value)
+static void set_axis_value(struct sdl_device *impl, int index, short value)
{
- DWORD *report = (DWORD *)(ext->report_buffer + ext->axis_start);
+ DWORD *report = (DWORD *)(impl->report_buffer + impl->axis_start);
report[index] = LE_DWORD(value);
}
-static void set_ball_value(struct platform_private *ext, int index, int value1, int value2)
+static void set_ball_value(struct sdl_device *impl, int index, int value1, int value2)
{
int offset;
- offset = ext->ball_start + (index * sizeof(DWORD));
- *(DWORD *)&ext->report_buffer[offset] = LE_DWORD(value1);
- *(DWORD *)&ext->report_buffer[offset + sizeof(DWORD)] = LE_DWORD(value2);
+ offset = impl->ball_start + (index * sizeof(DWORD));
+ *(DWORD *)&impl->report_buffer[offset] = LE_DWORD(value1);
+ *(DWORD *)&impl->report_buffer[offset + sizeof(DWORD)] = LE_DWORD(value2);
}
-static void set_hat_value(struct platform_private *ext, int index, int value)
+static void set_hat_value(struct sdl_device *impl, int index, int value)
{
- int byte = ext->hat_start + index;
+ int byte = impl->hat_start + index;
unsigned char val;
switch (value)
@@ -205,35 +205,35 @@ static void set_hat_value(struct platform_private *ext, int index, int value)
default: return;
}
- ext->report_buffer[byte] = val;
+ impl->report_buffer[byte] = val;
}
-static BOOL descriptor_add_haptic(struct platform_private *ext)
+static BOOL descriptor_add_haptic(struct sdl_device *impl)
{
- if (pSDL_JoystickIsHaptic(ext->sdl_joystick))
+ if (pSDL_JoystickIsHaptic(impl->sdl_joystick))
{
- ext->sdl_haptic = pSDL_HapticOpenFromJoystick(ext->sdl_joystick);
- if (ext->sdl_haptic &&
- ((pSDL_HapticQuery(ext->sdl_haptic) & SDL_HAPTIC_LEFTRIGHT) != 0 ||
- pSDL_HapticRumbleSupported(ext->sdl_haptic)))
+ impl->sdl_haptic = pSDL_HapticOpenFromJoystick(impl->sdl_joystick);
+ if (impl->sdl_haptic &&
+ ((pSDL_HapticQuery(impl->sdl_haptic) & SDL_HAPTIC_LEFTRIGHT) != 0 ||
+ pSDL_HapticRumbleSupported(impl->sdl_haptic)))
{
- pSDL_HapticStopAll(ext->sdl_haptic);
- pSDL_HapticRumbleInit(ext->sdl_haptic);
- if (!hid_descriptor_add_haptics(&ext->desc))
+ pSDL_HapticStopAll(impl->sdl_haptic);
+ pSDL_HapticRumbleInit(impl->sdl_haptic);
+ if (!hid_descriptor_add_haptics(&impl->desc))
return FALSE;
- ext->haptic_effect_id = -1;
+ impl->haptic_effect_id = -1;
}
else
{
- pSDL_HapticClose(ext->sdl_haptic);
- ext->sdl_haptic = NULL;
+ pSDL_HapticClose(impl->sdl_haptic);
+ impl->sdl_haptic = NULL;
}
}
return TRUE;
}
-static NTSTATUS build_joystick_report_descriptor(struct platform_private *ext)
+static NTSTATUS build_joystick_report_descriptor(struct sdl_device *impl)
{
static const USAGE joystick_usages[] =
{
@@ -251,72 +251,72 @@ static NTSTATUS build_joystick_report_descriptor(struct platform_private *ext)
int i, report_size = 1;
int button_count, axis_count, ball_count, hat_count;
- axis_count = pSDL_JoystickNumAxes(ext->sdl_joystick);
+ axis_count = pSDL_JoystickNumAxes(impl->sdl_joystick);
if (axis_count > 6)
{
FIXME("Clamping joystick to 6 axis\n");
axis_count = 6;
}
- ext->axis_start = report_size;
+ impl->axis_start = report_size;
report_size += (sizeof(DWORD) * axis_count);
- ball_count = pSDL_JoystickNumBalls(ext->sdl_joystick);
+ ball_count = pSDL_JoystickNumBalls(impl->sdl_joystick);
if (axis_count + ball_count * 2 > ARRAY_SIZE(joystick_usages))
{
FIXME("Capping ball + axis at 9\n");
ball_count = (ARRAY_SIZE(joystick_usages) - axis_count) / 2;
}
- ext->ball_start = report_size;
+ impl->ball_start = report_size;
report_size += (sizeof(DWORD) * 2 * ball_count);
- hat_count = pSDL_JoystickNumHats(ext->sdl_joystick);
- ext->hat_start = report_size;
+ hat_count = pSDL_JoystickNumHats(impl->sdl_joystick);
+ impl->hat_start = report_size;
report_size += hat_count;
/* For now lump all buttons just into incremental usages, Ignore Keys */
- button_count = pSDL_JoystickNumButtons(ext->sdl_joystick);
- ext->button_start = report_size;
+ button_count = pSDL_JoystickNumButtons(impl->sdl_joystick);
+ impl->button_start = report_size;
report_size += (button_count + 7) / 8;
TRACE("Report will be %i bytes\n", report_size);
- if (!hid_descriptor_begin(&ext->desc, HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_JOYSTICK))
+ if (!hid_descriptor_begin(&impl->desc, HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_JOYSTICK))
return STATUS_NO_MEMORY;
- if (axis_count && !hid_descriptor_add_axes(&ext->desc, axis_count, HID_USAGE_PAGE_GENERIC,
+ if (axis_count && !hid_descriptor_add_axes(&impl->desc, axis_count, HID_USAGE_PAGE_GENERIC,
joystick_usages, FALSE, -32768, 32767))
return STATUS_NO_MEMORY;
- if (ball_count && !hid_descriptor_add_axes(&ext->desc, ball_count * 2, HID_USAGE_PAGE_GENERIC,
+ if (ball_count && !hid_descriptor_add_axes(&impl->desc, ball_count * 2, HID_USAGE_PAGE_GENERIC,
&joystick_usages[axis_count], TRUE, INT32_MIN, INT32_MAX))
return STATUS_NO_MEMORY;
- if (hat_count && !hid_descriptor_add_hatswitch(&ext->desc, hat_count))
+ if (hat_count && !hid_descriptor_add_hatswitch(&impl->desc, hat_count))
return STATUS_NO_MEMORY;
- if (button_count && !hid_descriptor_add_buttons(&ext->desc, HID_USAGE_PAGE_BUTTON, 1, button_count))
+ if (button_count && !hid_descriptor_add_buttons(&impl->desc, HID_USAGE_PAGE_BUTTON, 1, button_count))
return STATUS_NO_MEMORY;
- if (!descriptor_add_haptic(ext))
+ if (!descriptor_add_haptic(impl))
return STATUS_NO_MEMORY;
- if (!hid_descriptor_end(&ext->desc))
+ if (!hid_descriptor_end(&impl->desc))
return STATUS_NO_MEMORY;
- ext->buffer_length = report_size;
- if (!(ext->report_buffer = calloc(1, report_size))) goto failed;
+ impl->buffer_length = report_size;
+ if (!(impl->report_buffer = calloc(1, report_size))) goto failed;
/* Initialize axis in the report */
for (i = 0; i < axis_count; i++)
- set_axis_value(ext, i, pSDL_JoystickGetAxis(ext->sdl_joystick, i));
+ set_axis_value(impl, i, pSDL_JoystickGetAxis(impl->sdl_joystick, i));
for (i = 0; i < hat_count; i++)
- set_hat_value(ext, i, pSDL_JoystickGetHat(ext->sdl_joystick, i));
+ set_hat_value(impl, i, pSDL_JoystickGetHat(impl->sdl_joystick, i));
return STATUS_SUCCESS;
failed:
- free(ext->report_buffer);
- hid_descriptor_free(&ext->desc);
+ free(impl->report_buffer);
+ hid_descriptor_free(&impl->desc);
return STATUS_NO_MEMORY;
}
@@ -347,7 +347,7 @@ static SHORT compose_dpad_value(SDL_GameController *joystick)
return SDL_HAT_CENTERED;
}
-static NTSTATUS build_controller_report_descriptor(struct platform_private *ext)
+static NTSTATUS build_controller_report_descriptor(struct sdl_device *impl)
{
static const USAGE left_axis_usages[] = {HID_USAGE_GENERIC_X, HID_USAGE_GENERIC_Y};
static const USAGE right_axis_usages[] = {HID_USAGE_GENERIC_RX, HID_USAGE_GENERIC_RY};
@@ -355,52 +355,52 @@ static NTSTATUS build_controller_report_descriptor(struct platform_private *ext)
ULONG i, button_count = SDL_CONTROLLER_BUTTON_MAX - 1;
C_ASSERT(SDL_CONTROLLER_AXIS_MAX == 6);
- ext->axis_start = 0;
- ext->hat_start = SDL_CONTROLLER_AXIS_MAX * sizeof(DWORD);
- ext->button_start = ext->hat_start + 1;
- ext->buffer_length = ext->button_start + (button_count + 7) / 8;
+ impl->axis_start = 0;
+ impl->hat_start = SDL_CONTROLLER_AXIS_MAX * sizeof(DWORD);
+ impl->button_start = impl->hat_start + 1;
+ impl->buffer_length = impl->button_start + (button_count + 7) / 8;
- TRACE("Report will be %i bytes\n", ext->buffer_length);
+ TRACE("Report will be %i bytes\n", impl->buffer_length);
- if (!hid_descriptor_begin(&ext->desc, HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_GAMEPAD))
+ if (!hid_descriptor_begin(&impl->desc, HID_USAGE_PAGE_GENERIC, HID_USAGE_GENERIC_GAMEPAD))
return STATUS_NO_MEMORY;
- if (!hid_descriptor_add_axes(&ext->desc, 2, HID_USAGE_PAGE_GENERIC, left_axis_usages,
+ if (!hid_descriptor_add_axes(&impl->desc, 2, HID_USAGE_PAGE_GENERIC, left_axis_usages,
FALSE, -32768, 32767))
return STATUS_NO_MEMORY;
- if (!hid_descriptor_add_axes(&ext->desc, 2, HID_USAGE_PAGE_GENERIC, right_axis_usages,
+ if (!hid_descriptor_add_axes(&impl->desc, 2, HID_USAGE_PAGE_GENERIC, right_axis_usages,
FALSE, -32768, 32767))
return STATUS_NO_MEMORY;
- if (!hid_descriptor_add_axes(&ext->desc, 2, HID_USAGE_PAGE_GENERIC, trigger_axis_usages,
+ if (!hid_descriptor_add_axes(&impl->desc, 2, HID_USAGE_PAGE_GENERIC, trigger_axis_usages,
FALSE, 0, 32767))
return STATUS_NO_MEMORY;
- if (!hid_descriptor_add_hatswitch(&ext->desc, 1))
+ if (!hid_descriptor_add_hatswitch(&impl->desc, 1))
return STATUS_NO_MEMORY;
- if (!hid_descriptor_add_buttons(&ext->desc, HID_USAGE_PAGE_BUTTON, 1, button_count))
+ if (!hid_descriptor_add_buttons(&impl->desc, HID_USAGE_PAGE_BUTTON, 1, button_count))
return STATUS_NO_MEMORY;
- if (!descriptor_add_haptic(ext))
+ if (!descriptor_add_haptic(impl))
return STATUS_NO_MEMORY;
- if (!hid_descriptor_end(&ext->desc))
+ if (!hid_descriptor_end(&impl->desc))
return STATUS_NO_MEMORY;
- if (!(ext->report_buffer = calloc(1, ext->buffer_length))) goto failed;
+ if (!(impl->report_buffer = calloc(1, impl->buffer_length))) goto failed;
/* Initialize axis in the report */
for (i = SDL_CONTROLLER_AXIS_LEFTX; i < SDL_CONTROLLER_AXIS_MAX; i++)
- set_axis_value(ext, i, pSDL_GameControllerGetAxis(ext->sdl_controller, i));
- set_hat_value(ext, 0, compose_dpad_value(ext->sdl_controller));
+ set_axis_value(impl, i, pSDL_GameControllerGetAxis(impl->sdl_controller, i));
+ set_hat_value(impl, 0, compose_dpad_value(impl->sdl_controller));
return STATUS_SUCCESS;
failed:
- free(ext->report_buffer);
- hid_descriptor_free(&ext->desc);
+ free(impl->report_buffer);
+ hid_descriptor_free(&impl->desc);
return STATUS_NO_MEMORY;
}
@@ -410,51 +410,51 @@ static void sdl_device_destroy(struct unix_device *iface)
static NTSTATUS sdl_device_start(struct unix_device *iface)
{
- struct platform_private *ext = impl_from_unix_device(iface);
- if (ext->sdl_controller) return build_controller_report_descriptor(ext);
- return build_joystick_report_descriptor(ext);
+ struct sdl_device *impl = impl_from_unix_device(iface);
+ if (impl->sdl_controller) return build_controller_report_descriptor(impl);
+ return build_joystick_report_descriptor(impl);
}
static void sdl_device_stop(struct unix_device *iface)
{
- struct platform_private *private = impl_from_unix_device(iface);
+ struct sdl_device *impl = impl_from_unix_device(iface);
- pSDL_JoystickClose(private->sdl_joystick);
- if (private->sdl_controller) pSDL_GameControllerClose(private->sdl_controller);
- if (private->sdl_haptic) pSDL_HapticClose(private->sdl_haptic);
+ pSDL_JoystickClose(impl->sdl_joystick);
+ if (impl->sdl_controller) pSDL_GameControllerClose(impl->sdl_controller);
+ if (impl->sdl_haptic) pSDL_HapticClose(impl->sdl_haptic);
pthread_mutex_lock(&sdl_cs);
- list_remove(&private->unix_device.entry);
+ list_remove(&impl->unix_device.entry);
pthread_mutex_unlock(&sdl_cs);
}
static NTSTATUS sdl_device_get_reportdescriptor(struct unix_device *iface, BYTE *buffer,
DWORD length, DWORD *out_length)
{
- struct platform_private *ext = impl_from_unix_device(iface);
+ struct sdl_device *impl = impl_from_unix_device(iface);
- *out_length = ext->desc.size;
- if (length < ext->desc.size) return STATUS_BUFFER_TOO_SMALL;
+ *out_length = impl->desc.size;
+ if (length < impl->desc.size) return STATUS_BUFFER_TOO_SMALL;
- memcpy(buffer, ext->desc.data, ext->desc.size);
+ memcpy(buffer, impl->desc.data, impl->desc.size);
return STATUS_SUCCESS;
}
static void sdl_device_set_output_report(struct unix_device *iface, HID_XFER_PACKET *packet, IO_STATUS_BLOCK *io)
{
- struct platform_private *ext = impl_from_unix_device(iface);
+ struct sdl_device *impl = impl_from_unix_device(iface);
- if (ext->sdl_haptic && packet->reportId == 0)
+ if (impl->sdl_haptic && packet->reportId == 0)
{
WORD left = packet->reportBuffer[2] * 128;
WORD right = packet->reportBuffer[3] * 128;
- if (ext->haptic_effect_id >= 0)
+ if (impl->haptic_effect_id >= 0)
{
- pSDL_HapticDestroyEffect(ext->sdl_haptic, ext->haptic_effect_id);
- ext->haptic_effect_id = -1;
+ pSDL_HapticDestroyEffect(impl->sdl_haptic, impl->haptic_effect_id);
+ impl->haptic_effect_id = -1;
}
- pSDL_HapticStopAll(ext->sdl_haptic);
+ pSDL_HapticStopAll(impl->sdl_haptic);
if (left != 0 || right != 0)
{
SDL_HapticEffect effect;
@@ -465,15 +465,15 @@ static void sdl_device_set_output_report(struct unix_device *iface, HID_XFER_PAC
effect.leftright.large_magnitude = left;
effect.leftright.small_magnitude = right;
- ext->haptic_effect_id = pSDL_HapticNewEffect(ext->sdl_haptic, &effect);
- if (ext->haptic_effect_id >= 0)
+ impl->haptic_effect_id = pSDL_HapticNewEffect(impl->sdl_haptic, &effect);
+ if (impl->haptic_effect_id >= 0)
{
- pSDL_HapticRunEffect(ext->sdl_haptic, ext->haptic_effect_id, 1);
+ pSDL_HapticRunEffect(impl->sdl_haptic, impl->haptic_effect_id, 1);
}
else
{
float i = (float)((left + right)/2.0) / 32767.0;
- pSDL_HapticRumblePlay(ext->sdl_haptic, i, -1);
+ pSDL_HapticRumblePlay(impl->sdl_haptic, i, -1);
}
}
@@ -510,11 +510,11 @@ static const struct unix_device_vtbl sdl_device_vtbl =
sdl_device_set_feature_report,
};
-static BOOL set_report_from_joystick_event(struct platform_private *device, SDL_Event *event)
+static BOOL set_report_from_joystick_event(struct sdl_device *impl, SDL_Event *event)
{
- struct unix_device *iface = &device->unix_device;
+ struct unix_device *iface = &impl->unix_device;
- if (device->sdl_controller) return TRUE; /* use controller events instead */
+ if (impl->sdl_controller) return TRUE; /* use controller events instead */
switch(event->type)
{
@@ -523,9 +523,9 @@ static BOOL set_report_from_joystick_event(struct platform_private *device, SDL_
{
SDL_JoyButtonEvent *ie = &event->jbutton;
- set_button_value(device, ie->button, ie->state);
+ set_button_value(impl, ie->button, ie->state);
- bus_event_queue_input_report(&event_queue, iface, device->report_buffer, device->buffer_length);
+ bus_event_queue_input_report(&event_queue, iface, impl->report_buffer, impl->buffer_length);
break;
}
case SDL_JOYAXISMOTION:
@@ -534,8 +534,8 @@ static BOOL set_report_from_joystick_event(struct platform_private *device, SDL_
if (ie->axis < 6)
{
- set_axis_value(device, ie->axis, ie->value);
- bus_event_queue_input_report(&event_queue, iface, device->report_buffer, device->buffer_length);
+ set_axis_value(impl, ie->axis, ie->value);
+ bus_event_queue_input_report(&event_queue, iface, impl->report_buffer, impl->buffer_length);
}
break;
}
@@ -543,16 +543,16 @@ static BOOL set_report_from_joystick_event(struct platform_private *device, SDL_
{
SDL_JoyBallEvent *ie = &event->jball;
- set_ball_value(device, ie->ball, ie->xrel, ie->yrel);
- bus_event_queue_input_report(&event_queue, iface, device->report_buffer, device->buffer_length);
+ set_ball_value(impl, ie->ball, ie->xrel, ie->yrel);
+ bus_event_queue_input_report(&event_queue, iface, impl->report_buffer, impl->buffer_length);
break;
}
case SDL_JOYHATMOTION:
{
SDL_JoyHatEvent *ie = &event->jhat;
- set_hat_value(device, ie->hat, ie->value);
- bus_event_queue_input_report(&event_queue, iface, device->report_buffer, device->buffer_length);
+ set_hat_value(impl, ie->hat, ie->value);
+ bus_event_queue_input_report(&event_queue, iface, impl->report_buffer, impl->buffer_length);
break;
}
default:
@@ -561,9 +561,9 @@ static BOOL set_report_from_joystick_event(struct platform_private *device, SDL_
return FALSE;
}
-static BOOL set_report_from_controller_event(struct platform_private *device, SDL_Event *event)
+static BOOL set_report_from_controller_event(struct sdl_device *impl, SDL_Event *event)
{
- struct unix_device *iface = &device->unix_device;
+ struct unix_device *iface = &impl->unix_device;
switch(event->type)
{
@@ -579,7 +579,7 @@ static BOOL set_report_from_controller_event(struct platform_private *device, SD
case SDL_CONTROLLER_BUTTON_DPAD_DOWN:
case SDL_CONTROLLER_BUTTON_DPAD_LEFT:
case SDL_CONTROLLER_BUTTON_DPAD_RIGHT:
- set_hat_value(device, 0, compose_dpad_value(device->sdl_controller));
+ set_hat_value(impl, 0, compose_dpad_value(impl->sdl_controller));
break;
case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: button = 4; break;
case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: button = 5; break;
@@ -590,16 +590,16 @@ static BOOL set_report_from_controller_event(struct platform_private *device, SD
case SDL_CONTROLLER_BUTTON_GUIDE: button = 10; break;
}
- set_button_value(device, button, ie->state);
- bus_event_queue_input_report(&event_queue, iface, device->report_buffer, device->buffer_length);
+ set_button_value(impl, button, ie->state);
+ bus_event_queue_input_report(&event_queue, iface, impl->report_buffer, impl->buffer_length);
break;
}
case SDL_CONTROLLERAXISMOTION:
{
SDL_ControllerAxisEvent *ie = &event->caxis;
- set_axis_value(device, ie->axis, ie->value);
- bus_event_queue_input_report(&event_queue, iface, device->report_buffer, device->buffer_length);
+ set_axis_value(impl, ie->axis, ie->value);
+ bus_event_queue_input_report(&event_queue, iface, impl->report_buffer, impl->buffer_length);
break;
}
default:
@@ -616,7 +616,7 @@ static void sdl_add_device(unsigned int index)
.manufacturer = {"SDL"},
.serialnumber = {"0000"},
};
- struct platform_private *private;
+ struct sdl_device *impl;
SDL_Joystick* joystick;
SDL_JoystickID id;
@@ -664,18 +664,18 @@ static void sdl_add_device(unsigned int index)
TRACE("%s id %d, desc %s.\n", controller ? "controller" : "joystick", id, debugstr_device_desc(&desc));
- if (!(private = unix_device_create(&sdl_device_vtbl, sizeof(struct platform_private)))) return;
- list_add_tail(&device_list, &private->unix_device.entry);
- private->sdl_joystick = joystick;
- private->sdl_controller = controller;
- private->id = id;
+ if (!(impl = unix_device_create(&sdl_device_vtbl, sizeof(struct sdl_device)))) return;
+ list_add_tail(&device_list, &impl->unix_device.entry);
+ impl->sdl_joystick = joystick;
+ impl->sdl_controller = controller;
+ impl->id = id;
- bus_event_queue_device_created(&event_queue, &private->unix_device, &desc);
+ bus_event_queue_device_created(&event_queue, &impl->unix_device, &desc);
}
static void process_device_event(SDL_Event *event)
{
- struct platform_private *device;
+ struct sdl_device *impl;
SDL_JoystickID id;
TRACE_(hid_report)("Received action %x\n", event->type);
@@ -687,22 +687,22 @@ static void process_device_event(SDL_Event *event)
else if (event->type == SDL_JOYDEVICEREMOVED)
{
id = ((SDL_JoyDeviceEvent *)event)->which;
- device = find_device_from_id(id);
- if (device) bus_event_queue_device_removed(&event_queue, &device->unix_device);
+ impl = find_device_from_id(id);
+ if (impl) bus_event_queue_device_removed(&event_queue, &impl->unix_device);
else WARN("failed to find device with id %d\n", id);
}
else if (event->type >= SDL_JOYAXISMOTION && event->type <= SDL_JOYBUTTONUP)
{
id = ((SDL_JoyButtonEvent *)event)->which;
- device = find_device_from_id(id);
- if (device) set_report_from_joystick_event(device, event);
+ impl = find_device_from_id(id);
+ if (impl) set_report_from_joystick_event(impl, event);
else WARN("failed to find device with id %d\n", id);
}
else if (event->type >= SDL_CONTROLLERAXISMOTION && event->type <= SDL_CONTROLLERBUTTONUP)
{
id = ((SDL_ControllerButtonEvent *)event)->which;
- device = find_device_from_id(id);
- if (device) set_report_from_controller_event(device, event);
+ impl = find_device_from_id(id);
+ if (impl) set_report_from_controller_event(impl, event);
else WARN("failed to find device with id %d\n", id);
}
--
2.33.0
2
10
[PATCH 1/7] hidparse.sys: Recompute HIDP_CAPS from the value caps in HidP_GetCaps.
by Rémi Bernon Sept. 22, 2021
by Rémi Bernon Sept. 22, 2021
Sept. 22, 2021
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/hid/hidp.c | 60 ++++++++++++++++++---
dlls/hidparse.sys/main.c | 111 +++++++++++++++------------------------
include/wine/hid.h | 25 ++++++---
3 files changed, 115 insertions(+), 81 deletions(-)
diff --git a/dlls/hid/hidp.c b/dlls/hid/hidp.c
index a1cdb951fd4..acb02246523 100644
--- a/dlls/hid/hidp.c
+++ b/dlls/hid/hidp.c
@@ -44,25 +44,27 @@ static NTSTATUS get_value_caps_range( struct hid_preparsed_data *preparsed, HIDP
switch (report_type)
{
case HidP_Input:
- if (report_len && report_len != preparsed->caps.InputReportByteLength)
+ if (report_len && report_len != preparsed->input_report_byte_length)
return HIDP_STATUS_INVALID_REPORT_LENGTH;
*caps = HID_INPUT_VALUE_CAPS( preparsed );
+ *caps_end = *caps + preparsed->input_caps_count;
break;
case HidP_Output:
- if (report_len && report_len != preparsed->caps.OutputReportByteLength)
+ if (report_len && report_len != preparsed->output_report_byte_length)
return HIDP_STATUS_INVALID_REPORT_LENGTH;
*caps = HID_OUTPUT_VALUE_CAPS( preparsed );
+ *caps_end = *caps + preparsed->output_caps_count;
break;
case HidP_Feature:
- if (report_len && report_len != preparsed->caps.FeatureReportByteLength)
+ if (report_len && report_len != preparsed->feature_report_byte_length)
return HIDP_STATUS_INVALID_REPORT_LENGTH;
*caps = HID_FEATURE_VALUE_CAPS( preparsed );
+ *caps_end = *caps + preparsed->feature_caps_count;
break;
default:
return HIDP_STATUS_INVALID_REPORT_TYPE;
}
- *caps_end = *caps + preparsed->value_caps_count[report_type];
return HIDP_STATUS_SUCCESS;
}
@@ -165,12 +167,58 @@ NTSTATUS WINAPI HidP_GetButtonCaps( HIDP_REPORT_TYPE report_type, HIDP_BUTTON_CA
NTSTATUS WINAPI HidP_GetCaps( PHIDP_PREPARSED_DATA preparsed_data, HIDP_CAPS *caps )
{
struct hid_preparsed_data *preparsed = (struct hid_preparsed_data *)preparsed_data;
+ struct hid_value_caps *it, *end;
TRACE( "preparsed_data %p, caps %p.\n", preparsed_data, caps );
if (!preparsed || preparsed->magic != HID_MAGIC) return HIDP_STATUS_INVALID_PREPARSED_DATA;
- *caps = preparsed->caps;
+ caps->Usage = preparsed->usage;
+ caps->UsagePage = preparsed->usage_page;
+ caps->InputReportByteLength = preparsed->input_report_byte_length;
+ caps->OutputReportByteLength = preparsed->output_report_byte_length;
+ caps->FeatureReportByteLength = preparsed->feature_report_byte_length;
+ caps->NumberLinkCollectionNodes = preparsed->number_link_collection_nodes;
+ caps->NumberInputButtonCaps = 0;
+ caps->NumberInputValueCaps = 0;
+ caps->NumberInputDataIndices = 0;
+ caps->NumberOutputButtonCaps = 0;
+ caps->NumberOutputValueCaps = 0;
+ caps->NumberOutputDataIndices = 0;
+ caps->NumberFeatureButtonCaps = 0;
+ caps->NumberFeatureValueCaps = 0;
+ caps->NumberFeatureDataIndices = 0;
+
+ for (it = HID_INPUT_VALUE_CAPS( preparsed ), end = it + preparsed->input_caps_count;
+ it != end; ++it)
+ {
+ if (!it->usage_min && !it->usage_max) continue;
+ if (it->flags & HID_VALUE_CAPS_IS_BUTTON) caps->NumberInputButtonCaps++;
+ else caps->NumberInputValueCaps++;
+ if (!(it->flags & HID_VALUE_CAPS_IS_RANGE)) caps->NumberInputDataIndices++;
+ else caps->NumberInputDataIndices += it->data_index_max - it->data_index_min + 1;
+ }
+
+ for (it = HID_OUTPUT_VALUE_CAPS( preparsed ), end = it + preparsed->output_caps_count;
+ it != end; ++it)
+ {
+ if (!it->usage_min && !it->usage_max) continue;
+ if (it->flags & HID_VALUE_CAPS_IS_BUTTON) caps->NumberOutputButtonCaps++;
+ else caps->NumberOutputValueCaps++;
+ if (!(it->flags & HID_VALUE_CAPS_IS_RANGE)) caps->NumberOutputDataIndices++;
+ else caps->NumberOutputDataIndices += it->data_index_max - it->data_index_min + 1;
+ }
+
+ for (it = HID_FEATURE_VALUE_CAPS( preparsed ), end = it + preparsed->feature_caps_count;
+ it != end; ++it)
+ {
+ if (!it->usage_min && !it->usage_max) continue;
+ if (it->flags & HID_VALUE_CAPS_IS_BUTTON) caps->NumberFeatureButtonCaps++;
+ else caps->NumberFeatureValueCaps++;
+ if (!(it->flags & HID_VALUE_CAPS_IS_RANGE)) caps->NumberFeatureDataIndices++;
+ else caps->NumberFeatureDataIndices += it->data_index_max - it->data_index_min + 1;
+ }
+
return HIDP_STATUS_SUCCESS;
}
@@ -956,7 +1004,7 @@ NTSTATUS WINAPI HidP_GetLinkCollectionNodes( HIDP_LINK_COLLECTION_NODE *nodes, U
if (!preparsed || preparsed->magic != HID_MAGIC) return HIDP_STATUS_INVALID_PREPARSED_DATA;
- count = *nodes_len = preparsed->caps.NumberLinkCollectionNodes;
+ count = *nodes_len = preparsed->number_link_collection_nodes;
if (capacity < count) return HIDP_STATUS_BUFFER_TOO_SMALL;
for (i = 0; i < count; ++i)
diff --git a/dlls/hidparse.sys/main.c b/dlls/hidparse.sys/main.c
index 3170abc50b5..d1191a20789 100644
--- a/dlls/hidparse.sys/main.c
+++ b/dlls/hidparse.sys/main.c
@@ -116,30 +116,20 @@ static void debug_print_preparsed( struct hid_preparsed_data *data )
if (TRACE_ON( hidp ))
{
- TRACE( "START PREPARSED Data <<< Usage: %i, UsagePage: %i, "
- "InputReportByteLength: %i, tOutputReportByteLength: %i, "
- "FeatureReportByteLength: %i, NumberLinkCollectionNodes: %i, "
- "NumberInputButtonCaps: %i, NumberInputValueCaps: %i, "
- "NumberInputDataIndices: %i, NumberOutputButtonCaps: %i, "
- "NumberOutputValueCaps: %i, NumberOutputDataIndices: %i, "
- "NumberFeatureButtonCaps: %i, NumberFeatureValueCaps: %i, "
- "NumberFeatureDataIndices: %i\n",
- data->caps.Usage, data->caps.UsagePage, data->caps.InputReportByteLength,
- data->caps.OutputReportByteLength, data->caps.FeatureReportByteLength,
- data->caps.NumberLinkCollectionNodes, data->caps.NumberInputButtonCaps,
- data->caps.NumberInputValueCaps, data->caps.NumberInputDataIndices,
- data->caps.NumberOutputButtonCaps, data->caps.NumberOutputValueCaps,
- data->caps.NumberOutputDataIndices, data->caps.NumberFeatureButtonCaps,
- data->caps.NumberFeatureValueCaps, data->caps.NumberFeatureDataIndices );
- end = data->value_caps_count[HidP_Input];
- for (i = 0; i < end; i++) TRACE( "INPUT: %s\n", debugstr_hid_value_caps( HID_INPUT_VALUE_CAPS( data ) + i ) );
- end = data->value_caps_count[HidP_Output];
- for (i = 0; i < end; i++) TRACE( "OUTPUT: %s\n", debugstr_hid_value_caps( HID_OUTPUT_VALUE_CAPS( data ) + i ) );
- end = data->value_caps_count[HidP_Feature];
- for (i = 0; i < end; i++) TRACE( "FEATURE: %s\n", debugstr_hid_value_caps( HID_FEATURE_VALUE_CAPS( data ) + i ) );
- end = data->caps.NumberLinkCollectionNodes;
- for (i = 0; i < end; i++) TRACE( "COLLECTION: %s\n", debugstr_hid_value_caps( HID_COLLECTION_VALUE_CAPS( data ) + i ) );
- TRACE(">>> END Preparsed Data\n");
+ TRACE( "usage %02x:%02x input %u-(%u)-%u, report len %u output %u-(%u)-%u, report len %u "
+ "feature %u-(%u)-%u, report len %u collections %u\n", data->usage_page, data->usage,
+ data->input_caps_start, data->input_caps_count, data->input_caps_end, data->input_report_byte_length,
+ data->output_caps_start, data->output_caps_count, data->output_caps_end, data->output_report_byte_length,
+ data->feature_caps_start, data->feature_caps_count, data->feature_caps_end, data->feature_report_byte_length,
+ data->number_link_collection_nodes );
+ end = data->input_caps_count;
+ for (i = 0; i < end; i++) TRACE( "input %d: %s\n", i, debugstr_hid_value_caps( HID_INPUT_VALUE_CAPS( data ) + i ) );
+ end = data->output_caps_count;
+ for (i = 0; i < end; i++) TRACE( "output %d: %s\n", i, debugstr_hid_value_caps( HID_OUTPUT_VALUE_CAPS( data ) + i ) );
+ end = data->feature_caps_count;
+ for (i = 0; i < end; i++) TRACE( "feature %d: %s\n", i, debugstr_hid_value_caps( HID_FEATURE_VALUE_CAPS( data ) + i ) );
+ end = data->number_link_collection_nodes;
+ for (i = 0; i < end; i++) TRACE( "collection %d: %s\n", i, debugstr_hid_value_caps( HID_COLLECTION_VALUE_CAPS( data ) + i ) );
}
}
@@ -416,7 +406,7 @@ static struct hid_preparsed_data *build_preparsed_data( struct hid_parser_state
{
struct hid_preparsed_data *data;
struct hid_value_caps *caps;
- DWORD i, button, filler, caps_len, size;
+ DWORD caps_len, size;
caps_len = state->caps.NumberInputValueCaps + state->caps.NumberOutputValueCaps +
state->caps.NumberFeatureValueCaps + state->caps.NumberLinkCollectionNodes;
@@ -426,47 +416,30 @@ static struct hid_preparsed_data *build_preparsed_data( struct hid_parser_state
memset( data, 0, size );
data->magic = HID_MAGIC;
data->size = size;
- data->caps = state->caps;
- data->value_caps_count[HidP_Input] = state->caps.NumberInputValueCaps;
- data->value_caps_count[HidP_Output] = state->caps.NumberOutputValueCaps;
- data->value_caps_count[HidP_Feature] = state->caps.NumberFeatureValueCaps;
-
- /* fixup value vs button vs filler counts */
+ data->usage = state->caps.Usage;
+ data->usage_page = state->caps.UsagePage;
+ data->input_caps_start = 0;
+ data->input_caps_count = state->caps.NumberInputValueCaps;
+ data->input_caps_end = data->input_caps_start + data->input_caps_count;
+ data->input_report_byte_length = state->caps.InputReportByteLength;
+ data->output_caps_start = data->input_caps_end;
+ data->output_caps_count = state->caps.NumberOutputValueCaps;
+ data->output_caps_end = data->output_caps_start + data->output_caps_count;
+ data->output_report_byte_length = state->caps.OutputReportByteLength;
+ data->feature_caps_start = data->output_caps_end;
+ data->feature_caps_count = state->caps.NumberFeatureValueCaps;
+ data->feature_caps_end = data->feature_caps_start + data->feature_caps_count;
+ data->feature_report_byte_length = state->caps.FeatureReportByteLength;
+ data->number_link_collection_nodes = state->caps.NumberLinkCollectionNodes;
caps = HID_INPUT_VALUE_CAPS( data );
- memcpy( caps, state->values[0], data->caps.NumberInputValueCaps * sizeof(*caps) );
- for (i = 0, button = 0, filler = 0; i < data->caps.NumberInputValueCaps; ++i)
- {
- if (!caps[i].usage_min && !caps[i].usage_max) filler++;
- else if (caps[i].flags & HID_VALUE_CAPS_IS_BUTTON) button++;
- }
- data->caps.NumberInputButtonCaps = button;
- data->caps.NumberInputValueCaps -= filler + button;
-
+ memcpy( caps, state->values[0], data->input_caps_count * sizeof(*caps) );
caps = HID_OUTPUT_VALUE_CAPS( data );
- memcpy( caps, state->values[1], data->caps.NumberOutputValueCaps * sizeof(*caps) );
- for (i = 0, button = 0, filler = 0; i < data->caps.NumberOutputValueCaps; ++i)
- {
- if (!caps[i].usage_min && !caps[i].usage_max) filler++;
- else if (caps[i].flags & HID_VALUE_CAPS_IS_BUTTON) button++;
- }
- caps += data->caps.NumberOutputValueCaps;
- data->caps.NumberOutputButtonCaps = button;
- data->caps.NumberOutputValueCaps -= filler + button;
-
+ memcpy( caps, state->values[1], data->output_caps_count * sizeof(*caps) );
caps = HID_FEATURE_VALUE_CAPS( data );
- memcpy( caps, state->values[2], data->caps.NumberFeatureValueCaps * sizeof(*caps) );
- for (i = 0, button = 0, filler = 0; i < data->caps.NumberFeatureValueCaps; ++i)
- {
- if (!caps[i].usage_min && !caps[i].usage_max) filler++;
- else if (caps[i].flags & HID_VALUE_CAPS_IS_BUTTON) button++;
- }
- caps += data->caps.NumberFeatureValueCaps;
- data->caps.NumberFeatureButtonCaps = button;
- data->caps.NumberFeatureValueCaps -= filler + button;
-
+ memcpy( caps, state->values[2], data->feature_caps_count * sizeof(*caps) );
caps = HID_COLLECTION_VALUE_CAPS( data );
- memcpy( caps, state->collections, data->caps.NumberLinkCollectionNodes * sizeof(*caps) );
+ memcpy( caps, state->collections, data->number_link_collection_nodes * sizeof(*caps) );
return data;
}
@@ -645,17 +618,17 @@ NTSTATUS WINAPI HidP_GetCollectionDescription( PHIDP_REPORT_DESCRIPTOR report_de
}
device_desc->CollectionDescLength = 1;
- device_desc->CollectionDesc[0].UsagePage = preparsed->caps.UsagePage;
- device_desc->CollectionDesc[0].Usage = preparsed->caps.Usage;
+ device_desc->CollectionDesc[0].UsagePage = preparsed->usage_page;
+ device_desc->CollectionDesc[0].Usage = preparsed->usage;
device_desc->CollectionDesc[0].CollectionNumber = 1;
- device_desc->CollectionDesc[0].InputLength = preparsed->caps.InputReportByteLength;
- device_desc->CollectionDesc[0].OutputLength = preparsed->caps.OutputReportByteLength;
- device_desc->CollectionDesc[0].FeatureLength = preparsed->caps.FeatureReportByteLength;
+ device_desc->CollectionDesc[0].InputLength = preparsed->input_report_byte_length;
+ device_desc->CollectionDesc[0].OutputLength = preparsed->output_report_byte_length;
+ device_desc->CollectionDesc[0].FeatureLength = preparsed->feature_report_byte_length;
device_desc->CollectionDesc[0].PreparsedDataLength = preparsed->size;
device_desc->CollectionDesc[0].PreparsedData = (PHIDP_PREPARSED_DATA)preparsed;
caps = HID_INPUT_VALUE_CAPS( preparsed );
- caps_end = caps + preparsed->value_caps_count[HidP_Input];
+ caps_end = caps + preparsed->input_caps_count;
for (; caps != caps_end; ++caps)
{
len = caps->start_byte * 8 + caps->start_bit + caps->bit_size * caps->report_count;
@@ -664,7 +637,7 @@ NTSTATUS WINAPI HidP_GetCollectionDescription( PHIDP_REPORT_DESCRIPTOR report_de
}
caps = HID_OUTPUT_VALUE_CAPS( preparsed );
- caps_end = caps + preparsed->value_caps_count[HidP_Output];
+ caps_end = caps + preparsed->output_caps_count;
for (; caps != caps_end; ++caps)
{
len = caps->start_byte * 8 + caps->start_bit + caps->bit_size * caps->report_count;
@@ -673,7 +646,7 @@ NTSTATUS WINAPI HidP_GetCollectionDescription( PHIDP_REPORT_DESCRIPTOR report_de
}
caps = HID_FEATURE_VALUE_CAPS( preparsed );
- caps_end = caps + preparsed->value_caps_count[HidP_Feature];
+ caps_end = caps + preparsed->feature_caps_count;
for (; caps != caps_end; ++caps)
{
len = caps->start_byte * 8 + caps->start_bit + caps->bit_size * caps->report_count;
diff --git a/include/wine/hid.h b/include/wine/hid.h
index 43f881bcc52..10fccda07cc 100644
--- a/include/wine/hid.h
+++ b/include/wine/hid.h
@@ -76,14 +76,27 @@ struct hid_preparsed_data
{
DWORD magic;
DWORD size;
- HIDP_CAPS caps;
- USHORT value_caps_count[3];
+ USAGE usage;
+ USAGE usage_page;
+ USHORT input_caps_start;
+ USHORT input_caps_count;
+ USHORT input_caps_end;
+ USHORT input_report_byte_length;
+ USHORT output_caps_start;
+ USHORT output_caps_count;
+ USHORT output_caps_end;
+ USHORT output_report_byte_length;
+ USHORT feature_caps_start;
+ USHORT feature_caps_count;
+ USHORT feature_caps_end;
+ USHORT feature_report_byte_length;
+ USHORT number_link_collection_nodes;
struct hid_value_caps value_caps[1];
};
-#define HID_INPUT_VALUE_CAPS(d) ((d)->value_caps)
-#define HID_OUTPUT_VALUE_CAPS(d) (HID_INPUT_VALUE_CAPS(d) + (d)->value_caps_count[0])
-#define HID_FEATURE_VALUE_CAPS(d) (HID_OUTPUT_VALUE_CAPS(d) + (d)->value_caps_count[1])
-#define HID_COLLECTION_VALUE_CAPS(d) (HID_FEATURE_VALUE_CAPS(d) + (d)->value_caps_count[2])
+#define HID_INPUT_VALUE_CAPS(d) ((d)->value_caps + (d)->input_caps_start)
+#define HID_OUTPUT_VALUE_CAPS(d) ((d)->value_caps + (d)->output_caps_start)
+#define HID_FEATURE_VALUE_CAPS(d) ((d)->value_caps + (d)->feature_caps_start)
+#define HID_COLLECTION_VALUE_CAPS(d) ((d)->value_caps + (d)->feature_caps_end)
#endif /* __WINE_PARSE_H */
--
2.33.0
1
6