[PATCH 05/16] [WinMM, MMSystem]: move the 16bit management of midi out driver type to the new 16=>32 thunking scheme
Eric Pouech
eric.pouech at orange.fr
Thu Oct 22 15:10:05 CDT 2009
A+
---
0 files changed, 0 insertions(+), 0 deletions(-)
diff --git a/dlls/winmm/message16.c b/dlls/winmm/message16.c
index b6041e2..fc455b4 100644
--- a/dlls/winmm/message16.c
+++ b/dlls/winmm/message16.c
@@ -314,18 +314,18 @@ static void MMSYSTDRV_MidiIn_MapCB(UINT uMsg, DWORD_PTR* dwUser, DW
* ================================= */
/**************************************************************************
- * MMDRV_MidiOut_Map16To32W [internal]
+ * MMSYSTDRV_MidiOut_Map16To32W [internal]
*/
-static WINMM_MapType MMDRV_MidiOut_Map16To32W (UINT wMsg, DWORD_PTR *lpdwUser, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2)
+static MMSYSTEM_MapType MMSYSTDRV_MidiOut_Map16To32W (UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2)
{
- WINMM_MapType ret = WINMM_MAP_MSGERROR;
+ MMSYSTEM_MapType ret = MMSYSTEM_MAP_MSGERROR;
switch (wMsg) {
case MODM_GETNUMDEVS:
case MODM_DATA:
case MODM_RESET:
case MODM_SETVOLUME:
- ret = WINMM_MAP_OK;
+ ret = MMSYSTEM_MAP_OK;
break;
case MODM_OPEN:
@@ -345,9 +345,9 @@ static WINMM_MapType MMDRV_MidiOut_Map16To32W (UINT wMsg, DWORD_PTR *lpdwUser,
*lpParam1 = (DWORD)moc32;
*lpParam2 = sizeof(MIDIOUTCAPSW);
- ret = WINMM_MAP_OKMEM;
+ ret = MMSYSTEM_MAP_OKMEM;
} else {
- ret = WINMM_MAP_NOMEM;
+ ret = MMSYSTEM_MAP_NOMEM;
}
}
break;
@@ -373,9 +373,9 @@ static WINMM_MapType MMDRV_MidiOut_Map16To32W (UINT wMsg, DWORD_PTR *lpdwUser,
*lpParam1 = (DWORD)mh32;
*lpParam2 = sizeof(MIDIHDR);
- ret = WINMM_MAP_OKMEM;
+ ret = MMSYSTEM_MAP_OKMEM;
} else {
- ret = WINMM_MAP_NOMEM;
+ ret = MMSYSTEM_MAP_NOMEM;
}
}
break;
@@ -393,7 +393,7 @@ static WINMM_MapType MMDRV_MidiOut_Map16To32W (UINT wMsg, DWORD_PTR *lpdwUser,
mh32->dwBufferLength, mh16->dwBufferLength);
} else
mh32->dwBufferLength = mh16->dwBufferLength;
- ret = WINMM_MAP_OKMEM;
+ ret = MMSYSTEM_MAP_OKMEM;
}
break;
@@ -407,18 +407,18 @@ static WINMM_MapType MMDRV_MidiOut_Map16To32W (UINT wMsg, DWORD_PTR *lpdwUser,
}
/**************************************************************************
- * MMDRV_MidiOut_UnMap16To32W [internal]
+ * MMSYSTDRV_MidiOut_UnMap16To32W [internal]
*/
-static WINMM_MapType MMDRV_MidiOut_UnMap16To32W(UINT wMsg, DWORD_PTR *lpdwUser, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2, MMRESULT fn_ret)
+static MMSYSTEM_MapType MMSYSTDRV_MidiOut_UnMap16To32W(UINT wMsg, DWORD_PTR* lpParam1, DWORD_PTR* lpParam2, MMRESULT fn_ret)
{
- WINMM_MapType ret = WINMM_MAP_MSGERROR;
+ MMSYSTEM_MapType ret = MMSYSTEM_MAP_MSGERROR;
switch (wMsg) {
case MODM_GETNUMDEVS:
case MODM_DATA:
case MODM_RESET:
case MODM_SETVOLUME:
- ret = WINMM_MAP_OK;
+ ret = MMSYSTEM_MAP_OK;
break;
case MODM_OPEN:
@@ -443,7 +443,7 @@ static WINMM_MapType MMDRV_MidiOut_UnMap16To32W(UINT wMsg, DWORD_PTR *lpdwUser,
moc16->wChannelMask = moc32->wChannelMask;
moc16->dwSupport = moc32->dwSupport;
HeapFree(GetProcessHeap(), 0, (LPSTR)moc32 - sizeof(LPMIDIOUTCAPS16));
- ret = WINMM_MAP_OK;
+ ret = MMSYSTEM_MAP_OK;
}
break;
case MODM_PREPARE:
@@ -465,7 +465,7 @@ static WINMM_MapType MMDRV_MidiOut_UnMap16To32W(UINT wMsg, DWORD_PTR *lpdwUser,
HeapFree(GetProcessHeap(), 0, (LPSTR)mh32 - sizeof(LPMIDIHDR));
mh16->lpNext = 0;
}
- ret = WINMM_MAP_OK;
+ ret = MMSYSTEM_MAP_OK;
}
break;
@@ -739,6 +739,34 @@ static void CALLBACK MMDRV_MidiOut_Callback(HDRVR hDev, UINT uMsg, DWORD_PTR dw
MMDRV_Callback(mld, hDev, uMsg, dwParam1, dwParam2);
}
+/******************************************************************
+ * MMSYSTDRV_MidiOut_MapCB
+ */
+static void MMSYSTDRV_MidiOut_MapCB(UINT uMsg, DWORD_PTR* dwUser, DWORD_PTR* dwParam1, DWORD_PTR* dwParam2)
+{
+ switch (uMsg) {
+ case MOM_OPEN:
+ case MOM_CLOSE:
+ /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
+ break;
+ case MOM_DONE:
+ {
+ /* initial map is: 16 => 32 */
+ LPMIDIHDR mh32 = (LPMIDIHDR)(*dwParam1);
+ SEGPTR segmh16 = *(SEGPTR*)((LPSTR)mh32 - sizeof(LPMIDIHDR));
+ LPMIDIHDR mh16 = MapSL(segmh16);
+
+ *dwParam1 = (DWORD)segmh16;
+ mh16->dwFlags = mh32->dwFlags;
+ if (mh16->reserved >= sizeof(MIDIHDR))
+ mh16->dwOffset = mh32->dwOffset;
+ }
+ break;
+ default:
+ ERR("Unknown msg %u\n", uMsg);
+ }
+}
+
/* =================================
* W A V E I N M A P P E R S
* ================================= */
@@ -2580,6 +2608,8 @@ static WINMM_MapType MMDRV_UnMap16To32W(UINT wMsg, DWORD_PTR *lpdwUser, DWORD_P
#define MMDRV_Mixer_UnMap16To32W MMDRV_UnMap16To32W
#define MMDRV_MidiIn_Map16To32W MMDRV_Map16To32W
#define MMDRV_MidiIn_UnMap16To32W MMDRV_UnMap16To32W
+#define MMDRV_MidiOut_Map16To32W MMDRV_Map16To32W
+#define MMDRV_MidiOut_UnMap16To32W MMDRV_UnMap16To32W
void MMDRV_Init16(void)
{
@@ -2637,6 +2667,7 @@ static struct MMSYSTDRV_Type
{
{MMSYSTDRV_Mixer_Map16To32W, MMSYSTDRV_Mixer_UnMap16To32W, MMSYSTDRV_Mixer_MapCB},
{MMSYSTDRV_MidiIn_Map16To32W, MMSYSTDRV_MidiIn_UnMap16To32W, MMSYSTDRV_MidiIn_MapCB},
+ {MMSYSTDRV_MidiOut_Map16To32W, MMSYSTDRV_MidiOut_UnMap16To32W, MMSYSTDRV_MidiOut_MapCB},
};
/******************************************************************
diff --git a/dlls/winmm/mmsystem.c b/dlls/winmm/mmsystem.c
index 564fbf4..00a1859 100644
--- a/dlls/winmm/mmsystem.c
+++ b/dlls/winmm/mmsystem.c
@@ -595,12 +595,25 @@ UINT16 WINAPI midiOutGetErrorText16(UINT16 uError, LPSTR lpText, UINT16 uSize)
UINT16 WINAPI midiOutOpen16(HMIDIOUT16* lphMidiOut, UINT16 uDeviceID,
DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
{
- HMIDIOUT hmo;
- UINT ret;
-
- ret = MIDI_OutOpen(&hmo, uDeviceID, dwCallback, dwInstance, dwFlags, FALSE);
+ HMIDIOUT hmo;
+ UINT ret;
+ struct mmsystdrv_thunk* thunk;
- if (lphMidiOut != NULL) *lphMidiOut = HMIDIOUT_16(hmo);
+ if (!(thunk = MMSYSTDRV_AddThunk(dwCallback, MMSYSTDRV_MIDIOUT)))
+ {
+ return MMSYSERR_NOMEM;
+ }
+ if ((dwFlags & CALLBACK_TYPEMASK) == CALLBACK_FUNCTION)
+ {
+ dwCallback = (DWORD)thunk;
+ }
+ ret = midiOutOpen(&hmo, uDeviceID, dwCallback, dwInstance, dwFlags);
+ if (ret == MMSYSERR_NOERROR)
+ {
+ if (lphMidiOut != NULL) *lphMidiOut = HMIDIOUT_16(hmo);
+ MMSYSTDRV_SetHandle(thunk, (void*)hmo);
+ }
+ else MMSYSTDRV_DeleteThunk(thunk);
return ret;
}
@@ -609,7 +622,11 @@ UINT16 WINAPI midiOutOpen16(HMIDIOUT16* lphMidiOut, UINT16 uDeviceID,
*/
UINT16 WINAPI midiOutClose16(HMIDIOUT16 hMidiOut)
{
- return midiOutClose(HMIDIOUT_32(hMidiOut));
+ UINT ret = midiOutClose(HMIDIOUT_32(hMidiOut));
+
+ if (ret == MMSYSERR_NOERROR)
+ MMSYSTDRV_CloseHandle((void*)HMIDIOUT_32(hMidiOut));
+ return ret;
}
/**************************************************************************
@@ -619,14 +636,9 @@ UINT16 WINAPI midiOutPrepareHeader16(HMIDIOUT16 hMidiOut, /* [in] */
SEGPTR lpsegMidiOutHdr, /* [???] */
UINT16 uSize) /* [in] */
{
- LPWINE_MLD wmld;
-
TRACE("(%04X, %08x, %d)\n", hMidiOut, lpsegMidiOutHdr, uSize);
- if ((wmld = MMDRV_Get(HMIDIOUT_32(hMidiOut), MMDRV_MIDIOUT, FALSE)) == NULL)
- return MMSYSERR_INVALHANDLE;
-
- return MMDRV_Message(wmld, MODM_PREPARE, lpsegMidiOutHdr, uSize, FALSE);
+ return MMSYSTDRV_Message(HMIDIOUT_32(hMidiOut), MODM_PREPARE, lpsegMidiOutHdr, uSize);
}
/**************************************************************************
@@ -636,7 +648,6 @@ UINT16 WINAPI midiOutUnprepareHeader16(HMIDIOUT16 hMidiOut, /* [in] */
SEGPTR lpsegMidiOutHdr, /* [???] */
UINT16 uSize) /* [in] */
{
- LPWINE_MLD wmld;
LPMIDIHDR16 lpMidiOutHdr = MapSL(lpsegMidiOutHdr);
TRACE("(%04X, %08x, %d)\n", hMidiOut, lpsegMidiOutHdr, uSize);
@@ -645,10 +656,7 @@ UINT16 WINAPI midiOutUnprepareHeader16(HMIDIOUT16 hMidiOut, /* [in] */
return MMSYSERR_NOERROR;
}
- if ((wmld = MMDRV_Get(HMIDIOUT_32(hMidiOut), MMDRV_MIDIOUT, FALSE)) == NULL)
- return MMSYSERR_INVALHANDLE;
-
- return MMDRV_Message(wmld, MODM_UNPREPARE, lpsegMidiOutHdr, uSize, FALSE);
+ return MMSYSTDRV_Message(HMIDIOUT_32(hMidiOut), MODM_UNPREPARE, lpsegMidiOutHdr, uSize);
}
/**************************************************************************
@@ -666,14 +674,9 @@ UINT16 WINAPI midiOutLongMsg16(HMIDIOUT16 hMidiOut, /* [in] */
LPMIDIHDR16 lpsegMidiOutHdr, /* [???] NOTE: SEGPTR */
UINT16 uSize) /* [in] */
{
- LPWINE_MLD wmld;
-
TRACE("(%04X, %p, %d)\n", hMidiOut, lpsegMidiOutHdr, uSize);
- if ((wmld = MMDRV_Get(HMIDIOUT_32(hMidiOut), MMDRV_MIDIOUT, FALSE)) == NULL)
- return MMSYSERR_INVALHANDLE;
-
- return MMDRV_Message(wmld, MODM_LONGDATA, (DWORD_PTR)lpsegMidiOutHdr, uSize, FALSE);
+ return MMSYSTDRV_Message(HMIDIOUT_32(hMidiOut), MODM_LONGDATA, (DWORD_PTR)lpsegMidiOutHdr, uSize);
}
/**************************************************************************
@@ -739,13 +742,8 @@ UINT16 WINAPI midiOutGetID16(HMIDIOUT16 hMidiOut, UINT16* lpuDeviceID)
DWORD WINAPI midiOutMessage16(HMIDIOUT16 hMidiOut, UINT16 uMessage,
DWORD dwParam1, DWORD dwParam2)
{
- LPWINE_MLD wmld;
-
TRACE("(%04X, %04X, %08X, %08X)\n", hMidiOut, uMessage, dwParam1, dwParam2);
- if ((wmld = MMDRV_Get(HMIDIOUT_32(hMidiOut), MMDRV_MIDIOUT, FALSE)) == NULL)
- return MMSYSERR_INVALHANDLE;
-
switch (uMessage) {
case MODM_OPEN:
case MODM_CLOSE:
@@ -762,7 +760,7 @@ DWORD WINAPI midiOutMessage16(HMIDIOUT16 hMidiOut, UINT16 uMessage,
case MODM_UNPREPARE:
return midiOutUnprepareHeader16(hMidiOut, dwParam1, dwParam2);
}
- return MMDRV_Message(wmld, uMessage, dwParam1, dwParam2, TRUE);
+ return MMSYSTDRV_Message(HMIDIOUT_32(hMidiOut), uMessage, dwParam1, dwParam2);
}
/**************************************************************************
diff --git a/dlls/winmm/winemm.h b/dlls/winmm/winemm.h
index 83eb2e4..82139c5 100644
--- a/dlls/winmm/winemm.h
+++ b/dlls/winmm/winemm.h
@@ -203,8 +203,6 @@ LPSTR MCI_strdupWtoA(LPCWSTR str);
BOOL WINMM_CheckForMMSystem(void);
const char* WINMM_ErrorToString(MMRESULT error);
-UINT MIDI_OutOpen(HMIDIOUT* lphMidiOut, UINT uDeviceID, DWORD_PTR dwCallback,
- DWORD_PTR dwInstance, DWORD dwFlags, BOOL bFrom32);
MMRESULT MIDI_StreamOpen(HMIDISTRM* lphMidiStrm, LPUINT lpuDeviceID,
DWORD cMidi, DWORD_PTR dwCallback,
DWORD_PTR dwInstance, DWORD fdwOpen, BOOL bFrom32);
diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
index 77f11d2..00d25b6 100644
--- a/dlls/winmm/winmm.c
+++ b/dlls/winmm/winmm.c
@@ -931,8 +931,11 @@ static LPWINE_MIDI MIDI_OutAlloc(HMIDIOUT* lphMidiOut, DWORD_PTR* lpdwCallback,
return lpwm;
}
-UINT MIDI_OutOpen(LPHMIDIOUT lphMidiOut, UINT uDeviceID, DWORD_PTR dwCallback,
- DWORD_PTR dwInstance, DWORD dwFlags, BOOL bFrom32)
+/**************************************************************************
+ * midiOutOpen [WINMM.@]
+ */
+UINT WINAPI midiOutOpen(LPHMIDIOUT lphMidiOut, UINT uDeviceID,
+ DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD dwFlags)
{
HMIDIOUT hMidiOut;
LPWINE_MIDI lpwm;
@@ -944,7 +947,7 @@ UINT MIDI_OutOpen(LPHMIDIOUT lphMidiOut, UINT uDeviceID, DWORD_PTR dwCallback,
if (lphMidiOut != NULL) *lphMidiOut = 0;
lpwm = MIDI_OutAlloc(&hMidiOut, &dwCallback, &dwInstance, &dwFlags,
- 0, NULL, bFrom32);
+ 0, NULL, TRUE);
if (lpwm == NULL)
return MMSYSERR_NOMEM;
@@ -965,15 +968,6 @@ UINT MIDI_OutOpen(LPHMIDIOUT lphMidiOut, UINT uDeviceID, DWORD_PTR dwCallback,
}
/**************************************************************************
- * midiOutOpen [WINMM.@]
- */
-UINT WINAPI midiOutOpen(LPHMIDIOUT lphMidiOut, UINT uDeviceID,
- DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD dwFlags)
-{
- return MIDI_OutOpen(lphMidiOut, uDeviceID, dwCallback, dwInstance, dwFlags, TRUE);
-}
-
-/**************************************************************************
* midiOutClose [WINMM.@]
*/
UINT WINAPI midiOutClose(HMIDIOUT hMidiOut)
More information about the wine-patches
mailing list