Module: wine Branch: master Commit: 67124e1c0b33c9f832c0debebbc7abaee0ea5a2b URL: http://source.winehq.org/git/wine.git/?a=commit;h=67124e1c0b33c9f832c0debebb...
Author: Jörg Höhle hoehle@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;