diff --git a/dlls/dmsynth/dmsynth_private.h b/dlls/dmsynth/dmsynth_private.h index 2a2e88c8e88..aabf1f56904 100644 --- a/dlls/dmsynth/dmsynth_private.h +++ b/dlls/dmsynth/dmsynth_private.h @@ -77,6 +77,7 @@ struct IDirectMusicSynthSinkImpl { LONG ref; IReferenceClock *latency_clock; IReferenceClock *master_clock; + IDirectMusicSynth *synth; /* No reference hold! */ BOOL active; }; diff --git a/dlls/dmsynth/synthsink.c b/dlls/dmsynth/synthsink.c index 72fd671a415..9d7096a032b 100644 --- a/dlls/dmsynth/synthsink.c +++ b/dlls/dmsynth/synthsink.c @@ -96,7 +96,11 @@ static HRESULT WINAPI IDirectMusicSynthSinkImpl_Init(IDirectMusicSynthSink *ifac { IDirectMusicSynthSinkImpl *This = impl_from_IDirectMusicSynthSink(iface); - FIXME("(%p)->(%p): stub\n", This, synth); + TRACE("(%p)->(%p)\n", This, synth); + + /* Not holding a reference to avoid circular dependencies. + The synth will release the sink during the synth's destruction. */ + This->synth = synth; return S_OK; } diff --git a/dlls/dmsynth/tests/dmsynth.c b/dlls/dmsynth/tests/dmsynth.c index 1e3e20829b7..e27d8abdb26 100644 --- a/dlls/dmsynth/tests/dmsynth.c +++ b/dlls/dmsynth/tests/dmsynth.c @@ -131,6 +131,8 @@ static void test_dmsynth(void) ref_clock_sink = get_refcount(clock_sink); /* This will Init() the SynthSink and finish initializing the Synth */ + hr = IDirectMusicSynthSink_Init(dmsynth_sink2, NULL); + ok(hr == S_OK, "IDirectMusicSynthSink_Init returned: %x\n", hr); hr = IDirectMusicSynth_SetSynthSink(dmsynth, dmsynth_sink2); ok(hr == S_OK, "IDirectMusicSynth_SetSynthSink returned: %x\n", hr); hr = IDirectMusicSynth_SetSynthSink(dmsynth, dmsynth_sink); diff --git a/dlls/dmusic/port.c b/dlls/dmusic/port.c index 31b3b764e02..7fe72563bb0 100644 --- a/dlls/dmusic/port.c +++ b/dlls/dmusic/port.c @@ -195,10 +195,10 @@ static ULONG WINAPI synth_port_Release(IDirectMusicPort *iface) if (!ref) { dmusic_remove_port(This->parent, iface); + IDirectMusicSynthSink_Release(This->synth_sink); IDirectMusicSynth_Activate(This->synth, FALSE); IDirectMusicSynth_Close(This->synth); IDirectMusicSynth_Release(This->synth); - IDirectMusicSynthSink_Release(This->synth_sink); if (This->dsbuffer) IDirectSoundBuffer_Release(This->dsbuffer); if (This->dsound)