dmime/tests: Test band track and DMUS_PATCH_PMSG.
This commit is contained in:
parent
47c299ce17
commit
4ea18f87cc
1 changed files with 483 additions and 0 deletions
|
@ -344,6 +344,213 @@ static DWORD test_tool_wait_message(IDirectMusicTool *iface, DWORD timeout, DMUS
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct test_loader_stream
|
||||||
|
{
|
||||||
|
IStream IStream_iface;
|
||||||
|
IDirectMusicGetLoader IDirectMusicGetLoader_iface;
|
||||||
|
LONG ref;
|
||||||
|
|
||||||
|
IStream *stream;
|
||||||
|
IDirectMusicLoader *loader;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct test_loader_stream *impl_from_IStream(IStream *iface)
|
||||||
|
{
|
||||||
|
return CONTAINING_RECORD(iface, struct test_loader_stream, IStream_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI test_loader_stream_QueryInterface(IStream *iface, REFIID iid, void **out)
|
||||||
|
{
|
||||||
|
struct test_loader_stream *impl = impl_from_IStream(iface);
|
||||||
|
|
||||||
|
if (IsEqualGUID(iid, &IID_IUnknown)
|
||||||
|
|| IsEqualGUID(iid, &IID_IStream))
|
||||||
|
{
|
||||||
|
IStream_AddRef(&impl->IStream_iface);
|
||||||
|
*out = &impl->IStream_iface;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsEqualGUID(iid, &IID_IDirectMusicGetLoader))
|
||||||
|
{
|
||||||
|
IDirectMusicGetLoader_AddRef(&impl->IDirectMusicGetLoader_iface);
|
||||||
|
*out = &impl->IDirectMusicGetLoader_iface;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
ok(IsEqualGUID(iid, &IID_IStream),
|
||||||
|
"got iid %s\n", debugstr_guid(iid));
|
||||||
|
*out = NULL;
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI test_loader_stream_AddRef(IStream *iface)
|
||||||
|
{
|
||||||
|
struct test_loader_stream *impl = impl_from_IStream(iface);
|
||||||
|
return InterlockedIncrement(&impl->ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI test_loader_stream_Release(IStream *iface)
|
||||||
|
{
|
||||||
|
struct test_loader_stream *impl = impl_from_IStream(iface);
|
||||||
|
ULONG ref = InterlockedDecrement(&impl->ref);
|
||||||
|
|
||||||
|
if (!ref)
|
||||||
|
{
|
||||||
|
IDirectMusicLoader_Release(impl->loader);
|
||||||
|
IStream_Release(impl->stream);
|
||||||
|
free(impl);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI test_loader_stream_Read(IStream *iface, void *data, ULONG size, ULONG *ret_size)
|
||||||
|
{
|
||||||
|
struct test_loader_stream *impl = impl_from_IStream(iface);
|
||||||
|
return IStream_Read(impl->stream, data, size, ret_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI test_loader_stream_Write(IStream *iface, const void *data, ULONG size, ULONG *ret_size)
|
||||||
|
{
|
||||||
|
ok(0, "Unexpected call.\n");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI test_loader_stream_Seek(IStream *iface, LARGE_INTEGER offset, DWORD method, ULARGE_INTEGER *ret_offset)
|
||||||
|
{
|
||||||
|
struct test_loader_stream *impl = impl_from_IStream(iface);
|
||||||
|
return IStream_Seek(impl->stream, offset, method, ret_offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI test_loader_stream_SetSize(IStream *iface, ULARGE_INTEGER size)
|
||||||
|
{
|
||||||
|
ok(0, "Unexpected call.\n");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI test_loader_stream_CopyTo(IStream *iface, IStream *dest, ULARGE_INTEGER size,
|
||||||
|
ULARGE_INTEGER *read_size, ULARGE_INTEGER *write_size)
|
||||||
|
{
|
||||||
|
ok(0, "Unexpected call.\n");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI test_loader_stream_Commit(IStream *iface, DWORD flags)
|
||||||
|
{
|
||||||
|
ok(0, "Unexpected call.\n");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI test_loader_stream_Revert(IStream *iface)
|
||||||
|
{
|
||||||
|
ok(0, "Unexpected call.\n");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI test_loader_stream_LockRegion(IStream *iface, ULARGE_INTEGER offset, ULARGE_INTEGER size, DWORD type)
|
||||||
|
{
|
||||||
|
ok(0, "Unexpected call.\n");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI test_loader_stream_UnlockRegion(IStream *iface, ULARGE_INTEGER offset, ULARGE_INTEGER size, DWORD type)
|
||||||
|
{
|
||||||
|
ok(0, "Unexpected call.\n");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI test_loader_stream_Stat(IStream *iface, STATSTG *stat, DWORD flags)
|
||||||
|
{
|
||||||
|
ok(0, "Unexpected call.\n");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI test_loader_stream_Clone(IStream *iface, IStream **out)
|
||||||
|
{
|
||||||
|
ok(0, "Unexpected call.\n");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const IStreamVtbl test_loader_stream_vtbl =
|
||||||
|
{
|
||||||
|
test_loader_stream_QueryInterface,
|
||||||
|
test_loader_stream_AddRef,
|
||||||
|
test_loader_stream_Release,
|
||||||
|
test_loader_stream_Read,
|
||||||
|
test_loader_stream_Write,
|
||||||
|
test_loader_stream_Seek,
|
||||||
|
test_loader_stream_SetSize,
|
||||||
|
test_loader_stream_CopyTo,
|
||||||
|
test_loader_stream_Commit,
|
||||||
|
test_loader_stream_Revert,
|
||||||
|
test_loader_stream_LockRegion,
|
||||||
|
test_loader_stream_UnlockRegion,
|
||||||
|
test_loader_stream_Stat,
|
||||||
|
test_loader_stream_Clone,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct test_loader_stream *impl_from_IDirectMusicGetLoader(IDirectMusicGetLoader *iface)
|
||||||
|
{
|
||||||
|
return CONTAINING_RECORD(iface, struct test_loader_stream, IDirectMusicGetLoader_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI test_loader_stream_getter_QueryInterface(IDirectMusicGetLoader *iface, REFIID iid, void **out)
|
||||||
|
{
|
||||||
|
struct test_loader_stream *impl = impl_from_IDirectMusicGetLoader(iface);
|
||||||
|
return IStream_QueryInterface(&impl->IStream_iface, iid, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI test_loader_stream_getter_AddRef(IDirectMusicGetLoader *iface)
|
||||||
|
{
|
||||||
|
struct test_loader_stream *impl = impl_from_IDirectMusicGetLoader(iface);
|
||||||
|
return IStream_AddRef(&impl->IStream_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI test_loader_stream_getter_Release(IDirectMusicGetLoader *iface)
|
||||||
|
{
|
||||||
|
struct test_loader_stream *impl = impl_from_IDirectMusicGetLoader(iface);
|
||||||
|
return IStream_Release(&impl->IStream_iface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI test_loader_stream_getter_GetLoader(IDirectMusicGetLoader *iface, IDirectMusicLoader **ret_loader)
|
||||||
|
{
|
||||||
|
struct test_loader_stream *impl = impl_from_IDirectMusicGetLoader(iface);
|
||||||
|
|
||||||
|
*ret_loader = impl->loader;
|
||||||
|
IDirectMusicLoader_AddRef(impl->loader);
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const IDirectMusicGetLoaderVtbl test_loader_stream_getter_vtbl =
|
||||||
|
{
|
||||||
|
test_loader_stream_getter_QueryInterface,
|
||||||
|
test_loader_stream_getter_AddRef,
|
||||||
|
test_loader_stream_getter_Release,
|
||||||
|
test_loader_stream_getter_GetLoader,
|
||||||
|
};
|
||||||
|
|
||||||
|
static HRESULT test_loader_stream_create(IStream *stream, IDirectMusicLoader *loader,
|
||||||
|
IStream **ret_iface)
|
||||||
|
{
|
||||||
|
struct test_loader_stream *obj;
|
||||||
|
|
||||||
|
*ret_iface = NULL;
|
||||||
|
if (!(obj = calloc(1, sizeof(*obj)))) return E_OUTOFMEMORY;
|
||||||
|
obj->IStream_iface.lpVtbl = &test_loader_stream_vtbl;
|
||||||
|
obj->IDirectMusicGetLoader_iface.lpVtbl = &test_loader_stream_getter_vtbl;
|
||||||
|
obj->ref = 1;
|
||||||
|
|
||||||
|
obj->stream = stream;
|
||||||
|
IStream_AddRef(stream);
|
||||||
|
obj->loader = loader;
|
||||||
|
IDirectMusicLoader_AddRef(loader);
|
||||||
|
|
||||||
|
*ret_iface = &obj->IStream_iface;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static BOOL missing_dmime(void)
|
static BOOL missing_dmime(void)
|
||||||
{
|
{
|
||||||
IDirectMusicSegment8 *dms;
|
IDirectMusicSegment8 *dms;
|
||||||
|
@ -2671,6 +2878,281 @@ static void test_sequence_track(void)
|
||||||
IDirectMusicTool_Release(tool);
|
IDirectMusicTool_Release(tool);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define check_dmus_patch_pmsg(a, b, c, d, e) check_dmus_patch_pmsg_(__LINE__, a, b, c, d, e)
|
||||||
|
static void check_dmus_patch_pmsg_(int line, DMUS_PATCH_PMSG *msg, MUSIC_TIME time, UINT chan,
|
||||||
|
UINT bank, UINT patch)
|
||||||
|
{
|
||||||
|
ok_(__FILE__, line)(msg->dwSize == sizeof(*msg), "got dwSize %lu\n", msg->dwSize);
|
||||||
|
ok_(__FILE__, line)(msg->rtTime != 0, "got rtTime %I64u\n", msg->rtTime);
|
||||||
|
ok_(__FILE__, line)(abs(msg->mtTime - time) < 10, "got mtTime %lu\n", msg->mtTime);
|
||||||
|
ok_(__FILE__, line)(msg->dwPChannel == chan, "got dwPChannel %lu\n", msg->dwPChannel);
|
||||||
|
ok_(__FILE__, line)(!!msg->dwVirtualTrackID, "got dwVirtualTrackID %lu\n", msg->dwVirtualTrackID);
|
||||||
|
ok_(__FILE__, line)(msg->dwType == DMUS_PMSGT_PATCH, "got %#lx\n", msg->dwType);
|
||||||
|
ok_(__FILE__, line)(!msg->dwVoiceID, "got dwVoiceID %lu\n", msg->dwVoiceID);
|
||||||
|
ok_(__FILE__, line)(msg->dwGroupID == 1, "got dwGroupID %lu\n", msg->dwGroupID);
|
||||||
|
ok_(__FILE__, line)(!msg->punkUser, "got punkUser %p\n", msg->punkUser);
|
||||||
|
ok_(__FILE__, line)(msg->byInstrument == patch, "got byInstrument %u\n", msg->byInstrument);
|
||||||
|
ok_(__FILE__, line)(msg->byMSB == bank >> 8, "got byMSB %u\n", msg->byMSB);
|
||||||
|
ok_(__FILE__, line)(msg->byLSB == (bank & 0xff), "got byLSB %u\n", msg->byLSB);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_band_track_play(void)
|
||||||
|
{
|
||||||
|
static const DWORD message_types[] =
|
||||||
|
{
|
||||||
|
DMUS_PMSGT_MIDI,
|
||||||
|
DMUS_PMSGT_NOTE,
|
||||||
|
DMUS_PMSGT_SYSEX,
|
||||||
|
DMUS_PMSGT_NOTIFICATION,
|
||||||
|
DMUS_PMSGT_TEMPO,
|
||||||
|
DMUS_PMSGT_CURVE,
|
||||||
|
DMUS_PMSGT_TIMESIG,
|
||||||
|
DMUS_PMSGT_PATCH,
|
||||||
|
DMUS_PMSGT_TRANSPOSE,
|
||||||
|
DMUS_PMSGT_CHANNEL_PRIORITY,
|
||||||
|
DMUS_PMSGT_STOP,
|
||||||
|
DMUS_PMSGT_DIRTY,
|
||||||
|
DMUS_PMSGT_WAVE,
|
||||||
|
DMUS_PMSGT_LYRIC,
|
||||||
|
DMUS_PMSGT_SCRIPTLYRIC,
|
||||||
|
DMUS_PMSGT_USER,
|
||||||
|
};
|
||||||
|
DMUS_OBJECTDESC desc =
|
||||||
|
{
|
||||||
|
.dwSize = sizeof(DMUS_OBJECTDESC),
|
||||||
|
.dwValidData = DMUS_OBJ_OBJECT | DMUS_OBJ_CLASS | DMUS_OBJ_FILENAME | DMUS_OBJ_FULLPATH,
|
||||||
|
.guidClass = CLSID_DirectMusicCollection,
|
||||||
|
.guidObject = GUID_DefaultGMCollection,
|
||||||
|
.wszFileName = L"C:\\windows\\system32\\drivers\\gm.dls",
|
||||||
|
};
|
||||||
|
static const LARGE_INTEGER zero = {0};
|
||||||
|
IDirectMusicPerformance *performance;
|
||||||
|
IStream *stream, *loader_stream;
|
||||||
|
IDirectMusicSegment *segment;
|
||||||
|
IDirectMusicLoader *loader;
|
||||||
|
IDirectMusicGraph *graph;
|
||||||
|
IDirectMusicTrack *track;
|
||||||
|
IPersistStream *persist;
|
||||||
|
IDirectMusicTool *tool;
|
||||||
|
DMUS_PATCH_PMSG *patch;
|
||||||
|
DMUS_PMSG *msg;
|
||||||
|
HRESULT hr;
|
||||||
|
DWORD ret;
|
||||||
|
|
||||||
|
hr = test_tool_create(message_types, ARRAY_SIZE(message_types), &tool);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
|
||||||
|
hr = CoCreateInstance(&CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC_SERVER,
|
||||||
|
&IID_IDirectMusicPerformance, (void **)&performance);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
|
||||||
|
hr = CoCreateInstance(&CLSID_DirectMusicGraph, NULL, CLSCTX_INPROC_SERVER,
|
||||||
|
&IID_IDirectMusicGraph, (void **)&graph);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
hr = IDirectMusicGraph_InsertTool(graph, (IDirectMusicTool *)tool, NULL, 0, -1);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
hr = IDirectMusicPerformance_SetGraph(performance, graph);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
IDirectMusicGraph_Release(graph);
|
||||||
|
|
||||||
|
|
||||||
|
/* create a segment and load a simple RIFF stream */
|
||||||
|
|
||||||
|
hr = CoCreateInstance(&CLSID_DirectMusicSegment, NULL, CLSCTX_INPROC_SERVER,
|
||||||
|
&IID_IDirectMusicSegment, (void **)&segment);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
|
||||||
|
hr = IDirectMusicSegment_QueryInterface(segment, &IID_IPersistStream, (void **)&persist);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
hr = CreateStreamOnHGlobal(0, TRUE, &stream);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
|
||||||
|
CHUNK_RIFF(stream, "DMSG")
|
||||||
|
{
|
||||||
|
/* set a non-zero segment length, or nothing will be played */
|
||||||
|
DMUS_IO_SEGMENT_HEADER head = {.mtLength = 2000};
|
||||||
|
CHUNK_DATA(stream, "segh", head);
|
||||||
|
CHUNK_DATA(stream, "guid", CLSID_DirectMusicSegment);
|
||||||
|
}
|
||||||
|
CHUNK_END;
|
||||||
|
|
||||||
|
hr = IStream_Seek(stream, zero, 0, NULL);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
hr = IPersistStream_Load(persist, stream);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
IPersistStream_Release(persist);
|
||||||
|
IStream_Release(stream);
|
||||||
|
|
||||||
|
|
||||||
|
/* add a sequence track to our segment */
|
||||||
|
|
||||||
|
hr = CoCreateInstance(&CLSID_DirectMusicBandTrack, NULL, CLSCTX_INPROC_SERVER,
|
||||||
|
&IID_IDirectMusicTrack, (void **)&track);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
|
||||||
|
hr = IDirectMusicSegment_QueryInterface(track, &IID_IPersistStream, (void **)&persist);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
hr = CreateStreamOnHGlobal(0, TRUE, &stream);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
|
||||||
|
CHUNK_RIFF(stream, "DMBT")
|
||||||
|
{
|
||||||
|
DMUS_IO_BAND_TRACK_HEADER head = {.bAutoDownload = TRUE};
|
||||||
|
|
||||||
|
CHUNK_DATA(stream, "bdth", head);
|
||||||
|
CHUNK_LIST(stream, "lbdl")
|
||||||
|
{
|
||||||
|
CHUNK_LIST(stream, "lbnd")
|
||||||
|
{
|
||||||
|
DMUS_IO_BAND_ITEM_HEADER head = {.lBandTime = 0};
|
||||||
|
CHUNK_DATA(stream, "bdih", head);
|
||||||
|
|
||||||
|
CHUNK_RIFF(stream, "DMBD")
|
||||||
|
{
|
||||||
|
GUID guid = CLSID_DirectMusicBand;
|
||||||
|
CHUNK_DATA(stream, "guid", guid);
|
||||||
|
|
||||||
|
CHUNK_LIST(stream, "lbil")
|
||||||
|
{
|
||||||
|
CHUNK_LIST(stream, "lbin")
|
||||||
|
{
|
||||||
|
DMUS_IO_INSTRUMENT head = {.dwPatch = 1, .dwPChannel = 1, .dwFlags = DMUS_IO_INST_PATCH};
|
||||||
|
CHUNK_DATA(stream, "bins", head);
|
||||||
|
}
|
||||||
|
CHUNK_END;
|
||||||
|
}
|
||||||
|
CHUNK_END;
|
||||||
|
}
|
||||||
|
CHUNK_END;
|
||||||
|
}
|
||||||
|
CHUNK_END;
|
||||||
|
|
||||||
|
CHUNK_LIST(stream, "lbnd")
|
||||||
|
{
|
||||||
|
DMUS_IO_BAND_ITEM_HEADER head = {.lBandTime = 1000};
|
||||||
|
CHUNK_DATA(stream, "bdih", head);
|
||||||
|
|
||||||
|
CHUNK_RIFF(stream, "DMBD")
|
||||||
|
{
|
||||||
|
GUID guid = CLSID_DirectMusicBand;
|
||||||
|
CHUNK_DATA(stream, "guid", guid);
|
||||||
|
|
||||||
|
CHUNK_LIST(stream, "lbil")
|
||||||
|
{
|
||||||
|
CHUNK_LIST(stream, "lbin")
|
||||||
|
{
|
||||||
|
DMUS_IO_INSTRUMENT head = {.dwPatch = 2, .dwPChannel = 1, .dwFlags = DMUS_IO_INST_PATCH};
|
||||||
|
CHUNK_DATA(stream, "bins", head);
|
||||||
|
}
|
||||||
|
CHUNK_END;
|
||||||
|
|
||||||
|
CHUNK_LIST(stream, "lbin")
|
||||||
|
{
|
||||||
|
DMUS_IO_INSTRUMENT head = {.dwPatch = 3, .dwPChannel = 2, .dwFlags = DMUS_IO_INST_PATCH};
|
||||||
|
CHUNK_DATA(stream, "bins", head);
|
||||||
|
}
|
||||||
|
CHUNK_END;
|
||||||
|
}
|
||||||
|
CHUNK_END;
|
||||||
|
}
|
||||||
|
CHUNK_END;
|
||||||
|
}
|
||||||
|
CHUNK_END;
|
||||||
|
}
|
||||||
|
CHUNK_END;
|
||||||
|
}
|
||||||
|
CHUNK_END;
|
||||||
|
|
||||||
|
hr = IStream_Seek(stream, zero, 0, NULL);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
|
||||||
|
/* band track requires the stream to implement IDirectMusicGetLoader */
|
||||||
|
|
||||||
|
hr = CoCreateInstance(&CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC_SERVER,
|
||||||
|
&IID_IDirectMusicLoader8, (void **)&loader);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
hr = IDirectMusicLoader_SetObject(loader, &desc);
|
||||||
|
todo_wine ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
|
||||||
|
hr = test_loader_stream_create(stream, loader, &loader_stream);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
IDirectMusicLoader8_Release(loader);
|
||||||
|
|
||||||
|
hr = IPersistStream_Load(persist, loader_stream);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
IStream_Release(loader_stream);
|
||||||
|
|
||||||
|
IPersistStream_Release(persist);
|
||||||
|
IStream_Release(stream);
|
||||||
|
|
||||||
|
hr = IDirectMusicSegment_InsertTrack(segment, (IDirectMusicTrack *)track, 1);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
IDirectMusicTrack_Release(track);
|
||||||
|
|
||||||
|
|
||||||
|
/* now play the segment, and check produced messages */
|
||||||
|
|
||||||
|
hr = IDirectMusicPerformance_Init(performance, NULL, 0, 0);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
|
||||||
|
hr = IDirectMusicPerformance_PlaySegment(performance, segment, 0x800, 0, NULL);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
|
||||||
|
ret = test_tool_wait_message(tool, 500, &msg);
|
||||||
|
todo_wine ok(!ret, "got %#lx\n", ret);
|
||||||
|
if (!ret)
|
||||||
|
{
|
||||||
|
ok(msg->dwType == DMUS_PMSGT_DIRTY, "got %#lx\n", msg->dwType);
|
||||||
|
hr = IDirectMusicPerformance_FreePMsg(performance, msg);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = test_tool_wait_message(tool, 500, (DMUS_PMSG **)&patch);
|
||||||
|
todo_wine ok(!ret, "got %#lx\n", ret);
|
||||||
|
if (!ret)
|
||||||
|
{
|
||||||
|
check_dmus_patch_pmsg(patch, 0, 1, 0, 1);
|
||||||
|
hr = IDirectMusicPerformance_FreePMsg(performance, (DMUS_PMSG *)patch);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = test_tool_wait_message(tool, 500, (DMUS_PMSG **)&patch);
|
||||||
|
todo_wine ok(!ret, "got %#lx\n", ret);
|
||||||
|
if (!ret)
|
||||||
|
{
|
||||||
|
check_dmus_patch_pmsg(patch, 1000, 2, 0, 3);
|
||||||
|
hr = IDirectMusicPerformance_FreePMsg(performance, (DMUS_PMSG *)patch);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = test_tool_wait_message(tool, 500, (DMUS_PMSG **)&patch);
|
||||||
|
todo_wine ok(!ret, "got %#lx\n", ret);
|
||||||
|
if (!ret)
|
||||||
|
{
|
||||||
|
check_dmus_patch_pmsg(patch, 1000, 1, 0, 2);
|
||||||
|
hr = IDirectMusicPerformance_FreePMsg(performance, (DMUS_PMSG *)patch);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = test_tool_wait_message(tool, 500, &msg);
|
||||||
|
todo_wine ok(!ret, "got %#lx\n", ret);
|
||||||
|
if (!ret)
|
||||||
|
{
|
||||||
|
ok(msg->dwType == DMUS_PMSGT_DIRTY, "got %#lx\n", msg->dwType);
|
||||||
|
hr = IDirectMusicPerformance_FreePMsg(performance, msg);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
IDirectMusicSegment_Release(segment);
|
||||||
|
|
||||||
|
|
||||||
|
hr = IDirectMusicPerformance_CloseDown(performance);
|
||||||
|
ok(hr == S_OK, "got %#lx\n", hr);
|
||||||
|
|
||||||
|
IDirectMusicPerformance_Release(performance);
|
||||||
|
IDirectMusicTool_Release(tool);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(dmime)
|
START_TEST(dmime)
|
||||||
{
|
{
|
||||||
CoInitialize(NULL);
|
CoInitialize(NULL);
|
||||||
|
@ -2701,6 +3183,7 @@ START_TEST(dmime)
|
||||||
test_notification_pmsg();
|
test_notification_pmsg();
|
||||||
test_wave_pmsg();
|
test_wave_pmsg();
|
||||||
test_sequence_track();
|
test_sequence_track();
|
||||||
|
test_band_track_play();
|
||||||
|
|
||||||
CoUninitialize();
|
CoUninitialize();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue