diff --git a/dlls/winmm/tests/midi.c b/dlls/winmm/tests/midi.c index 3b8bd2287dd..c46286b38ec 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 ef7dcdfc9a6..4bba1a7bd91 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);