mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-04 22:37:33 +00:00
dmime: Introduce a new segment_state_create constructor.
This commit is contained in:
parent
9cb0142632
commit
45d1c00eea
|
@ -70,6 +70,9 @@ extern void set_audiopath_perf_pointer(IDirectMusicAudioPath*,IDirectMusicPerfor
|
||||||
extern void set_audiopath_dsound_buffer(IDirectMusicAudioPath*,IDirectSoundBuffer*);
|
extern void set_audiopath_dsound_buffer(IDirectMusicAudioPath*,IDirectSoundBuffer*);
|
||||||
extern void set_audiopath_primary_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
|
* Auxiliary definitions
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1063,17 +1063,35 @@ static HRESULT WINAPI performance_InitAudio(IDirectMusicPerformance8 *iface, IDi
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI performance_PlaySegmentEx(IDirectMusicPerformance8 *iface, IUnknown *pSource,
|
static HRESULT WINAPI performance_PlaySegmentEx(IDirectMusicPerformance8 *iface, IUnknown *source,
|
||||||
WCHAR *pwzSegmentName, IUnknown *pTransition, DWORD dwFlags, __int64 i64StartTime,
|
WCHAR *segment_name, IUnknown *transition, DWORD segment_flags, INT64 start_time,
|
||||||
IDirectMusicSegmentState **ppSegmentState, IUnknown *pFrom, IUnknown *pAudioPath)
|
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,
|
FIXME("(%p, %p, %s, %p, %#lx, %I64d, %p, %p, %p): stub\n", This, source, debugstr_w(segment_name),
|
||||||
pTransition, dwFlags, wine_dbgstr_longlong(i64StartTime), ppSegmentState, pFrom, pAudioPath);
|
transition, segment_flags, start_time, segment_state, from, audio_path);
|
||||||
if (ppSegmentState)
|
|
||||||
return create_dmsegmentstate(&IID_IDirectMusicSegmentState,(void**)ppSegmentState);
|
if (FAILED(hr = IUnknown_QueryInterface(source, &IID_IDirectMusicSegment, (void **)&segment)))
|
||||||
return S_OK;
|
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,
|
static HRESULT WINAPI performance_StopEx(IDirectMusicPerformance8 *iface, IUnknown *pObjectToStop,
|
||||||
|
|
|
@ -25,6 +25,10 @@ struct segment_state
|
||||||
{
|
{
|
||||||
IDirectMusicSegmentState8 IDirectMusicSegmentState8_iface;
|
IDirectMusicSegmentState8 IDirectMusicSegmentState8_iface;
|
||||||
LONG ref;
|
LONG ref;
|
||||||
|
|
||||||
|
IDirectMusicSegment *segment;
|
||||||
|
MUSIC_TIME start_point;
|
||||||
|
MUSIC_TIME start_time;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct segment_state *impl_from_IDirectMusicSegmentState8(IDirectMusicSegmentState8 *iface)
|
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);
|
TRACE("(%p): %ld\n", This, ref);
|
||||||
|
|
||||||
if (!ref) free(This);
|
if (!ref)
|
||||||
|
{
|
||||||
|
if (This->segment) IDirectMusicSegment_Release(This->segment);
|
||||||
|
free(This);
|
||||||
|
}
|
||||||
|
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
@ -89,17 +97,21 @@ static HRESULT WINAPI segment_state_GetSegment(IDirectMusicSegmentState8 *iface,
|
||||||
{
|
{
|
||||||
struct segment_state *This = impl_from_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;
|
if (!(*segment = This->segment)) return DMUS_E_NOT_FOUND;
|
||||||
return DMUS_E_NOT_FOUND;
|
|
||||||
|
IDirectMusicSegment_AddRef(This->segment);
|
||||||
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI segment_state_GetStartTime(IDirectMusicSegmentState8 *iface, MUSIC_TIME *start_time)
|
static HRESULT WINAPI segment_state_GetStartTime(IDirectMusicSegmentState8 *iface, MUSIC_TIME *start_time)
|
||||||
{
|
{
|
||||||
struct segment_state *This = impl_from_IDirectMusicSegmentState8(iface);
|
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;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,13 +123,13 @@ static HRESULT WINAPI segment_state_GetSeek(IDirectMusicSegmentState8 *iface, MU
|
||||||
return S_OK;
|
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);
|
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;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,8 +173,33 @@ HRESULT create_dmsegmentstate(REFIID riid, void **ret_iface)
|
||||||
if (!(obj = calloc(1, sizeof(*obj)))) return E_OUTOFMEMORY;
|
if (!(obj = calloc(1, sizeof(*obj)))) return E_OUTOFMEMORY;
|
||||||
obj->IDirectMusicSegmentState8_iface.lpVtbl = &segment_state_vtbl;
|
obj->IDirectMusicSegmentState8_iface.lpVtbl = &segment_state_vtbl;
|
||||||
obj->ref = 1;
|
obj->ref = 1;
|
||||||
|
obj->start_time = -1;
|
||||||
|
|
||||||
|
TRACE("Created IDirectMusicSegmentState %p\n", obj);
|
||||||
hr = IDirectMusicSegmentState8_QueryInterface(&obj->IDirectMusicSegmentState8_iface, riid, ret_iface);
|
hr = IDirectMusicSegmentState8_QueryInterface(&obj->IDirectMusicSegmentState8_iface, riid, ret_iface);
|
||||||
IDirectMusicSegmentState8_Release(&obj->IDirectMusicSegmentState8_iface);
|
IDirectMusicSegmentState8_Release(&obj->IDirectMusicSegmentState8_iface);
|
||||||
return hr;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -4043,14 +4043,14 @@ static void test_segment_state(void)
|
||||||
|
|
||||||
tmp_segment = (void *)0xdeadbeef;
|
tmp_segment = (void *)0xdeadbeef;
|
||||||
hr = IDirectMusicSegmentState_GetSegment(state, &tmp_segment);
|
hr = IDirectMusicSegmentState_GetSegment(state, &tmp_segment);
|
||||||
todo_wine ok(hr == S_OK, "got %#lx\n", hr);
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
todo_wine ok(tmp_segment == segment, "got %p\n", tmp_segment);
|
ok(tmp_segment == segment, "got %p\n", tmp_segment);
|
||||||
if (tmp_segment) IDirectMusicSegment_Release(tmp_segment);
|
IDirectMusicSegment_Release(tmp_segment);
|
||||||
|
|
||||||
time = 0xdeadbeef;
|
time = 0xdeadbeef;
|
||||||
hr = IDirectMusicSegmentState_GetStartPoint(state, &time);
|
hr = IDirectMusicSegmentState_GetStartPoint(state, &time);
|
||||||
ok(hr == S_OK, "got %#lx\n", hr);
|
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;
|
time = 0xdeadbeef;
|
||||||
hr = IDirectMusicSegmentState_GetRepeats(state, &value);
|
hr = IDirectMusicSegmentState_GetRepeats(state, &value);
|
||||||
ok(hr == S_OK, "got %#lx\n", hr);
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
@ -4058,7 +4058,7 @@ static void test_segment_state(void)
|
||||||
time = 0xdeadbeef;
|
time = 0xdeadbeef;
|
||||||
hr = IDirectMusicSegmentState_GetStartTime(state, &time);
|
hr = IDirectMusicSegmentState_GetStartTime(state, &time);
|
||||||
ok(hr == S_OK, "got %#lx\n", hr);
|
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;
|
time = 0xdeadbeef;
|
||||||
|
|
||||||
/* The seek value is also dependent on whether the tracks are playing.
|
/* The seek value is also dependent on whether the tracks are playing.
|
||||||
|
@ -4080,7 +4080,7 @@ static void test_segment_state(void)
|
||||||
time = 0xdeadbeef;
|
time = 0xdeadbeef;
|
||||||
hr = IDirectMusicSegmentState_GetStartPoint(state, &time);
|
hr = IDirectMusicSegmentState_GetStartPoint(state, &time);
|
||||||
ok(hr == S_OK, "got %#lx\n", hr);
|
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;
|
time = 0xdeadbeef;
|
||||||
hr = IDirectMusicSegmentState_GetRepeats(state, &value);
|
hr = IDirectMusicSegmentState_GetRepeats(state, &value);
|
||||||
ok(hr == S_OK, "got %#lx\n", hr);
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
@ -4088,7 +4088,7 @@ static void test_segment_state(void)
|
||||||
time = 0xdeadbeef;
|
time = 0xdeadbeef;
|
||||||
hr = IDirectMusicSegmentState_GetStartTime(state, &time);
|
hr = IDirectMusicSegmentState_GetStartTime(state, &time);
|
||||||
ok(hr == S_OK, "got %#lx\n", hr);
|
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;
|
time = 0xdeadbeef;
|
||||||
hr = IDirectMusicSegmentState_GetSeek(state, &time);
|
hr = IDirectMusicSegmentState_GetSeek(state, &time);
|
||||||
ok(hr == S_OK, "got %#lx\n", hr);
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
|
Loading…
Reference in a new issue