static HRESULT WINAPI MMDevCol_Item(IMMDeviceCollection *iface, UINT n, IMMDevice **dev) { MMDevColImpl *This = impl_from_IMMDeviceCollection(iface); DWORD i = 0, j = 0; TRACE("(%p)->(%u, %p)\n", This, n, dev); if (!dev) return E_POINTER; for (j = 0; j < MMDevice_count; ++j) { MMDevice *cur = MMDevice_head[j]; if ((cur->flow == This->flow || This->flow == eAll) && (cur->state & This->state) && i++ == n) { *dev = &cur->IMMDevice_iface; IMMDevice_AddRef(*dev); return S_OK; } } WARN("Could not obtain item %u\n", n); *dev = NULL; return E_INVALIDARG; }
static HRESULT WINAPI MMDevEnum_GetDevice(IMMDeviceEnumerator *iface, const WCHAR *name, IMMDevice **device) { MMDevEnumImpl *This = impl_from_IMMDeviceEnumerator(iface); DWORD i=0; IMMDevice *dev = NULL; static const WCHAR wine_info_deviceW[] = {'W','i','n','e',' ', 'i','n','f','o',' ','d','e','v','i','c','e',0}; TRACE("(%p)->(%s,%p)\n", This, debugstr_w(name), device); if(!name || !device) return E_POINTER; if(!lstrcmpW(name, wine_info_deviceW)){ *device = &info_device; return S_OK; } for (i = 0; i < MMDevice_count; ++i) { HRESULT hr; WCHAR *str; dev = &MMDevice_head[i]->IMMDevice_iface; hr = IMMDevice_GetId(dev, &str); if (FAILED(hr)) { WARN("GetId failed: %08x\n", hr); continue; } if (str && !lstrcmpW(str, name)) { CoTaskMemFree(str); IMMDevice_AddRef(dev); *device = dev; return S_OK; } CoTaskMemFree(str); } TRACE("Could not find device %s\n", debugstr_w(name)); return E_INVALIDARG; }
static HRESULT WINAPI MMDevEnum_GetDefaultAudioEndpoint(IMMDeviceEnumerator *iface, EDataFlow flow, ERole role, IMMDevice **device) { MMDevEnumImpl *This = impl_from_IMMDeviceEnumerator(iface); TRACE("(%p)->(%u,%u,%p)\n", This, flow, role, device); if (!device) return E_POINTER; *device = NULL; if (flow == eRender) *device = &MMDevice_def_play->IMMDevice_iface; else if (flow == eCapture) *device = &MMDevice_def_rec->IMMDevice_iface; else { WARN("Unknown flow %u\n", flow); return E_INVALIDARG; } if (!*device) return E_NOTFOUND; IMMDevice_AddRef(*device); return S_OK; }
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; }
static ULONG WINAPI MMEndpoint_AddRef(IMMEndpoint *iface) { MMDevice *This = impl_from_IMMEndpoint(iface); TRACE("(%p)\n", This); return IMMDevice_AddRef(&This->IMMDevice_iface); }