JNIEXPORT jint JNICALL Java_org_jitsi_impl_neomedia_jmfext_media_protocol_wasapi_WASAPI_IMMDevice_1GetState (JNIEnv *env, jclass clazz, jlong thiz) { DWORD dwState; HRESULT hr = IMMDevice_GetState((IMMDevice *) (intptr_t) thiz, &dwState); if (FAILED(hr)) { dwState = 0; WASAPI_throwNewHResultException(env, hr, __func__, __LINE__); } return (jint) dwState; }
static HRESULT WINAPI MMDevEnum_GetDefaultAudioEndpoint(IMMDeviceEnumerator *iface, EDataFlow flow, ERole role, IMMDevice **device) { MMDevEnumImpl *This = impl_from_IMMDeviceEnumerator(iface); WCHAR reg_key[256]; HKEY key; HRESULT hr; TRACE("(%p)->(%u,%u,%p)\n", This, flow, role, device); if (!device) return E_POINTER; if((flow != eRender && flow != eCapture) || (role != eConsole && role != eMultimedia && role != eCommunications)){ WARN("Unknown flow (%u) or role (%u)\n", flow, role); return E_INVALIDARG; } *device = NULL; if(!drvs.module_name[0]) return E_NOTFOUND; lstrcpyW(reg_key, drv_keyW); lstrcatW(reg_key, slashW); lstrcatW(reg_key, drvs.module_name); if(RegOpenKeyW(HKEY_CURRENT_USER, reg_key, &key) == ERROR_SUCCESS){ const WCHAR *reg_x_name, *reg_vx_name; WCHAR def_id[256]; DWORD size = sizeof(def_id), state; if(flow == eRender){ reg_x_name = reg_out_nameW; reg_vx_name = reg_vout_nameW; }else{ reg_x_name = reg_in_nameW; reg_vx_name = reg_vin_nameW; } if(role == eCommunications && RegQueryValueExW(key, reg_vx_name, 0, NULL, (BYTE*)def_id, &size) == ERROR_SUCCESS){ hr = IMMDeviceEnumerator_GetDevice(iface, def_id, device); if(SUCCEEDED(hr)){ if(SUCCEEDED(IMMDevice_GetState(*device, &state)) && state == DEVICE_STATE_ACTIVE){ RegCloseKey(key); return S_OK; } } TRACE("Unable to find voice device %s\n", wine_dbgstr_w(def_id)); } if(RegQueryValueExW(key, reg_x_name, 0, NULL, (BYTE*)def_id, &size) == ERROR_SUCCESS){ hr = IMMDeviceEnumerator_GetDevice(iface, def_id, device); if(SUCCEEDED(hr)){ if(SUCCEEDED(IMMDevice_GetState(*device, &state)) && state == DEVICE_STATE_ACTIVE){ RegCloseKey(key); return S_OK; } } TRACE("Unable to find device %s\n", wine_dbgstr_w(def_id)); } RegCloseKey(key); } if (flow == eRender) *device = &MMDevice_def_play->IMMDevice_iface; else *device = &MMDevice_def_rec->IMMDevice_iface; if (!*device) return E_NOTFOUND; IMMDevice_AddRef(*device); return S_OK; }