Module: wine Branch: master Commit: b2441ad69979dda9d8edbeb4a02f2ce8c142207d URL: https://gitlab.winehq.org/wine/wine/-/commit/b2441ad69979dda9d8edbeb4a02f2ce...
Author: Eric Pouech epouech@codeweavers.com Date: Mon Jan 22 17:02:12 2024 +0100
dmime/tests: Add some tests for loops on wave tracks.
Signed-off-by: Eric Pouech epouech@codeweavers.com
---
dlls/dmime/tests/dmime.c | 89 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 70 insertions(+), 19 deletions(-)
diff --git a/dlls/dmime/tests/dmime.c b/dlls/dmime/tests/dmime.c index e22193e3a5c..f96e6509b7a 100644 --- a/dlls/dmime/tests/dmime.c +++ b/dlls/dmime/tests/dmime.c @@ -3542,7 +3542,7 @@ static void test_notification_pmsg(void) IDirectMusicTool_Release(tool); }
-static void test_wave_pmsg(void) +static void test_wave_pmsg(unsigned num_repeats) { static const DWORD message_types[] = { @@ -3550,17 +3550,25 @@ static void test_wave_pmsg(void) DMUS_PMSGT_WAVE, }; IDirectMusicPerformance *performance; + IDirectMusicSegmentState *state; IDirectMusicSegment *segment; IDirectMusicLoader8 *loader; IDirectMusicGraph *graph; WCHAR test_wav[MAX_PATH]; IDirectMusicTool *tool; DMUS_WAVE_PMSG *wave; + DWORD mt_start_ref; MUSIC_TIME length; DMUS_PMSG *msg; + DWORD value; HRESULT hr; + unsigned i; DWORD ret;
+ if (num_repeats) + winetest_push_context("with %u repeats", num_repeats); + else + winetest_push_context("without any repeats"); hr = test_tool_create(message_types, ARRAY_SIZE(message_types), &tool); ok(hr == S_OK, "got %#lx\n", hr);
@@ -3599,6 +3607,12 @@ static void test_wave_pmsg(void) ok(length == 1, "got %lu\n", length);
+ if (num_repeats) + { + hr = IDirectMusicSegment_SetRepeats(segment, num_repeats); + ok(hr == S_OK, "got %#lx\n", hr); + } + /* without Download, no DMUS_PMSGT_WAVE is sent */
hr = IDirectMusicPerformance_PlaySegment(performance, segment, 0, 0, NULL); @@ -3611,10 +3625,14 @@ static void test_wave_pmsg(void) ok(hr == S_OK, "got %#lx\n", hr);
ret = test_tool_wait_message(tool, 500, &msg); + todo_wine_if(num_repeats) ok(!ret, "got %#lx\n", ret); - ok(msg->dwType == DMUS_PMSGT_DIRTY, "got %p\n", msg); - hr = IDirectMusicPerformance_FreePMsg(performance, msg); - ok(hr == S_OK, "got %#lx\n", hr); + if (!ret) + { + ok(msg->dwType == DMUS_PMSGT_DIRTY, "got %p\n", msg); + hr = IDirectMusicPerformance_FreePMsg(performance, msg); + ok(hr == S_OK, "got %#lx\n", hr); + }
ret = test_tool_wait_message(tool, 100, &msg); ok(ret == WAIT_TIMEOUT, "got %#lx\n", ret); @@ -3626,7 +3644,7 @@ static void test_wave_pmsg(void) hr = IDirectMusicSegment8_Download((IDirectMusicSegment8 *)segment, (IUnknown *)performance); ok(hr == S_OK, "got %#lx\n", hr);
- hr = IDirectMusicPerformance_PlaySegment(performance, segment, 0, 0, NULL); + hr = IDirectMusicPerformance_PlaySegment(performance, segment, 0, 0, &state); ok(hr == S_OK, "got %#lx\n", hr);
ret = test_tool_wait_message(tool, 500, &msg); @@ -3635,24 +3653,54 @@ static void test_wave_pmsg(void) hr = IDirectMusicPerformance_FreePMsg(performance, msg); ok(hr == S_OK, "got %#lx\n", hr);
- ret = test_tool_wait_message(tool, 500, (DMUS_PMSG **)&wave); - ok(!ret, "got %#lx\n", ret); - ok(wave->dwType == DMUS_PMSGT_WAVE, "got %p\n", wave); - ok(!!wave->punkUser, "got %p\n", wave->punkUser); - ok(wave->rtStartOffset == 0, "got %I64d\n", wave->rtStartOffset); - ok(wave->rtDuration == 1000000, "got %I64d\n", wave->rtDuration); - ok(wave->lOffset == 0, "got %lu\n", wave->lOffset); - ok(wave->lVolume == 0, "got %lu\n", wave->lVolume); - ok(wave->lPitch == 0, "got %lu\n", wave->lPitch); - ok(wave->bFlags == 0, "got %#x\n", wave->bFlags); - hr = IDirectMusicPerformance_FreePMsg(performance, (DMUS_PMSG *)wave); + hr = IDirectMusicPerformance_ReferenceToMusicTime(performance, 1000000, &length); ok(hr == S_OK, "got %#lx\n", hr); + /* assuming not modified tempo */ + length = round((1000000 * 120.0 * DMUS_PPQ) / 600000000.0); + + for (i = 0; i <= num_repeats; i++) + { + ret = test_tool_wait_message(tool, 500, (DMUS_PMSG **)&wave); + todo_wine_if(num_repeats && ret) + ok(!ret, "got %#lx\n", ret); + if (ret) continue; + ok(wave->dwType == DMUS_PMSGT_WAVE, "got %p\n", wave); + ok(wave->dwSize == sizeof(*wave), "got %lu\n", wave->dwSize); + ok(!!wave->punkUser, "got %p\n", wave->punkUser); + ok((wave->dwFlags & DMUS_PMSGF_REFTIME) && (wave->dwFlags & DMUS_PMSGF_MUSICTIME), + "got %lx\n", wave->dwFlags); + if (i == 0) + mt_start_ref = wave->mtTime; + else + todo_wine + ok(wave->mtTime == mt_start_ref + length * i, "got %lu (%lu,%lu)\n", wave->mtTime, mt_start_ref, i * length); + ok(wave->rtStartOffset == 0, "got %I64d\n", wave->rtStartOffset); + ok(wave->rtDuration == 1000000, "got %I64d\n", wave->rtDuration); + ok(wave->lOffset == 0, "got %lu\n", wave->lOffset); + ok(wave->lVolume == 0, "got %lu\n", wave->lVolume); + ok(wave->lPitch == 0, "got %lu\n", wave->lPitch); + ok(wave->bFlags == 0, "got %#x\n", wave->bFlags); + hr = IDirectMusicPerformance_FreePMsg(performance, (DMUS_PMSG *)wave); + ok(hr == S_OK, "got %#lx\n", hr); + }
ret = test_tool_wait_message(tool, 500, &msg); + todo_wine_if(num_repeats) ok(!ret, "got %#lx\n", ret); - ok(msg->dwType == DMUS_PMSGT_DIRTY, "got %p\n", msg); - hr = IDirectMusicPerformance_FreePMsg(performance, msg); + if (!ret) + { + ok(msg->dwType == DMUS_PMSGT_DIRTY, "got %p\n", msg); + hr = IDirectMusicPerformance_FreePMsg(performance, msg); + ok(hr == S_OK, "got %#lx\n", hr); + } + + hr = IDirectMusicSegment_GetRepeats(segment, &value); ok(hr == S_OK, "got %#lx\n", hr); + ok(value == num_repeats, "got %lu\n", value); + + hr = IDirectMusicSegmentState_GetRepeats(state, &value); + ok(hr == S_OK, "got %#lx\n", hr); + ok(value == num_repeats, "got %lu\n", value);
hr = IDirectMusicSegment8_Unload((IDirectMusicSegment8 *)segment, (IUnknown *)performance); ok(hr == S_OK, "got %#lx\n", hr); @@ -3670,6 +3718,8 @@ static void test_wave_pmsg(void)
IDirectMusicPerformance_Release(performance); IDirectMusicTool_Release(tool); + + winetest_pop_context(); }
static void test_sequence_track(void) @@ -4664,7 +4714,8 @@ START_TEST(dmime) test_performance_time(); test_performance_pmsg(); test_notification_pmsg(); - test_wave_pmsg(); + test_wave_pmsg(0); + test_wave_pmsg(10); test_sequence_track(); test_band_track_play(); test_tempo_track_play();