[PATCH 2/4] dmusic: Implement IDirectMusicPort_GetLatencyClock() for the midi port

Michael Stefaniuc mstefani at winehq.org
Sun Aug 19 17:01:35 CDT 2018


Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
---
 dlls/dmusic/port.c | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

diff --git a/dlls/dmusic/port.c b/dlls/dmusic/port.c
index 2f8fb9288c..ebc8506769 100644
--- a/dlls/dmusic/port.c
+++ b/dlls/dmusic/port.c
@@ -907,6 +907,7 @@ HRESULT synth_port_create(IDirectMusic8Impl *parent, DMUS_PORTPARAMS *port_param
 struct midi_port {
     IDirectMusicPort IDirectMusicPort_iface;
     LONG ref;
+    IReferenceClock *clock;
 };
 
 static inline struct midi_port *impl_from_IDirectMusicPort(IDirectMusicPort *iface)
@@ -949,8 +950,11 @@ static ULONG WINAPI midi_IDirectMusicPort_Release(IDirectMusicPort *iface)
 
     TRACE("(%p) ref = %u\n", iface, ref);
 
-    if (!ref)
+    if (!ref) {
+        if (This->clock)
+            IReferenceClock_Release(This->clock);
         heap_free(This);
+    }
 
     return ref;
 }
@@ -999,9 +1003,17 @@ static HRESULT WINAPI midi_IDirectMusicPort_UnloadInstrument(IDirectMusicPort *i
 static HRESULT WINAPI midi_IDirectMusicPort_GetLatencyClock(IDirectMusicPort *iface,
         IReferenceClock **clock)
 {
-    FIXME("(%p, %p) stub!\n", iface, clock);
+    struct midi_port *This = impl_from_IDirectMusicPort(iface);
 
-    return E_NOTIMPL;
+    TRACE("(%p, %p)\n", iface, clock);
+
+    if (!clock)
+        return E_POINTER;
+
+    *clock = This->clock;
+    IReferenceClock_AddRef(*clock);
+
+    return S_OK;
 }
 
 static HRESULT WINAPI midi_IDirectMusicPort_GetRunningStats(IDirectMusicPort *iface,
@@ -1118,6 +1130,7 @@ HRESULT midi_out_port_create(IDirectMusic8Impl *parent, DMUS_PORTPARAMS *port_pa
         DMUS_PORTCAPS *port_caps, IDirectMusicPort **port)
 {
     struct midi_port *obj;
+    HRESULT hr;
 
     TRACE("(%p, %p, %p)\n", port_params, port_caps, port);
 
@@ -1127,6 +1140,12 @@ HRESULT midi_out_port_create(IDirectMusic8Impl *parent, DMUS_PORTPARAMS *port_pa
     obj->IDirectMusicPort_iface.lpVtbl = &midi_port_vtbl;
     obj->ref = 1;
 
+    hr = DMUSIC_CreateReferenceClockImpl(&IID_IReferenceClock, (void **)&obj->clock, NULL);
+    if (hr != S_OK) {
+        HeapFree(GetProcessHeap(), 0, obj);
+        return hr;
+    }
+
     *port = &obj->IDirectMusicPort_iface;
 
     return S_OK;
-- 
2.14.4




More information about the wine-devel mailing list