Jörg Höhle : midimap: Perform stricter error-checking.
Alexandre Julliard
julliard at winehq.org
Mon Feb 1 08:56:07 CST 2010
Module: wine
Branch: master
Commit: ed7a3662020a6a7ae553c37985b2ed05ccbc70fe
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ed7a3662020a6a7ae553c37985b2ed05ccbc70fe
Author: Jörg Höhle <hoehle at 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;
More information about the wine-cvs
mailing list