static DWORD DSOUND_FindSpeakerConfig(IMMDevice *mmdevice, int channels) { IPropertyStore *store; HRESULT hr; PROPVARIANT pv; ULONG phys_speakers; const DWORD def = DSSPEAKER_COMBINED(DSSPEAKER_STEREO, DSSPEAKER_GEOMETRY_WIDE); hr = IMMDevice_OpenPropertyStore(mmdevice, STGM_READ, &store); if (FAILED(hr)) { WARN("IMMDevice_OpenPropertyStore failed: %08x\n", hr); return def; } hr = IPropertyStore_GetValue(store, &PKEY_AudioEndpoint_PhysicalSpeakers, &pv); if (FAILED(hr)) { WARN("IPropertyStore_GetValue failed: %08x\n", hr); IPropertyStore_Release(store); return def; } if (pv.vt != VT_UI4) { WARN("PKEY_AudioEndpoint_PhysicalSpeakers is not a ULONG: 0x%x\n", pv.vt); PropVariantClear(&pv); IPropertyStore_Release(store); return def; } phys_speakers = pv.u.ulVal; PropVariantClear(&pv); IPropertyStore_Release(store); if ((channels >= 6 || channels == 0) && (phys_speakers & KSAUDIO_SPEAKER_5POINT1) == KSAUDIO_SPEAKER_5POINT1) return DSSPEAKER_5POINT1_BACK; else if ((channels >= 6 || channels == 0) && (phys_speakers & KSAUDIO_SPEAKER_5POINT1_SURROUND) == KSAUDIO_SPEAKER_5POINT1_SURROUND) return DSSPEAKER_5POINT1_SURROUND; else if ((channels >= 4 || channels == 0) && (phys_speakers & KSAUDIO_SPEAKER_QUAD) == KSAUDIO_SPEAKER_QUAD) return DSSPEAKER_QUAD; else if ((channels >= 2 || channels == 0) && (phys_speakers & KSAUDIO_SPEAKER_STEREO) == KSAUDIO_SPEAKER_STEREO) return DSSPEAKER_COMBINED(DSSPEAKER_STEREO, DSSPEAKER_GEOMETRY_WIDE); else if ((phys_speakers & KSAUDIO_SPEAKER_MONO) == KSAUDIO_SPEAKER_MONO) return DSSPEAKER_MONO; return def; }
static void test_deviceinterface(IPropertyStore *store) { HRESULT hr; PROPVARIANT pv; static const PROPERTYKEY deviceinterface_key = { {0x233164c8, 0x1b2c, 0x4c7d, {0xbc, 0x68, 0xb6, 0x71, 0x68, 0x7a, 0x25, 0x67}}, 1 }; pv.vt = VT_EMPTY; hr = IPropertyStore_GetValue(store, &deviceinterface_key, &pv); ok(hr == S_OK, "GetValue failed: %08x\n", hr); ok(pv.vt == VT_LPWSTR, "Got wrong variant type: 0x%x\n", pv.vt); trace("device interface: %s\n", wine_dbgstr_w(pv.u.pwszVal)); CoTaskMemFree(pv.u.pwszVal); }
static char * GetWasapiDeviceName(IMMDevice *device) { /* PKEY_Device_FriendlyName gives you "Speakers (SoundBlaster Pro)" which drives me nuts. I'd rather it be "SoundBlaster Pro (Speakers)" but I guess that's developers vs users. Windows uses the FriendlyName in its own UIs, like Volume Control, etc. */ char *utf8dev = NULL; IPropertyStore *props = NULL; if (SUCCEEDED(IMMDevice_OpenPropertyStore(device, STGM_READ, &props))) { PROPVARIANT var; PropVariantInit(&var); if (SUCCEEDED(IPropertyStore_GetValue(props, &SDL_PKEY_Device_FriendlyName, &var))) { utf8dev = WIN_StringToUTF8(var.pwszVal); } PropVariantClear(&var); IPropertyStore_Release(props); } return utf8dev; }
static void test_first_device(void) { IMMDeviceEnumerator *devenum; IMMDevice *defdev; IPropertyStore *ps; PROPVARIANT pv; HRESULT hr; hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (void**)&devenum); if(FAILED(hr)){ win_skip("MMDevAPI is not available, skipping default device test\n"); return; } hr = IMMDeviceEnumerator_GetDefaultAudioEndpoint(devenum, eRender, eMultimedia, &defdev); if (hr == E_NOTFOUND) { win_skip("No default device found\n"); return; } ok(hr == S_OK, "GetDefaultAudioEndpoint failed: %08x\n", hr); hr = IMMDevice_OpenPropertyStore(defdev, STGM_READ, &ps); ok(hr == S_OK, "OpenPropertyStore failed: %08x\n", hr); PropVariantInit(&pv); hr = IPropertyStore_GetValue(ps, &PKEY_AudioEndpoint_GUID, &pv); ok(hr == S_OK, "GetValue failed: %08x\n", hr); CLSIDFromString(pv.u.pwszVal, &default_info.guid); PropVariantClear(&pv); IPropertyStore_Release(ps); IMMDevice_Release(defdev); IMMDeviceEnumerator_Release(devenum); hr = pDirectSoundEnumerateA(&default_device_cb, NULL); ok(hr == S_OK, "DirectSoundEnumerateA failed: %08x\n", hr); }
static BOOL send_device(IMMDevice *device, GUID *guid, LPDSENUMCALLBACKW cb, void *user) { IPropertyStore *ps; PROPVARIANT pv; BOOL keep_going; HRESULT hr; PropVariantInit(&pv); hr = IMMDevice_OpenPropertyStore(device, STGM_READ, &ps); if(FAILED(hr)){ WARN("OpenPropertyStore failed: %08x\n", hr); return TRUE; } hr = get_mmdevice_guid(device, ps, guid); if(FAILED(hr)){ IPropertyStore_Release(ps); return TRUE; } hr = IPropertyStore_GetValue(ps, (const PROPERTYKEY *)&DEVPKEY_Device_FriendlyName, &pv); if(FAILED(hr)){ IPropertyStore_Release(ps); WARN("GetValue(FriendlyName) failed: %08x\n", hr); return TRUE; } TRACE("Calling back with %s (%s)\n", wine_dbgstr_guid(guid), wine_dbgstr_w(pv.u.pwszVal)); keep_going = cb(guid, pv.u.pwszVal, wine_vxd_drv, user); PropVariantClear(&pv); IPropertyStore_Release(ps); return keep_going; }
JNIEXPORT jstring JNICALL Java_org_jitsi_impl_neomedia_jmfext_media_protocol_wasapi_WASAPI_IPropertyStore_1GetString (JNIEnv *env, jclass clazz, jlong thiz, jlong key) { PROPVARIANT v; HRESULT hr; jstring ret; PropVariantInit(&v); hr = IPropertyStore_GetValue( (IPropertyStore *) (intptr_t) thiz, (REFPROPERTYKEY) (intptr_t) key, &v); if (SUCCEEDED(hr)) { if (v.vt == VT_LPWSTR) { ret = v.pwszVal ? (*env)->NewString(env, v.pwszVal, wcslen(v.pwszVal)) : NULL; } else { ret = NULL; WASAPI_throwNewHResultException( env, E_UNEXPECTED, __func__, __LINE__); } PropVariantClear(&v); } else { ret = NULL; WASAPI_throwNewHResultException(env, hr, __func__, __LINE__); } return ret; }
static ALCchar *get_device_name(IMMDevice *device) { ALCchar *name = NULL; IPropertyStore *ps; PROPVARIANT pvname; HRESULT hr; int len; hr = IMMDevice_OpenPropertyStore(device, STGM_READ, &ps); if(FAILED(hr)) { WARN("OpenPropertyStore failed: 0x%08lx\n", hr); return calloc(1, 1); } PropVariantInit(&pvname); hr = IPropertyStore_GetValue(ps, (const PROPERTYKEY*)&DEVPKEY_Device_FriendlyName, &pvname); if(FAILED(hr)) { WARN("GetValue failed: 0x%08lx\n", hr); name = calloc(1, 1); } else { if((len=WideCharToMultiByte(CP_ACP, 0, pvname.pwszVal, -1, NULL, 0, NULL, NULL)) > 0) { name = calloc(1, len); WideCharToMultiByte(CP_ACP, 0, pvname.pwszVal, -1, name, len, NULL, NULL); } } PropVariantClear(&pvname); IPropertyStore_Release(ps); return name; }
static void get_device_name(IMMDevice *device, al_string *name) { IPropertyStore *ps; PROPVARIANT pvname; HRESULT hr; hr = IMMDevice_OpenPropertyStore(device, STGM_READ, &ps); if(FAILED(hr)) { WARN("OpenPropertyStore failed: 0x%08lx\n", hr); return; } PropVariantInit(&pvname); hr = IPropertyStore_GetValue(ps, (const PROPERTYKEY*)&DEVPKEY_Device_FriendlyName, &pvname); if(FAILED(hr)) WARN("GetValue failed: 0x%08lx\n", hr); else al_string_copy_wcstr(name, pvname.pwszVal); PropVariantClear(&pvname); IPropertyStore_Release(ps); }
static void test_setvalue_on_wow64(IPropertyStore *store) { PROPVARIANT pv; HRESULT hr; LONG ret; WCHAR *guidW; HKEY root, props, devkey; DWORD type, regval, size; static const PROPERTYKEY PKEY_Bogus = { {0x1da5d803, 0xd492, 0x4edd, {0x8c, 0x23, 0xe0, 0xc0, 0xff, 0xee, 0x7f, 0x00}}, 0x7f }; static const WCHAR bogusW[] = {'{','1','D','A','5','D','8','0','3','-','D','4','9','2','-','4','E','D','D','-','8','C','2','3','-','E','0','C','0','F','F','E','E','7','F','0','0','}',',','1','2','7',0}; PropVariantInit(&pv); pv.vt = VT_EMPTY; hr = IPropertyStore_GetValue(store, &PKEY_AudioEndpoint_GUID, &pv); ok(hr == S_OK, "Failed to get Endpoint GUID: %08x\n", hr); guidW = pv.u.pwszVal; pv.vt = VT_UI4; pv.u.ulVal = 0xAB; hr = IPropertyStore_SetValue(store, &PKEY_Bogus, &pv); ok(hr == S_OK || hr == E_ACCESSDENIED, "SetValue failed: %08x\n", hr); if (hr != S_OK) { win_skip("Missing permission to write to registry\n"); return; } pv.u.ulVal = 0x00; hr = IPropertyStore_GetValue(store, &PKEY_Bogus, &pv); ok(hr == S_OK, "GetValue failed: %08x\n", hr); ok(pv.u.ulVal == 0xAB, "Got wrong value: 0x%x\n", pv.u.ulVal); /* should find the key in 64-bit view */ ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, software_renderW, 0, KEY_READ|KEY_WOW64_64KEY, &root); ok(ret == ERROR_SUCCESS, "Couldn't open mmdevices Render key: %u\n", ret); ret = RegOpenKeyExW(root, guidW, 0, KEY_READ|KEY_WOW64_64KEY, &devkey); ok(ret == ERROR_SUCCESS, "Couldn't open mmdevice guid key: %u\n", ret); ret = RegOpenKeyExW(devkey, propertiesW, 0, KEY_READ|KEY_WOW64_64KEY, &props); ok(ret == ERROR_SUCCESS, "Couldn't open mmdevice property key: %u\n", ret); /* Note: the registry key exists even without calling IPropStore::Commit */ size = sizeof(regval); ret = RegGetValueW(props, NULL, bogusW, RRF_RT_DWORD, &type, ®val, &size); ok(ret == ERROR_SUCCESS, "Couldn't get bogus propertykey value: %u\n", ret); ok(type == REG_DWORD, "Got wrong value type: %u\n", type); ok(regval == 0xAB, "Got wrong value: 0x%x\n", regval); RegCloseKey(props); RegCloseKey(devkey); RegCloseKey(root); CoTaskMemFree(guidW); /* should NOT find the key in 32-bit view */ ret = RegOpenKeyExW(HKEY_LOCAL_MACHINE, software_renderW, 0, KEY_READ, &root); ok(ret == ERROR_FILE_NOT_FOUND, "Wrong error when opening mmdevices Render key: %u\n", ret); }
static HRESULT DSPROPERTY_DescriptionW( LPVOID pPropData, ULONG cbPropData, PULONG pcbReturned ) { PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA ppd = pPropData; GUID dev_guid; IMMDevice *mmdevice; IPropertyStore *ps; PROPVARIANT pv; DWORD desclen; HRESULT hr; TRACE("pPropData=%p,cbPropData=%d,pcbReturned=%p)\n", pPropData,cbPropData,pcbReturned); TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId)); if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) { /* default device of type specified by ppd->DataFlow */ if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) { TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n"); ppd->DeviceId = DSDEVID_DefaultCapture; } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) { TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n"); ppd->DeviceId = DSDEVID_DefaultPlayback; } else { WARN("DataFlow=Unknown(%d)\n", ppd->DataFlow); return E_PROP_ID_UNSUPPORTED; } } setup_dsound_options(); GetDeviceID(&ppd->DeviceId, &dev_guid); hr = get_mmdevice(eRender, &dev_guid, &mmdevice); if(FAILED(hr)){ hr = get_mmdevice(eCapture, &dev_guid, &mmdevice); if(FAILED(hr)) return hr; } hr = IMMDevice_OpenPropertyStore(mmdevice, STGM_READ, &ps); if(FAILED(hr)){ IMMDevice_Release(mmdevice); WARN("OpenPropertyStore failed: %08x\n", hr); return hr; } hr = IPropertyStore_GetValue(ps, (const PROPERTYKEY *)&DEVPKEY_Device_FriendlyName, &pv); if(FAILED(hr)){ IPropertyStore_Release(ps); IMMDevice_Release(mmdevice); WARN("GetValue(FriendlyName) failed: %08x\n", hr); return hr; } desclen = lstrlenW(pv.u.pwszVal) + 1; /* FIXME: Still a memory leak.. */ ppd->Description = HeapAlloc(GetProcessHeap(), 0, desclen * sizeof(WCHAR)); memcpy(ppd->Description, pv.u.pwszVal, desclen * sizeof(WCHAR)); ppd->Module = wine_vxd_drv; ppd->Interface = wInterface; ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD; PropVariantClear(&pv); IPropertyStore_Release(ps); IMMDevice_Release(mmdevice); if (pcbReturned) { *pcbReturned = sizeof(*ppd); TRACE("*pcbReturned=%d\n", *pcbReturned); } return S_OK; }