Module: wine Branch: master Commit: 2cb326260b68634fec7a3a402808710fea159d99 URL: https://source.winehq.org/git/wine.git/?a=commit;h=2cb326260b68634fec7a3a402...
Author: Akihiro Sagawa sagawa.aki@gmail.com Date: Tue Jun 26 22:10:45 2018 +0900
winmm: Don't allow to set time division property while playing.
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com Signed-off-by: Andrew Eikum aeikum@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/winmm/tests/midi.c | 6 ++++++ dlls/winmm/winmm.c | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/dlls/winmm/tests/midi.c b/dlls/winmm/tests/midi.c index 3b8bd22..c46286b 100644 --- a/dlls/winmm/tests/midi.c +++ b/dlls/winmm/tests/midi.c @@ -885,6 +885,12 @@ static void test_midiStream(UINT udev, HWND hwnd) ok(ret > expected && ret < expected + MARGIN, "expected greater than %ums, got %ums\n", expected, ret); expected = ret;
+ /* shouldn't set time division property while playing */ + midiprop.tdiv.cbStruct = sizeof(midiprop.tdiv); + midiprop.tdiv.dwTimeDiv = 24; + rc = midiStreamProperty(hm, (void*)&midiprop, MIDIPROP_SET | MIDIPROP_TIMEDIV); + ok(rc == MMSYSERR_INVALPARAM, "midiStreamProperty(SET|TIMEDIV, dev=%d) rc=%s\n", udev, mmsys_error(rc)); + ret = WaitForSingleObject(records.done, INFINITE); ok(ret == WAIT_OBJECT_0, "WaitForSingleObject failed, got %d\n", ret);
diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c index ef7dcdf..4bba1a7 100644 --- a/dlls/winmm/winmm.c +++ b/dlls/winmm/winmm.c @@ -1539,9 +1539,13 @@ MMRESULT WINAPI midiStreamProperty(HMIDISTRM hMidiStrm, LPBYTE lpPropData, DWORD ret = MMSYSERR_INVALPARAM; } else if (dwProperty & MIDIPROP_SET) { EnterCriticalSection(&lpMidiStrm->lock); - lpMidiStrm->dwTimeDiv = mptd->dwTimeDiv; + if (lpMidiStrm->status != MSM_STATUS_PLAYING) { + lpMidiStrm->dwTimeDiv = mptd->dwTimeDiv; + TRACE("Setting time div to %d\n", mptd->dwTimeDiv); + } + else + ret = MMSYSERR_INVALPARAM; LeaveCriticalSection(&lpMidiStrm->lock); - TRACE("Setting time div to %d\n", mptd->dwTimeDiv); } else if (dwProperty & MIDIPROP_GET) { mptd->dwTimeDiv = lpMidiStrm->dwTimeDiv; TRACE("Getting time div <= %d\n", mptd->dwTimeDiv);