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 ULONG WINAPI MMDevCol_AddRef(IMMDeviceCollection *iface) { MMDevColImpl *This = impl_from_IMMDeviceCollection(iface); LONG ref = InterlockedIncrement(&This->ref); TRACE("Refcount now %i\n", ref); return ref; }
static ULONG WINAPI MMDevCol_Release(IMMDeviceCollection *iface) { MMDevColImpl *This = impl_from_IMMDeviceCollection(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("Refcount now %i\n", ref); if (!ref) MMDevCol_Destroy(This); return ref; }
static HRESULT WINAPI MMDevCol_QueryInterface(IMMDeviceCollection *iface, REFIID riid, void **ppv) { MMDevColImpl *This = impl_from_IMMDeviceCollection(iface); if (!ppv) return E_POINTER; if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IMMDeviceCollection)) *ppv = This; else *ppv = NULL; if (!*ppv) return E_NOINTERFACE; IUnknown_AddRef((IUnknown*)*ppv); return S_OK; }
static HRESULT WINAPI MMDevCol_QueryInterface(IMMDeviceCollection *iface, REFIID riid, void **ppv) { MMDevColImpl *This = impl_from_IMMDeviceCollection(iface); TRACE("(%p)->(%s, %p)\n", This, debugstr_guid(riid), ppv); if (!ppv) return E_POINTER; if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IMMDeviceCollection)) *ppv = &This->IMMDeviceCollection_iface; else *ppv = NULL; if (!*ppv) return E_NOINTERFACE; IUnknown_AddRef((IUnknown*)*ppv); return S_OK; }
static HRESULT WINAPI MMDevCol_GetCount(IMMDeviceCollection *iface, UINT *numdevs) { MMDevColImpl *This = impl_from_IMMDeviceCollection(iface); DWORD i; TRACE("(%p)->(%p)\n", This, numdevs); if (!numdevs) return E_POINTER; *numdevs = 0; for (i = 0; i < MMDevice_count; ++i) { MMDevice *cur = MMDevice_head[i]; if ((cur->flow == This->flow || This->flow == eAll) && (cur->state & This->state)) ++(*numdevs); } return S_OK; }