Module: wine Branch: master Commit: 99f3ee3804b85226e7df8332f49747dc6c43928f URL: http://source.winehq.org/git/wine.git/?a=commit;h=99f3ee3804b85226e7df8332f4...
Author: Maarten Lankhorst m.b.lankhorst@gmail.com Date: Sun Feb 21 14:16:20 2010 +0100
mmdevapi: Add IMMEndpoint to IMMDevice.
---
dlls/mmdevapi/devenum.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- dlls/mmdevapi/mmdevapi.h | 1 + 2 files changed, 45 insertions(+), 1 deletions(-)
diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c index 452384b..32a337a 100644 --- a/dlls/mmdevapi/devenum.c +++ b/dlls/mmdevapi/devenum.c @@ -84,7 +84,7 @@ static const IMMDeviceEnumeratorVtbl MMDevEnumVtbl; static const IMMDeviceCollectionVtbl MMDevColVtbl; static const IMMDeviceVtbl MMDeviceVtbl; static const IPropertyStoreVtbl MMDevPropVtbl; - +static const IMMEndpointVtbl MMEndpointVtbl;
typedef struct MMDevColImpl { @@ -138,6 +138,7 @@ static void MMDevice_Create(WCHAR *name, GUID *id, EDataFlow flow, DWORD state, } lstrcpyW(cur->alname, name); cur->lpVtbl = &MMDeviceVtbl; + cur->lpEndpointVtbl = &MMEndpointVtbl; cur->ref = 0; InitializeCriticalSection(&cur->crst); cur->crst.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": MMDevice.crst"); @@ -215,6 +216,8 @@ static HRESULT WINAPI MMDevice_QueryInterface(IMMDevice *iface, REFIID riid, voi if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IMMDevice)) *ppv = This; + else if (IsEqualIID(riid, &IID_IMMEndpoint)) + *ppv = &This->lpEndpointVtbl; if (*ppv) { IUnknown_AddRef((IUnknown*)*ppv); @@ -303,6 +306,46 @@ static const IMMDeviceVtbl MMDeviceVtbl = MMDevice_GetState };
+static MMDevice *get_this_from_endpoint(IMMEndpoint *iface) +{ + return (MMDevice*)((char*)iface - offsetof(MMDevice,lpEndpointVtbl)); +} + +static HRESULT WINAPI MMEndpoint_QueryInterface(IMMEndpoint *iface, REFIID riid, void **ppv) +{ + MMDevice *This = get_this_from_endpoint(iface); + return IMMDevice_QueryInterface((IMMDevice*)This, riid, ppv); +} + +static ULONG WINAPI MMEndpoint_AddRef(IMMEndpoint *iface) +{ + MMDevice *This = get_this_from_endpoint(iface); + return IMMDevice_AddRef((IMMDevice*)This); +} + +static ULONG WINAPI MMEndpoint_Release(IMMEndpoint *iface) +{ + MMDevice *This = get_this_from_endpoint(iface); + return IMMDevice_Release((IMMDevice*)This); +} + +static HRESULT WINAPI MMEndpoint_GetDataFlow(IMMEndpoint *iface, EDataFlow *flow) +{ + MMDevice *This = get_this_from_endpoint(iface); + if (!flow) + return E_POINTER; + *flow = This->flow; + return S_OK; +} + +static const IMMEndpointVtbl MMEndpointVtbl = +{ + MMEndpoint_QueryInterface, + MMEndpoint_AddRef, + MMEndpoint_Release, + MMEndpoint_GetDataFlow +}; + static HRESULT MMDevCol_Create(IMMDeviceCollection **ppv, EDataFlow flow, DWORD state) { MMDevColImpl *This; diff --git a/dlls/mmdevapi/mmdevapi.h b/dlls/mmdevapi/mmdevapi.h index 15ba4ae..cc4b3f2 100644 --- a/dlls/mmdevapi/mmdevapi.h +++ b/dlls/mmdevapi/mmdevapi.h @@ -24,6 +24,7 @@ extern HRESULT MMDevice_SetPropValue(const GUID *devguid, DWORD flow, REFPROPERT
typedef struct MMDevice { const IMMDeviceVtbl *lpVtbl; + const IMMEndpointVtbl *lpEndpointVtbl; LONG ref;
CRITICAL_SECTION crst;