Andrew Eikum : wineoss.drv: Trim the sub-device part of the device path.

Alexandre Julliard julliard at winehq.org
Tue Oct 11 14:03:37 CDT 2011


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

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Mon Oct 10 15:57:06 2011 -0500

wineoss.drv: Trim the sub-device part of the device path.

---

 dlls/wineoss.drv/mmdevdrv.c |   58 +++++++++++++++++++++++++++++++++++-------
 1 files changed, 48 insertions(+), 10 deletions(-)

diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
index 5de0a15..6f8e2d2 100644
--- a/dlls/wineoss.drv/mmdevdrv.c
+++ b/dlls/wineoss.drv/mmdevdrv.c
@@ -119,6 +119,7 @@ struct ACImpl {
 
     int fd;
     oss_audioinfo ai;
+    char devnode[OSS_DEVNODE_SIZE];
 
     BOOL initted, playing;
     UINT64 written_frames;
@@ -281,10 +282,34 @@ int WINAPI AUDDRV_GetPriority(void)
     return Priority_Preferred;
 }
 
+static const char *oss_clean_devnode(const char *devnode)
+{
+    static char ret[OSS_DEVNODE_SIZE];
+
+    const char *dot, *slash;
+    size_t len;
+
+    dot = strrchr(devnode, '.');
+    if(!dot)
+        return devnode;
+
+    slash = strrchr(devnode, '/');
+    if(slash && dot < slash)
+        return devnode;
+
+    len = dot - devnode;
+
+    memcpy(ret, devnode, len);
+    ret[len] = '\0';
+
+    return ret;
+}
+
 static UINT get_default_index(EDataFlow flow, char **keys, UINT num)
 {
     int fd = -1, err, i;
     oss_audioinfo ai;
+    const char *devnode;
 
     if(flow == eRender)
         fd = open("/dev/dsp", O_WRONLY);
@@ -306,8 +331,9 @@ static UINT get_default_index(EDataFlow flow, char **keys, UINT num)
     close(fd);
 
     TRACE("Default devnode: %s\n", ai.devnode);
+    devnode = oss_clean_devnode(ai.devnode);
     for(i = 0; i < num; ++i)
-        if(!strcmp(ai.devnode, keys[i]))
+        if(!strcmp(devnode, keys[i]))
             return i;
 
     WARN("Couldn't find default device! Choosing first.\n");
@@ -317,7 +343,7 @@ static UINT get_default_index(EDataFlow flow, char **keys, UINT num)
 HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, char ***keys,
         UINT *num, UINT *def_index)
 {
-    int i, mixer_fd;
+    int i, j, mixer_fd;
     oss_sysinfo sysinfo;
     static int print_once = 0;
 
@@ -365,6 +391,7 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, char ***keys,
     *num = 0;
     for(i = 0; i < sysinfo.numaudios; ++i){
         oss_audioinfo ai = {0};
+        const char *devnode;
         int fd;
 
         ai.dev = i;
@@ -374,13 +401,22 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, char ***keys,
             continue;
         }
 
+        devnode = oss_clean_devnode(ai.devnode);
+
+        /* check for duplicates */
+        for(j = 0; j < *num; ++j)
+            if(!strcmp(devnode, (*keys)[j]))
+                break;
+        if(j != *num)
+            continue;
+
         if(flow == eRender)
-            fd = open(ai.devnode, O_WRONLY, 0);
+            fd = open(devnode, O_WRONLY, 0);
         else
-            fd = open(ai.devnode, O_RDONLY, 0);
+            fd = open(devnode, O_RDONLY, 0);
         if(fd < 0){
             WARN("Opening device \"%s\" failed, pretending it doesn't exist: %d (%s)\n",
-                    ai.devnode, errno, strerror(errno));
+                    devnode, errno, strerror(errno));
             continue;
         }
         close(fd);
@@ -390,7 +426,7 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, char ***keys,
             size_t len;
 
             (*keys)[*num] = HeapAlloc(GetProcessHeap(), 0,
-                    strlen(ai.devnode) + 1);
+                    strlen(devnode) + 1);
             if(!(*keys)[*num]){
                 for(i = 0; i < *num; ++i){
                     HeapFree(GetProcessHeap(), 0, (*ids)[i]);
@@ -401,7 +437,7 @@ HRESULT WINAPI AUDDRV_GetEndpointIDs(EDataFlow flow, WCHAR ***ids, char ***keys,
                 close(mixer_fd);
                 return E_OUTOFMEMORY;
             }
-            strcpy((*keys)[*num], ai.devnode);
+            strcpy((*keys)[*num], devnode);
 
             len = MultiByteToWideChar(CP_UNIXCP, 0, ai.name, -1, NULL, 0);
             (*ids)[*num] = HeapAlloc(GetProcessHeap(), 0,
@@ -468,6 +504,8 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(char *devnode, IMMDevice *dev,
         return E_FAIL;
     }
 
+    strcpy(This->devnode, devnode);
+
     TRACE("OSS audioinfo:\n");
     TRACE("devnode: %s\n", This->ai.devnode);
     TRACE("name: %s\n", This->ai.name);
@@ -1100,12 +1138,12 @@ static HRESULT WINAPI AudioClient_IsFormatSupported(IAudioClient *iface,
     dump_fmt(pwfx);
 
     if(This->dataflow == eRender)
-        fd = open(This->ai.devnode, O_WRONLY, 0);
+        fd = open(This->devnode, O_WRONLY, 0);
     else if(This->dataflow == eCapture)
-        fd = open(This->ai.devnode, O_RDONLY, 0);
+        fd = open(This->devnode, O_RDONLY, 0);
 
     if(fd < 0){
-        ERR("Unable to open device %s: %d (%s)\n", This->ai.devnode, errno,
+        ERR("Unable to open device %s: %d (%s)\n", This->devnode, errno,
                 strerror(errno));
         return AUDCLNT_E_DEVICE_INVALIDATED;
     }




More information about the wine-cvs mailing list