Maarten Lankhorst : mmdevapi: Blacklist alsa hw devices.

Alexandre Julliard julliard at winehq.org
Mon Apr 12 09:54:09 CDT 2010


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

Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date:   Mon Apr 12 11:59:59 2010 +0200

mmdevapi: Blacklist alsa hw devices.

---

 dlls/mmdevapi/devenum.c |   35 ++++++++++++++++++++++++++++-------
 1 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c
index b593eb6..9619aa6 100644
--- a/dlls/mmdevapi/devenum.c
+++ b/dlls/mmdevapi/devenum.c
@@ -732,11 +732,18 @@ static void openal_setformat(MMDevice *This, DWORD freq)
     }
 }
 
+static int blacklist(const char *dev) {
+    if (strstr(dev, "ALSA") && strstr(dev, "hw:"))
+        return 1;
+    return 0;
+}
+
 static void openal_scanrender(void)
 {
     WCHAR name[MAX_PATH];
     ALCdevice *dev;
     const ALCchar *devstr, *defaultstr;
+    int defblacklisted;
     EnterCriticalSection(&openal_crst);
     if (palcIsExtensionPresent(NULL, "ALC_ENUMERATE_ALL_EXT")) {
         defaultstr = palcGetString(NULL, ALC_DEFAULT_ALL_DEVICES_SPECIFIER);
@@ -745,12 +752,20 @@ static void openal_scanrender(void)
         defaultstr = palcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER);
         devstr = palcGetString(NULL, ALC_DEVICE_SPECIFIER);
     }
-    if (devstr && *devstr)
-        do {
+    defblacklisted = blacklist(defaultstr);
+    if (defblacklisted)
+        WARN("Disabling blacklist because %s is blacklisted\n", defaultstr);
+    if (devstr)
+        for (; *devstr; devstr += strlen(devstr)+1) {
             MMDevice *mmdev;
             MultiByteToWideChar( CP_UNIXCP, 0, devstr, -1,
                                  name, sizeof(name)/sizeof(*name)-1 );
             name[sizeof(name)/sizeof(*name)-1] = 0;
+            /* Only enable blacklist if the default device isn't blacklisted */
+            if (!defblacklisted && blacklist(devstr)) {
+                WARN("Not adding %s: device is blacklisted\n", devstr);
+                continue;
+            }
             TRACE("Adding %s\n", devstr);
             dev = palcOpenDevice(devstr);
             MMDevice_Create(&mmdev, name, NULL, eRender, dev ? DEVICE_STATE_ACTIVE : DEVICE_STATE_NOTPRESENT, !strcmp(devstr, defaultstr));
@@ -763,8 +778,7 @@ static void openal_scanrender(void)
             }
             else
                 WARN("Could not open device: %04x\n", palcGetError(NULL));
-            devstr += strlen(devstr)+1;
-        } while (*devstr);
+        }
     LeaveCriticalSection(&openal_crst);
 }
 
@@ -773,16 +787,24 @@ static void openal_scancapture(void)
     WCHAR name[MAX_PATH];
     ALCdevice *dev;
     const ALCchar *devstr, *defaultstr;
+    int defblacklisted;
 
     EnterCriticalSection(&openal_crst);
     devstr = palcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER);
     defaultstr = palcGetString(NULL, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER);
+    defblacklisted = blacklist(defaultstr);
+    if (defblacklisted)
+        WARN("Disabling blacklist because %s is blacklisted\n", defaultstr);
     if (devstr && *devstr)
-        do {
+        for (; *devstr; devstr += strlen(devstr)+1) {
             ALint freq = 44100;
             MultiByteToWideChar( CP_UNIXCP, 0, devstr, -1,
                                  name, sizeof(name)/sizeof(*name)-1 );
             name[sizeof(name)/sizeof(*name)-1] = 0;
+            if (!defblacklisted && blacklist(devstr)) {
+                WARN("Not adding %s: device is blacklisted\n", devstr);
+                continue;
+            }
             TRACE("Adding %s\n", devstr);
             dev = palcCaptureOpenDevice(devstr, freq, AL_FORMAT_MONO16, 65536);
             MMDevice_Create(NULL, name, NULL, eCapture, dev ? DEVICE_STATE_ACTIVE : DEVICE_STATE_NOTPRESENT, !strcmp(devstr, defaultstr));
@@ -790,8 +812,7 @@ static void openal_scancapture(void)
                 palcCaptureCloseDevice(dev);
             else
                 WARN("Could not open device: %04x\n", palcGetError(NULL));
-            devstr += strlen(devstr)+1;
-        } while (*devstr);
+        }
     LeaveCriticalSection(&openal_crst);
 }
 #endif /*HAVE_OPENAL*/




More information about the wine-cvs mailing list