static HRESULT load_driver_devices(EDataFlow flow) { WCHAR **ids; GUID *guids; UINT num, def, i; HRESULT hr; if(!drvs.pGetEndpointIDs) return S_OK; hr = drvs.pGetEndpointIDs(flow, &ids, &guids, &num, &def); if(FAILED(hr)) return hr; for(i = 0; i < num; ++i){ MMDevice *dev; dev = MMDevice_Create(ids[i], &guids[i], flow, DEVICE_STATE_ACTIVE, def == i); set_format(dev); } HeapFree(GetProcessHeap(), 0, guids); HeapFree(GetProcessHeap(), 0, ids); return S_OK; }
static HRESULT load_devices_from_reg(void) { DWORD i = 0; HKEY root, cur; LONG ret; DWORD curflow; ret = RegCreateKeyExW(HKEY_LOCAL_MACHINE, software_mmdevapi, 0, NULL, 0, KEY_WRITE|KEY_READ|KEY_WOW64_64KEY, NULL, &root, NULL); if (ret == ERROR_SUCCESS) ret = RegCreateKeyExW(root, reg_capture, 0, NULL, 0, KEY_READ|KEY_WRITE|KEY_WOW64_64KEY, NULL, &key_capture, NULL); if (ret == ERROR_SUCCESS) ret = RegCreateKeyExW(root, reg_render, 0, NULL, 0, KEY_READ|KEY_WRITE|KEY_WOW64_64KEY, NULL, &key_render, NULL); RegCloseKey(root); cur = key_capture; curflow = eCapture; if (ret != ERROR_SUCCESS) { RegCloseKey(key_capture); key_render = key_capture = NULL; WARN("Couldn't create key: %u\n", ret); return E_FAIL; } do { WCHAR guidvalue[39]; GUID guid; DWORD len; PROPVARIANT pv = { VT_EMPTY }; len = sizeof(guidvalue)/sizeof(guidvalue[0]); ret = RegEnumKeyExW(cur, i++, guidvalue, &len, NULL, NULL, NULL, NULL); if (ret == ERROR_NO_MORE_ITEMS) { if (cur == key_capture) { cur = key_render; curflow = eRender; i = 0; continue; } break; } if (ret != ERROR_SUCCESS) continue; if (SUCCEEDED(CLSIDFromString(guidvalue, &guid)) && SUCCEEDED(MMDevice_GetPropValue(&guid, curflow, (const PROPERTYKEY*)&DEVPKEY_Device_FriendlyName, &pv)) && pv.vt == VT_LPWSTR) { DWORD size_bytes = (strlenW(pv.u.pwszVal) + 1) * sizeof(WCHAR); WCHAR *name = HeapAlloc(GetProcessHeap(), 0, size_bytes); memcpy(name, pv.u.pwszVal, size_bytes); MMDevice_Create(name, &guid, curflow, DEVICE_STATE_NOTPRESENT, FALSE); CoTaskMemFree(pv.u.pwszVal); } } while (1); return S_OK; }
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); devstr = palcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER); } else { defaultstr = palcGetString(NULL, ALC_DEFAULT_DEVICE_SPECIFIER); devstr = palcGetString(NULL, ALC_DEVICE_SPECIFIER); } pulse_fixup(devstr, &defaultstr, 1); 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)); if (dev) { ALint freq = 44100; palcGetIntegerv(dev, ALC_FREQUENCY, 1, &freq); openal_setformat(mmdev, freq); palcCloseDevice(dev); } else WARN("Could not open device: %04x\n", palcGetError(NULL)); } LeaveCriticalSection(&openal_crst); }
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); pulse_fixup(devstr, &defaultstr, 0); defblacklisted = blacklist(defaultstr); if (defblacklisted) WARN("Disabling blacklist because %s is blacklisted\n", defaultstr); if (devstr && *devstr) for (; *devstr; devstr += strlen(devstr)+1) { MMDevice *mmdev; 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(&mmdev, name, NULL, eCapture, dev ? DEVICE_STATE_ACTIVE : DEVICE_STATE_NOTPRESENT, !strcmp(devstr, defaultstr)); if (dev) { openal_setformat(mmdev, freq); palcCaptureCloseDevice(dev); } else WARN("Could not open device: %04x\n", palcGetError(NULL)); } LeaveCriticalSection(&openal_crst); }
HRESULT MMDevEnum_Create(REFIID riid, void **ppv) { MMDevEnumImpl *This = MMDevEnumerator; if (!This) { DWORD i = 0; HKEY root, cur; LONG ret; DWORD curflow; This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This)); *ppv = NULL; if (!This) return E_OUTOFMEMORY; This->ref = 1; This->IMMDeviceEnumerator_iface.lpVtbl = &MMDevEnumVtbl; MMDevEnumerator = This; ret = RegCreateKeyExW(HKEY_LOCAL_MACHINE, software_mmdevapi, 0, NULL, 0, KEY_WRITE|KEY_READ, NULL, &root, NULL); if (ret == ERROR_SUCCESS) ret = RegCreateKeyExW(root, reg_capture, 0, NULL, 0, KEY_READ|KEY_WRITE, NULL, &key_capture, NULL); if (ret == ERROR_SUCCESS) ret = RegCreateKeyExW(root, reg_render, 0, NULL, 0, KEY_READ|KEY_WRITE, NULL, &key_render, NULL); RegCloseKey(root); cur = key_capture; curflow = eCapture; if (ret != ERROR_SUCCESS) { RegCloseKey(key_capture); key_render = key_capture = NULL; WARN("Couldn't create key: %u\n", ret); return E_FAIL; } else do { WCHAR guidvalue[39]; GUID guid; DWORD len; PROPVARIANT pv = { VT_EMPTY }; len = sizeof(guidvalue)/sizeof(guidvalue[0]); ret = RegEnumKeyExW(cur, i++, guidvalue, &len, NULL, NULL, NULL, NULL); if (ret == ERROR_NO_MORE_ITEMS) { if (cur == key_capture) { cur = key_render; curflow = eRender; i = 0; continue; } break; } if (ret != ERROR_SUCCESS) continue; if (SUCCEEDED(CLSIDFromString(guidvalue, &guid)) && SUCCEEDED(MMDevice_GetPropValue(&guid, curflow, (const PROPERTYKEY*)&DEVPKEY_Device_FriendlyName, &pv)) && pv.vt == VT_LPWSTR) { MMDevice_Create(NULL, pv.u.pwszVal, &guid, curflow, DEVICE_STATE_NOTPRESENT, FALSE); CoTaskMemFree(pv.u.pwszVal); } } while (1); #ifdef HAVE_OPENAL if (openal_loaded) { openal_scanrender(); openal_scancapture(); } else FIXME("OpenAL support not enabled, application will not find sound devices\n"); #else ERR("OpenAL support not compiled in, application will not find sound devices\n"); #endif /*HAVE_OPENAL*/ } return IUnknown_QueryInterface((IUnknown*)This, riid, ppv); }