-- v2: dmime: Introduce a new segment_state_create constructor. dmime: Redirect IDirectMusicPerformance_PlaySegment to PlaySegmentEx. dmime: Implement some segment state default values. dmime: Get rid of the IDirectMusicSegmentState8Impl typedef. dmime: Rename DirectMusicSegmentState8 method prefix to segment_state.
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmime/segmentstate.c | 49 +++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 22 deletions(-)
diff --git a/dlls/dmime/segmentstate.c b/dlls/dmime/segmentstate.c index 1a0b63419f0..3a5eee72a57 100644 --- a/dlls/dmime/segmentstate.c +++ b/dlls/dmime/segmentstate.c @@ -32,7 +32,7 @@ static inline IDirectMusicSegmentState8Impl *impl_from_IDirectMusicSegmentState8 return CONTAINING_RECORD(iface, IDirectMusicSegmentState8Impl, IDirectMusicSegmentState8_iface); }
-static HRESULT WINAPI DirectMusicSegmentState8_QueryInterface(IDirectMusicSegmentState8 *iface, REFIID riid, void **ppobj) +static HRESULT WINAPI segment_state_QueryInterface(IDirectMusicSegmentState8 *iface, REFIID riid, void **ppobj) { IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface);
@@ -56,7 +56,7 @@ static HRESULT WINAPI DirectMusicSegmentState8_QueryInterface(IDirectMusicSegmen return E_NOINTERFACE; }
-static ULONG WINAPI DirectMusicSegmentState8_AddRef(IDirectMusicSegmentState8 *iface) +static ULONG WINAPI segment_state_AddRef(IDirectMusicSegmentState8 *iface) { IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); ULONG ref = InterlockedIncrement(&This->ref); @@ -66,7 +66,7 @@ static ULONG WINAPI DirectMusicSegmentState8_AddRef(IDirectMusicSegmentState8 *i return ref; }
-static ULONG WINAPI DirectMusicSegmentState8_Release(IDirectMusicSegmentState8 *iface) +static ULONG WINAPI segment_state_Release(IDirectMusicSegmentState8 *iface) { IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); ULONG ref = InterlockedDecrement(&This->ref); @@ -78,64 +78,69 @@ static ULONG WINAPI DirectMusicSegmentState8_Release(IDirectMusicSegmentState8 * return ref; }
-static HRESULT WINAPI DirectMusicSegmentState8_GetRepeats(IDirectMusicSegmentState8 *iface, DWORD* pdwRepeats) +static HRESULT WINAPI segment_state_GetRepeats(IDirectMusicSegmentState8 *iface, DWORD *pdwRepeats) { IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); FIXME("(%p, %p): stub\n", This, pdwRepeats); return S_OK; }
-static HRESULT WINAPI DirectMusicSegmentState8_GetSegment(IDirectMusicSegmentState8 *iface, IDirectMusicSegment** ppSegment) +static HRESULT WINAPI segment_state_GetSegment(IDirectMusicSegmentState8 *iface, IDirectMusicSegment **ppSegment) { IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); FIXME("(%p, %p): stub\n", This, ppSegment); return S_OK; }
-static HRESULT WINAPI DirectMusicSegmentState8_GetStartTime(IDirectMusicSegmentState8 *iface, MUSIC_TIME* pmtStart) +static HRESULT WINAPI segment_state_GetStartTime(IDirectMusicSegmentState8 *iface, MUSIC_TIME *pmtStart) { IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); FIXME("(%p, %p): stub\n", This, pmtStart); return S_OK; }
-static HRESULT WINAPI DirectMusicSegmentState8_GetSeek(IDirectMusicSegmentState8 *iface, MUSIC_TIME* pmtSeek) +static HRESULT WINAPI segment_state_GetSeek(IDirectMusicSegmentState8 *iface, MUSIC_TIME *pmtSeek) { IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); FIXME("(%p, %p): stub\n", This, pmtSeek); return S_OK; }
-static HRESULT WINAPI DirectMusicSegmentState8_GetStartPoint(IDirectMusicSegmentState8 *iface, MUSIC_TIME* pmtStart) +static HRESULT WINAPI segment_state_GetStartPoint(IDirectMusicSegmentState8 *iface, MUSIC_TIME *pmtStart) { IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); FIXME("(%p, %p): stub\n", This, pmtStart); return S_OK; }
-static HRESULT WINAPI DirectMusicSegmentState8_SetTrackConfig(IDirectMusicSegmentState8 *iface, REFGUID rguidTrackClassID, DWORD dwGroupBits, DWORD dwIndex, DWORD dwFlagsOn, DWORD dwFlagsOff) { +static HRESULT WINAPI segment_state_SetTrackConfig(IDirectMusicSegmentState8 *iface, + REFGUID rguidTrackClassID, DWORD dwGroupBits, DWORD dwIndex, DWORD dwFlagsOn, DWORD dwFlagsOff) +{ IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); FIXME("(%p, %s, %ld, %ld, %ld, %ld): stub\n", This, debugstr_dmguid(rguidTrackClassID), dwGroupBits, dwIndex, dwFlagsOn, dwFlagsOff); return S_OK; }
-static HRESULT WINAPI DirectMusicSegmentState8_GetObjectInPath(IDirectMusicSegmentState8 *iface, DWORD dwPChannel, DWORD dwStage, DWORD dwBuffer, REFGUID guidObject, DWORD dwIndex, REFGUID iidInterface, void** ppObject) { +static HRESULT WINAPI segment_state_GetObjectInPath(IDirectMusicSegmentState8 *iface, DWORD dwPChannel, + DWORD dwStage, DWORD dwBuffer, REFGUID guidObject, DWORD dwIndex, REFGUID iidInterface, void **ppObject) +{ IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); FIXME("(%p, %ld, %ld, %ld, %s, %ld, %s, %p): stub\n", This, dwPChannel, dwStage, dwBuffer, debugstr_dmguid(guidObject), dwIndex, debugstr_dmguid(iidInterface), ppObject); return S_OK; }
-static const IDirectMusicSegmentState8Vtbl DirectMusicSegmentState8Vtbl = { - DirectMusicSegmentState8_QueryInterface, - DirectMusicSegmentState8_AddRef, - DirectMusicSegmentState8_Release, - DirectMusicSegmentState8_GetRepeats, - DirectMusicSegmentState8_GetSegment, - DirectMusicSegmentState8_GetStartTime, - DirectMusicSegmentState8_GetSeek, - DirectMusicSegmentState8_GetStartPoint, - DirectMusicSegmentState8_SetTrackConfig, - DirectMusicSegmentState8_GetObjectInPath +static const IDirectMusicSegmentState8Vtbl segment_state_vtbl = +{ + segment_state_QueryInterface, + segment_state_AddRef, + segment_state_Release, + segment_state_GetRepeats, + segment_state_GetSegment, + segment_state_GetStartTime, + segment_state_GetSeek, + segment_state_GetStartPoint, + segment_state_SetTrackConfig, + segment_state_GetObjectInPath, };
/* for ClassFactory */ @@ -146,7 +151,7 @@ HRESULT create_dmsegmentstate(REFIID riid, void **ret_iface)
*ret_iface = NULL; if (!(obj = calloc(1, sizeof(*obj)))) return E_OUTOFMEMORY; - obj->IDirectMusicSegmentState8_iface.lpVtbl = &DirectMusicSegmentState8Vtbl; + obj->IDirectMusicSegmentState8_iface.lpVtbl = &segment_state_vtbl; obj->ref = 1;
hr = IDirectMusicSegmentState8_QueryInterface(&obj->IDirectMusicSegmentState8_iface, riid, ret_iface);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmime/segmentstate.c | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/dlls/dmime/segmentstate.c b/dlls/dmime/segmentstate.c index 3a5eee72a57..b49308369ac 100644 --- a/dlls/dmime/segmentstate.c +++ b/dlls/dmime/segmentstate.c @@ -1,5 +1,4 @@ -/* IDirectMusicSegmentState8 Implementation - * +/* * Copyright (C) 2003-2004 Rok Mandeljc * * This program is free software; you can redistribute it and/or @@ -22,19 +21,20 @@
WINE_DEFAULT_DEBUG_CHANNEL(dmime);
-typedef struct IDirectMusicSegmentState8Impl { +struct segment_state +{ IDirectMusicSegmentState8 IDirectMusicSegmentState8_iface; LONG ref; -} IDirectMusicSegmentState8Impl; +};
-static inline IDirectMusicSegmentState8Impl *impl_from_IDirectMusicSegmentState8(IDirectMusicSegmentState8 *iface) +static inline struct segment_state *impl_from_IDirectMusicSegmentState8(IDirectMusicSegmentState8 *iface) { - return CONTAINING_RECORD(iface, IDirectMusicSegmentState8Impl, IDirectMusicSegmentState8_iface); + return CONTAINING_RECORD(iface, struct segment_state, IDirectMusicSegmentState8_iface); }
static HRESULT WINAPI segment_state_QueryInterface(IDirectMusicSegmentState8 *iface, REFIID riid, void **ppobj) { - IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); + struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface);
TRACE("(%p, %s, %p)\n", This, debugstr_dmguid(riid), ppobj);
@@ -58,7 +58,7 @@ static HRESULT WINAPI segment_state_QueryInterface(IDirectMusicSegmentState8 *if
static ULONG WINAPI segment_state_AddRef(IDirectMusicSegmentState8 *iface) { - IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); + struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface); ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p): %ld\n", This, ref); @@ -68,7 +68,7 @@ static ULONG WINAPI segment_state_AddRef(IDirectMusicSegmentState8 *iface)
static ULONG WINAPI segment_state_Release(IDirectMusicSegmentState8 *iface) { - IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); + struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface); ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p): %ld\n", This, ref); @@ -80,35 +80,35 @@ static ULONG WINAPI segment_state_Release(IDirectMusicSegmentState8 *iface)
static HRESULT WINAPI segment_state_GetRepeats(IDirectMusicSegmentState8 *iface, DWORD *pdwRepeats) { - IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); + struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface); FIXME("(%p, %p): stub\n", This, pdwRepeats); return S_OK; }
static HRESULT WINAPI segment_state_GetSegment(IDirectMusicSegmentState8 *iface, IDirectMusicSegment **ppSegment) { - IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); + struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface); FIXME("(%p, %p): stub\n", This, ppSegment); return S_OK; }
static HRESULT WINAPI segment_state_GetStartTime(IDirectMusicSegmentState8 *iface, MUSIC_TIME *pmtStart) { - IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); + struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface); FIXME("(%p, %p): stub\n", This, pmtStart); return S_OK; }
static HRESULT WINAPI segment_state_GetSeek(IDirectMusicSegmentState8 *iface, MUSIC_TIME *pmtSeek) { - IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); + struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface); FIXME("(%p, %p): stub\n", This, pmtSeek); return S_OK; }
static HRESULT WINAPI segment_state_GetStartPoint(IDirectMusicSegmentState8 *iface, MUSIC_TIME *pmtStart) { - IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); + struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface); FIXME("(%p, %p): stub\n", This, pmtStart); return S_OK; } @@ -116,7 +116,7 @@ static HRESULT WINAPI segment_state_GetStartPoint(IDirectMusicSegmentState8 *ifa static HRESULT WINAPI segment_state_SetTrackConfig(IDirectMusicSegmentState8 *iface, REFGUID rguidTrackClassID, DWORD dwGroupBits, DWORD dwIndex, DWORD dwFlagsOn, DWORD dwFlagsOff) { - IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); + struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface); FIXME("(%p, %s, %ld, %ld, %ld, %ld): stub\n", This, debugstr_dmguid(rguidTrackClassID), dwGroupBits, dwIndex, dwFlagsOn, dwFlagsOff); return S_OK; } @@ -124,7 +124,7 @@ static HRESULT WINAPI segment_state_SetTrackConfig(IDirectMusicSegmentState8 *if static HRESULT WINAPI segment_state_GetObjectInPath(IDirectMusicSegmentState8 *iface, DWORD dwPChannel, DWORD dwStage, DWORD dwBuffer, REFGUID guidObject, DWORD dwIndex, REFGUID iidInterface, void **ppObject) { - IDirectMusicSegmentState8Impl *This = impl_from_IDirectMusicSegmentState8(iface); + struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface); FIXME("(%p, %ld, %ld, %ld, %s, %ld, %s, %p): stub\n", This, dwPChannel, dwStage, dwBuffer, debugstr_dmguid(guidObject), dwIndex, debugstr_dmguid(iidInterface), ppObject); return S_OK; } @@ -146,7 +146,7 @@ static const IDirectMusicSegmentState8Vtbl segment_state_vtbl = /* for ClassFactory */ HRESULT create_dmsegmentstate(REFIID riid, void **ret_iface) { - IDirectMusicSegmentState8Impl* obj; + struct segment_state *obj; HRESULT hr;
*ret_iface = NULL;
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmime/segmentstate.c | 30 +++++++++++++++++++----------- dlls/dmime/tests/dmime.c | 10 +++++----- 2 files changed, 24 insertions(+), 16 deletions(-)
diff --git a/dlls/dmime/segmentstate.c b/dlls/dmime/segmentstate.c index b49308369ac..655940311b3 100644 --- a/dlls/dmime/segmentstate.c +++ b/dlls/dmime/segmentstate.c @@ -78,38 +78,46 @@ static ULONG WINAPI segment_state_Release(IDirectMusicSegmentState8 *iface) return ref; }
-static HRESULT WINAPI segment_state_GetRepeats(IDirectMusicSegmentState8 *iface, DWORD *pdwRepeats) +static HRESULT WINAPI segment_state_GetRepeats(IDirectMusicSegmentState8 *iface, DWORD *repeats) { struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface); - FIXME("(%p, %p): stub\n", This, pdwRepeats); + FIXME("(%p, %p): semi-stub\n", This, repeats); return S_OK; }
-static HRESULT WINAPI segment_state_GetSegment(IDirectMusicSegmentState8 *iface, IDirectMusicSegment **ppSegment) +static HRESULT WINAPI segment_state_GetSegment(IDirectMusicSegmentState8 *iface, IDirectMusicSegment **segment) { struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface); - FIXME("(%p, %p): stub\n", This, ppSegment); - return S_OK; + + FIXME("(%p, %p): semi-stub\n", This, segment); + + *segment = NULL; + return DMUS_E_NOT_FOUND; }
-static HRESULT WINAPI segment_state_GetStartTime(IDirectMusicSegmentState8 *iface, MUSIC_TIME *pmtStart) +static HRESULT WINAPI segment_state_GetStartTime(IDirectMusicSegmentState8 *iface, MUSIC_TIME *start_time) { struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface); - FIXME("(%p, %p): stub\n", This, pmtStart); + FIXME("(%p, %p): semi-stub\n", This, start_time); + *start_time = -1; return S_OK; }
-static HRESULT WINAPI segment_state_GetSeek(IDirectMusicSegmentState8 *iface, MUSIC_TIME *pmtSeek) +static HRESULT WINAPI segment_state_GetSeek(IDirectMusicSegmentState8 *iface, MUSIC_TIME *seek_time) { struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface); - FIXME("(%p, %p): stub\n", This, pmtSeek); + FIXME("(%p, %p): semi-stub\n", This, seek_time); + *seek_time = 0; return S_OK; }
-static HRESULT WINAPI segment_state_GetStartPoint(IDirectMusicSegmentState8 *iface, MUSIC_TIME *pmtStart) +static HRESULT WINAPI segment_state_GetStartPoint(IDirectMusicSegmentState8 *iface, MUSIC_TIME *start_time) { struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface); - FIXME("(%p, %p): stub\n", This, pmtStart); + + FIXME("(%p, %p): semi-stub\n", This, start_time); + + *start_time = 0; return S_OK; }
diff --git a/dlls/dmime/tests/dmime.c b/dlls/dmime/tests/dmime.c index ea5a972dc80..17fa951ae27 100644 --- a/dlls/dmime/tests/dmime.c +++ b/dlls/dmime/tests/dmime.c @@ -3985,12 +3985,12 @@ static void test_segment_state(void)
tmp_segment = (void *)0xdeadbeef; hr = IDirectMusicSegmentState_GetSegment(state, &tmp_segment); - todo_wine ok(hr == DMUS_E_NOT_FOUND, "got %#lx\n", hr); - todo_wine ok(tmp_segment == NULL, "got %p\n", tmp_segment); + ok(hr == DMUS_E_NOT_FOUND, "got %#lx\n", hr); + ok(tmp_segment == NULL, "got %p\n", tmp_segment); time = 0xdeadbeef; hr = IDirectMusicSegmentState_GetStartPoint(state, &time); ok(hr == S_OK, "got %#lx\n", hr); - todo_wine ok(time == 0, "got %#lx\n", time); + ok(time == 0, "got %#lx\n", time); time = 0xdeadbeef; hr = IDirectMusicSegmentState_GetRepeats(state, &value); ok(hr == S_OK, "got %#lx\n", hr); @@ -3998,11 +3998,11 @@ static void test_segment_state(void) time = 0xdeadbeef; hr = IDirectMusicSegmentState_GetStartTime(state, &time); ok(hr == S_OK, "got %#lx\n", hr); - todo_wine ok(time == -1, "got %#lx\n", time); + ok(time == -1, "got %#lx\n", time); time = 0xdeadbeef; hr = IDirectMusicSegmentState_GetSeek(state, &time); ok(hr == S_OK, "got %#lx\n", hr); - todo_wine ok(time == 0, "got %#lx\n", time); + ok(time == 0, "got %#lx\n", time);
/* PlaySegment returns a different, genuine segment state */
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmime/performance.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/dlls/dmime/performance.c b/dlls/dmime/performance.c index 111d7c60568..e590db88997 100644 --- a/dlls/dmime/performance.c +++ b/dlls/dmime/performance.c @@ -384,16 +384,15 @@ static HRESULT WINAPI performance_Init(IDirectMusicPerformance8 *iface, IDirectM return S_OK; }
-static HRESULT WINAPI performance_PlaySegment(IDirectMusicPerformance8 *iface, IDirectMusicSegment *pSegment, - DWORD dwFlags, __int64 i64StartTime, IDirectMusicSegmentState **ppSegmentState) +static HRESULT WINAPI performance_PlaySegment(IDirectMusicPerformance8 *iface, IDirectMusicSegment *segment, + DWORD segment_flags, INT64 start_time, IDirectMusicSegmentState **ret_state) { - struct performance *This = impl_from_IDirectMusicPerformance8(iface); + struct performance *This = impl_from_IDirectMusicPerformance8(iface);
- FIXME("(%p, %p, %ld, 0x%s, %p): stub\n", This, pSegment, dwFlags, - wine_dbgstr_longlong(i64StartTime), ppSegmentState); - if (ppSegmentState) - return create_dmsegmentstate(&IID_IDirectMusicSegmentState,(void**)ppSegmentState); - return S_OK; + TRACE("(%p, %p, %ld, %I64d, %p)\n", This, segment, segment_flags, start_time, ret_state); + + return IDirectMusicPerformance8_PlaySegmentEx(iface, (IUnknown *)segment, NULL, NULL, + segment_flags, start_time, ret_state, NULL, NULL); }
static HRESULT WINAPI performance_Stop(IDirectMusicPerformance8 *iface, IDirectMusicSegment *pSegment,
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/dmime/dmime_private.h | 3 +++ dlls/dmime/performance.c | 36 ++++++++++++++++++------- dlls/dmime/segmentstate.c | 55 +++++++++++++++++++++++++++++++------- dlls/dmime/tests/dmime.c | 12 ++++----- 4 files changed, 82 insertions(+), 24 deletions(-)
diff --git a/dlls/dmime/dmime_private.h b/dlls/dmime/dmime_private.h index eacde4b46be..c35c52eb066 100644 --- a/dlls/dmime/dmime_private.h +++ b/dlls/dmime/dmime_private.h @@ -70,6 +70,9 @@ extern void set_audiopath_perf_pointer(IDirectMusicAudioPath*,IDirectMusicPerfor extern void set_audiopath_dsound_buffer(IDirectMusicAudioPath*,IDirectSoundBuffer*); extern void set_audiopath_primary_dsound_buffer(IDirectMusicAudioPath*,IDirectSoundBuffer*);
+extern HRESULT segment_state_create(IDirectMusicSegment *segment, MUSIC_TIME start_time, + IDirectMusicSegmentState **ret_iface); + /***************************************************************************** * Auxiliary definitions */ diff --git a/dlls/dmime/performance.c b/dlls/dmime/performance.c index e590db88997..9f293358ca6 100644 --- a/dlls/dmime/performance.c +++ b/dlls/dmime/performance.c @@ -1063,17 +1063,35 @@ static HRESULT WINAPI performance_InitAudio(IDirectMusicPerformance8 *iface, IDi return S_OK; }
-static HRESULT WINAPI performance_PlaySegmentEx(IDirectMusicPerformance8 *iface, IUnknown *pSource, - WCHAR *pwzSegmentName, IUnknown *pTransition, DWORD dwFlags, __int64 i64StartTime, - IDirectMusicSegmentState **ppSegmentState, IUnknown *pFrom, IUnknown *pAudioPath) +static HRESULT WINAPI performance_PlaySegmentEx(IDirectMusicPerformance8 *iface, IUnknown *source, + WCHAR *segment_name, IUnknown *transition, DWORD segment_flags, INT64 start_time, + IDirectMusicSegmentState **segment_state, IUnknown *from, IUnknown *audio_path) { - struct performance *This = impl_from_IDirectMusicPerformance8(iface); + struct performance *This = impl_from_IDirectMusicPerformance8(iface); + IDirectMusicSegmentState *state; + IDirectMusicSegment *segment; + HRESULT hr;
- FIXME("(%p, %p, %p, %p, %ld, 0x%s, %p, %p, %p): stub\n", This, pSource, pwzSegmentName, - pTransition, dwFlags, wine_dbgstr_longlong(i64StartTime), ppSegmentState, pFrom, pAudioPath); - if (ppSegmentState) - return create_dmsegmentstate(&IID_IDirectMusicSegmentState,(void**)ppSegmentState); - return S_OK; + FIXME("(%p, %p, %s, %p, %#lx, %I64d, %p, %p, %p): stub\n", This, source, debugstr_w(segment_name), + transition, segment_flags, start_time, segment_state, from, audio_path); + + if (FAILED(hr = IUnknown_QueryInterface(source, &IID_IDirectMusicSegment, (void **)&segment))) + return hr; + if (FAILED(hr = segment_state_create((IDirectMusicSegment *)segment, start_time, &state))) + { + IDirectMusicSegment_Release(segment); + return hr; + } + + if (segment_state) + { + *segment_state = state; + IDirectMusicSegmentState_AddRef(state); + } + + IDirectMusicSegmentState_Release(state); + IDirectMusicSegment_Release(segment); + return hr; }
static HRESULT WINAPI performance_StopEx(IDirectMusicPerformance8 *iface, IUnknown *pObjectToStop, diff --git a/dlls/dmime/segmentstate.c b/dlls/dmime/segmentstate.c index 655940311b3..1a09bed5dd3 100644 --- a/dlls/dmime/segmentstate.c +++ b/dlls/dmime/segmentstate.c @@ -25,6 +25,10 @@ struct segment_state { IDirectMusicSegmentState8 IDirectMusicSegmentState8_iface; LONG ref; + + IDirectMusicSegment *segment; + MUSIC_TIME start_point; + MUSIC_TIME start_time; };
static inline struct segment_state *impl_from_IDirectMusicSegmentState8(IDirectMusicSegmentState8 *iface) @@ -73,7 +77,11 @@ static ULONG WINAPI segment_state_Release(IDirectMusicSegmentState8 *iface)
TRACE("(%p): %ld\n", This, ref);
- if (!ref) free(This); + if (!ref) + { + if (This->segment) IDirectMusicSegment_Release(This->segment); + free(This); + }
return ref; } @@ -89,17 +97,21 @@ static HRESULT WINAPI segment_state_GetSegment(IDirectMusicSegmentState8 *iface, { struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface);
- FIXME("(%p, %p): semi-stub\n", This, segment); + TRACE("(%p, %p)\n", This, segment);
- *segment = NULL; - return DMUS_E_NOT_FOUND; + if (!(*segment = This->segment)) return DMUS_E_NOT_FOUND; + + IDirectMusicSegment_AddRef(This->segment); + return S_OK; }
static HRESULT WINAPI segment_state_GetStartTime(IDirectMusicSegmentState8 *iface, MUSIC_TIME *start_time) { struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface); - FIXME("(%p, %p): semi-stub\n", This, start_time); - *start_time = -1; + + TRACE("(%p, %p)\n", This, start_time); + + *start_time = This->start_time; return S_OK; }
@@ -111,13 +123,13 @@ static HRESULT WINAPI segment_state_GetSeek(IDirectMusicSegmentState8 *iface, MU return S_OK; }
-static HRESULT WINAPI segment_state_GetStartPoint(IDirectMusicSegmentState8 *iface, MUSIC_TIME *start_time) +static HRESULT WINAPI segment_state_GetStartPoint(IDirectMusicSegmentState8 *iface, MUSIC_TIME *start_point) { struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface);
- FIXME("(%p, %p): semi-stub\n", This, start_time); + TRACE("(%p, %p)\n", This, start_point);
- *start_time = 0; + *start_point = This->start_point; return S_OK; }
@@ -161,8 +173,33 @@ HRESULT create_dmsegmentstate(REFIID riid, void **ret_iface) if (!(obj = calloc(1, sizeof(*obj)))) return E_OUTOFMEMORY; obj->IDirectMusicSegmentState8_iface.lpVtbl = &segment_state_vtbl; obj->ref = 1; + obj->start_time = -1;
+ TRACE("Created IDirectMusicSegmentState %p\n", obj); hr = IDirectMusicSegmentState8_QueryInterface(&obj->IDirectMusicSegmentState8_iface, riid, ret_iface); IDirectMusicSegmentState8_Release(&obj->IDirectMusicSegmentState8_iface); return hr; } + +HRESULT segment_state_create(IDirectMusicSegment *segment, MUSIC_TIME start_time, + IDirectMusicSegmentState **ret_iface) +{ + IDirectMusicSegmentState *iface; + struct segment_state *This; + HRESULT hr; + + TRACE("(%p, %lu, %p)\n", segment, start_time, ret_iface); + + if (FAILED(hr = create_dmsegmentstate(&IID_IDirectMusicSegmentState, (void **)&iface))) return hr; + This = impl_from_IDirectMusicSegmentState8((IDirectMusicSegmentState8 *)iface); + + This->segment = segment; + IDirectMusicSegment_AddRef(This->segment); + + This->start_time = start_time; + hr = IDirectMusicSegment_GetStartPoint(segment, &This->start_point); + + if (SUCCEEDED(hr)) *ret_iface = iface; + else IDirectMusicSegmentState_Release(iface); + return hr; +} diff --git a/dlls/dmime/tests/dmime.c b/dlls/dmime/tests/dmime.c index 17fa951ae27..87d938a9015 100644 --- a/dlls/dmime/tests/dmime.c +++ b/dlls/dmime/tests/dmime.c @@ -4044,13 +4044,13 @@ static void test_segment_state(void) tmp_segment = (void *)0xdeadbeef; hr = IDirectMusicSegmentState_GetSegment(state, &tmp_segment); ok(hr == S_OK, "got %#lx\n", hr); - todo_wine ok(tmp_segment == segment, "got %p\n", tmp_segment); - if (tmp_segment != (void *)0xdeadbeef) IDirectMusicSegment_Release(tmp_segment); + ok(tmp_segment == segment, "got %p\n", tmp_segment); + IDirectMusicSegment_Release(tmp_segment);
time = 0xdeadbeef; hr = IDirectMusicSegmentState_GetStartPoint(state, &time); ok(hr == S_OK, "got %#lx\n", hr); - todo_wine ok(time == 50, "got %lu\n", time); + ok(time == 50, "got %lu\n", time); time = 0xdeadbeef; hr = IDirectMusicSegmentState_GetRepeats(state, &value); ok(hr == S_OK, "got %#lx\n", hr); @@ -4058,7 +4058,7 @@ static void test_segment_state(void) time = 0xdeadbeef; hr = IDirectMusicSegmentState_GetStartTime(state, &time); ok(hr == S_OK, "got %#lx\n", hr); - todo_wine ok(time == 20, "got %#lx\n", time); + ok(time == 20, "got %#lx\n", time); time = 0xdeadbeef;
/* The seek value is also dependent on whether the tracks are playing. @@ -4080,7 +4080,7 @@ static void test_segment_state(void) time = 0xdeadbeef; hr = IDirectMusicSegmentState_GetStartPoint(state, &time); ok(hr == S_OK, "got %#lx\n", hr); - todo_wine ok(time == 50, "got %#lx\n", time); + ok(time == 50, "got %#lx\n", time); time = 0xdeadbeef; hr = IDirectMusicSegmentState_GetRepeats(state, &value); ok(hr == S_OK, "got %#lx\n", hr); @@ -4088,7 +4088,7 @@ static void test_segment_state(void) time = 0xdeadbeef; hr = IDirectMusicSegmentState_GetStartTime(state, &time); ok(hr == S_OK, "got %#lx\n", hr); - todo_wine ok(time == 20, "got %#lx\n", time); + ok(time == 20, "got %#lx\n", time); time = 0xdeadbeef; hr = IDirectMusicSegmentState_GetSeek(state, &time); ok(hr == S_OK, "got %#lx\n", hr);
v2: Leave unrelated message time change for later, add change with new segment state constructor.
`dmime: Redirect IDirectMusicPerformance_PlaySegment to PlaySegmentEx.` crashes for me: ```dmime.c:4046: Test failed: got 0x88781161 wine: Unhandled page fault on read access to 00000000 at address 004153F7 (thread 0024), starting debugger... Unhandled exception: page fault on read access to 0x00000000 in wow64 32-bit code (0x004153f7). Register dump: CS:0023 SS:002b DS:002b ES:002b FS:0063 GS:006b EIP:004153f7 ESP:006afcd0 EBP:006afd78 EFLAGS:00010217( R- -- I -A-P-C) EAX:00000000 EBX:006afd28 ECX:006afcd8 EDX:00000000 ESI:00000001 EDI:00d40868 Stack dump: 0x006afcd0: 00000000 0041929b 00000000 00000014 0x006afce0: 00000000 006afd0c 00d40668 00000015 0x006afcf0: 7bc9857c 00000001 00000001 00d413a0 0x006afd00: 7bc9857c 00000015 00000001 02cc0138 0x006afd10: 02cc4608 00000000 00d86c08 02cc4a00 0x006afd20: 00d413a0 02cc4a00 00000000 00000000 Backtrace: =>0 0x004153f7 test_segment_state+0xd90() [/home/michi/work/wine/dlls/dmime/tests/dmime.c:4048] in d mime_test (0x006afd78) 1 0x004153f7 func_dmime+0x1717() [/home/michi/work/wine/dlls/dmime/tests/dmime.c:4151] in dmime_te st (0x006afd78) 2 0x00416623 run_test+0xf3(name=<register EDI not accessible in this frame>) [/home/michi/work/win e/include/wine/test.h:767] in dmime_test (0x006afe18) 3 0x004179c0 main+0x240(argc=<couldn't compute location>, argv=<couldn't compute location>) [/home /michi/work/wine/include/wine/test.h:884] in dmime_test (0x006afee8) 4 0x004173c4 mainCRTStartup+0x74() [/home/michi/work/wine/dlls/msvcrt/crt_main.c:60] in dmime_test (0x006aff30) 5 0x7b828a70 in kernel32 (+0x28a70) (0x006aff48) 6 0x7bc59827 in ntdll (+0x59827) (0x006aff5c) 7 0x7bc5a048 in ntdll (+0x5a048) (0x006affec) 0x004153f7 func_dmime+0x1717 [/home/michi/work/wine/dlls/dmime/tests/dmime.c:4151] in dmime_test: mo v (%eax), %edx 4151 test_band_track_play(); ```
Tests succeed without crashing with the full MR.
On Mon Oct 2 18:17:49 2023 +0000, Michael Stefaniuc wrote:
`dmime: Redirect IDirectMusicPerformance_PlaySegment to PlaySegmentEx.` crashes for me:
wine: Unhandled page fault on read access to 00000000 at address 004153F7 (thread 0024), starting debugger... Unhandled exception: page fault on read access to 0x00000000 in wow64 32-bit code (0x004153f7). Register dump: CS:0023 SS:002b DS:002b ES:002b FS:0063 GS:006b EIP:004153f7 ESP:006afcd0 EBP:006afd78 EFLAGS:00010217( R- -- I -A-P-C) EAX:00000000 EBX:006afd28 ECX:006afcd8 EDX:00000000 ESI:00000001 EDI:00d40868 Stack dump: 0x006afcd0: 00000000 0041929b 00000000 00000014 0x006afce0: 00000000 006afd0c 00d40668 00000015 0x006afcf0: 7bc9857c 00000001 00000001 00d413a0 0x006afd00: 7bc9857c 00000015 00000001 02cc0138 0x006afd10: 02cc4608 00000000 00d86c08 02cc4a00 0x006afd20: 00d413a0 02cc4a00 00000000 00000000 Backtrace: =>0 0x004153f7 test_segment_state+0xd90() [/home/michi/work/wine/dlls/dmime/tests/dmime.c:4048] in d mime_test (0x006afd78) 1 0x004153f7 func_dmime+0x1717() [/home/michi/work/wine/dlls/dmime/tests/dmime.c:4151] in dmime_te st (0x006afd78) 2 0x00416623 run_test+0xf3(name=<register EDI not accessible in this frame>) [/home/michi/work/win e/include/wine/test.h:767] in dmime_test (0x006afe18) 3 0x004179c0 main+0x240(argc=<couldn't compute location>, argv=<couldn't compute location>) [/home /michi/work/wine/include/wine/test.h:884] in dmime_test (0x006afee8) 4 0x004173c4 mainCRTStartup+0x74() [/home/michi/work/wine/dlls/msvcrt/crt_main.c:60] in dmime_test (0x006aff30) 5 0x7b828a70 in kernel32 (+0x28a70) (0x006aff48) 6 0x7bc59827 in ntdll (+0x59827) (0x006aff5c) 7 0x7bc5a048 in ntdll (+0x5a048) (0x006affec) 0x004153f7 func_dmime+0x1717 [/home/michi/work/wine/dlls/dmime/tests/dmime.c:4151] in dmime_test: mo v (%eax), %edx 4151 test_band_track_play();
Tests succeed without crashing with the full MR.
Thanks for catching this, I'll fix it.