Akihiro Sagawa : winmm: Use microsecond unit in MIDI stream position variable to simplify the code.

Alexandre Julliard julliard at winehq.org
Wed Jul 11 15:53:51 CDT 2018


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

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

winmm: Use microsecond unit in MIDI stream position variable to simplify the code.

Since 32-bit variable overflows after approximately 70 minutes,
we use 64-bit variable for this purpose. `remainder' member is removed.

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/winmm.c | 20 +++++++-------------
 1 file changed, 7 insertions(+), 13 deletions(-)

diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
index 0328721..4b8d4de 100644
--- a/dlls/winmm/winmm.c
+++ b/dlls/winmm/winmm.c
@@ -915,13 +915,12 @@ typedef struct WINE_MIDIStream {
     CRITICAL_SECTION		lock;
     DWORD			dwTempo;
     DWORD			dwTimeDiv;
-    DWORD			dwPositionMS;
+    ULONGLONG			position_usec;
     DWORD			dwPulses;
     DWORD			dwStartTicks;
     DWORD			dwElapsedMS;
     WORD			wFlags;
     WORD			status;
-    WORD			remainder;
     HANDLE			hEvent;
     LPMIDIHDR			lpMidiHdr;
 } WINE_MIDIStream;
@@ -1008,8 +1007,7 @@ static	BOOL	MMSYSTEM_MidiStream_MessageHandler(WINE_MIDIStream* lpMidiStrm, LPWI
             lpMidiStrm->status = MSM_STATUS_STOPPED;
             lpMidiStrm->dwPulses = 0;
             lpMidiStrm->dwElapsedMS = 0;
-            lpMidiStrm->dwPositionMS = 0;
-            lpMidiStrm->remainder = 0;
+            lpMidiStrm->position_usec = 0;
             LeaveCriticalSection(&lpMidiStrm->lock);
             /* this is not quite what MS doc says... */
             midiOutReset(lpMidiStrm->hDevice);
@@ -1181,15 +1179,12 @@ start_header:
 
 	/* do we have to wait ? */
 	if (me->dwDeltaTime) {
-	    DWORD delta;
 	    EnterCriticalSection(&lpMidiStrm->lock);
-	    delta = lpMidiStrm->remainder + MMSYSTEM_MidiStream_Convert(lpMidiStrm, me->dwDeltaTime);
-	    lpMidiStrm->dwPositionMS += delta / 1000;
-	    lpMidiStrm->remainder = delta % 1000;
+	    lpMidiStrm->position_usec += MMSYSTEM_MidiStream_Convert(lpMidiStrm, me->dwDeltaTime);
 	    lpMidiStrm->dwPulses += me->dwDeltaTime;
 	    LeaveCriticalSection(&lpMidiStrm->lock);
 
-	    dwToGo = lpMidiStrm->dwStartTicks + lpMidiStrm->dwPositionMS;
+	    dwToGo = lpMidiStrm->dwStartTicks + lpMidiStrm->position_usec / 1000;
 
 	    TRACE("%u/%u/%u\n", dwToGo, GetTickCount(), me->dwDeltaTime);
 	    while (dwToGo - (dwCurrTC = GetTickCount()) <= MAXLONG) {
@@ -1204,7 +1199,7 @@ start_header:
 			}
 		    }
 		    /* reset dwToGo because dwStartTicks might be updated */
-		    dwToGo = lpMidiStrm->dwStartTicks + lpMidiStrm->dwPositionMS;
+		    dwToGo = lpMidiStrm->dwStartTicks + lpMidiStrm->position_usec / 1000;
 		} else {
 		    /* timeout, so me->dwDeltaTime is elapsed, can break the while loop */
 		    break;
@@ -1334,10 +1329,9 @@ MMRESULT WINAPI midiStreamOpen(HMIDISTRM* lphMidiStrm, LPUINT lpuDeviceID,
     if (!lpMidiStrm)
 	return MMSYSERR_NOMEM;
 
-    lpMidiStrm->dwTempo = 500000;  /* micro seconds per quarter note, i.e. 120 BPM */
+    lpMidiStrm->dwTempo = 500000;  /* microseconds per quarter note, i.e. 120 BPM */
     lpMidiStrm->dwTimeDiv = 24;    /* ticks per quarter note */
-    lpMidiStrm->dwPositionMS = 0;
-    lpMidiStrm->remainder = 0;
+    lpMidiStrm->position_usec = 0;
     lpMidiStrm->status = MSM_STATUS_PAUSED;
     lpMidiStrm->dwElapsedMS = 0;
 




More information about the wine-cvs mailing list