Commit 00d19159 authored by Michael Stefaniuc's avatar Michael Stefaniuc Committed by Alexandre Julliard

mmdevapi: Use ifaces instead of vtbl pointers in MMDevice.

parent f0b20ad4
...@@ -171,8 +171,8 @@ static void MMDevice_Create(MMDevice **dev, WCHAR *name, GUID *id, EDataFlow flo ...@@ -171,8 +171,8 @@ static void MMDevice_Create(MMDevice **dev, WCHAR *name, GUID *id, EDataFlow flo
return; return;
} }
lstrcpyW(cur->alname, name); lstrcpyW(cur->alname, name);
cur->lpVtbl = &MMDeviceVtbl; cur->IMMDevice_iface.lpVtbl = &MMDeviceVtbl;
cur->lpEndpointVtbl = &MMEndpointVtbl; cur->IMMEndpoint_iface.lpVtbl = &MMEndpointVtbl;
cur->ref = 0; cur->ref = 0;
InitializeCriticalSection(&cur->crst); InitializeCriticalSection(&cur->crst);
cur->crst.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": MMDevice.crst"); cur->crst.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": MMDevice.crst");
...@@ -246,9 +246,14 @@ static void MMDevice_Destroy(MMDevice *This) ...@@ -246,9 +246,14 @@ static void MMDevice_Destroy(MMDevice *This)
HeapFree(GetProcessHeap(), 0, This); HeapFree(GetProcessHeap(), 0, This);
} }
static inline MMDevice *impl_from_IMMDevice(IMMDevice *iface)
{
return CONTAINING_RECORD(iface, MMDevice, IMMDevice_iface);
}
static HRESULT WINAPI MMDevice_QueryInterface(IMMDevice *iface, REFIID riid, void **ppv) static HRESULT WINAPI MMDevice_QueryInterface(IMMDevice *iface, REFIID riid, void **ppv)
{ {
MMDevice *This = (MMDevice *)iface; MMDevice *This = impl_from_IMMDevice(iface);
TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ppv); TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(riid), ppv);
if (!ppv) if (!ppv)
...@@ -258,7 +263,7 @@ static HRESULT WINAPI MMDevice_QueryInterface(IMMDevice *iface, REFIID riid, voi ...@@ -258,7 +263,7 @@ static HRESULT WINAPI MMDevice_QueryInterface(IMMDevice *iface, REFIID riid, voi
|| IsEqualIID(riid, &IID_IMMDevice)) || IsEqualIID(riid, &IID_IMMDevice))
*ppv = This; *ppv = This;
else if (IsEqualIID(riid, &IID_IMMEndpoint)) else if (IsEqualIID(riid, &IID_IMMEndpoint))
*ppv = &This->lpEndpointVtbl; *ppv = &This->IMMEndpoint_iface;
if (*ppv) if (*ppv)
{ {
IUnknown_AddRef((IUnknown*)*ppv); IUnknown_AddRef((IUnknown*)*ppv);
...@@ -270,7 +275,7 @@ static HRESULT WINAPI MMDevice_QueryInterface(IMMDevice *iface, REFIID riid, voi ...@@ -270,7 +275,7 @@ static HRESULT WINAPI MMDevice_QueryInterface(IMMDevice *iface, REFIID riid, voi
static ULONG WINAPI MMDevice_AddRef(IMMDevice *iface) static ULONG WINAPI MMDevice_AddRef(IMMDevice *iface)
{ {
MMDevice *This = (MMDevice *)iface; MMDevice *This = impl_from_IMMDevice(iface);
LONG ref; LONG ref;
ref = InterlockedIncrement(&This->ref); ref = InterlockedIncrement(&This->ref);
...@@ -280,7 +285,7 @@ static ULONG WINAPI MMDevice_AddRef(IMMDevice *iface) ...@@ -280,7 +285,7 @@ static ULONG WINAPI MMDevice_AddRef(IMMDevice *iface)
static ULONG WINAPI MMDevice_Release(IMMDevice *iface) static ULONG WINAPI MMDevice_Release(IMMDevice *iface)
{ {
MMDevice *This = (MMDevice *)iface; MMDevice *This = impl_from_IMMDevice(iface);
LONG ref; LONG ref;
ref = InterlockedDecrement(&This->ref); ref = InterlockedDecrement(&This->ref);
...@@ -293,7 +298,7 @@ static HRESULT WINAPI MMDevice_Activate(IMMDevice *iface, REFIID riid, DWORD cls ...@@ -293,7 +298,7 @@ static HRESULT WINAPI MMDevice_Activate(IMMDevice *iface, REFIID riid, DWORD cls
HRESULT hr = E_NOINTERFACE; HRESULT hr = E_NOINTERFACE;
#ifdef HAVE_OPENAL #ifdef HAVE_OPENAL
MMDevice *This = (MMDevice *)iface; MMDevice *This = impl_from_IMMDevice(iface);
TRACE("(%p)->(%p,%x,%p,%p)\n", iface, riid, clsctx, params, ppv); TRACE("(%p)->(%p,%x,%p,%p)\n", iface, riid, clsctx, params, ppv);
...@@ -385,7 +390,7 @@ static HRESULT WINAPI MMDevice_Activate(IMMDevice *iface, REFIID riid, DWORD cls ...@@ -385,7 +390,7 @@ static HRESULT WINAPI MMDevice_Activate(IMMDevice *iface, REFIID riid, DWORD cls
static HRESULT WINAPI MMDevice_OpenPropertyStore(IMMDevice *iface, DWORD access, IPropertyStore **ppv) static HRESULT WINAPI MMDevice_OpenPropertyStore(IMMDevice *iface, DWORD access, IPropertyStore **ppv)
{ {
MMDevice *This = (MMDevice *)iface; MMDevice *This = impl_from_IMMDevice(iface);
TRACE("(%p)->(%x,%p)\n", This, access, ppv); TRACE("(%p)->(%x,%p)\n", This, access, ppv);
if (!ppv) if (!ppv)
...@@ -395,7 +400,7 @@ static HRESULT WINAPI MMDevice_OpenPropertyStore(IMMDevice *iface, DWORD access, ...@@ -395,7 +400,7 @@ static HRESULT WINAPI MMDevice_OpenPropertyStore(IMMDevice *iface, DWORD access,
static HRESULT WINAPI MMDevice_GetId(IMMDevice *iface, WCHAR **itemid) static HRESULT WINAPI MMDevice_GetId(IMMDevice *iface, WCHAR **itemid)
{ {
MMDevice *This = (MMDevice *)iface; MMDevice *This = impl_from_IMMDevice(iface);
WCHAR *str; WCHAR *str;
GUID *id = &This->devguid; GUID *id = &This->devguid;
static const WCHAR formatW[] = { '{','0','.','0','.','0','.','0','0','0','0','0','0','0','0','}','.', static const WCHAR formatW[] = { '{','0','.','0','.','0','.','0','0','0','0','0','0','0','0','}','.',
...@@ -418,7 +423,7 @@ static HRESULT WINAPI MMDevice_GetId(IMMDevice *iface, WCHAR **itemid) ...@@ -418,7 +423,7 @@ static HRESULT WINAPI MMDevice_GetId(IMMDevice *iface, WCHAR **itemid)
static HRESULT WINAPI MMDevice_GetState(IMMDevice *iface, DWORD *state) static HRESULT WINAPI MMDevice_GetState(IMMDevice *iface, DWORD *state)
{ {
MMDevice *This = (MMDevice *)iface; MMDevice *This = impl_from_IMMDevice(iface);
TRACE("(%p)->(%p)\n", iface, state); TRACE("(%p)->(%p)\n", iface, state);
if (!state) if (!state)
...@@ -438,32 +443,32 @@ static const IMMDeviceVtbl MMDeviceVtbl = ...@@ -438,32 +443,32 @@ static const IMMDeviceVtbl MMDeviceVtbl =
MMDevice_GetState MMDevice_GetState
}; };
static MMDevice *get_this_from_endpoint(IMMEndpoint *iface) static inline MMDevice *impl_from_IMMEndpoint(IMMEndpoint *iface)
{ {
return (MMDevice*)((char*)iface - offsetof(MMDevice,lpEndpointVtbl)); return CONTAINING_RECORD(iface, MMDevice, IMMEndpoint_iface);
} }
static HRESULT WINAPI MMEndpoint_QueryInterface(IMMEndpoint *iface, REFIID riid, void **ppv) static HRESULT WINAPI MMEndpoint_QueryInterface(IMMEndpoint *iface, REFIID riid, void **ppv)
{ {
MMDevice *This = get_this_from_endpoint(iface); MMDevice *This = impl_from_IMMEndpoint(iface);
return IMMDevice_QueryInterface((IMMDevice*)This, riid, ppv); return IMMDevice_QueryInterface(&This->IMMDevice_iface, riid, ppv);
} }
static ULONG WINAPI MMEndpoint_AddRef(IMMEndpoint *iface) static ULONG WINAPI MMEndpoint_AddRef(IMMEndpoint *iface)
{ {
MMDevice *This = get_this_from_endpoint(iface); MMDevice *This = impl_from_IMMEndpoint(iface);
return IMMDevice_AddRef((IMMDevice*)This); return IMMDevice_AddRef(&This->IMMDevice_iface);
} }
static ULONG WINAPI MMEndpoint_Release(IMMEndpoint *iface) static ULONG WINAPI MMEndpoint_Release(IMMEndpoint *iface)
{ {
MMDevice *This = get_this_from_endpoint(iface); MMDevice *This = impl_from_IMMEndpoint(iface);
return IMMDevice_Release((IMMDevice*)This); return IMMDevice_Release(&This->IMMDevice_iface);
} }
static HRESULT WINAPI MMEndpoint_GetDataFlow(IMMEndpoint *iface, EDataFlow *flow) static HRESULT WINAPI MMEndpoint_GetDataFlow(IMMEndpoint *iface, EDataFlow *flow)
{ {
MMDevice *This = get_this_from_endpoint(iface); MMDevice *This = impl_from_IMMEndpoint(iface);
if (!flow) if (!flow)
return E_POINTER; return E_POINTER;
*flow = This->flow; *flow = This->flow;
...@@ -570,7 +575,7 @@ static HRESULT WINAPI MMDevCol_Item(IMMDeviceCollection *iface, UINT n, IMMDevic ...@@ -570,7 +575,7 @@ static HRESULT WINAPI MMDevCol_Item(IMMDeviceCollection *iface, UINT n, IMMDevic
&& (cur->state & This->state) && (cur->state & This->state)
&& i++ == n) && i++ == n)
{ {
*dev = (IMMDevice *)cur; *dev = &cur->IMMDevice_iface;
IMMDevice_AddRef(*dev); IMMDevice_AddRef(*dev);
return S_OK; return S_OK;
} }
...@@ -1059,9 +1064,9 @@ static HRESULT WINAPI MMDevEnum_GetDefaultAudioEndpoint(IMMDeviceEnumerator *ifa ...@@ -1059,9 +1064,9 @@ static HRESULT WINAPI MMDevEnum_GetDefaultAudioEndpoint(IMMDeviceEnumerator *ifa
*device = NULL; *device = NULL;
if (flow == eRender) if (flow == eRender)
*device = (IMMDevice*)MMDevice_def_play; *device = &MMDevice_def_play->IMMDevice_iface;
else if (flow == eCapture) else if (flow == eCapture)
*device = (IMMDevice*)MMDevice_def_rec; *device = &MMDevice_def_rec->IMMDevice_iface;
else else
{ {
WARN("Unknown flow %u\n", flow); WARN("Unknown flow %u\n", flow);
...@@ -1084,7 +1089,7 @@ static HRESULT WINAPI MMDevEnum_GetDevice(IMMDeviceEnumerator *iface, const WCHA ...@@ -1084,7 +1089,7 @@ static HRESULT WINAPI MMDevEnum_GetDevice(IMMDeviceEnumerator *iface, const WCHA
for (i = 0; i < MMDevice_count; ++i) for (i = 0; i < MMDevice_count; ++i)
{ {
WCHAR *str; WCHAR *str;
dev = (IMMDevice*)MMDevice_head[i]; dev = &MMDevice_head[i]->IMMDevice_iface;
IMMDevice_GetId(dev, &str); IMMDevice_GetId(dev, &str);
if (str && !lstrcmpW(str, name)) if (str && !lstrcmpW(str, name))
......
...@@ -27,8 +27,8 @@ extern HRESULT MMDevice_GetPropValue(const GUID *devguid, DWORD flow, REFPROPERT ...@@ -27,8 +27,8 @@ extern HRESULT MMDevice_GetPropValue(const GUID *devguid, DWORD flow, REFPROPERT
extern HRESULT MMDevice_SetPropValue(const GUID *devguid, DWORD flow, REFPROPERTYKEY key, REFPROPVARIANT pv); extern HRESULT MMDevice_SetPropValue(const GUID *devguid, DWORD flow, REFPROPERTYKEY key, REFPROPVARIANT pv);
typedef struct MMDevice { typedef struct MMDevice {
const IMMDeviceVtbl *lpVtbl; IMMDevice IMMDevice_iface;
const IMMEndpointVtbl *lpEndpointVtbl; IMMEndpoint IMMEndpoint_iface;
LONG ref; LONG ref;
CRITICAL_SECTION crst; CRITICAL_SECTION crst;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment