static HRESULT get_mmdevice_guid(IMMDevice *device, IPropertyStore *ps, GUID *guid) { PROPVARIANT pv; HRESULT hr; if(!ps){ hr = IMMDevice_OpenPropertyStore(device, STGM_READ, &ps); if(FAILED(hr)){ WARN("OpenPropertyStore failed: %08x\n", hr); return hr; } }else IPropertyStore_AddRef(ps); PropVariantInit(&pv); hr = IPropertyStore_GetValue(ps, &PKEY_AudioEndpoint_GUID, &pv); if(FAILED(hr)){ IPropertyStore_Release(ps); WARN("GetValue(GUID) failed: %08x\n", hr); return hr; } CLSIDFromString(pv.u.pwszVal, guid); PropVariantClear(&pv); IPropertyStore_Release(ps); return S_OK; }
static BOOL load_device(IMMDevice *dev, struct DeviceInfo *info) { IPropertyStore *ps; HRESULT hr; PROPVARIANT pv; UINT i; hr = IMMDevice_GetId(dev, &info->id); if(FAILED(hr)){ info->id = NULL; return FALSE; } hr = IMMDevice_OpenPropertyStore(dev, STGM_READ, &ps); if(FAILED(hr)){ CoTaskMemFree(info->id); info->id = NULL; return FALSE; } PropVariantInit(&info->name); hr = IPropertyStore_GetValue(ps, (PROPERTYKEY*)&DEVPKEY_Device_FriendlyName, &info->name); if(FAILED(hr)){ CoTaskMemFree(info->id); info->id = NULL; IPropertyStore_Release(ps); return FALSE; } PropVariantInit(&pv); hr = IPropertyStore_GetValue(ps, &PKEY_AudioEndpoint_PhysicalSpeakers, &pv); info->speaker_config = -1; if(SUCCEEDED(hr) && pv.vt == VT_UI4){ i = 0; while (speaker_configs[i].text_id != 0) { if ((speaker_configs[i].speaker_mask & pv.u.ulVal) == speaker_configs[i].speaker_mask) { info->speaker_config = i; break; } i++; } } /* fallback to stereo */ if(info->speaker_config == -1) info->speaker_config = 2; IPropertyStore_Release(ps); return TRUE; }
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 BOOL get_driver_name(IMMDeviceEnumerator *devenum, PROPVARIANT *pv) { IMMDevice *device; IPropertyStore *ps; HRESULT hr; static const WCHAR wine_info_deviceW[] = {'W','i','n','e',' ', 'i','n','f','o',' ','d','e','v','i','c','e',0}; hr = IMMDeviceEnumerator_GetDevice(devenum, wine_info_deviceW, &device); if(FAILED(hr)) return FALSE; hr = IMMDevice_OpenPropertyStore(device, STGM_READ, &ps); if(FAILED(hr)){ IMMDevice_Release(device); return FALSE; } hr = IPropertyStore_GetValue(ps, (const PROPERTYKEY *)&DEVPKEY_Device_Driver, pv); IPropertyStore_Release(ps); IMMDevice_Release(device); if(FAILED(hr)) return FALSE; return TRUE; }
static BOOL load_device(IMMDevice *dev, struct DeviceInfo *info) { IPropertyStore *ps; HRESULT hr; hr = IMMDevice_GetId(dev, &info->id); if(FAILED(hr)){ info->id = NULL; return FALSE; } hr = IMMDevice_OpenPropertyStore(dev, STGM_READ, &ps); if(FAILED(hr)){ CoTaskMemFree(info->id); info->id = NULL; return FALSE; } PropVariantInit(&info->name); hr = IPropertyStore_GetValue(ps, (PROPERTYKEY*)&DEVPKEY_Device_FriendlyName, &info->name); IPropertyStore_Release(ps); if(FAILED(hr)){ CoTaskMemFree(info->id); info->id = NULL; return FALSE; } return TRUE; }
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; }
static void apply_speaker_configs(void) { UINT i; IMMDeviceEnumerator *devenum; IMMDevice *dev; IPropertyStore *ps; PROPVARIANT pv; HRESULT hr; hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, (void**)&devenum); if(FAILED(hr)){ ERR("Unable to create MMDeviceEnumerator: 0x%08x\n", hr); return; } PropVariantInit(&pv); pv.vt = VT_UI4; for (i = 0; i < num_render_devs; i++) { hr = IMMDeviceEnumerator_GetDevice(devenum, render_devs[i].id, &dev); if(FAILED(hr)){ WARN("Could not get MMDevice for %s: 0x%08x\n", wine_dbgstr_w(render_devs[i].id), hr); continue; } hr = IMMDevice_OpenPropertyStore(dev, STGM_WRITE, &ps); if(FAILED(hr)){ WARN("Could not open property store for %s: 0x%08x\n", wine_dbgstr_w(render_devs[i].id), hr); IMMDevice_Release(dev); continue; } pv.u.ulVal = speaker_configs[render_devs[i].speaker_config].speaker_mask; hr = IPropertyStore_SetValue(ps, &PKEY_AudioEndpoint_PhysicalSpeakers, &pv); if (FAILED(hr)) WARN("IPropertyStore_SetValue failed for %s: 0x%08x\n", wine_dbgstr_w(render_devs[i].id), hr); IPropertyStore_Release(ps); IMMDevice_Release(dev); } IMMDeviceEnumerator_Release(devenum); }
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 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 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; }
JNIEXPORT void JNICALL Java_org_jitsi_impl_neomedia_jmfext_media_protocol_wasapi_WASAPI_IPropertyStore_1Release (JNIEnv *env, jclass clazz, jlong thiz) { IPropertyStore_Release((IPropertyStore *) (intptr_t) thiz); }