Jörg Höhle : winmm: Improve initial MIDI player thread synchronisation.
Alexandre Julliard
julliard at winehq.org
Thu Feb 11 11:08:31 CST 2010
Module: wine
Branch: master
Commit: 67124e1c0b33c9f832c0debebbc7abaee0ea5a2b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=67124e1c0b33c9f832c0debebbc7abaee0ea5a2b
Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date: Thu Feb 11 04:15:43 2010 +0100
winmm: Improve initial MIDI player thread synchronisation.
---
dlls/winmm/winmm.c | 31 +++++++++++++------------------
1 files changed, 13 insertions(+), 18 deletions(-)
diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
index 233de32..d201d12 100644
--- a/dlls/winmm/winmm.c
+++ b/dlls/winmm/winmm.c
@@ -1606,22 +1606,16 @@ static DWORD CALLBACK MMSYSTEM_MidiStream_Player(LPVOID pmt)
goto the_end;
/* force thread's queue creation */
- /* Used to be InitThreadInput16(0, 5); */
- /* but following works also with hack in midiStreamOpen */
- PeekMessageA(&msg, 0, 0, 0, 0);
-
- /* FIXME: this next line must be called before midiStreamOut or midiStreamRestart are called */
- SetEvent(lpMidiStrm->hEvent);
- TRACE("Ready to go 1\n");
- /* thread is started in paused mode */
- SuspendThread(GetCurrentThread());
- TRACE("Ready to go 2\n");
+ PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE);
lpMidiStrm->dwStartTicks = 0;
lpMidiStrm->dwPulses = 0;
lpMidiStrm->lpMidiHdr = 0;
+ /* midiStreamOpen is waiting for ack */
+ SetEvent(lpMidiStrm->hEvent);
+
for (;;) {
lpMidiHdr = lpMidiStrm->lpMidiHdr;
if (!lpMidiHdr) {
@@ -1706,8 +1700,7 @@ static DWORD CALLBACK MMSYSTEM_MidiStream_Player(LPVOID pmt)
}
the_end:
TRACE("End of thread\n");
- ExitThread(0);
- return 0; /* for removing the warning, never executed */
+ return 0;
}
/**************************************************************************
@@ -1718,7 +1711,7 @@ static BOOL MMSYSTEM_MidiStream_PostMessage(WINE_MIDIStream* lpMidiStrm, WORD ms
if (PostThreadMessageA(lpMidiStrm->dwThreadID, msg, pmt1, pmt2)) {
MsgWaitForMultipleObjects( 1, &lpMidiStrm->hEvent, FALSE, INFINITE, 0 );
} else {
- WARN("bad PostThreadMessageA\n");
+ ERR("bad PostThreadMessageA\n");
return FALSE;
}
return TRUE;
@@ -1805,6 +1798,8 @@ MMRESULT WINAPI midiStreamOpen(HMIDISTRM* lphMidiStrm, LPUINT lpuDeviceID,
/* wait for thread to have started, and for its queue to be created */
WaitForSingleObject(lpMidiStrm->hEvent, INFINITE);
+ /* start in paused mode */
+ SuspendThread(lpMidiStrm->hThread);
TRACE("=> (%u/%d) hMidi=%p ret=%d lpMidiStrm=%p\n",
*lpuDeviceID, lpwm->mld.uDeviceID, *lphMidiStrm, ret, lpMidiStrm);
@@ -1839,7 +1834,7 @@ MMRESULT WINAPI midiStreamOut(HMIDISTRM hMidiStrm, LPMIDIHDR lpMidiHdr,
if (!PostThreadMessageA(lpMidiStrm->dwThreadID,
WINE_MSM_HEADER, cbMidiHdr,
(LPARAM)lpMidiHdr)) {
- WARN("bad PostThreadMessageA\n");
+ ERR("bad PostThreadMessageA\n");
ret = MMSYSERR_ERROR;
}
}
@@ -1860,7 +1855,7 @@ MMRESULT WINAPI midiStreamPause(HMIDISTRM hMidiStrm)
ret = MMSYSERR_INVALHANDLE;
} else {
if (SuspendThread(lpMidiStrm->hThread) == 0xFFFFFFFF) {
- WARN("bad Suspend (%d)\n", GetLastError());
+ ERR("bad Suspend (%d)\n", GetLastError());
ret = MMSYSERR_ERROR;
}
}
@@ -1963,13 +1958,13 @@ MMRESULT WINAPI midiStreamRestart(HMIDISTRM hMidiStrm)
DWORD ret;
/* since we increase the thread suspend count on each midiStreamPause
- * there may be a need for several midiStreamResume
+ * there may be a need for several ResumeThread
*/
do {
ret = ResumeThread(lpMidiStrm->hThread);
- } while (ret != 0xFFFFFFFF && ret != 0);
+ } while (ret != 0xFFFFFFFF && ret > 1);
if (ret == 0xFFFFFFFF) {
- WARN("bad Resume (%d)\n", GetLastError());
+ ERR("bad Resume (%d)\n", GetLastError());
ret = MMSYSERR_ERROR;
} else {
lpMidiStrm->dwStartTicks = GetTickCount() - lpMidiStrm->dwPositionMS;
More information about the wine-cvs
mailing list