Andrew Eikum : winealsa.drv: Prefix device names with direction indication.

Alexandre Julliard julliard at winehq.org
Thu Apr 5 12:31:45 CDT 2012


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

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Wed Apr  4 13:15:33 2012 -0500

winealsa.drv: Prefix device names with direction indication.

---

 dlls/winealsa.drv/mmdevdrv.c |   79 ++++++++++++++++++++++++++++-------------
 1 files changed, 54 insertions(+), 25 deletions(-)

diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
index a3ac27b..c99186b 100644
--- a/dlls/winealsa.drv/mmdevdrv.c
+++ b/dlls/winealsa.drv/mmdevdrv.c
@@ -339,11 +339,60 @@ static BOOL alsa_try_open(const char *devnode, snd_pcm_stream_t stream)
     return TRUE;
 }
 
+static WCHAR *construct_device_id(EDataFlow flow, const WCHAR *chunk1, const char *chunk2)
+{
+    WCHAR *ret;
+    const WCHAR *prefix;
+    DWORD len_wchars = 0, chunk1_len, copied = 0, prefix_len;
+
+    static const WCHAR dashW[] = {' ','-',' ',0};
+    static const size_t dashW_len = (sizeof(dashW) / sizeof(*dashW)) - 1;
+    static const WCHAR outW[] = {'O','u','t',':',' ',0};
+    static const WCHAR inW[] = {'I','n',':',' ',0};
+
+    if(flow == eRender){
+        prefix = outW;
+        prefix_len = (sizeof(outW) / sizeof(*outW)) - 1;
+        len_wchars += prefix_len;
+    }else{
+        prefix = inW;
+        prefix_len = (sizeof(inW) / sizeof(*inW)) - 1;
+        len_wchars += prefix_len;
+    }
+    if(chunk1){
+        chunk1_len = strlenW(chunk1);
+        len_wchars += chunk1_len;
+    }
+    if(chunk1 && chunk2)
+        len_wchars += dashW_len;
+    if(chunk2)
+        len_wchars += MultiByteToWideChar(CP_UNIXCP, 0, chunk2, -1, NULL, 0) - 1;
+    len_wchars += 1; /* NULL byte */
+
+    ret = HeapAlloc(GetProcessHeap(), 0, len_wchars * sizeof(WCHAR));
+
+    memcpy(ret, prefix, prefix_len * sizeof(WCHAR));
+    copied += prefix_len;
+    if(chunk1){
+        memcpy(ret + copied, chunk1, chunk1_len * sizeof(WCHAR));
+        copied += chunk1_len;
+    }
+    if(chunk1 && chunk2){
+        memcpy(ret + copied, dashW, dashW_len * sizeof(WCHAR));
+        copied += dashW_len;
+    }
+    if(chunk2){
+        MultiByteToWideChar(CP_UNIXCP, 0, chunk2, -1, ret + copied, len_wchars - copied);
+    }else
+        ret[copied] = 0;
+
+    return ret;
+}
+
 static HRESULT alsa_get_card_devices(EDataFlow flow, snd_pcm_stream_t stream,
         WCHAR **ids, GUID *guids, UINT *num, snd_ctl_t *ctl, int card,
         const WCHAR *cardnameW)
 {
-    static const WCHAR dashW[] = {' ','-',' ',0};
     int err, device;
     snd_pcm_info_t *info;
 
@@ -377,8 +426,6 @@ static HRESULT alsa_get_card_devices(EDataFlow flow, snd_pcm_stream_t stream,
             continue;
 
         if(ids && guids){
-            DWORD len, cardlen;
-
             devname = snd_pcm_info_get_name(info);
             if(!devname){
                 WARN("Unable to get device name for card %d, device %d\n", card,
@@ -386,21 +433,7 @@ static HRESULT alsa_get_card_devices(EDataFlow flow, snd_pcm_stream_t stream,
                 continue;
             }
 
-            cardlen = lstrlenW(cardnameW);
-            len = MultiByteToWideChar(CP_UNIXCP, 0, devname, -1, NULL, 0);
-            len += lstrlenW(dashW);
-            len += cardlen;
-            ids[*num] = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
-            if(!ids[*num]){
-                HeapFree(GetProcessHeap(), 0, info);
-                return E_OUTOFMEMORY;
-            }
-            memcpy(ids[*num], cardnameW, cardlen * sizeof(WCHAR));
-            memcpy(ids[*num] + cardlen, dashW, lstrlenW(dashW) * sizeof(WCHAR));
-            cardlen += lstrlenW(dashW);
-            MultiByteToWideChar(CP_UNIXCP, 0, devname, -1, ids[*num] + cardlen,
-                    len - cardlen);
-
+            ids[*num] = construct_device_id(flow, cardnameW, devname);
             get_device_guid(flow, devnode, &guids[*num]);
         }
 
@@ -423,7 +456,7 @@ static void get_reg_devices(EDataFlow flow, snd_pcm_stream_t stream, WCHAR **ids
     static const WCHAR ALSAInputDevices[] = {'A','L','S','A','I','n','p','u','t','D','e','v','i','c','e','s',0};
     HKEY key;
     WCHAR reg_devices[256];
-    DWORD size = sizeof(reg_devices), type, len;
+    DWORD size = sizeof(reg_devices), type;
     const WCHAR *value_name = (stream == SND_PCM_STREAM_PLAYBACK) ? ALSAOutputDevices : ALSAInputDevices;
 
     /* @@ Wine registry key: HKCU\Software\Wine\Drivers\winealsa.drv */
@@ -445,10 +478,7 @@ static void get_reg_devices(EDataFlow flow, snd_pcm_stream_t stream, WCHAR **ids
 
                 if(alsa_try_open(devname, stream)){
                     if(ids && guids){
-                        len = lstrlenW(p) + 1;
-                        ids[*num] = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
-                        memcpy(ids[*num], p, len * sizeof(WCHAR));
-
+                        ids[*num] = construct_device_id(flow, p, NULL);
                         get_device_guid(flow, devname, &guids[*num]);
                     }
                     ++*num;
@@ -474,8 +504,7 @@ static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR **ids, GUID *guids,
 
     if(alsa_try_open(defname, stream)){
         if(ids && guids){
-            *ids = HeapAlloc(GetProcessHeap(), 0, sizeof(defaultW));
-            memcpy(*ids, defaultW, sizeof(defaultW));
+            *ids = construct_device_id(flow, defaultW, NULL);
             get_device_guid(flow, defname, guids);
         }
         ++*num;




More information about the wine-cvs mailing list