Huw Davies : winealsa: Pass a unicode chunk2 to construct_device_id().

Alexandre Julliard julliard at winehq.org
Tue Feb 15 16:07:20 CST 2022


Module: wine
Branch: master
Commit: dde06247a700947fdece115c831ffe1d51bb7d1a
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=dde06247a700947fdece115c831ffe1d51bb7d1a

Author: Huw Davies <huw at codeweavers.com>
Date:   Tue Feb 15 13:09:51 2022 +0000

winealsa: Pass a unicode chunk2 to construct_device_id().

This makes construct_device_id() rather more sane.

Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winealsa.drv/mmdevdrv.c | 29 ++++++++++++++++-------------
 1 file changed, 16 insertions(+), 13 deletions(-)

diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
index 534667040a2..a6ca3827e5f 100644
--- a/dlls/winealsa.drv/mmdevdrv.c
+++ b/dlls/winealsa.drv/mmdevdrv.c
@@ -372,11 +372,11 @@ static BOOL alsa_try_open(const char *devnode, EDataFlow flow)
     return TRUE;
 }
 
-static WCHAR *construct_device_id(EDataFlow flow, const WCHAR *chunk1, const char *chunk2)
+static WCHAR *construct_device_id(EDataFlow flow, const WCHAR *chunk1, const WCHAR *chunk2)
 {
     WCHAR *ret;
     const WCHAR *prefix;
-    DWORD len_wchars = 0, chunk1_len = 0, copied = 0, prefix_len;
+    size_t len_wchars = 0, chunk1_len = 0, chunk2_len = 0, copied = 0, prefix_len;
 
     static const WCHAR dashW[] = {' ','-',' ',0};
     static const size_t dashW_len = ARRAY_SIZE(dashW) - 1;
@@ -398,8 +398,10 @@ static WCHAR *construct_device_id(EDataFlow flow, const WCHAR *chunk1, const cha
     }
     if(chunk1 && chunk2)
         len_wchars += dashW_len;
-    if(chunk2)
-        len_wchars += MultiByteToWideChar(CP_UNIXCP, 0, chunk2, -1, NULL, 0) - 1;
+    if(chunk2){
+        chunk2_len = strlenW(chunk2);
+        len_wchars += chunk2_len;
+    }
     len_wchars += 1; /* NULL byte */
 
     ret = HeapAlloc(GetProcessHeap(), 0, len_wchars * sizeof(WCHAR));
@@ -415,9 +417,10 @@ static WCHAR *construct_device_id(EDataFlow flow, const WCHAR *chunk1, const cha
         copied += dashW_len;
     }
     if(chunk2){
-        MultiByteToWideChar(CP_UNIXCP, 0, chunk2, -1, ret + copied, len_wchars - copied);
-    }else
-        ret[copied] = 0;
+        memcpy(ret + copied, chunk2, chunk2_len * sizeof(WCHAR));
+        copied += chunk2_len;
+    }
+    ret[copied] = 0;
 
     TRACE("Enumerated device: %s\n", wine_dbgstr_w(ret));
 
@@ -425,7 +428,7 @@ static WCHAR *construct_device_id(EDataFlow flow, const WCHAR *chunk1, const cha
 }
 
 static HRESULT alsa_get_card_devices(EDataFlow flow, WCHAR ***ids, GUID **guids, UINT *num,
-                                     snd_ctl_t *ctl, int card, const WCHAR *cardnameW)
+                                     snd_ctl_t *ctl, int card, const WCHAR *cardname)
 {
     int err, device;
     snd_pcm_info_t *info;
@@ -440,8 +443,8 @@ static HRESULT alsa_get_card_devices(EDataFlow flow, WCHAR ***ids, GUID **guids,
     device = -1;
     for(err = snd_ctl_pcm_next_device(ctl, &device); device != -1 && err >= 0;
             err = snd_ctl_pcm_next_device(ctl, &device)){
-        const char *devname;
         char devnode[32];
+        WCHAR *devname;
 
         snd_pcm_info_set_device(info, device);
 
@@ -467,15 +470,15 @@ static HRESULT alsa_get_card_devices(EDataFlow flow, WCHAR ***ids, GUID **guids,
             *guids = HeapAlloc(GetProcessHeap(), 0, sizeof(GUID));
         }
 
-        devname = snd_pcm_info_get_name(info);
+        devname = strdupAtoW(snd_pcm_info_get_name(info));
         if(!devname){
-            WARN("Unable to get device name for card %d, device %d\n", card,
-                    device);
+            WARN("Unable to get device name for card %d, device %d\n", card, device);
             continue;
         }
 
-        (*ids)[*num] = construct_device_id(flow, cardnameW, devname);
+        (*ids)[*num] = construct_device_id(flow, cardname, devname);
         get_device_guid(flow, devnode, &(*guids)[*num]);
+        free(devname);
 
         ++(*num);
     }




More information about the wine-cvs mailing list