[PATCH v5 2/5] winepulse.drv: Cache the devices looked up in the registry.
Andrew Eikum
aeikum at codeweavers.com
Mon Feb 21 14:23:07 CST 2022
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
On Fri, Feb 18, 2022 at 08:38:00PM +0200, Gabriel Ivăncescu wrote:
> Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
> ---
>
> Will be useful for next patch since we'll have to look it up on each
> prop call.
>
> dlls/winepulse.drv/mmdevdrv.c | 34 +++++++++++++++++++++++++++++++++-
> 1 file changed, 33 insertions(+), 1 deletion(-)
>
> diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c
> index 8ef3575..0d9f56f 100644
> --- a/dlls/winepulse.drv/mmdevdrv.c
> +++ b/dlls/winepulse.drv/mmdevdrv.c
> @@ -63,6 +63,14 @@ static struct pulse_config pulse_config;
>
> static HANDLE pulse_thread;
> static struct list g_sessions = LIST_INIT(g_sessions);
> +static struct list g_devices_cache = LIST_INIT(g_devices_cache);
> +
> +struct device_cache {
> + struct list entry;
> + GUID guid;
> + EDataFlow dataflow;
> + char pulse_name[0];
> +};
>
> static GUID pulse_render_guid =
> { 0xfd47d9cc, 0x4218, 0x4135, { 0x9c, 0xe2, 0x0c, 0x19, 0x5c, 0x87, 0x40, 0x5b } };
> @@ -90,6 +98,10 @@ BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, void *reserved)
> if (__wine_unix_call(pulse_handle, process_attach, NULL))
> return FALSE;
> } else if (reason == DLL_PROCESS_DETACH) {
> + struct device_cache *device, *device_next;
> +
> + LIST_FOR_EACH_ENTRY_SAFE(device, device_next, &g_devices_cache, struct device_cache, entry)
> + free(device);
> __wine_unix_call(pulse_handle, process_detach, NULL);
> if (pulse_thread) {
> WaitForSingleObject(pulse_thread, INFINITE);
> @@ -387,6 +399,7 @@ int WINAPI AUDDRV_GetPriority(void)
>
> static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_NAME_LEN], EDataFlow *flow)
> {
> + struct device_cache *device;
> WCHAR key_name[MAX_PULSE_NAME_LEN + 2];
> DWORD key_name_size;
> DWORD index = 0;
> @@ -402,6 +415,15 @@ static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_N
> return TRUE;
> }
>
> + /* Check the cache first */
> + LIST_FOR_EACH_ENTRY(device, &g_devices_cache, struct device_cache, entry) {
> + if (!IsEqualGUID(guid, &device->guid))
> + continue;
> + *flow = device->dataflow;
> + strcpy(pulse_name, device->pulse_name);
> + return TRUE;
> + }
> +
> if (RegOpenKeyExW(HKEY_CURRENT_USER, drv_key_devicesW, 0, KEY_READ | KEY_WOW64_64KEY, &key) != ERROR_SUCCESS) {
> WARN("No devices found in registry\n");
> return FALSE;
> @@ -412,6 +434,7 @@ static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_N
> LSTATUS status;
> GUID reg_guid;
> HKEY dev_key;
> + int len;
>
> key_name_size = ARRAY_SIZE(key_name);
> if (RegEnumKeyExW(key, index++, key_name, &key_name_size, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
> @@ -440,7 +463,16 @@ static BOOL get_pulse_name_by_guid(const GUID *guid, char pulse_name[MAX_PULSE_N
> return FALSE;
> }
>
> - return WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, pulse_name, MAX_PULSE_NAME_LEN, NULL, NULL);
> + if (!(len = WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, pulse_name, MAX_PULSE_NAME_LEN, NULL, NULL)))
> + return FALSE;
> +
> + if ((device = malloc(FIELD_OFFSET(struct device_cache, pulse_name[len])))) {
> + device->guid = reg_guid;
> + device->dataflow = *flow;
> + strcpy(device->pulse_name, pulse_name);
> + list_add_tail(&g_devices_cache, &device->entry);
> + }
> + return TRUE;
> }
> }
>
> --
> 2.34.1
>
>
More information about the wine-devel
mailing list