[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