Christian Costa : dmsynth: Create default clock for SynthSink object and assign it to Synth object when callink SetSynthSink .

Alexandre Julliard julliard at winehq.org
Tue May 8 14:16:56 CDT 2012


Module: wine
Branch: master
Commit: 0ce9eb7ba5cc8c886cebd23fd29627c476ad649c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0ce9eb7ba5cc8c886cebd23fd29627c476ad649c

Author: Christian Costa <titan.costa at gmail.com>
Date:   Thu May  3 23:05:33 2012 +0200

dmsynth: Create default clock for SynthSink object and assign it to Synth object when callink SetSynthSink.

---

 dlls/dmsynth/dmsynth_private.h |    1 +
 dlls/dmsynth/synth.c           |   18 ++++++++++---
 dlls/dmsynth/synthsink.c       |   57 ++++++++++++++++++++++++++++++----------
 dlls/dmsynth/tests/dmsynth.c   |   18 +++++++-----
 4 files changed, 69 insertions(+), 25 deletions(-)

diff --git a/dlls/dmsynth/dmsynth_private.h b/dlls/dmsynth/dmsynth_private.h
index 1cc24ac..aec547a 100644
--- a/dlls/dmsynth/dmsynth_private.h
+++ b/dlls/dmsynth/dmsynth_private.h
@@ -76,6 +76,7 @@ struct IDirectMusicSynthSinkImpl {
     LONG ref;
 
     /* IDirectMusicSynthSinkImpl fields */
+    IReferenceClock* latency_clock;
 };
 
 /**********************************************************************
diff --git a/dlls/dmsynth/synth.c b/dlls/dmsynth/synth.c
index 952bb62..aadb72f 100644
--- a/dlls/dmsynth/synth.c
+++ b/dlls/dmsynth/synth.c
@@ -64,6 +64,8 @@ static ULONG WINAPI IDirectMusicSynth8Impl_Release(LPDIRECTMUSICSYNTH8 iface)
 	TRACE("(%p)->(ref before=%u)\n", This, refCount + 1);
 
 	if (!refCount) {
+		if (This->pLatencyClock)
+			IReferenceClock_Release(This->pLatencyClock);
 		HeapFree(GetProcessHeap(), 0, This);
 	}
 
@@ -160,9 +162,16 @@ static HRESULT WINAPI IDirectMusicSynth8Impl_GetLatencyClock(LPDIRECTMUSICSYNTH8
 {
     IDirectMusicSynth8Impl *This = impl_from_IDirectMusicSynth8(iface);
 
-    TRACE("(%p)->(%p)\n", This, clock);
+    TRACE("(%p)->(%p)\n", iface, clock);
+
+    if (!clock)
+        return E_POINTER;
+
+    if (!This->pSynthSink)
+        return DMUS_E_NOSYNTHSINK;
 
     *clock = This->pLatencyClock;
+    IReferenceClock_AddRef(This->pLatencyClock);
 
     return S_OK;
 }
@@ -182,10 +191,13 @@ static HRESULT WINAPI IDirectMusicSynth8Impl_SetSynthSink(LPDIRECTMUSICSYNTH8 if
 {
     IDirectMusicSynth8Impl *This = impl_from_IDirectMusicSynth8(iface);
 
-    TRACE("(%p)->(%p)\n", This, synth_sink);
+    TRACE("(%p)->(%p)\n", iface, synth_sink);
 
     This->pSynthSink = (IDirectMusicSynthSinkImpl*)synth_sink;
 
+    if (synth_sink)
+        return IDirectMusicSynthSink_GetLatencyClock(synth_sink, &This->pLatencyClock);
+
     return S_OK;
 }
 
@@ -337,8 +349,6 @@ HRESULT WINAPI DMUSIC_CreateDirectMusicSynthImpl (LPCGUID lpcGUID, LPVOID* ppobj
 	obj->pCaps.dwMaxAudioChannels = 2;
 	obj->pCaps.dwEffectFlags = DMUS_EFFECT_REVERB;
 	MultiByteToWideChar (CP_ACP, 0, "Microsoft Synthesizer", -1, obj->pCaps.wszDescription, sizeof(obj->pCaps.wszDescription)/sizeof(WCHAR));
-	/* assign latency clock */
-	/*DMUSIC_CreateReferenceClockImpl (&IID_IReferenceClock, (LPVOID*)&This->pLatencyClock, NULL); */
 
 	return IDirectMusicSynth8Impl_QueryInterface ((LPDIRECTMUSICSYNTH8)obj, lpcGUID, ppobj);
 }
diff --git a/dlls/dmsynth/synthsink.c b/dlls/dmsynth/synthsink.c
index 82ed894..268f6e8 100644
--- a/dlls/dmsynth/synthsink.c
+++ b/dlls/dmsynth/synthsink.c
@@ -19,6 +19,8 @@
  */
 
 #include "dmsynth_private.h"
+#include "initguid.h"
+#include "uuids.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(dmsynth);
 
