Huw Davies : winealsa: Introduce a helper to retrieve the card name.

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


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

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

winealsa: Introduce a helper to retrieve the card name.

This is primarily to simplify the code.  It does however add name
collision detection if there are two unknown cards.

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 | 86 ++++++++++++++++++++++++--------------------
 1 file changed, 48 insertions(+), 38 deletions(-)

diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
index 6accd1bab4f..534667040a2 100644
--- a/dlls/winealsa.drv/mmdevdrv.c
+++ b/dlls/winealsa.drv/mmdevdrv.c
@@ -266,6 +266,19 @@ int WINAPI AUDDRV_GetPriority(void)
     return Priority_Neutral;
 }
 
+static WCHAR *strdupAtoW(const char *str)
+{
+    unsigned int len;
+    WCHAR *ret;
+
+    if(!str) return NULL;
+
+    len = MultiByteToWideChar(CP_UNIXCP, 0, str, -1, NULL, 0);
+    ret = malloc(len * sizeof(WCHAR));
+    if(ret) MultiByteToWideChar(CP_UNIXCP, 0, str, -1, ret, len);
+    return ret;
+}
+
 static void set_device_guid(EDataFlow flow, HKEY drv_key, const WCHAR *key_name,
         GUID *guid)
 {
@@ -553,6 +566,36 @@ static BOOL need_card_number(int card, const char *string)
     return FALSE;
 }
 
+static WCHAR *alsa_get_card_name(int card)
+{
+    char *cardname;
+    WCHAR *ret;
+    int err;
+
+    if((err = snd_card_get_name(card, &cardname)) < 0){
+        /* FIXME: Should be localized */
+        WARN("Unable to get card name for ALSA device %d: %d (%s)\n", card, err, snd_strerror(err));
+        cardname = strdup("Unknown soundcard");
+    }
+
+    if(need_card_number(card, cardname)){
+        char *cardnameN;
+        /*
+         * For identical card names, second and subsequent instances get
+         * card number prefix to distinguish them (like Windows).
+         */
+        if(asprintf(&cardnameN, "%u-%s", card, cardname) > 0){
+            free(cardname);
+            cardname = cardnameN;
+        }
+    }
+
+    ret = strdupAtoW(cardname);
+    free(cardname);
+
+    return ret;
+}
+
 static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR ***ids, GUID **guids,
         UINT *num)
 {
@@ -571,13 +614,10 @@ static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR ***ids, GUID **guids,
 
     get_reg_devices(flow, ids, guids, num);
 
-    for(err = snd_card_next(&card); card != -1 && err >= 0;
-            err = snd_card_next(&card)){
+    for(err = snd_card_next(&card); card != -1 && err >= 0; err = snd_card_next(&card)){
         char cardpath[64];
-        char *cardname;
-        WCHAR *cardnameW;
+        WCHAR *cardname;
         snd_ctl_t *ctl;
-        DWORD len;
 
         sprintf(cardpath, "hw:%u", card);
 
@@ -587,39 +627,9 @@ static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR ***ids, GUID **guids,
             continue;
         }
 
-        if(snd_card_get_name(card, &cardname) < 0) {
-            /* FIXME: Should be localized */
-            static const WCHAR nameW[] = {'U','n','k','n','o','w','n',' ','s','o','u','n','d','c','a','r','d',0};
-            WARN("Unable to get card name for ALSA device %s: %d (%s)\n",
-                    cardpath, err, snd_strerror(err));
-            alsa_get_card_devices(flow, ids, guids, num, ctl, card, nameW);
-        }else{
-            if(need_card_number(card, cardname)){
-                char *cardnameN;
-                /*
-                 * For identical card names, second and subsequent instances get
-                 * card number prefix to distinguish them (like Windows).
-                 */
-                if(asprintf(&cardnameN, "%u-%s", card, cardname) > 0){
-                    free(cardname);
-                    cardname = cardnameN;
-                }
-            }
-            len = MultiByteToWideChar(CP_UNIXCP, 0, cardname, -1, NULL, 0);
-            cardnameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
-
-            if(!cardnameW){
-                free(cardname);
-                snd_ctl_close(ctl);
-                return E_OUTOFMEMORY;
-            }
-            MultiByteToWideChar(CP_UNIXCP, 0, cardname, -1, cardnameW, len);
-
-            alsa_get_card_devices(flow, ids, guids, num, ctl, card, cardnameW);
-
-            HeapFree(GetProcessHeap(), 0, cardnameW);
-            free(cardname);
-        }
+        cardname = alsa_get_card_name(card);
+        alsa_get_card_devices(flow, ids, guids, num, ctl, card, cardname);
+        free(cardname);
 
         snd_ctl_close(ctl);
     }




More information about the wine-cvs mailing list