Module: wine Branch: master Commit: 9d79ca02d3cb2822dad7dc89c519ddf226fc3381 URL: http://source.winehq.org/git/wine.git/?a=commit;h=9d79ca02d3cb2822dad7dc89c5...
Author: Jeff Klein jeffrey.a.klein@gmail.com Date: Thu Aug 1 21:54:20 2013 -0400
winecoreaudio.drv: Implement IMarshal for IAudioClient.
---
dlls/winecoreaudio.drv/mmdevdrv.c | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index d4250a7..ab3c2c9 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -120,6 +120,7 @@ struct ACImpl { LONG ref;
IMMDevice *parent; + IUnknown *pUnkFTMarshal;
WAVEFORMATEX *fmt;
@@ -599,6 +600,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient ACImpl *This; AudioDeviceID adevid; EDataFlow dataflow; + HRESULT hr;
TRACE("%s %p %p\n", debugstr_guid(guid), dev, out);
@@ -629,6 +631,13 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient
This->lock = 0;
+ hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient_iface, + (IUnknown **)&This->pUnkFTMarshal); + if (FAILED(hr)) { + HeapFree(GetProcessHeap(), 0, This); + return hr; + } + This->parent = dev; IMMDevice_AddRef(This->parent);
@@ -744,6 +753,7 @@ static void avail_update(ACImpl *This) static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient *iface, REFIID riid, void **ppv) { + ACImpl *This = impl_from_IAudioClient(iface); TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
if(!ppv) @@ -751,6 +761,9 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient *iface, *ppv = NULL; if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IAudioClient)) *ppv = iface; + else if(IsEqualIID(riid, &IID_IMarshal)) + return IUnknown_QueryInterface(This->pUnkFTMarshal, riid, ppv); + if(*ppv){ IUnknown_AddRef((IUnknown*)*ppv); return S_OK; @@ -808,6 +821,7 @@ static ULONG WINAPI AudioClient_Release(IAudioClient *iface) HeapFree(GetProcessHeap(), 0, This->vols); CoTaskMemFree(This->fmt); IMMDevice_Release(This->parent); + IUnknown_Release(This->pUnkFTMarshal); HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -1936,6 +1950,7 @@ static const IAudioClientVtbl AudioClient_Vtbl = static HRESULT WINAPI AudioRenderClient_QueryInterface( IAudioRenderClient *iface, REFIID riid, void **ppv) { + ACImpl *This = impl_from_IAudioRenderClient(iface); TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
if(!ppv) @@ -1945,6 +1960,9 @@ static HRESULT WINAPI AudioRenderClient_QueryInterface( if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IAudioRenderClient)) *ppv = iface; + else if(IsEqualIID(riid, &IID_IMarshal)) + return IUnknown_QueryInterface(This->pUnkFTMarshal, riid, ppv); + if(*ppv){ IUnknown_AddRef((IUnknown*)*ppv); return S_OK; @@ -2153,6 +2171,7 @@ static const IAudioRenderClientVtbl AudioRenderClient_Vtbl = { static HRESULT WINAPI AudioCaptureClient_QueryInterface( IAudioCaptureClient *iface, REFIID riid, void **ppv) { + ACImpl *This = impl_from_IAudioCaptureClient(iface); TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
if(!ppv) @@ -2162,6 +2181,9 @@ static HRESULT WINAPI AudioCaptureClient_QueryInterface( if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IAudioCaptureClient)) *ppv = iface; + else if(IsEqualIID(riid, &IID_IMarshal)) + return IUnknown_QueryInterface(This->pUnkFTMarshal, riid, ppv); + if(*ppv){ IUnknown_AddRef((IUnknown*)*ppv); return S_OK;