[PATCH 5/6] dmusic: Partially implement the synth IDirectMusicPort::SetDirectSound()
Michael Stefaniuc
mstefani at winehq.org
Wed May 10 07:44:02 CDT 2017
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>
---
dlls/dmusic/port.c | 41 ++++++++++++++++++++++++++++++++++-------
dlls/dmusic/tests/dmusic.c | 18 +++++++++---------
2 files changed, 43 insertions(+), 16 deletions(-)
diff --git a/dlls/dmusic/port.c b/dlls/dmusic/port.c
index 577fb0a..1bff721 100644
--- a/dlls/dmusic/port.c
+++ b/dlls/dmusic/port.c
@@ -31,11 +31,12 @@ typedef struct SynthPortImpl {
IKsControl IKsControl_iface;
LONG ref;
IDirectMusic8Impl *parent;
- IDirectSound *pDirectSound;
+ IDirectSound *dsound;
+ IDirectSoundBuffer *dsbuffer;
IReferenceClock *pLatencyClock;
IDirectMusicSynth *synth;
IDirectMusicSynthSink *synth_sink;
- BOOL fActive;
+ BOOL active;
DMUS_PORTCAPS caps;
DMUS_PORTPARAMS params;
int nrofgroups;
@@ -198,6 +199,10 @@ static ULONG WINAPI SynthPortImpl_IDirectMusicPort_Release(LPDIRECTMUSICPORT ifa
IDirectMusicSynth_Release(This->synth);
IDirectMusicSynthSink_Release(This->synth_sink);
IReferenceClock_Release(This->pLatencyClock);
+ if (This->dsbuffer)
+ IDirectSoundBuffer_Release(This->dsbuffer);
+ if (This->dsound)
+ IDirectSound_Release(This->dsound);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -437,7 +442,7 @@ static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_Activate(LPDIRECTMUSICPORT
TRACE("(%p/%p)->(%d)\n", iface, This, active);
- This->fActive = active;
+ This->active = active;
return S_OK;
}
@@ -468,11 +473,33 @@ static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_GetChannelPriority(LPDIRECT
return S_OK;
}
-static HRESULT WINAPI SynthPortImpl_IDirectMusicPort_SetDirectSound(LPDIRECTMUSICPORT iface, LPDIRECTSOUND direct_sound, LPDIRECTSOUNDBUFFER direct_sound_buffer)
+static HRESULT WINAPI synth_dmport_SetDirectSound(IDirectMusicPort *iface, IDirectSound *dsound,
+ IDirectSoundBuffer *dsbuffer)
{
SynthPortImpl *This = impl_from_SynthPortImpl_IDirectMusicPort(iface);
- FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, direct_sound, direct_sound_buffer);
+ FIXME("(%p/%p)->(%p, %p): semi-stub\n", iface, This, dsound, dsbuffer);
+
+ if (This->active)
+ return DMUS_E_DSOUND_ALREADY_SET;
+
+ if (This->dsound) {
+ if (This->dsound != This->parent->dsound)
+ ERR("Not the same dsound in the port (%p) and parent dmusic (%p), expect trouble!\n",
+ This->dsound, This->parent->dsound);
+ if (!IDirectSound_Release(This->parent->dsound))
+ This->parent->dsound = NULL;
+ }
+ if (This->dsbuffer)
+ IDirectSound_Release(This->dsbuffer);
+
+ This->dsound = dsound;
+ This->dsbuffer = dsbuffer;
+
+ if (This->dsound)
+ IDirectSound_AddRef(This->dsound);
+ if (This->dsbuffer)
+ IDirectSound_AddRef(This->dsbuffer);
return S_OK;
}
@@ -543,7 +570,7 @@ static const IDirectMusicPortVtbl SynthPortImpl_DirectMusicPort_Vtbl = {
SynthPortImpl_IDirectMusicPort_Activate,
SynthPortImpl_IDirectMusicPort_SetChannelPriority,
SynthPortImpl_IDirectMusicPort_GetChannelPriority,
- SynthPortImpl_IDirectMusicPort_SetDirectSound,
+ synth_dmport_SetDirectSound,
SynthPortImpl_IDirectMusicPort_GetFormat
};
@@ -785,7 +812,7 @@ HRESULT synth_port_create(IDirectMusic8Impl *parent, DMUS_PORTPARAMS *port_param
obj->IKsControl_iface.lpVtbl = &ikscontrol_vtbl;
obj->ref = 1;
obj->parent = parent;
- obj->fActive = FALSE;
+ obj->active = FALSE;
obj->params = *port_params;
obj->caps = *port_caps;
diff --git a/dlls/dmusic/tests/dmusic.c b/dlls/dmusic/tests/dmusic.c
index f701b2b..a96b4f7 100644
--- a/dlls/dmusic/tests/dmusic.c
+++ b/dlls/dmusic/tests/dmusic.c
@@ -183,11 +183,11 @@ static void test_setdsound(void)
/* Releasing dsound from dmusic */
hr = IDirectMusic_SetDirectSound(dmusic, NULL, NULL);
- todo_wine ok(hr == DMUS_E_DSOUND_ALREADY_SET, "SetDirectSound failed: %08x\n", hr);
+ ok(hr == DMUS_E_DSOUND_ALREADY_SET, "SetDirectSound failed: %08x\n", hr);
hr = IDirectMusicPort_Activate(port, FALSE);
ok(hr == S_OK, "Port Activate returned: %x\n", hr);
ref = get_refcount(dsound);
- todo_wine ok(ref == 2, "dsound ref count got %d expected 2\n", ref);
+ ok(ref == 2, "dsound ref count got %d expected 2\n", ref);
hr = IDirectMusic_SetDirectSound(dmusic, NULL, NULL);
ok(hr == S_OK, "SetDirectSound failed: %08x\n", hr);
ref = get_refcount(dsound);
@@ -217,41 +217,41 @@ static void test_setdsound(void)
hr = IDirectMusicPort_SetDirectSound(port, dsound, NULL);
ok(hr == S_OK, "SetDirectSound failed: %08x\n", hr);
ref = get_refcount(dsound);
- todo_wine ok(ref == 2, "dsound ref count got %d expected 2\n", ref);
+ ok(ref == 2, "dsound ref count got %d expected 2\n", ref);
ref = get_refcount(dsound2);
ok(ref == 2, "dsound2 ref count got %d expected 2\n", ref);
/* Setting the dsound again on the port will mess with the parent dmusic */
hr = IDirectMusicPort_SetDirectSound(port, dsound, NULL);
ok(hr == S_OK, "SetDirectSound failed: %08x\n", hr);
ref = get_refcount(dsound);
- todo_wine ok(ref == 3, "dsound ref count got %d expected 3\n", ref);
+ ok(ref == 3, "dsound ref count got %d expected 3\n", ref);
ref = get_refcount(dsound2);
- todo_wine ok(ref == 1, "dsound2 ref count got %d expected 1\n", ref);
+ ok(ref == 1, "dsound2 ref count got %d expected 1\n", ref);
IDirectSound_AddRef(dsound2); /* Crash prevention */
hr = IDirectMusicPort_Activate(port, TRUE);
ok(hr == S_OK, "Activate returned: %x\n", hr);
ref = get_refcount(dsound);
todo_wine ok(ref == 4, "dsound ref count got %d expected 4\n", ref);
ref = get_refcount(dsound2);
- todo_wine ok(ref == 2, "dsound2 ref count got %d expected 2\n", ref);
+ ok(ref == 2, "dsound2 ref count got %d expected 2\n", ref);
hr = IDirectMusicPort_Activate(port, TRUE);
todo_wine ok(hr == S_FALSE, "Activate returned: %x\n", hr);
ref = get_refcount(dsound);
todo_wine ok(ref == 4, "dsound ref count got %d expected 4\n", ref);
ref = get_refcount(dsound2);
- todo_wine ok(ref == 2, "dsound2 ref count got %d expected 2\n", ref);
+ ok(ref == 2, "dsound2 ref count got %d expected 2\n", ref);
/* Deactivating the port messes with the dsound refcount in the parent dmusic */
hr = IDirectMusicPort_Activate(port, FALSE);
ok(hr == S_OK, "Port Activate returned: %x\n", hr);
ref = get_refcount(dsound);
- todo_wine ok(ref == 3, "dsound ref count got %d expected 3\n", ref);
+ ok(ref == 3, "dsound ref count got %d expected 3\n", ref);
ref = get_refcount(dsound2);
todo_wine ok(ref == 1, "dsound2 ref count got %d expected 1\n", ref);
hr = IDirectMusicPort_Activate(port, FALSE);
todo_wine ok(hr == S_FALSE, "Port Activate returned: %x\n", hr);
ref = get_refcount(dsound);
- todo_wine ok(ref == 3, "dsound ref count got %d expected 3\n", ref);
+ ok(ref == 3, "dsound ref count got %d expected 3\n", ref);
ref = get_refcount(dsound2);
todo_wine ok(ref == 1, "dsound2 ref count got %d expected 1\n", ref);
--
2.9.3
More information about the wine-patches
mailing list