From: Anton Baskanov baskanov@gmail.com
--- dlls/dmime/performance.c | 23 ++++++++++++++++++----- dlls/dmime/tests/dmime.c | 4 ++-- 2 files changed, 20 insertions(+), 7 deletions(-)
diff --git a/dlls/dmime/performance.c b/dlls/dmime/performance.c index a7f63f959e7..dd7395f457f 100644 --- a/dlls/dmime/performance.c +++ b/dlls/dmime/performance.c @@ -2046,12 +2046,25 @@ static HRESULT WINAPI performance_tool_ProcessPMsg(IDirectMusicTool *iface, DMUS_NOTE_PMSG *note = (DMUS_NOTE_PMSG *)msg;
msg->mtTime += note->nOffset; - if (FAILED(hr = performance_send_midi_pmsg(This, msg, DMUS_PMSGF_MUSICTIME | DMUS_PMSGF_TOOL_IMMEDIATE, - MIDI_NOTE_ON, note->bMidiValue, note->bVelocity))) - WARN("Failed to translate message to MIDI, hr %#lx\n", hr);
- msg->mtTime += note->mtDuration; - if (FAILED(hr = performance_send_midi_pmsg(This, msg, DMUS_PMSGF_MUSICTIME | DMUS_PMSGF_TOOL_QUEUE, + if (note->bFlags & DMUS_NOTEF_NOTEON) + { + if (FAILED(hr = performance_send_midi_pmsg(This, msg, DMUS_PMSGF_MUSICTIME | DMUS_PMSGF_TOOL_IMMEDIATE, + MIDI_NOTE_ON, note->bMidiValue, note->bVelocity))) + WARN("Failed to translate message to MIDI, hr %#lx\n", hr); + + if (note->mtDuration) + { + msg->mtTime -= note->nOffset; + msg->mtTime += note->mtDuration; + if (FAILED(hr = IDirectMusicPerformance8_MusicToReferenceTime(performance, msg->mtTime, &msg->rtTime))) + return hr; + note->bFlags &= ~DMUS_NOTEF_NOTEON; + return DMUS_S_REQUEUE; + } + } + + if (FAILED(hr = performance_send_midi_pmsg(This, msg, DMUS_PMSGF_MUSICTIME | DMUS_PMSGF_TOOL_IMMEDIATE, MIDI_NOTE_OFF, note->bMidiValue, 0))) WARN("Failed to translate message to MIDI, hr %#lx\n", hr);
diff --git a/dlls/dmime/tests/dmime.c b/dlls/dmime/tests/dmime.c index 6a8a3ef0a87..8290d3e595c 100644 --- a/dlls/dmime/tests/dmime.c +++ b/dlls/dmime/tests/dmime.c @@ -2590,7 +2590,7 @@ static void test_performance_tool(void) note.rtTime = rt; note.mtTime = mt; hr = IDirectMusicTool_ProcessPMsg(tool, performance, (DMUS_PMSG *)¬e); - todo_wine ok(hr == DMUS_S_REQUEUE, "got %#lx\n", hr); + ok(hr == DMUS_S_REQUEUE, "got %#lx\n", hr); ok(note.dwSize == sizeof(DMUS_NOTE_PMSG), "got %lu\n", note.dwSize); todo_wine ok(llabs(note.rtTime - rt - 6503906) < 10, "got %I64d\n", note.rtTime - rt); todo_wine ok(note.mtTime - mt == 999, "got %ld\n", note.mtTime - mt); @@ -2610,7 +2610,7 @@ static void test_performance_tool(void) ok(!note.bBeat, "got %d\n", note.bBeat); ok(!note.bGrid, "got %d\n", note.bGrid); ok(note.bVelocity == 127, "got %d\n", note.bVelocity); - todo_wine ok(!note.bFlags, "got %#x\n", note.bFlags); + ok(!note.bFlags, "got %#x\n", note.bFlags); ok(!note.bTimeRange, "got %d\n", note.bTimeRange); ok(!note.bDurRange, "got %d\n", note.bDurRange); ok(!note.bVelRange, "got %d\n", note.bVelRange);