Module: wine Branch: master Commit: e9f520467d089becc7e5f30230b397c0b2e4c49d URL: http://source.winehq.org/git/wine.git/?a=commit;h=e9f520467d089becc7e5f30230...
Author: Maarten Lankhorst m.b.lankhorst@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*/