Maarten Lankhorst : mmdevapi: Try to detect openal 1.11, and do not blacklist pulseaudio on it.

Alexandre Julliard julliard at winehq.org
Tue May 4 13:06:35 CDT 2010


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

Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date:   Mon May  3 19:36:51 2010 +0200

mmdevapi: Try to detect openal 1.11, and do not blacklist pulseaudio on it.

---

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

diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c
index 281faf5..85eeb5e 100644
--- a/dlls/mmdevapi/devenum.c
+++ b/dlls/mmdevapi/devenum.c
@@ -759,24 +759,50 @@ static int blacklist(const char *dev) {
     return 0;
 }
 
-static void pulse_fixup(const char *devstr, const char **defstr) {
+static void pulse_fixup(const char *devstr, const char **defstr, int render) {
     static int warned;
+    int default_pulse;
 
-    if (!blacklist_pulse && !local_contexts)
+    if (render && !blacklist_pulse && !local_contexts)
         blacklist_pulse = 1;
 
-    if (!blacklist_pulse || !devstr || strncmp(*defstr, "PulseAudio ", 11))
+    if (!blacklist_pulse || !devstr || !*devstr)
         return;
 
+    default_pulse = !strncmp(*defstr, "PulseAudio ", 11);
+
+    while (*devstr && !strncmp(devstr, "PulseAudio ", 11))
+        devstr += strlen(devstr) + 1;
+
+    /* Could still be a newer version, so check for 1.11 if more devices are enabled */
+    if (render && *devstr) {
+        ALCdevice *dev = palcOpenDevice(devstr);
+        ALCcontext *ctx = palcCreateContext(dev, NULL);
+        if (ctx) {
+            const char *ver;
+
+            setALContext(ctx);
+            ver = palGetString(AL_VERSION);
+            popALContext();
+            palcDestroyContext(ctx);
+
+            if (!strcmp(ver, "1.1 ALSOFT 1.11.753")) {
+                blacklist_pulse = 0;
+                palcCloseDevice(dev);
+                return;
+            }
+        }
+        if (dev)
+            palcCloseDevice(dev);
+    }
+
     if (!warned++) {
         ERR("Disabling pulseaudio because of old openal version\n");
         ERR("Please upgrade to openal-soft v1.12 or newer\n");
     }
-    while (*devstr && !strncmp(devstr, "PulseAudio ", 11)) {
-        devstr += strlen(devstr) + 1;
-    }
     TRACE("New default: %s\n", devstr);
-    *defstr = devstr;
+    if (default_pulse)
+        *defstr = devstr;
 }
 
 static void openal_scanrender(void)
@@ -793,7 +819,7 @@ static void openal_scanrender(void)
         defaultstr = palcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER);
         devstr = palcGetString(NULL, ALC_DEVICE_SPECIFIER);
     }
-    pulse_fixup(devstr, &defaultstr);
+    pulse_fixup(devstr, &defaultstr, 1);
     defblacklisted = blacklist(defaultstr);
     if (defblacklisted)
         WARN("Disabling blacklist because %s is blacklisted\n", defaultstr);
@@ -834,7 +860,7 @@ static void openal_scancapture(void)
     EnterCriticalSection(&openal_crst);
     devstr = palcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER);
     defaultstr = palcGetString(NULL, ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER);
-    pulse_fixup(devstr, &defaultstr);
+    pulse_fixup(devstr, &defaultstr, 0);
     defblacklisted = blacklist(defaultstr);
     if (defblacklisted)
         WARN("Disabling blacklist because %s is blacklisted\n", defaultstr);




More information about the wine-cvs mailing list