Akihiro Sagawa : winmm: Support TIME_MIDI position in MIDI stream.

Alexandre Julliard julliard at winehq.org
Thu Jul 12 17:45:39 CDT 2018


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

Author: Akihiro Sagawa <sagawa.aki at gmail.com>
Date:   Wed Jul 11 22:33:25 2018 +0900

winmm: Support TIME_MIDI position in MIDI stream.

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 |  4 ++--
 dlls/winmm/winmm.c      | 21 ++++++++++++++++++---
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/dlls/winmm/tests/midi.c b/dlls/winmm/tests/midi.c
index 66f35ef..2b1e91f 100644
--- a/dlls/winmm/tests/midi.c
+++ b/dlls/winmm/tests/midi.c
@@ -698,7 +698,7 @@ static void test_midiStream(UINT udev, HWND hwnd)
 
         test_position(hm, TIME_MS,      TIME_MS);
         test_position(hm, TIME_TICKS,   TIME_TICKS);
-        todo_wine test_position(hm, TIME_MIDI,    TIME_MIDI);
+        test_position(hm, TIME_MIDI,    TIME_MIDI);
         test_position(hm, TIME_SMPTE,   TIME_MS);
         test_position(hm, TIME_SAMPLES, TIME_MS);
         test_position(hm, TIME_BYTES,   TIME_MS);
@@ -933,7 +933,7 @@ static void test_midiStream(UINT udev, HWND hwnd)
     /* TIME_MIDI value is a quarter of TIME_TICKS, rounded */
     expected = (ret + midiprop.tdiv.dwTimeDiv/8) / (midiprop.tdiv.dwTimeDiv/4);
     ret = get_position(hm, TIME_MIDI);
-    todo_wine ok(ret == expected, "expected song pointer %u, got %u\n", expected, ret);
+    ok(ret == expected, "expected song pointer %u, got %u\n", expected, ret);
 
     ok(records.count == 2, "expected 2 MM_MOM_DONE messages, got %d\n", records.count);
 
diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
index f2dfae9..487bbff 100644
--- a/dlls/winmm/winmm.c
+++ b/dlls/winmm/winmm.c
@@ -1508,9 +1508,17 @@ MMRESULT WINAPI midiStreamPosition(HMIDISTRM hMidiStrm, LPMMTIME lpMMT, UINT cbm
     } else {
 	EnterCriticalSection(&lpMidiStrm->lock);
 	switch (lpMMT->wType) {
-	default:
-	    FIXME("Unsupported time type %x\n", lpMMT->wType);
-        /* fall through */
+	case TIME_MIDI:
+	    if (lpMidiStrm->dwTimeDiv < 0x8000) {
+		DWORD tdiv, pulses;
+		tdiv = (lpMidiStrm->dwTimeDiv > 24) ? lpMidiStrm->dwTimeDiv : 24;
+		pulses = midistream_get_current_pulse(lpMidiStrm);
+		lpMMT->u.midi.songptrpos = (pulses + tdiv/8) / (tdiv/4);
+		if (!lpMMT->u.midi.songptrpos && pulses) lpMMT->u.midi.songptrpos++;
+		TRACE("=> song position %d (pulses %u, tdiv %u)\n", lpMMT->u.midi.songptrpos, pulses, tdiv);
+		break;
+	    }
+	/* fall through */
 	case TIME_BYTES:
 	case TIME_SAMPLES:
 	    lpMMT->wType = TIME_MS;
@@ -1523,6 +1531,13 @@ MMRESULT WINAPI midiStreamPosition(HMIDISTRM hMidiStrm, LPMMTIME lpMMT, UINT cbm
 	    lpMMT->u.ticks = midistream_get_current_pulse(lpMidiStrm);
 	    TRACE("=> %d ticks\n", lpMMT->u.ticks);
 	    break;
+	default:
+	    FIXME("Unsupported time type %x\n", lpMMT->wType);
+	    /* use TIME_MS instead */
+	    lpMMT->wType = TIME_MS;
+	    lpMMT->u.ms = midistream_get_playing_position(lpMidiStrm);
+	    TRACE("=> %d ms\n", lpMMT->u.ms);
+	    break;
 	}
 	LeaveCriticalSection(&lpMidiStrm->lock);
     }




More information about the wine-cvs mailing list