[PATCH 5/6] winepulse: add support for IMarshal
Andrew Eikum
aeikum at codeweavers.com
Mon Nov 2 11:54:51 CST 2015
From: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Based On Jeff Klein's patches for the other drivers.
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
---
At this point, winepulse passes all audio tests on my machines except
for mmdevapi/capture, where it passes a couple todo_wine tests that
the other drivers fail. The next patch adds a workaround for those
tests until the other drivers can pass them, too.
dlls/winepulse.drv/mmdevdrv.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/dlls/winepulse.drv/mmdevdrv.c b/dlls/winepulse.drv/mmdevdrv.c
index c312f62..2760552 100644
--- a/dlls/winepulse.drv/mmdevdrv.c
+++ b/dlls/winepulse.drv/mmdevdrv.c
@@ -157,6 +157,7 @@ struct ACImpl {
IAudioClock IAudioClock_iface;
IAudioClock2 IAudioClock2_iface;
IAudioStreamVolume IAudioStreamVolume_iface;
+ IUnknown *marshal;
IMMDevice *parent;
struct list entry;
float vol[PA_CHANNELS_MAX];
@@ -834,6 +835,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient
ACImpl *This;
int i;
EDataFlow dataflow;
+ HRESULT hr;
TRACE("%s %p %p\n", debugstr_guid(guid), dev, out);
if (IsEqualGUID(guid, &pulse_render_guid))
@@ -859,6 +861,12 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient
This->parent = dev;
for (i = 0; i < PA_CHANNELS_MAX; ++i)
This->vol[i] = 1.f;
+
+ hr = CoCreateFreeThreadedMarshaler((IUnknown*)This, &This->marshal);
+ if (hr) {
+ HeapFree(GetProcessHeap(), 0, This);
+ return hr;
+ }
IMMDevice_AddRef(This->parent);
*out = &This->IAudioClient_iface;
@@ -870,10 +878,13 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient
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)
return E_POINTER;
+
*ppv = NULL;
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IAudioClient))
*ppv = iface;
@@ -881,6 +892,10 @@ static HRESULT WINAPI AudioClient_QueryInterface(IAudioClient *iface,
IUnknown_AddRef((IUnknown*)*ppv);
return S_OK;
}
+
+ if (IsEqualIID(riid, &IID_IMarshal))
+ return IUnknown_QueryInterface(This->marshal, riid, ppv);
+
WARN("Unknown interface %s\n", debugstr_guid(riid));
return E_NOINTERFACE;
}
@@ -913,6 +928,7 @@ static ULONG WINAPI AudioClient_Release(IAudioClient *iface)
list_remove(&This->entry);
pthread_mutex_unlock(&pulse_lock);
}
+ IUnknown_Release(This->marshal);
IMMDevice_Release(This->parent);
HeapFree(GetProcessHeap(), 0, This->tmp_buffer);
HeapFree(GetProcessHeap(), 0, This);
@@ -1853,6 +1869,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)
@@ -1867,6 +1884,9 @@ static HRESULT WINAPI AudioRenderClient_QueryInterface(
return S_OK;
}
+ if (IsEqualIID(riid, &IID_IMarshal))
+ return IUnknown_QueryInterface(This->marshal, riid, ppv);
+
WARN("Unknown interface %s\n", debugstr_guid(riid));
return E_NOINTERFACE;
}
@@ -1991,6 +2011,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)
@@ -2005,6 +2026,9 @@ static HRESULT WINAPI AudioCaptureClient_QueryInterface(
return S_OK;
}
+ if (IsEqualIID(riid, &IID_IMarshal))
+ return IUnknown_QueryInterface(This->marshal, riid, ppv);
+
WARN("Unknown interface %s\n", debugstr_guid(riid));
return E_NOINTERFACE;
}
@@ -2145,6 +2169,9 @@ static HRESULT WINAPI AudioClock_QueryInterface(IAudioClock *iface,
return S_OK;
}
+ if (IsEqualIID(riid, &IID_IMarshal))
+ return IUnknown_QueryInterface(This->marshal, riid, ppv);
+
WARN("Unknown interface %s\n", debugstr_guid(riid));
return E_NOINTERFACE;
}
@@ -2280,6 +2307,8 @@ static const IAudioClock2Vtbl AudioClock2_Vtbl =
static HRESULT WINAPI AudioStreamVolume_QueryInterface(
IAudioStreamVolume *iface, REFIID riid, void **ppv)
{
+ ACImpl *This = impl_from_IAudioStreamVolume(iface);
+
TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv);
if (!ppv)
@@ -2294,6 +2323,9 @@ static HRESULT WINAPI AudioStreamVolume_QueryInterface(
return S_OK;
}
+ if (IsEqualIID(riid, &IID_IMarshal))
+ return IUnknown_QueryInterface(This->marshal, riid, ppv);
+
WARN("Unknown interface %s\n", debugstr_guid(riid));
return E_NOINTERFACE;
}
--
2.6.2
More information about the wine-patches
mailing list