@@ -63,6 +65,8 @@ static ULONG WINAPI IDirectMusicSynthSinkImpl_Release(LPDIRECTMUSICSYNTHSINK ifa
 	TRACE("(%p)->(ref before=%u)\n", This, refCount + 1);
 
 	if (!refCount) {
+		if (This->latency_clock)
+			IReferenceClock_Release(This->latency_clock);
 		HeapFree(GetProcessHeap(), 0, This);
 	}
 
@@ -94,7 +98,13 @@ static HRESULT WINAPI IDirectMusicSynthSinkImpl_GetLatencyClock(LPDIRECTMUSICSYN
 {
     IDirectMusicSynthSinkImpl *This = impl_from_IDirectMusicSynthSink(iface);
 
-    FIXME("(%p)->(%p): stub\n", This, clock);
+    TRACE("(%p)->(%p)\n", iface, clock);
+
+    if (!clock)
+        return E_POINTER;
+
+    *clock = This->latency_clock;
+    IReferenceClock_AddRef(This->latency_clock);
 
     return S_OK;
 }
@@ -159,17 +169,36 @@ static const IDirectMusicSynthSinkVtbl DirectMusicSynthSink_Vtbl = {
 };
 
 /* for ClassFactory */
-HRESULT WINAPI DMUSIC_CreateDirectMusicSynthSinkImpl (LPCGUID lpcGUID, LPVOID* ppobj, LPUNKNOWN pUnkOuter) {
-	IDirectMusicSynthSinkImpl *obj;
-	
-	TRACE("(%p,%p,%p)\n", lpcGUID, ppobj, pUnkOuter);
-	obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicSynthSinkImpl));
-	if (NULL == obj) {
-		*ppobj = NULL;
-		return E_OUTOFMEMORY;
-	}
-	obj->IDirectMusicSynthSink_iface.lpVtbl = &DirectMusicSynthSink_Vtbl;
-	obj->ref = 0;
-	
-	return IDirectMusicSynthSinkImpl_QueryInterface((LPDIRECTMUSICSYNTHSINK)obj, lpcGUID, ppobj);
+HRESULT WINAPI DMUSIC_CreateDirectMusicSynthSinkImpl(LPCGUID riid, LPVOID* ret_iface, LPUNKNOWN unkouter)
+{
+    IDirectMusicSynthSinkImpl *obj;
+    HRESULT hr;
+
+    TRACE("(%p,%p,%p)\n", riid, ret_iface, unkouter);
+
+    *ret_iface = NULL;
+
+    obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectMusicSynthSinkImpl));
+    if (!obj)
+        return E_OUTOFMEMORY;
+
+    obj->IDirectMusicSynthSink_iface.lpVtbl = &DirectMusicSynthSink_Vtbl;
+    obj->ref = 0;
+
+    hr = CoCreateInstance(&CLSID_SystemClock, NULL, CLSCTX_INPROC_SERVER, &IID_IReferenceClock, (LPVOID*)&obj->latency_clock);
+    if (FAILED(hr))
+    {
+        HeapFree(GetProcessHeap(), 0, obj);
+        return hr;
+    }
+
+    hr = IDirectMusicSynthSinkImpl_QueryInterface((LPDIRECTMUSICSYNTHSINK)obj, riid, ret_iface);
+    if (FAILED(hr))
+    {
+        IReferenceClock_Release(obj->latency_clock);
+        HeapFree(GetProcessHeap(), 0, obj);
+        return hr;
+    }
+
+    return S_OK;
 }
diff --git a/dlls/dmsynth/tests/dmsynth.c b/dlls/dmsynth/tests/dmsynth.c
index 161018e..df67cd4 100644
--- a/dlls/dmsynth/tests/dmsynth.c
+++ b/dlls/dmsynth/tests/dmsynth.c
@@ -33,7 +33,7 @@ static void test_dmsynth(void)
 {
     IDirectMusicSynth *dmsynth = NULL;
     IDirectMusicSynthSink *dmsynth_sink = NULL;
-    IReferenceClock* clock = NULL;
+    IReferenceClock* clock_synth = NULL;
     IReferenceClock* clock_sink = NULL;
     HRESULT hr;
 
@@ -48,24 +48,28 @@ static void test_dmsynth(void)
     ok(hr == S_OK, "CoCreateInstance returned: %x\n", hr);
 
     /* Synth has no default clock */
-    hr = IDirectMusicSynth_GetLatencyClock(dmsynth, &clock);
-    todo_wine ok(hr == DMUS_E_NOSYNTHSINK, "IDirectMusicSynth_GetLatencyClock returned: %x\n", hr);
+    hr = IDirectMusicSynth_GetLatencyClock(dmsynth, &clock_synth);
+    ok(hr == DMUS_E_NOSYNTHSINK, "IDirectMusicSynth_GetLatencyClock returned: %x\n", hr);
 
     /* SynthSink has a default clock */
     hr = IDirectMusicSynthSink_GetLatencyClock(dmsynth_sink, &clock_sink);
     ok(hr == S_OK, "IDirectMusicSynth_GetLatencyClock returned: %x\n", hr);
-    todo_wine ok(clock_sink != NULL, "No clock returned\n");
+    ok(clock_sink != NULL, "No clock returned\n");
 
     /* This will set clock to Synth */
     hr = IDirectMusicSynth_SetSynthSink(dmsynth, dmsynth_sink);
     ok(hr == S_OK, "IDirectMusicSynth_SetSynthSink returned: %x\n", hr);
 
     /* Check clocks are the same */
-    hr = IDirectMusicSynth_GetLatencyClock(dmsynth, &clock);
+    hr = IDirectMusicSynth_GetLatencyClock(dmsynth, &clock_synth);
     ok(hr == S_OK, "IDirectMusicSynth_GetLatencyClock returned: %x\n", hr);
-    todo_wine ok(clock != NULL, "No clock returned\n");
-    ok(clock == clock_sink, "Synth and SynthSink clocks are not the same\n");
+    ok(clock_synth != NULL, "No clock returned\n");
+    ok(clock_synth == clock_sink, "Synth and SynthSink clocks are not the same\n");
 
+    if (clock_synth)
+        IReferenceClock_Release(clock_synth);
+    if (clock_sink)
+        IReferenceClock_Release(clock_sink);
     if (dmsynth_sink)
         IDirectMusicSynthSink_Release(dmsynth_sink);
     IDirectMusicSynth_Release(dmsynth);




More information about the wine-cvs mailing list