[PATCH 3/6] winealsa: Return offsets rather than ptrs to the strings.
Huw Davies
huw at codeweavers.com
Fri Apr 22 02:37:55 CDT 2022
This will make the Wow64 syscall rather simpler.
Signed-off-by: Huw Davies <huw at codeweavers.com>
---
dlls/winealsa.drv/alsa.c | 26 +++++++++++++++-----------
dlls/winealsa.drv/mmdevdrv.c | 9 ++++++---
dlls/winealsa.drv/unixlib.h | 4 ++--
3 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/dlls/winealsa.drv/alsa.c b/dlls/winealsa.drv/alsa.c
index 9cf99f5b459..0e86185e441 100644
--- a/dlls/winealsa.drv/alsa.c
+++ b/dlls/winealsa.drv/alsa.c
@@ -291,10 +291,16 @@ static WCHAR *construct_device_id(EDataFlow flow, const WCHAR *chunk1, const WCH
return ret;
}
+struct endpt
+{
+ WCHAR *name;
+ char *device;
+};
+
struct endpoints_info
{
unsigned int num, size;
- struct endpoint *endpoints;
+ struct endpt *endpoints;
};
static void endpoints_add(struct endpoints_info *endpoints, WCHAR *name, char *device)
@@ -467,10 +473,9 @@ static NTSTATUS get_endpoint_ids(void *args)
static const WCHAR defaultW[] = {'d','e','f','a','u','l','t',0};
struct get_endpoint_ids_params *params = args;
struct endpoints_info endpoints_info;
- unsigned int i, needed, name_len, device_len;
+ unsigned int i, needed, name_len, device_len, offset;
struct endpoint *endpoint;
int err, card;
- char *ptr;
card = -1;
@@ -505,9 +510,8 @@ static NTSTATUS get_endpoint_ids(void *args)
if(err != 0)
WARN("Got a failure during card enumeration: %d (%s)\n", err, snd_strerror(err));
- needed = endpoints_info.num * sizeof(*params->endpoints);
+ offset = needed = endpoints_info.num * sizeof(*params->endpoints);
endpoint = params->endpoints;
- ptr = (char *)(endpoint + endpoints_info.num);
for(i = 0; i < endpoints_info.num; i++){
name_len = wcslen(endpoints_info.endpoints[i].name) + 1;
@@ -515,12 +519,12 @@ static NTSTATUS get_endpoint_ids(void *args)
needed += name_len * sizeof(WCHAR) + ((device_len + 1) & ~1);
if(needed <= params->size){
- endpoint->name = (WCHAR *)ptr;
- memcpy(endpoint->name, endpoints_info.endpoints[i].name, name_len * sizeof(WCHAR));
- ptr += name_len * sizeof(WCHAR);
- endpoint->device = ptr;
- memcpy(endpoint->device, endpoints_info.endpoints[i].device, device_len);
- ptr += (device_len + 1) & ~1;
+ endpoint->name = offset;
+ memcpy((char *)params->endpoints + offset, endpoints_info.endpoints[i].name, name_len * sizeof(WCHAR));
+ offset += name_len * sizeof(WCHAR);
+ endpoint->device = offset;
+ memcpy((char *)params->endpoints + offset, endpoints_info.endpoints[i].device, device_len);
+ offset += (device_len + 1) & ~1;
endpoint++;
}
free(endpoints_info.endpoints[i].name);
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
index 24e778db931..1a99f0ac26c 100644
--- a/dlls/winealsa.drv/mmdevdrv.c
+++ b/dlls/winealsa.drv/mmdevdrv.c
@@ -366,14 +366,17 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids_out, GUID **gu
}
for(i = 0; i < params.num; i++){
- unsigned int size = (wcslen(params.endpoints[i].name) + 1) * sizeof(WCHAR);
+ WCHAR *name = (WCHAR *)((char *)params.endpoints + params.endpoints[i].name);
+ char *device = (char *)params.endpoints + params.endpoints[i].device;
+ unsigned int size = (wcslen(name) + 1) * sizeof(WCHAR);
+
ids[i] = HeapAlloc(GetProcessHeap(), 0, size);
if(!ids[i]){
params.result = E_OUTOFMEMORY;
goto end;
}
- memcpy(ids[i], params.endpoints[i].name, size);
- get_device_guid(flow, params.endpoints[i].device, guids + i);
+ memcpy(ids[i], name, size);
+ get_device_guid(flow, device, guids + i);
}
*def_index = params.default_idx;
diff --git a/dlls/winealsa.drv/unixlib.h b/dlls/winealsa.drv/unixlib.h
index ed769d81948..56507ef9f0a 100644
--- a/dlls/winealsa.drv/unixlib.h
+++ b/dlls/winealsa.drv/unixlib.h
@@ -22,8 +22,8 @@ typedef UINT64 stream_handle;
struct endpoint
{
- WCHAR *name;
- char *device;
+ unsigned int name;
+ unsigned int device;
};
struct get_endpoint_ids_params
--
2.25.1
More information about the wine-devel
mailing list