Module: wine Branch: master Commit: ed7a3662020a6a7ae553c37985b2ed05ccbc70fe URL: http://source.winehq.org/git/wine.git/?a=commit;h=ed7a3662020a6a7ae553c37985...
Author: Jörg Höhle hoehle@users.sourceforge.net Date: Wed Jan 27 18:08:04 2010 +0100
midimap: Perform stricter error-checking.
---
dlls/midimap/midimap.c | 21 +++++++++++++++++---- 1 files changed, 17 insertions(+), 4 deletions(-)
diff --git a/dlls/midimap/midimap.c b/dlls/midimap/midimap.c index f429497..293465f 100644 --- a/dlls/midimap/midimap.c +++ b/dlls/midimap/midimap.c @@ -318,8 +318,14 @@ static DWORD modLongData(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD_PTR dwPara
if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR; + if (!(lpMidiHdr->dwFlags & MHDR_PREPARED)) + return MIDIERR_UNPREPARED; + if (lpMidiHdr->dwFlags & MHDR_INQUEUE) + return MIDIERR_STILLPLAYING;
mh = *lpMidiHdr; + lpMidiHdr->dwFlags &= ~MHDR_DONE; + lpMidiHdr->dwFlags |= MHDR_INQUEUE; for (chn = 0; chn < 16; chn++) { if (mom->ChannelMap[chn] && mom->ChannelMap[chn]->loaded > 0) @@ -327,10 +333,15 @@ static DWORD modLongData(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD_PTR dwPara mh.dwFlags = 0; midiOutPrepareHeader(mom->ChannelMap[chn]->hMidi, &mh, sizeof(mh)); ret = midiOutLongMsg(mom->ChannelMap[chn]->hMidi, &mh, sizeof(mh)); + /* As of 2009, wineXYZ.drv's LongData handlers are synchronous */ + if (!ret && !(mh.dwFlags & MHDR_DONE)) + FIXME("wait until MHDR_DONE\n"); midiOutUnprepareHeader(mom->ChannelMap[chn]->hMidi, &mh, sizeof(mh)); if (ret != MMSYSERR_NOERROR) break; } } + lpMidiHdr->dwFlags &= ~MHDR_INQUEUE; + lpMidiHdr->dwFlags |= MHDR_DONE; return ret; }
@@ -397,21 +408,23 @@ static DWORD modData(MIDIMAPDATA* mom, DWORD_PTR dwParam) return ret; }
-static DWORD modPrepare(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD_PTR dwParam2) +static DWORD modPrepare(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD_PTR dwSize) { if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR; - if (lpMidiHdr->dwFlags & (MHDR_ISSTRM|MHDR_PREPARED)) + if (dwSize < sizeof(MIDIHDR) || lpMidiHdr == 0 || + lpMidiHdr->lpData == 0 || (lpMidiHdr->dwFlags & MHDR_INQUEUE)) return MMSYSERR_INVALPARAM;
lpMidiHdr->dwFlags |= MHDR_PREPARED; + lpMidiHdr->dwFlags &= ~MHDR_DONE; return MMSYSERR_NOERROR; }
static DWORD modUnprepare(MIDIMAPDATA* mom, LPMIDIHDR lpMidiHdr, DWORD_PTR dwParam2) { if (MIDIMAP_IsBadData(mom)) return MMSYSERR_ERROR; - if ((lpMidiHdr->dwFlags & MHDR_ISSTRM) || !(lpMidiHdr->dwFlags & MHDR_PREPARED)) - return MMSYSERR_INVALPARAM; + if (!(lpMidiHdr->dwFlags & MHDR_PREPARED)) return MIDIERR_UNPREPARED; + if (lpMidiHdr->dwFlags & MHDR_INQUEUE) return MIDIERR_STILLPLAYING;
lpMidiHdr->dwFlags &= ~MHDR_PREPARED; return MMSYSERR_NOERROR;