Akihiro Sagawa : winmm: Don' t allow to set time division property while playing.

Alexandre Julliard julliard at winehq.org
Tue Jul 10 15:36:43 CDT 2018


Module: wine
Branch: master
Commit: 2cb326260b68634fec7a3a402808710fea159d99
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=2cb326260b68634fec7a3a402808710fea159d99

Author: Akihiro Sagawa <sagawa.aki at 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 at gmail.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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);




More information about the wine-cvs mailing list