2 * MMSYSTEM MCI and low level mapping functions
4 * Copyright 1999 Eric Pouech
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #include "wine/winbase16.h"
32 #include "wine/debug.h"
34 WINE_DEFAULT_DEBUG_CHANNEL(winmm
);
36 /**************************************************************************
37 * MMDRV_Callback [internal]
39 static void MMDRV_Callback(LPWINE_MLD mld
, HDRVR hDev
, UINT uMsg
, DWORD_PTR dwParam1
, DWORD_PTR dwParam2
)
41 TRACE("CB (*%08lx)(%p %08x %08lx %08lx %08lx\n",
42 mld
->dwCallback
, hDev
, uMsg
, mld
->dwClientInstance
, dwParam1
, dwParam2
);
44 if (!mld
->bFrom32
&& (mld
->dwFlags
& DCB_TYPEMASK
) == DCB_FUNCTION
)
47 /* 16 bit func, call it */
48 TRACE("Function (16 bit) !\n");
50 args
[7] = HDRVR_16(hDev
);
52 args
[5] = HIWORD(mld
->dwClientInstance
);
53 args
[4] = LOWORD(mld
->dwClientInstance
);
54 args
[3] = HIWORD(dwParam1
);
55 args
[2] = LOWORD(dwParam1
);
56 args
[1] = HIWORD(dwParam2
);
57 args
[0] = LOWORD(dwParam2
);
58 WOWCallback16Ex( mld
->dwCallback
, WCB16_PASCAL
, sizeof(args
), args
, NULL
);
60 DriverCallback(mld
->dwCallback
, mld
->dwFlags
, hDev
, uMsg
,
61 mld
->dwClientInstance
, dwParam1
, dwParam2
);
65 /* =================================
67 * ================================= */
69 /**************************************************************************
70 * MMDRV_Aux_Map16To32W [internal]
72 static WINMM_MapType
MMDRV_Aux_Map16To32W (UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
)
74 return WINMM_MAP_MSGERROR
;
77 /**************************************************************************
78 * MMDRV_Aux_UnMap16To32W [internal]
80 static WINMM_MapType
MMDRV_Aux_UnMap16To32W(UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
, MMRESULT fn_ret
)
82 return WINMM_MAP_MSGERROR
;
85 /**************************************************************************
86 * MMDRV_Aux_Map32WTo16 [internal]
88 static WINMM_MapType
MMDRV_Aux_Map32WTo16 (UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
)
90 return WINMM_MAP_MSGERROR
;
93 /**************************************************************************
94 * MMDRV_Aux_UnMap32WTo16 [internal]
96 static WINMM_MapType
MMDRV_Aux_UnMap32WTo16(UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
, MMRESULT fn_ret
)
99 case AUXDM_GETDEVCAPS
:
100 lpCaps
->wMid
= ac16
.wMid
;
101 lpCaps
->wPid
= ac16
.wPid
;
102 lpCaps
->vDriverVersion
= ac16
.vDriverVersion
;
103 strcpy(lpCaps
->szPname
, ac16
.szPname
);
104 lpCaps
->wTechnology
= ac16
.wTechnology
;
105 lpCaps
->dwSupport
= ac16
.dwSupport
;
107 return WINMM_MAP_MSGERROR
;
110 /**************************************************************************
111 * MMDRV_Aux_Callback [internal]
113 static void CALLBACK
MMDRV_Aux_Callback(HDRVR hDev
, UINT uMsg
, DWORD_PTR dwInstance
, DWORD_PTR dwParam1
, DWORD_PTR dwParam2
)
115 LPWINE_MLD mld
= (LPWINE_MLD
)dwInstance
;
118 MMDRV_Callback(mld
, hDev
, uMsg
, dwParam1
, dwParam2
);
121 /* =================================
122 * M I X E R M A P P E R S
123 * ================================= */
125 /**************************************************************************
126 * xMMDRV_Mixer_Map16To32W [internal]
128 static WINMM_MapType
MMDRV_Mixer_Map16To32W (UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
)
130 return WINMM_MAP_MSGERROR
;
133 /**************************************************************************
134 * MMDRV_Mixer_UnMap16To32W [internal]
136 static WINMM_MapType
MMDRV_Mixer_UnMap16To32W(UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
, MMRESULT fn_ret
)
140 UINT ret
= mixerGetDevCapsA(devid
, &micA
, sizeof(micA
));
142 if (ret
== MMSYSERR_NOERROR
) {
143 mixcaps
->wMid
= micA
.wMid
;
144 mixcaps
->wPid
= micA
.wPid
;
145 mixcaps
->vDriverVersion
= micA
.vDriverVersion
;
146 strcpy(mixcaps
->szPname
, micA
.szPname
);
147 mixcaps
->fdwSupport
= micA
.fdwSupport
;
148 mixcaps
->cDestinations
= micA
.cDestinations
;
152 return WINMM_MAP_MSGERROR
;
155 /**************************************************************************
156 * MMDRV_Mixer_Map32WTo16 [internal]
158 static WINMM_MapType
MMDRV_Mixer_Map32WTo16 (UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
)
160 return WINMM_MAP_MSGERROR
;
163 /**************************************************************************
164 * MMDRV_Mixer_UnMap32WTo16 [internal]
166 static WINMM_MapType
MMDRV_Mixer_UnMap32WTo16(UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
, MMRESULT fn_ret
)
168 return WINMM_MAP_MSGERROR
;
171 /**************************************************************************
172 * MMDRV_Mixer_Callback [internal]
174 static void CALLBACK
MMDRV_Mixer_Callback(HDRVR hDev
, UINT uMsg
, DWORD_PTR dwInstance
, DWORD_PTR dwParam1
, DWORD_PTR dwParam2
)
176 LPWINE_MLD mld
= (LPWINE_MLD
)dwInstance
;
179 MMDRV_Callback(mld
, hDev
, uMsg
, dwParam1
, dwParam2
);
182 /* =================================
183 * M I D I I N M A P P E R S
184 * ================================= */
186 /**************************************************************************
187 * MMDRV_MidiIn_Map16To32W [internal]
189 static WINMM_MapType
MMDRV_MidiIn_Map16To32W (UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
)
191 return WINMM_MAP_MSGERROR
;
194 /**************************************************************************
195 * MMDRV_MidiIn_UnMap16To32W [internal]
197 static WINMM_MapType
MMDRV_MidiIn_UnMap16To32W(UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
, MMRESULT fn_ret
)
199 return WINMM_MAP_MSGERROR
;
202 /**************************************************************************
203 * MMDRV_MidiIn_Map32WTo16 [internal]
205 static WINMM_MapType
MMDRV_MidiIn_Map32WTo16 (UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
)
207 return WINMM_MAP_MSGERROR
;
210 /**************************************************************************
211 * MMDRV_MidiIn_UnMap32WTo16 [internal]
213 static WINMM_MapType
MMDRV_MidiIn_UnMap32WTo16(UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
, MMRESULT fn_ret
)
215 return WINMM_MAP_MSGERROR
;
218 /**************************************************************************
219 * MMDRV_MidiIn_Callback [internal]
221 static void CALLBACK
MMDRV_MidiIn_Callback(HDRVR hDev
, UINT uMsg
, DWORD_PTR dwInstance
, DWORD_PTR dwParam1
, DWORD_PTR dwParam2
)
223 LPWINE_MLD mld
= (LPWINE_MLD
)dwInstance
;
228 /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
233 /* dwParam1 & dwParam2 are data, nothing to do */
237 /* dwParam1 points to a MidiHdr, work to be done !!! */
238 if (mld
->bFrom32
&& !MMDRV_Is32(mld
->mmdIndex
)) {
239 /* initial map is: 32 => 16 */
240 LPMIDIHDR mh16
= MapSL(dwParam1
);
241 LPMIDIHDR mh32
= *(LPMIDIHDR
*)((LPSTR
)mh16
- sizeof(LPMIDIHDR
));
243 dwParam1
= (DWORD
)mh32
;
244 mh32
->dwFlags
= mh16
->dwFlags
;
245 mh32
->dwBytesRecorded
= mh16
->dwBytesRecorded
;
246 if (mh32
->reserved
>= sizeof(MIDIHDR
))
247 mh32
->dwOffset
= mh16
->dwOffset
;
248 } else if (!mld
->bFrom32
&& MMDRV_Is32(mld
->mmdIndex
)) {
249 /* initial map is: 16 => 32 */
250 LPMIDIHDR mh32
= (LPMIDIHDR
)(dwParam1
);
251 SEGPTR segmh16
= *(SEGPTR
*)((LPSTR
)mh32
- sizeof(LPMIDIHDR
));
252 LPMIDIHDR mh16
= MapSL(segmh16
);
254 dwParam1
= (DWORD
)segmh16
;
255 mh16
->dwFlags
= mh32
->dwFlags
;
256 mh16
->dwBytesRecorded
= mh32
->dwBytesRecorded
;
257 if (mh16
->reserved
>= sizeof(MIDIHDR
))
258 mh16
->dwOffset
= mh32
->dwOffset
;
260 /* else { 16 => 16 or 32 => 32, nothing to do, same struct is kept }*/
262 /* case MOM_POSITIONCB: */
264 ERR("Unknown msg %u\n", uMsg
);
267 MMDRV_Callback(mld
, hDev
, uMsg
, dwParam1
, dwParam2
);
270 /* =================================
271 * M I D I O U T M A P P E R S
272 * ================================= */
274 /**************************************************************************
275 * MMDRV_MidiOut_Map16To32W [internal]
277 static WINMM_MapType
MMDRV_MidiOut_Map16To32W (UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
)
279 WINMM_MapType ret
= WINMM_MAP_MSGERROR
;
282 case MODM_GETNUMDEVS
:
292 FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
295 case MODM_GETDEVCAPS
:
297 LPMIDIOUTCAPSW moc32
= HeapAlloc(GetProcessHeap(), 0, sizeof(LPMIDIOUTCAPS16
) + sizeof(MIDIOUTCAPSW
));
298 LPMIDIOUTCAPS16 moc16
= MapSL(*lpParam1
);
301 *(LPMIDIOUTCAPS16
*)moc32
= moc16
;
302 moc32
= (LPMIDIOUTCAPSW
)((LPSTR
)moc32
+ sizeof(LPMIDIOUTCAPS16
));
303 *lpParam1
= (DWORD
)moc32
;
304 *lpParam2
= sizeof(MIDIOUTCAPSW
);
306 ret
= WINMM_MAP_OKMEM
;
308 ret
= WINMM_MAP_NOMEM
;
314 LPMIDIHDR mh32
= HeapAlloc(GetProcessHeap(), 0, sizeof(LPMIDIHDR
) + sizeof(MIDIHDR
));
315 LPMIDIHDR mh16
= MapSL(*lpParam1
);
318 *(LPMIDIHDR
*)mh32
= (LPMIDIHDR
)*lpParam1
;
319 mh32
= (LPMIDIHDR
)((LPSTR
)mh32
+ sizeof(LPMIDIHDR
));
320 mh32
->lpData
= MapSL((SEGPTR
)mh16
->lpData
);
321 mh32
->dwBufferLength
= mh16
->dwBufferLength
;
322 mh32
->dwBytesRecorded
= mh16
->dwBytesRecorded
;
323 mh32
->dwUser
= mh16
->dwUser
;
324 mh32
->dwFlags
= mh16
->dwFlags
;
325 /* FIXME: nothing on mh32->lpNext */
326 /* could link the mh32->lpNext at this level for memory house keeping */
327 mh32
->dwOffset
= (*lpParam2
>= sizeof(MIDIHDR
)) ? mh16
->dwOffset
: 0;
328 mh16
->lpNext
= mh32
; /* for reuse in unprepare and write */
329 /* store size of passed MIDIHDR?? structure to know if dwOffset is available or not */
330 mh16
->reserved
= *lpParam2
;
331 *lpParam1
= (DWORD
)mh32
;
332 *lpParam2
= sizeof(MIDIHDR
);
334 ret
= WINMM_MAP_OKMEM
;
336 ret
= WINMM_MAP_NOMEM
;
343 LPMIDIHDR mh16
= MapSL(*lpParam1
);
344 LPMIDIHDR mh32
= mh16
->lpNext
;
346 *lpParam1
= (DWORD
)mh32
;
347 *lpParam2
= sizeof(MIDIHDR
);
348 /* dwBufferLength can be reduced between prepare & write */
349 if (wMsg
== MODM_LONGDATA
&& mh32
->dwBufferLength
< mh16
->dwBufferLength
) {
350 ERR("Size of buffer has been increased from %d to %d, keeping initial value\n",
351 mh32
->dwBufferLength
, mh16
->dwBufferLength
);
353 mh32
->dwBufferLength
= mh16
->dwBufferLength
;
354 ret
= WINMM_MAP_OKMEM
;
358 case MODM_CACHEPATCHES
:
359 case MODM_CACHEDRUMPATCHES
:
361 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg
, *lpParam1
, *lpParam2
);
367 /**************************************************************************
368 * MMDRV_MidiOut_UnMap16To32W [internal]
370 static WINMM_MapType
MMDRV_MidiOut_UnMap16To32W(UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
, MMRESULT fn_ret
)
372 WINMM_MapType ret
= WINMM_MAP_MSGERROR
;
375 case MODM_GETNUMDEVS
:
385 FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
388 case MODM_GETDEVCAPS
:
390 LPMIDIOUTCAPSW moc32
= (LPMIDIOUTCAPSW
)(*lpParam1
);
391 LPMIDIOUTCAPS16 moc16
= *(LPMIDIOUTCAPS16
*)((LPSTR
)moc32
- sizeof(LPMIDIOUTCAPS16
));
393 moc16
->wMid
= moc32
->wMid
;
394 moc16
->wPid
= moc32
->wPid
;
395 moc16
->vDriverVersion
= moc32
->vDriverVersion
;
396 WideCharToMultiByte( CP_ACP
, 0, moc32
->szPname
, -1, moc16
->szPname
,
397 sizeof(moc16
->szPname
), NULL
, NULL
);
398 moc16
->wTechnology
= moc32
->wTechnology
;
399 moc16
->wVoices
= moc32
->wVoices
;
400 moc16
->wNotes
= moc32
->wNotes
;
401 moc16
->wChannelMask
= moc32
->wChannelMask
;
402 moc16
->dwSupport
= moc32
->dwSupport
;
403 HeapFree(GetProcessHeap(), 0, (LPSTR
)moc32
- sizeof(LPMIDIOUTCAPS16
));
411 LPMIDIHDR mh32
= (LPMIDIHDR
)(*lpParam1
);
412 LPMIDIHDR mh16
= MapSL(*(SEGPTR
*)((LPSTR
)mh32
- sizeof(LPMIDIHDR
)));
414 assert(mh16
->lpNext
== mh32
);
415 mh16
->dwBufferLength
= mh32
->dwBufferLength
;
416 mh16
->dwBytesRecorded
= mh32
->dwBytesRecorded
;
417 mh16
->dwUser
= mh32
->dwUser
;
418 mh16
->dwFlags
= mh32
->dwFlags
;
419 if (mh16
->reserved
>= sizeof(MIDIHDR
))
420 mh16
->dwOffset
= mh32
->dwOffset
;
422 if (wMsg
== MODM_UNPREPARE
&& fn_ret
== MMSYSERR_NOERROR
) {
423 HeapFree(GetProcessHeap(), 0, (LPSTR
)mh32
- sizeof(LPMIDIHDR
));
430 case MODM_CACHEPATCHES
:
431 case MODM_CACHEDRUMPATCHES
:
433 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg
, *lpParam1
, *lpParam2
);
439 /**************************************************************************
440 * MMDRV_MidiOut_Map32WTo16 [internal]
442 static WINMM_MapType
MMDRV_MidiOut_Map32WTo16 (UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
)
444 WINMM_MapType ret
= WINMM_MAP_MSGERROR
;
448 case MODM_GETNUMDEVS
:
454 case MODM_GETDEVCAPS
:
456 LPMIDIOUTCAPSW moc32
= (LPMIDIOUTCAPSW
)*lpParam1
;
457 LPSTR ptr
= HeapAlloc( GetProcessHeap(), 0, sizeof(LPMIDIOUTCAPSW
)+sizeof(MIDIOUTCAPS16
));
460 *(LPMIDIOUTCAPSW
*)ptr
= moc32
;
461 ret
= WINMM_MAP_OKMEM
;
463 ret
= WINMM_MAP_NOMEM
;
465 *lpParam1
= (DWORD
)MapLS(ptr
) + sizeof(LPMIDIOUTCAPSW
);
466 *lpParam2
= sizeof(MIDIOUTCAPS16
);
471 LPMIDIHDR mh32
= (LPMIDIHDR
)*lpParam1
;
473 LPVOID ptr
= HeapAlloc( GetProcessHeap(), 0,
474 sizeof(LPMIDIHDR
) + sizeof(MIDIHDR
) + mh32
->dwBufferLength
);
477 *(LPMIDIHDR
*)ptr
= mh32
;
478 mh16
= (LPMIDIHDR
)((LPSTR
)ptr
+ sizeof(LPMIDIHDR
));
479 *lpParam1
= MapLS(mh16
);
480 mh16
->lpData
= (LPSTR
)*lpParam1
+ sizeof(MIDIHDR
);
481 /* data will be copied on WODM_WRITE */
482 mh16
->dwBufferLength
= mh32
->dwBufferLength
;
483 mh16
->dwBytesRecorded
= mh32
->dwBytesRecorded
;
484 mh16
->dwUser
= mh32
->dwUser
;
485 mh16
->dwFlags
= mh32
->dwFlags
;
486 /* FIXME: nothing on mh32->lpNext */
487 /* could link the mh32->lpNext at this level for memory house keeping */
488 mh16
->dwOffset
= (*lpParam2
>= sizeof(MIDIHDR
)) ? mh32
->dwOffset
: 0;
490 mh32
->lpNext
= mh16
; /* for reuse in unprepare and write */
491 mh32
->reserved
= *lpParam2
;
493 TRACE("mh16=%08lx mh16->lpData=%p mh32->buflen=%u mh32->lpData=%p\n",
494 *lpParam1
, mh16
->lpData
, mh32
->dwBufferLength
, mh32
->lpData
);
495 *lpParam2
= sizeof(MIDIHDR
);
497 ret
= WINMM_MAP_OKMEM
;
499 ret
= WINMM_MAP_NOMEM
;
506 LPMIDIHDR mh32
= (LPMIDIHDR
)(*lpParam1
);
507 LPMIDIHDR mh16
= mh32
->lpNext
;
508 LPSTR ptr
= (LPSTR
)mh16
- sizeof(LPMIDIHDR
);
510 assert(*(LPMIDIHDR
*)ptr
== mh32
);
512 if (wMsg
== MODM_LONGDATA
)
513 memcpy((LPSTR
)mh16
+ sizeof(MIDIHDR
), mh32
->lpData
, mh32
->dwBufferLength
);
515 *lpParam1
= MapLS(mh16
);
516 *lpParam2
= sizeof(MIDIHDR
);
517 TRACE("mh16=%08lx mh16->lpData=%p mh32->buflen=%u mh32->lpData=%p\n",
518 *lpParam1
, mh16
->lpData
, mh32
->dwBufferLength
, mh32
->lpData
);
520 /* dwBufferLength can be reduced between prepare & write */
521 if (wMsg
== MODM_LONGDATA
&& mh16
->dwBufferLength
< mh32
->dwBufferLength
) {
522 ERR("Size of buffer has been increased from %d to %d, keeping initial value\n",
523 mh16
->dwBufferLength
, mh32
->dwBufferLength
);
525 mh16
->dwBufferLength
= mh32
->dwBufferLength
;
526 ret
= WINMM_MAP_OKMEM
;
531 LPMIDIOPENDESC mod32
= (LPMIDIOPENDESC
)*lpParam1
;
533 LPMIDIOPENDESC16 mod16
;
535 /* allocated data are mapped as follows:
536 LPMIDIOPENDESC ptr to orig lParam1
537 DWORD orig dwUser, which is a pointer to DWORD:driver dwInstance
538 DWORD dwUser passed to driver
539 MIDIOPENDESC16 mod16: openDesc passed to driver
542 ptr
= HeapAlloc( GetProcessHeap(), 0,
543 sizeof(LPMIDIOPENDESC
) + 2*sizeof(DWORD
) + sizeof(MIDIOPENDESC16
) +
544 mod32
->cIds
? (mod32
->cIds
- 1) * sizeof(MIDIOPENSTRMID
) : 0);
547 SEGPTR segptr
= MapLS(ptr
);
548 *(LPMIDIOPENDESC
*)ptr
= mod32
;
549 *(LPDWORD
)((char*)ptr
+ sizeof(LPMIDIOPENDESC
)) = *lpdwUser
;
550 mod16
= (LPMIDIOPENDESC16
)((LPSTR
)ptr
+ sizeof(LPMIDIOPENDESC
) + 2*sizeof(DWORD
));
552 mod16
->hMidi
= HMIDI_16(mod32
->hMidi
);
553 mod16
->dwCallback
= mod32
->dwCallback
;
554 mod16
->dwInstance
= mod32
->dwInstance
;
555 mod16
->dnDevNode
= mod32
->dnDevNode
;
556 mod16
->cIds
= mod32
->cIds
;
557 memcpy(&mod16
->rgIds
, &mod32
->rgIds
, mod32
->cIds
* sizeof(MIDIOPENSTRMID
));
559 *lpParam1
= (DWORD
)segptr
+ sizeof(LPMIDIOPENDESC
) + 2*sizeof(DWORD
);
560 *lpdwUser
= (DWORD
)segptr
+ sizeof(LPMIDIOPENDESC
) + sizeof(DWORD
);
562 ret
= WINMM_MAP_OKMEM
;
564 ret
= WINMM_MAP_NOMEM
;
569 case MODM_CACHEPATCHES
:
570 case MODM_CACHEDRUMPATCHES
:
572 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg
, *lpParam1
, *lpParam2
);
578 /**************************************************************************
579 * MMDRV_MidiOut_UnMap32WTo16 [internal]
581 static WINMM_MapType
MMDRV_MidiOut_UnMap32WTo16(UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
, MMRESULT fn_ret
)
583 WINMM_MapType ret
= WINMM_MAP_MSGERROR
;
587 case MODM_GETNUMDEVS
:
593 case MODM_GETDEVCAPS
:
595 LPMIDIOUTCAPS16 moc16
= MapSL(*lpParam1
);
596 LPSTR ptr
= (LPSTR
)moc16
- sizeof(LPMIDIOUTCAPSW
);
597 LPMIDIOUTCAPSW moc32
= *(LPMIDIOUTCAPSW
*)ptr
;
599 moc32
->wMid
= moc16
->wMid
;
600 moc32
->wPid
= moc16
->wPid
;
601 moc32
->vDriverVersion
= moc16
->vDriverVersion
;
602 WideCharToMultiByte( CP_ACP
, 0, moc32
->szPname
, -1, moc16
->szPname
,
603 sizeof(moc16
->szPname
), NULL
, NULL
);
604 moc32
->wTechnology
= moc16
->wTechnology
;
605 moc32
->wVoices
= moc16
->wVoices
;
606 moc32
->wNotes
= moc16
->wNotes
;
607 moc32
->wChannelMask
= moc16
->wChannelMask
;
608 moc32
->dwSupport
= moc16
->dwSupport
;
609 UnMapLS( *lpParam1
);
610 HeapFree( GetProcessHeap(), 0, ptr
);
618 LPMIDIHDR mh16
= MapSL(*lpParam1
);
619 LPSTR ptr
= (LPSTR
)mh16
- sizeof(LPMIDIHDR
);
620 LPMIDIHDR mh32
= *(LPMIDIHDR
*)ptr
;
622 assert(mh32
->lpNext
== mh16
);
623 UnMapLS( *lpParam1
);
624 mh32
->dwBytesRecorded
= mh16
->dwBytesRecorded
;
625 mh32
->dwUser
= mh16
->dwUser
;
626 mh32
->dwFlags
= mh16
->dwFlags
;
628 if (wMsg
== MODM_UNPREPARE
&& fn_ret
== MMSYSERR_NOERROR
) {
629 HeapFree( GetProcessHeap(), 0, ptr
);
637 LPMIDIOPENDESC16 mod16
= MapSL(*lpParam1
);
638 LPSTR ptr
= (LPSTR
)mod16
- sizeof(LPMIDIOPENDESC
) - 2*sizeof(DWORD
);
639 UnMapLS( *lpParam1
);
640 **(DWORD
**)(ptr
+ sizeof(LPMIDIOPENDESC
)) = *(LPDWORD
)(ptr
+ sizeof(LPMIDIOPENDESC
) + sizeof(DWORD
));
642 HeapFree( GetProcessHeap(), 0, ptr
);
647 case MODM_CACHEPATCHES
:
648 case MODM_CACHEDRUMPATCHES
:
650 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg
, *lpParam1
, *lpParam2
);
656 /**************************************************************************
657 * MMDRV_MidiOut_Callback [internal]
659 static void CALLBACK
MMDRV_MidiOut_Callback(HDRVR hDev
, UINT uMsg
, DWORD_PTR dwInstance
, DWORD_PTR dwParam1
, DWORD_PTR dwParam2
)
661 LPWINE_MLD mld
= (LPWINE_MLD
)dwInstance
;
666 /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
669 if (mld
->bFrom32
&& !MMDRV_Is32(mld
->mmdIndex
)) {
670 /* initial map is: 32 => 16 */
671 LPMIDIHDR mh16
= MapSL(dwParam1
);
672 LPMIDIHDR mh32
= *(LPMIDIHDR
*)((LPSTR
)mh16
- sizeof(LPMIDIHDR
));
674 dwParam1
= (DWORD
)mh32
;
675 mh32
->dwFlags
= mh16
->dwFlags
;
676 mh32
->dwOffset
= mh16
->dwOffset
;
677 if (mh32
->reserved
>= sizeof(MIDIHDR
))
678 mh32
->dwOffset
= mh16
->dwOffset
;
679 } else if (!mld
->bFrom32
&& MMDRV_Is32(mld
->mmdIndex
)) {
680 /* initial map is: 16 => 32 */
681 LPMIDIHDR mh32
= (LPMIDIHDR
)(dwParam1
);
682 SEGPTR segmh16
= *(SEGPTR
*)((LPSTR
)mh32
- sizeof(LPMIDIHDR
));
683 LPMIDIHDR mh16
= MapSL(segmh16
);
685 dwParam1
= (DWORD
)segmh16
;
686 mh16
->dwFlags
= mh32
->dwFlags
;
687 if (mh16
->reserved
>= sizeof(MIDIHDR
))
688 mh16
->dwOffset
= mh32
->dwOffset
;
690 /* else { 16 => 16 or 32 => 32, nothing to do, same struct is kept }*/
692 /* case MOM_POSITIONCB: */
694 ERR("Unknown msg %u\n", uMsg
);
697 MMDRV_Callback(mld
, hDev
, uMsg
, dwParam1
, dwParam2
);
700 /* =================================
701 * W A V E I N M A P P E R S
702 * ================================= */
704 /**************************************************************************
705 * MMDRV_WaveIn_Map16To32W [internal]
707 static WINMM_MapType
MMDRV_WaveIn_Map16To32W (UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
)
709 WINMM_MapType ret
= WINMM_MAP_MSGERROR
;
712 case WIDM_GETNUMDEVS
:
720 FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
722 case WIDM_GETDEVCAPS
:
724 LPWAVEINCAPSW wic32
= HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEINCAPS16
) + sizeof(WAVEINCAPSW
));
725 LPWAVEINCAPS16 wic16
= MapSL(*lpParam1
);
728 *(LPWAVEINCAPS16
*)wic32
= wic16
;
729 wic32
= (LPWAVEINCAPSW
)((LPSTR
)wic32
+ sizeof(LPWAVEINCAPS16
));
730 *lpParam1
= (DWORD
)wic32
;
731 *lpParam2
= sizeof(WAVEINCAPSW
);
733 ret
= WINMM_MAP_OKMEM
;
735 ret
= WINMM_MAP_NOMEM
;
741 LPMMTIME mmt32
= HeapAlloc(GetProcessHeap(), 0, sizeof(LPMMTIME16
) + sizeof(MMTIME
));
742 LPMMTIME16 mmt16
= MapSL(*lpParam1
);
745 *(LPMMTIME16
*)mmt32
= mmt16
;
746 mmt32
= (LPMMTIME
)((LPSTR
)mmt32
+ sizeof(LPMMTIME16
));
748 mmt32
->wType
= mmt16
->wType
;
749 *lpParam1
= (DWORD
)mmt32
;
750 *lpParam2
= sizeof(MMTIME
);
752 ret
= WINMM_MAP_OKMEM
;
754 ret
= WINMM_MAP_NOMEM
;
760 LPWAVEHDR wh32
= HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEHDR
) + sizeof(WAVEHDR
));
761 LPWAVEHDR wh16
= MapSL(*lpParam1
);
764 *(LPWAVEHDR
*)wh32
= (LPWAVEHDR
)*lpParam1
;
765 wh32
= (LPWAVEHDR
)((LPSTR
)wh32
+ sizeof(LPWAVEHDR
));
766 wh32
->lpData
= MapSL((SEGPTR
)wh16
->lpData
);
767 wh32
->dwBufferLength
= wh16
->dwBufferLength
;
768 wh32
->dwBytesRecorded
= wh16
->dwBytesRecorded
;
769 wh32
->dwUser
= wh16
->dwUser
;
770 wh32
->dwFlags
= wh16
->dwFlags
;
771 wh32
->dwLoops
= wh16
->dwLoops
;
772 /* FIXME: nothing on wh32->lpNext */
773 /* could link the wh32->lpNext at this level for memory house keeping */
774 wh16
->lpNext
= wh32
; /* for reuse in unprepare and write */
775 *lpParam1
= (DWORD
)wh32
;
776 *lpParam2
= sizeof(WAVEHDR
);
778 ret
= WINMM_MAP_OKMEM
;
780 ret
= WINMM_MAP_NOMEM
;
787 LPWAVEHDR wh16
= MapSL(*lpParam1
);
788 LPWAVEHDR wh32
= wh16
->lpNext
;
790 *lpParam1
= (DWORD
)wh32
;
791 *lpParam2
= sizeof(WAVEHDR
);
792 /* dwBufferLength can be reduced between prepare & write */
793 if (wMsg
== WIDM_ADDBUFFER
&& wh32
->dwBufferLength
< wh16
->dwBufferLength
) {
794 ERR("Size of buffer has been increased from %d to %d, keeping initial value\n",
795 wh32
->dwBufferLength
, wh16
->dwBufferLength
);
797 wh32
->dwBufferLength
= wh16
->dwBufferLength
;
798 ret
= WINMM_MAP_OKMEM
;
801 case WIDM_MAPPER_STATUS
:
802 /* just a single DWORD */
803 *lpParam2
= (DWORD
)MapSL(*lpParam2
);
807 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg
, *lpParam1
, *lpParam2
);
813 /**************************************************************************
814 * MMDRV_WaveIn_UnMap16To32W [internal]
816 static WINMM_MapType
MMDRV_WaveIn_UnMap16To32W(UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
, MMRESULT fn_ret
)
818 WINMM_MapType ret
= WINMM_MAP_MSGERROR
;
821 case WIDM_GETNUMDEVS
:
825 case WIDM_MAPPER_STATUS
:
830 FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
832 case WIDM_GETDEVCAPS
:
834 LPWAVEINCAPSW wic32
= (LPWAVEINCAPSW
)(*lpParam1
);
835 LPWAVEINCAPS16 wic16
= *(LPWAVEINCAPS16
*)((LPSTR
)wic32
- sizeof(LPWAVEINCAPS16
));
837 wic16
->wMid
= wic32
->wMid
;
838 wic16
->wPid
= wic32
->wPid
;
839 wic16
->vDriverVersion
= wic32
->vDriverVersion
;
840 WideCharToMultiByte( CP_ACP
, 0, wic32
->szPname
, -1, wic16
->szPname
,
841 sizeof(wic16
->szPname
), NULL
, NULL
);
842 wic16
->dwFormats
= wic32
->dwFormats
;
843 wic16
->wChannels
= wic32
->wChannels
;
844 HeapFree(GetProcessHeap(), 0, (LPSTR
)wic32
- sizeof(LPWAVEINCAPS16
));
850 LPMMTIME mmt32
= (LPMMTIME
)(*lpParam1
);
851 LPMMTIME16 mmt16
= *(LPMMTIME16
*)((LPSTR
)mmt32
- sizeof(LPMMTIME16
));
853 MMSYSTEM_MMTIME32to16(mmt16
, mmt32
);
854 HeapFree(GetProcessHeap(), 0, (LPSTR
)mmt32
- sizeof(LPMMTIME16
));
862 LPWAVEHDR wh32
= (LPWAVEHDR
)(*lpParam1
);
863 LPWAVEHDR wh16
= MapSL(*(SEGPTR
*)((LPSTR
)wh32
- sizeof(LPWAVEHDR
)));
865 assert(wh16
->lpNext
== wh32
);
866 wh16
->dwBufferLength
= wh32
->dwBufferLength
;
867 wh16
->dwBytesRecorded
= wh32
->dwBytesRecorded
;
868 wh16
->dwUser
= wh32
->dwUser
;
869 wh16
->dwFlags
= wh32
->dwFlags
;
870 wh16
->dwLoops
= wh32
->dwLoops
;
872 if (wMsg
== WIDM_UNPREPARE
&& fn_ret
== MMSYSERR_NOERROR
) {
873 HeapFree(GetProcessHeap(), 0, (LPSTR
)wh32
- sizeof(LPWAVEHDR
));
880 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg
, *lpParam1
, *lpParam2
);
886 /**************************************************************************
887 * MMDRV_WaveIn_Map32WTo16 [internal]
889 static WINMM_MapType
MMDRV_WaveIn_Map32WTo16 (UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
)
891 WINMM_MapType ret
= WINMM_MAP_MSGERROR
;
895 case WIDM_GETNUMDEVS
:
904 LPWAVEOPENDESC wod32
= (LPWAVEOPENDESC
)*lpParam1
;
905 int sz
= sizeof(WAVEFORMATEX
);
907 LPWAVEOPENDESC16 wod16
;
909 /* allocated data are mapped as follows:
910 LPWAVEOPENDESC ptr to orig lParam1
911 DWORD orig dwUser, which is a pointer to DWORD:driver dwInstance
912 DWORD dwUser passed to driver
913 WAVEOPENDESC16 wod16: openDesc passed to driver
914 WAVEFORMATEX openDesc->lpFormat passed to driver
915 xxx extra bytes to WAVEFORMATEX
917 if (wod32
->lpFormat
->wFormatTag
!= WAVE_FORMAT_PCM
) {
918 TRACE("Allocating %u extra bytes (%d)\n", wod32
->lpFormat
->cbSize
, wod32
->lpFormat
->wFormatTag
);
919 sz
+= wod32
->lpFormat
->cbSize
;
922 ptr
= HeapAlloc( GetProcessHeap(), 0,
923 sizeof(LPWAVEOPENDESC
) + 2*sizeof(DWORD
) + sizeof(WAVEOPENDESC16
) + sz
);
926 SEGPTR seg_ptr
= MapLS( ptr
);
927 *(LPWAVEOPENDESC
*)ptr
= wod32
;
928 *(LPDWORD
)((char*)ptr
+ sizeof(LPWAVEOPENDESC
)) = *lpdwUser
;
929 wod16
= (LPWAVEOPENDESC16
)((LPSTR
)ptr
+ sizeof(LPWAVEOPENDESC
) + 2*sizeof(DWORD
));
931 wod16
->hWave
= HWAVE_16(wod32
->hWave
);
932 wod16
->lpFormat
= (LPWAVEFORMATEX
)(seg_ptr
+ sizeof(LPWAVEOPENDESC
) + 2*sizeof(DWORD
) + sizeof(WAVEOPENDESC16
));
933 memcpy(wod16
+ 1, wod32
->lpFormat
, sz
);
935 wod16
->dwCallback
= wod32
->dwCallback
;
936 wod16
->dwInstance
= wod32
->dwInstance
;
937 wod16
->uMappedDeviceID
= wod32
->uMappedDeviceID
;
938 wod16
->dnDevNode
= wod32
->dnDevNode
;
940 *lpParam1
= seg_ptr
+ sizeof(LPWAVEOPENDESC
) + 2*sizeof(DWORD
);
941 *lpdwUser
= seg_ptr
+ sizeof(LPWAVEOPENDESC
) + sizeof(DWORD
);
943 ret
= WINMM_MAP_OKMEM
;
945 ret
= WINMM_MAP_NOMEM
;
951 LPWAVEHDR wh32
= (LPWAVEHDR
)*lpParam1
;
953 LPVOID ptr
= HeapAlloc( GetProcessHeap(), 0,
954 sizeof(LPWAVEHDR
) + sizeof(WAVEHDR
) + wh32
->dwBufferLength
);
957 SEGPTR seg_ptr
= MapLS( ptr
);
958 *(LPWAVEHDR
*)ptr
= wh32
;
959 wh16
= (LPWAVEHDR
)((LPSTR
)ptr
+ sizeof(LPWAVEHDR
));
960 wh16
->lpData
= (LPSTR
)seg_ptr
+ sizeof(LPWAVEHDR
) + sizeof(WAVEHDR
);
961 /* data will be copied on WODM_WRITE */
962 wh16
->dwBufferLength
= wh32
->dwBufferLength
;
963 wh16
->dwBytesRecorded
= wh32
->dwBytesRecorded
;
964 wh16
->dwUser
= wh32
->dwUser
;
965 wh16
->dwFlags
= wh32
->dwFlags
;
966 wh16
->dwLoops
= wh32
->dwLoops
;
967 /* FIXME: nothing on wh32->lpNext */
968 /* could link the wh32->lpNext at this level for memory house keeping */
969 wh32
->lpNext
= wh16
; /* for reuse in unprepare and write */
970 *lpParam1
= seg_ptr
+ sizeof(LPWAVEHDR
);
971 *lpParam2
= sizeof(WAVEHDR
);
972 TRACE("wh16=%08lx wh16->lpData=%p wh32->buflen=%u wh32->lpData=%p\n",
973 *lpParam1
, wh16
->lpData
, wh32
->dwBufferLength
, wh32
->lpData
);
975 ret
= WINMM_MAP_OKMEM
;
977 ret
= WINMM_MAP_NOMEM
;
984 LPWAVEHDR wh32
= (LPWAVEHDR
)(*lpParam1
);
985 LPWAVEHDR wh16
= wh32
->lpNext
;
986 LPSTR ptr
= (LPSTR
)wh16
- sizeof(LPWAVEHDR
);
987 SEGPTR seg_ptr
= MapLS( ptr
);
989 assert(*(LPWAVEHDR
*)ptr
== wh32
);
991 if (wMsg
== WIDM_ADDBUFFER
)
992 memcpy((LPSTR
)wh16
+ sizeof(WAVEHDR
), wh32
->lpData
, wh32
->dwBufferLength
);
994 *lpParam1
= seg_ptr
+ sizeof(LPWAVEHDR
);
995 *lpParam2
= sizeof(WAVEHDR
);
996 TRACE("wh16=%08lx wh16->lpData=%p wh32->buflen=%u wh32->lpData=%p\n",
997 *lpParam1
, wh16
->lpData
, wh32
->dwBufferLength
, wh32
->lpData
);
999 /* dwBufferLength can be reduced between prepare & write */
1000 if (wMsg
== WIDM_ADDBUFFER
&& wh16
->dwBufferLength
< wh32
->dwBufferLength
) {
1001 ERR("Size of buffer has been increased from %d to %d, keeping initial value\n",
1002 wh16
->dwBufferLength
, wh32
->dwBufferLength
);
1004 wh16
->dwBufferLength
= wh32
->dwBufferLength
;
1005 ret
= WINMM_MAP_OKMEM
;
1008 case WIDM_GETDEVCAPS
:
1010 LPWAVEINCAPSW wic32
= (LPWAVEINCAPSW
)*lpParam1
;
1011 LPSTR ptr
= HeapAlloc( GetProcessHeap(), 0 ,sizeof(LPWAVEINCAPSW
) + sizeof(WAVEINCAPS16
));
1014 *(LPWAVEINCAPSW
*)ptr
= wic32
;
1015 ret
= WINMM_MAP_OKMEM
;
1017 ret
= WINMM_MAP_NOMEM
;
1019 *lpParam1
= MapLS(ptr
) + sizeof(LPWAVEINCAPSW
);
1020 *lpParam2
= sizeof(WAVEINCAPS16
);
1025 LPMMTIME mmt32
= (LPMMTIME
)*lpParam1
;
1026 LPSTR ptr
= HeapAlloc( GetProcessHeap(), 0, sizeof(LPMMTIME
) + sizeof(MMTIME16
));
1027 LPMMTIME16 mmt16
= (LPMMTIME16
)(ptr
+ sizeof(LPMMTIME
));
1030 *(LPMMTIME
*)ptr
= mmt32
;
1031 mmt16
->wType
= mmt32
->wType
;
1032 ret
= WINMM_MAP_OKMEM
;
1034 ret
= WINMM_MAP_NOMEM
;
1036 *lpParam1
= MapLS(ptr
) + sizeof(LPMMTIME
);
1037 *lpParam2
= sizeof(MMTIME16
);
1040 case DRVM_MAPPER_STATUS
:
1042 LPDWORD p32
= (LPDWORD
)*lpParam2
;
1043 *lpParam2
= MapLS(p32
);
1044 ret
= WINMM_MAP_OKMEM
;
1048 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg
, *lpParam1
, *lpParam2
);
1054 /**************************************************************************
1055 * MMDRV_WaveIn_UnMap32WTo16 [internal]
1057 static WINMM_MapType
MMDRV_WaveIn_UnMap32WTo16(UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
, MMRESULT fn_ret
)
1059 WINMM_MapType ret
= WINMM_MAP_MSGERROR
;
1063 case WIDM_GETNUMDEVS
:
1072 LPWAVEOPENDESC16 wod16
= MapSL(*lpParam1
);
1073 LPSTR ptr
= (LPSTR
)wod16
- sizeof(LPWAVEOPENDESC
) - 2*sizeof(DWORD
);
1074 LPWAVEOPENDESC wod32
= *(LPWAVEOPENDESC
*)ptr
;
1076 UnMapLS( *lpParam1
);
1077 wod32
->uMappedDeviceID
= wod16
->uMappedDeviceID
;
1078 **(DWORD
**)(ptr
+ sizeof(LPWAVEOPENDESC
)) = *(LPDWORD
)(ptr
+ sizeof(LPWAVEOPENDESC
) + sizeof(DWORD
));
1079 HeapFree( GetProcessHeap(), 0, ptr
);
1084 case WIDM_ADDBUFFER
:
1086 case WIDM_UNPREPARE
:
1088 LPWAVEHDR wh16
= MapSL(*lpParam1
);
1089 LPSTR ptr
= (LPSTR
)wh16
- sizeof(LPWAVEHDR
);
1090 LPWAVEHDR wh32
= *(LPWAVEHDR
*)ptr
;
1092 assert(wh32
->lpNext
== wh16
);
1093 wh32
->dwBytesRecorded
= wh16
->dwBytesRecorded
;
1094 wh32
->dwUser
= wh16
->dwUser
;
1095 wh32
->dwFlags
= wh16
->dwFlags
;
1096 wh32
->dwLoops
= wh16
->dwLoops
;
1097 UnMapLS( *lpParam1
);
1099 if (wMsg
== WIDM_UNPREPARE
&& fn_ret
== MMSYSERR_NOERROR
) {
1100 HeapFree( GetProcessHeap(), 0, ptr
);
1106 case WIDM_GETDEVCAPS
:
1108 LPWAVEINCAPS16 wic16
= MapSL(*lpParam1
);
1109 LPSTR ptr
= (LPSTR
)wic16
- sizeof(LPWAVEINCAPSW
);
1110 LPWAVEINCAPSW wic32
= *(LPWAVEINCAPSW
*)ptr
;
1112 wic32
->wMid
= wic16
->wMid
;
1113 wic32
->wPid
= wic16
->wPid
;
1114 wic32
->vDriverVersion
= wic16
->vDriverVersion
;
1115 WideCharToMultiByte( CP_ACP
, 0, wic32
->szPname
, -1, wic16
->szPname
,
1116 sizeof(wic16
->szPname
), NULL
, NULL
);
1117 wic32
->dwFormats
= wic16
->dwFormats
;
1118 wic32
->wChannels
= wic16
->wChannels
;
1119 UnMapLS( *lpParam1
);
1120 HeapFree( GetProcessHeap(), 0, ptr
);
1126 LPMMTIME16 mmt16
= MapSL(*lpParam1
);
1127 LPSTR ptr
= (LPSTR
)mmt16
- sizeof(LPMMTIME
);
1128 LPMMTIME mmt32
= *(LPMMTIME
*)ptr
;
1130 MMSYSTEM_MMTIME16to32(mmt32
, mmt16
);
1131 UnMapLS( *lpParam1
);
1132 HeapFree( GetProcessHeap(), 0, ptr
);
1136 case DRVM_MAPPER_STATUS
:
1138 UnMapLS( *lpParam2
);
1143 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg
, *lpParam1
, *lpParam2
);
1149 /**************************************************************************
1150 * MMDRV_WaveIn_Callback [internal]
1152 static void CALLBACK
MMDRV_WaveIn_Callback(HDRVR hDev
, UINT uMsg
, DWORD_PTR dwInstance
, DWORD_PTR dwParam1
, DWORD_PTR dwParam2
)
1154 LPWINE_MLD mld
= (LPWINE_MLD
)dwInstance
;
1159 /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
1162 if (mld
->bFrom32
&& !MMDRV_Is32(mld
->mmdIndex
)) {
1163 /* initial map is: 32 => 16 */
1164 LPWAVEHDR wh16
= MapSL(dwParam1
);
1165 LPWAVEHDR wh32
= *(LPWAVEHDR
*)((LPSTR
)wh16
- sizeof(LPWAVEHDR
));
1167 dwParam1
= (DWORD
)wh32
;
1168 wh32
->dwFlags
= wh16
->dwFlags
;
1169 wh32
->dwBytesRecorded
= wh16
->dwBytesRecorded
;
1170 } else if (!mld
->bFrom32
&& MMDRV_Is32(mld
->mmdIndex
)) {
1171 /* initial map is: 16 => 32 */
1172 LPWAVEHDR wh32
= (LPWAVEHDR
)(dwParam1
);
1173 SEGPTR segwh16
= *(SEGPTR
*)((LPSTR
)wh32
- sizeof(LPWAVEHDR
));
1174 LPWAVEHDR wh16
= MapSL(segwh16
);
1176 dwParam1
= (DWORD
)segwh16
;
1177 wh16
->dwFlags
= wh32
->dwFlags
;
1178 wh16
->dwBytesRecorded
= wh32
->dwBytesRecorded
;
1180 /* else { 16 => 16 or 32 => 32, nothing to do, same struct is kept }*/
1183 ERR("Unknown msg %u\n", uMsg
);
1186 MMDRV_Callback(mld
, hDev
, uMsg
, dwParam1
, dwParam2
);
1189 /* =================================
1190 * W A V E O U T M A P P E R S
1191 * ================================= */
1193 /**************************************************************************
1194 * MMDRV_WaveOut_Map16To32W [internal]
1196 static WINMM_MapType
MMDRV_WaveOut_Map16To32W (UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
)
1198 WINMM_MapType ret
= WINMM_MAP_MSGERROR
;
1202 case WODM_BREAKLOOP
:
1204 case WODM_GETNUMDEVS
:
1209 case WODM_SETPLAYBACKRATE
:
1210 case WODM_SETVOLUME
:
1215 case WODM_GETPLAYBACKRATE
:
1216 case WODM_GETVOLUME
:
1218 FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
1221 case WODM_GETDEVCAPS
:
1223 LPWAVEOUTCAPSW woc32
= HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEOUTCAPS16
) + sizeof(WAVEOUTCAPSW
));
1224 LPWAVEOUTCAPS16 woc16
= MapSL(*lpParam1
);
1227 *(LPWAVEOUTCAPS16
*)woc32
= woc16
;
1228 woc32
= (LPWAVEOUTCAPSW
)((LPSTR
)woc32
+ sizeof(LPWAVEOUTCAPS16
));
1229 *lpParam1
= (DWORD
)woc32
;
1230 *lpParam2
= sizeof(WAVEOUTCAPSW
);
1232 ret
= WINMM_MAP_OKMEM
;
1234 ret
= WINMM_MAP_NOMEM
;
1240 LPMMTIME mmt32
= HeapAlloc(GetProcessHeap(), 0, sizeof(LPMMTIME16
) + sizeof(MMTIME
));
1241 LPMMTIME16 mmt16
= MapSL(*lpParam1
);
1244 *(LPMMTIME16
*)mmt32
= mmt16
;
1245 mmt32
= (LPMMTIME
)((LPSTR
)mmt32
+ sizeof(LPMMTIME16
));
1247 mmt32
->wType
= mmt16
->wType
;
1248 *lpParam1
= (DWORD
)mmt32
;
1249 *lpParam2
= sizeof(MMTIME
);
1251 ret
= WINMM_MAP_OKMEM
;
1253 ret
= WINMM_MAP_NOMEM
;
1259 LPWAVEHDR wh32
= HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEHDR
) + sizeof(WAVEHDR
));
1260 LPWAVEHDR wh16
= MapSL(*lpParam1
);
1263 *(LPWAVEHDR
*)wh32
= (LPWAVEHDR
)*lpParam1
;
1264 wh32
= (LPWAVEHDR
)((LPSTR
)wh32
+ sizeof(LPWAVEHDR
));
1265 wh32
->lpData
= MapSL((SEGPTR
)wh16
->lpData
);
1266 wh32
->dwBufferLength
= wh16
->dwBufferLength
;
1267 wh32
->dwBytesRecorded
= wh16
->dwBytesRecorded
;
1268 wh32
->dwUser
= wh16
->dwUser
;
1269 wh32
->dwFlags
= wh16
->dwFlags
;
1270 wh32
->dwLoops
= wh16
->dwLoops
;
1271 /* FIXME: nothing on wh32->lpNext */
1272 /* could link the wh32->lpNext at this level for memory house keeping */
1273 wh16
->lpNext
= wh32
; /* for reuse in unprepare and write */
1274 *lpParam1
= (DWORD
)wh32
;
1275 *lpParam2
= sizeof(WAVEHDR
);
1277 ret
= WINMM_MAP_OKMEM
;
1279 ret
= WINMM_MAP_NOMEM
;
1283 case WODM_UNPREPARE
:
1286 LPWAVEHDR wh16
= MapSL(*lpParam1
);
1287 LPWAVEHDR wh32
= wh16
->lpNext
;
1289 *lpParam1
= (DWORD
)wh32
;
1290 *lpParam2
= sizeof(WAVEHDR
);
1291 /* dwBufferLength can be reduced between prepare & write */
1292 if (wMsg
== WODM_WRITE
&& wh32
->dwBufferLength
< wh16
->dwBufferLength
) {
1293 ERR("Size of buffer has been increased from %d to %d, keeping initial value\n",
1294 wh32
->dwBufferLength
, wh16
->dwBufferLength
);
1296 wh32
->dwBufferLength
= wh16
->dwBufferLength
;
1297 ret
= WINMM_MAP_OKMEM
;
1300 case WODM_MAPPER_STATUS
:
1301 *lpParam2
= (DWORD
)MapSL(*lpParam2
);
1305 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg
, *lpParam1
, *lpParam2
);
1311 /**************************************************************************
1312 * MMDRV_WaveOut_UnMap16To32W [internal]
1314 static WINMM_MapType
MMDRV_WaveOut_UnMap16To32W(UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
, MMRESULT fn_ret
)
1316 WINMM_MapType ret
= WINMM_MAP_MSGERROR
;
1320 case WODM_BREAKLOOP
:
1322 case WODM_GETNUMDEVS
:
1327 case WODM_SETPLAYBACKRATE
:
1328 case WODM_SETVOLUME
:
1329 case WODM_MAPPER_STATUS
:
1334 case WODM_GETPLAYBACKRATE
:
1335 case WODM_GETVOLUME
:
1337 FIXME("Shouldn't be used: those 16 bit functions use the 32 bit interface\n");
1340 case WODM_GETDEVCAPS
:
1342 LPWAVEOUTCAPSW woc32
= (LPWAVEOUTCAPSW
)(*lpParam1
);
1343 LPWAVEOUTCAPS16 woc16
= *(LPWAVEOUTCAPS16
*)((LPSTR
)woc32
- sizeof(LPWAVEOUTCAPS16
));
1345 woc16
->wMid
= woc32
->wMid
;
1346 woc16
->wPid
= woc32
->wPid
;
1347 woc16
->vDriverVersion
= woc32
->vDriverVersion
;
1348 WideCharToMultiByte( CP_ACP
, 0, woc32
->szPname
, -1, woc16
->szPname
,
1349 sizeof(woc16
->szPname
), NULL
, NULL
);
1350 woc16
->dwFormats
= woc32
->dwFormats
;
1351 woc16
->wChannels
= woc32
->wChannels
;
1352 woc16
->dwSupport
= woc32
->dwSupport
;
1353 HeapFree(GetProcessHeap(), 0, (LPSTR
)woc32
- sizeof(LPWAVEOUTCAPS16
));
1359 LPMMTIME mmt32
= (LPMMTIME
)(*lpParam1
);
1360 LPMMTIME16 mmt16
= *(LPMMTIME16
*)((LPSTR
)mmt32
- sizeof(LPMMTIME16
));
1362 MMSYSTEM_MMTIME32to16(mmt16
, mmt32
);
1363 HeapFree(GetProcessHeap(), 0, (LPSTR
)mmt32
- sizeof(LPMMTIME16
));
1368 case WODM_UNPREPARE
:
1371 LPWAVEHDR wh32
= (LPWAVEHDR
)(*lpParam1
);
1372 LPWAVEHDR wh16
= MapSL(*(SEGPTR
*)((LPSTR
)wh32
- sizeof(LPWAVEHDR
)));
1374 assert(wh16
->lpNext
== wh32
);
1375 wh16
->dwBufferLength
= wh32
->dwBufferLength
;
1376 wh16
->dwBytesRecorded
= wh32
->dwBytesRecorded
;
1377 wh16
->dwUser
= wh32
->dwUser
;
1378 wh16
->dwFlags
= wh32
->dwFlags
;
1379 wh16
->dwLoops
= wh32
->dwLoops
;
1381 if (wMsg
== WODM_UNPREPARE
&& fn_ret
== MMSYSERR_NOERROR
) {
1382 HeapFree(GetProcessHeap(), 0, (LPSTR
)wh32
- sizeof(LPWAVEHDR
));
1389 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg
, *lpParam1
, *lpParam2
);
1395 /**************************************************************************
1396 * MMDRV_WaveOut_Map32WTo16 [internal]
1398 static WINMM_MapType
MMDRV_WaveOut_Map32WTo16 (UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
)
1404 case WODM_BREAKLOOP
:
1406 case WODM_GETNUMDEVS
:
1411 case WODM_SETPLAYBACKRATE
:
1412 case WODM_SETVOLUME
:
1416 case WODM_GETDEVCAPS
:
1418 LPWAVEOUTCAPSW woc32
= (LPWAVEOUTCAPSW
)*lpParam1
;
1419 LPSTR ptr
= HeapAlloc( GetProcessHeap(), 0,
1420 sizeof(LPWAVEOUTCAPSW
) + sizeof(WAVEOUTCAPS16
));
1423 *(LPWAVEOUTCAPSW
*)ptr
= woc32
;
1424 ret
= WINMM_MAP_OKMEM
;
1426 ret
= WINMM_MAP_NOMEM
;
1428 *lpParam1
= MapLS(ptr
) + sizeof(LPWAVEOUTCAPSW
);
1429 *lpParam2
= sizeof(WAVEOUTCAPS16
);
1433 FIXME("NIY: no conversion yet\n");
1434 ret
= WINMM_MAP_MSGERROR
;
1436 case WODM_GETPLAYBACKRATE
:
1437 FIXME("NIY: no conversion yet\n");
1438 ret
= WINMM_MAP_MSGERROR
;
1442 LPMMTIME mmt32
= (LPMMTIME
)*lpParam1
;
1443 LPSTR ptr
= HeapAlloc( GetProcessHeap(), 0, sizeof(LPMMTIME
) + sizeof(MMTIME16
));
1444 LPMMTIME16 mmt16
= (LPMMTIME16
)(ptr
+ sizeof(LPMMTIME
));
1447 *(LPMMTIME
*)ptr
= mmt32
;
1448 mmt16
->wType
= mmt32
->wType
;
1449 ret
= WINMM_MAP_OKMEM
;
1451 ret
= WINMM_MAP_NOMEM
;
1453 *lpParam1
= MapLS(ptr
) + sizeof(LPMMTIME
);
1454 *lpParam2
= sizeof(MMTIME16
);
1457 case WODM_GETVOLUME
:
1458 FIXME("NIY: no conversion yet\n");
1459 ret
= WINMM_MAP_MSGERROR
;
1463 LPWAVEOPENDESC wod32
= (LPWAVEOPENDESC
)*lpParam1
;
1464 int sz
= sizeof(WAVEFORMATEX
);
1466 LPWAVEOPENDESC16 wod16
;
1468 /* allocated data are mapped as follows:
1469 LPWAVEOPENDESC ptr to orig lParam1
1470 DWORD orig dwUser, which is a pointer to DWORD:driver dwInstance
1471 DWORD dwUser passed to driver
1472 WAVEOPENDESC16 wod16: openDesc passed to driver
1473 WAVEFORMATEX openDesc->lpFormat passed to driver
1474 xxx extra bytes to WAVEFORMATEX
1476 if (wod32
->lpFormat
->wFormatTag
!= WAVE_FORMAT_PCM
) {
1477 TRACE("Allocating %u extra bytes (%d)\n", wod32
->lpFormat
->cbSize
, wod32
->lpFormat
->wFormatTag
);
1478 sz
+= wod32
->lpFormat
->cbSize
;
1481 ptr
= HeapAlloc( GetProcessHeap(), 0,
1482 sizeof(LPWAVEOPENDESC
) + 2*sizeof(DWORD
) + sizeof(WAVEOPENDESC16
) + sz
);
1485 SEGPTR seg_ptr
= MapLS( ptr
);
1486 *(LPWAVEOPENDESC
*)ptr
= wod32
;
1487 *(LPDWORD
)((char*)ptr
+ sizeof(LPWAVEOPENDESC
)) = *lpdwUser
;
1488 wod16
= (LPWAVEOPENDESC16
)((LPSTR
)ptr
+ sizeof(LPWAVEOPENDESC
) + 2*sizeof(DWORD
));
1490 wod16
->hWave
= HWAVE_16(wod32
->hWave
);
1491 wod16
->lpFormat
= (LPWAVEFORMATEX
)(seg_ptr
+ sizeof(LPWAVEOPENDESC
) + 2*sizeof(DWORD
) + sizeof(WAVEOPENDESC16
));
1492 memcpy(wod16
+ 1, wod32
->lpFormat
, sz
);
1494 wod16
->dwCallback
= wod32
->dwCallback
;
1495 wod16
->dwInstance
= wod32
->dwInstance
;
1496 wod16
->uMappedDeviceID
= wod32
->uMappedDeviceID
;
1497 wod16
->dnDevNode
= wod32
->dnDevNode
;
1499 *lpParam1
= seg_ptr
+ sizeof(LPWAVEOPENDESC
) + 2*sizeof(DWORD
);
1500 *lpdwUser
= seg_ptr
+ sizeof(LPWAVEOPENDESC
) + sizeof(DWORD
);
1502 ret
= WINMM_MAP_OKMEM
;
1504 ret
= WINMM_MAP_NOMEM
;
1510 LPWAVEHDR wh32
= (LPWAVEHDR
)*lpParam1
;
1512 LPVOID ptr
= HeapAlloc( GetProcessHeap(), 0,
1513 sizeof(LPWAVEHDR
) + sizeof(WAVEHDR
) + wh32
->dwBufferLength
);
1516 SEGPTR seg_ptr
= MapLS( ptr
);
1517 *(LPWAVEHDR
*)ptr
= wh32
;
1518 wh16
= (LPWAVEHDR
)((LPSTR
)ptr
+ sizeof(LPWAVEHDR
));
1519 wh16
->lpData
= (LPSTR
)seg_ptr
+ sizeof(LPWAVEHDR
) + sizeof(WAVEHDR
);
1520 /* data will be copied on WODM_WRITE */
1521 wh16
->dwBufferLength
= wh32
->dwBufferLength
;
1522 wh16
->dwBytesRecorded
= wh32
->dwBytesRecorded
;
1523 wh16
->dwUser
= wh32
->dwUser
;
1524 wh16
->dwFlags
= wh32
->dwFlags
;
1525 wh16
->dwLoops
= wh32
->dwLoops
;
1526 /* FIXME: nothing on wh32->lpNext */
1527 /* could link the wh32->lpNext at this level for memory house keeping */
1528 wh32
->lpNext
= wh16
; /* for reuse in unprepare and write */
1529 *lpParam1
= seg_ptr
+ sizeof(LPWAVEHDR
);
1530 *lpParam2
= sizeof(WAVEHDR
);
1531 TRACE("wh16=%08lx wh16->lpData=%p wh32->buflen=%u wh32->lpData=%p\n",
1532 *lpParam1
, wh16
->lpData
, wh32
->dwBufferLength
, wh32
->lpData
);
1534 ret
= WINMM_MAP_OKMEM
;
1536 ret
= WINMM_MAP_NOMEM
;
1540 case WODM_UNPREPARE
:
1543 LPWAVEHDR wh32
= (LPWAVEHDR
)(*lpParam1
);
1544 LPWAVEHDR wh16
= wh32
->lpNext
;
1545 LPSTR ptr
= (LPSTR
)wh16
- sizeof(LPWAVEHDR
);
1546 SEGPTR seg_ptr
= MapLS( ptr
);
1548 assert(*(LPWAVEHDR
*)ptr
== wh32
);
1550 if (wMsg
== WODM_WRITE
)
1551 memcpy((LPSTR
)wh16
+ sizeof(WAVEHDR
), wh32
->lpData
, wh32
->dwBufferLength
);
1553 *lpParam1
= seg_ptr
+ sizeof(LPWAVEHDR
);
1554 *lpParam2
= sizeof(WAVEHDR
);
1555 TRACE("wh16=%08lx wh16->lpData=%p wh32->buflen=%u wh32->lpData=%p\n",
1556 *lpParam1
, wh16
->lpData
, wh32
->dwBufferLength
, wh32
->lpData
);
1558 /* dwBufferLength can be reduced between prepare & write */
1559 if (wMsg
== WODM_WRITE
&& wh16
->dwBufferLength
< wh32
->dwBufferLength
) {
1560 ERR("Size of buffer has been increased from %d to %d, keeping initial value\n",
1561 wh16
->dwBufferLength
, wh32
->dwBufferLength
);
1563 wh16
->dwBufferLength
= wh32
->dwBufferLength
;
1564 ret
= WINMM_MAP_OKMEM
;
1567 case DRVM_MAPPER_STATUS
:
1569 LPDWORD p32
= (LPDWORD
)*lpParam2
;
1570 *lpParam2
= MapLS(p32
);
1571 ret
= WINMM_MAP_OKMEM
;
1575 FIXME("NIY: no conversion yet\n");
1576 ret
= WINMM_MAP_MSGERROR
;
1582 /**************************************************************************
1583 * MMDRV_WaveOut_UnMap32WTo16 [internal]
1585 static WINMM_MapType
MMDRV_WaveOut_UnMap32WTo16(UINT wMsg
, DWORD_PTR
*lpdwUser
, DWORD_PTR
* lpParam1
, DWORD_PTR
* lpParam2
, MMRESULT fn_ret
)
1591 case WODM_BREAKLOOP
:
1593 case WODM_GETNUMDEVS
:
1598 case WODM_SETPLAYBACKRATE
:
1599 case WODM_SETVOLUME
:
1603 case WODM_GETDEVCAPS
:
1605 LPWAVEOUTCAPS16 woc16
= MapSL(*lpParam1
);
1606 LPSTR ptr
= (LPSTR
)woc16
- sizeof(LPWAVEOUTCAPSW
);
1607 LPWAVEOUTCAPSW woc32
= *(LPWAVEOUTCAPSW
*)ptr
;
1609 woc32
->wMid
= woc16
->wMid
;
1610 woc32
->wPid
= woc16
->wPid
;
1611 woc32
->vDriverVersion
= woc16
->vDriverVersion
;
1612 WideCharToMultiByte( CP_ACP
, 0, woc32
->szPname
, -1, woc16
->szPname
,
1613 sizeof(woc16
->szPname
), NULL
, NULL
);
1614 woc32
->dwFormats
= woc16
->dwFormats
;
1615 woc32
->wChannels
= woc16
->wChannels
;
1616 woc32
->dwSupport
= woc16
->dwSupport
;
1617 UnMapLS( *lpParam1
);
1618 HeapFree( GetProcessHeap(), 0, ptr
);
1623 FIXME("NIY: no conversion yet\n");
1624 ret
= WINMM_MAP_MSGERROR
;
1626 case WODM_GETPLAYBACKRATE
:
1627 FIXME("NIY: no conversion yet\n");
1628 ret
= WINMM_MAP_MSGERROR
;
1632 LPMMTIME16 mmt16
= MapSL(*lpParam1
);
1633 LPSTR ptr
= (LPSTR
)mmt16
- sizeof(LPMMTIME
);
1634 LPMMTIME mmt32
= *(LPMMTIME
*)ptr
;
1636 MMSYSTEM_MMTIME16to32(mmt32
, mmt16
);
1637 UnMapLS( *lpParam1
);
1638 HeapFree( GetProcessHeap(), 0, ptr
);
1644 LPWAVEOPENDESC16 wod16
= MapSL(*lpParam1
);
1645 LPSTR ptr
= (LPSTR
)wod16
- sizeof(LPWAVEOPENDESC
) - 2*sizeof(DWORD
);
1646 LPWAVEOPENDESC wod32
= *(LPWAVEOPENDESC
*)ptr
;
1648 wod32
->uMappedDeviceID
= wod16
->uMappedDeviceID
;
1649 **(DWORD
**)(ptr
+ sizeof(LPWAVEOPENDESC
)) = *(LPDWORD
)(ptr
+ sizeof(LPWAVEOPENDESC
) + sizeof(DWORD
));
1650 UnMapLS( *lpParam1
);
1651 HeapFree( GetProcessHeap(), 0, ptr
);
1656 case WODM_UNPREPARE
:
1659 LPWAVEHDR wh16
= MapSL(*lpParam1
);
1660 LPSTR ptr
= (LPSTR
)wh16
- sizeof(LPWAVEHDR
);
1661 LPWAVEHDR wh32
= *(LPWAVEHDR
*)ptr
;
1663 assert(wh32
->lpNext
== wh16
);
1664 wh32
->dwBytesRecorded
= wh16
->dwBytesRecorded
;
1665 wh32
->dwUser
= wh16
->dwUser
;
1666 wh32
->dwFlags
= wh16
->dwFlags
;
1667 wh32
->dwLoops
= wh16
->dwLoops
;
1669 UnMapLS( *lpParam1
);
1670 if (wMsg
== WODM_UNPREPARE
&& fn_ret
== MMSYSERR_NOERROR
) {
1671 HeapFree( GetProcessHeap(), 0, ptr
);
1677 case WODM_GETVOLUME
:
1678 FIXME("NIY: no conversion yet\n");
1679 ret
= WINMM_MAP_MSGERROR
;
1681 case DRVM_MAPPER_STATUS
:
1683 UnMapLS( *lpParam2
);
1688 FIXME("NIY: no conversion yet\n");
1689 ret
= WINMM_MAP_MSGERROR
;
1695 /**************************************************************************
1696 * MMDRV_WaveOut_Callback [internal]
1698 static void CALLBACK
MMDRV_WaveOut_Callback(HDRVR hDev
, UINT uMsg
, DWORD_PTR dwInstance
, DWORD_PTR dwParam1
, DWORD_PTR dwParam2
)
1700 LPWINE_MLD mld
= (LPWINE_MLD
)dwInstance
;
1705 /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
1708 if (mld
->bFrom32
&& !MMDRV_Is32(mld
->mmdIndex
)) {
1709 /* initial map is: 32 => 16 */
1710 LPWAVEHDR wh16
= MapSL(dwParam1
);
1711 LPWAVEHDR wh32
= *(LPWAVEHDR
*)((LPSTR
)wh16
- sizeof(LPWAVEHDR
));
1713 dwParam1
= (DWORD
)wh32
;
1714 wh32
->dwFlags
= wh16
->dwFlags
;
1715 } else if (!mld
->bFrom32
&& MMDRV_Is32(mld
->mmdIndex
)) {
1716 /* initial map is: 16 => 32 */
1717 LPWAVEHDR wh32
= (LPWAVEHDR
)(dwParam1
);
1718 SEGPTR segwh16
= *(SEGPTR
*)((LPSTR
)wh32
- sizeof(LPWAVEHDR
));
1719 LPWAVEHDR wh16
= MapSL(segwh16
);
1721 dwParam1
= (DWORD
)segwh16
;
1722 wh16
->dwFlags
= wh32
->dwFlags
;
1724 /* else { 16 => 16 or 32 => 32, nothing to do, same struct is kept }*/
1727 ERR("Unknown msg %u\n", uMsg
);
1730 MMDRV_Callback(mld
, hDev
, uMsg
, dwParam1
, dwParam2
);
1733 /* =================================
1734 * M A P P E R S H A N D L I N G
1735 * ================================= */
1737 static LRESULT
MMDRV_CallMMDrvFunc16(DWORD fp16
, WORD dev
, WORD msg
, LONG instance
,
1745 args
[5] = HIWORD(instance
);
1746 args
[4] = LOWORD(instance
);
1747 args
[3] = HIWORD(lp1
);
1748 args
[2] = LOWORD(lp1
);
1749 args
[1] = HIWORD(lp2
);
1750 args
[0] = LOWORD(lp2
);
1751 WOWCallback16Ex( fp16
, WCB16_PASCAL
, sizeof(args
), args
, &ret
);
1755 /**************************************************************************
1756 * MMDRV_GetDescription16 [internal]
1758 static BOOL
MMDRV_GetDescription16(const char* fname
, char* buf
, int buflen
)
1766 if ((hFile
= OpenFile(fname
, &ofs
, OF_READ
| OF_SHARE_DENY_WRITE
)) == HFILE_ERROR
) {
1767 ERR("Can't open file %s (builtin driver ?)\n", fname
);
1771 #define E(_x) do {TRACE _x;goto theEnd;} while(0)
1773 if (_lread(hFile
, &w
, 2) != 2) E(("Can't read sig\n"));
1774 if (w
!= ('Z' * 256 + 'M')) E(("Bad sig %04x\n", w
));
1775 if (_llseek(hFile
, 0x3C, SEEK_SET
) < 0) E(("Can't seek to ext header offset\n"));
1776 if (_lread(hFile
, &dw
, 4) != 4) E(("Can't read ext header offset\n"));
1777 if (_llseek(hFile
, dw
+ 0x2C, SEEK_SET
) < 0) E(("Can't seek to ext header.nr table %u\n", dw
+0x2C));
1778 if (_lread(hFile
, &dw
, 4) != 4) E(("Can't read nr table offset\n"));
1779 if (_llseek(hFile
, dw
, SEEK_SET
) < 0) E(("Can't seek to nr table %u\n", dw
));
1780 if (_lread(hFile
, buf
, 1) != 1) E(("Can't read descr length\n"));
1781 buflen
= min((int)(unsigned)(BYTE
)buf
[0], buflen
- 1);
1782 if (_lread(hFile
, buf
, buflen
) != buflen
) E(("Can't read descr (%d)\n", buflen
));
1785 TRACE("Got '%s' [%d]\n", buf
, buflen
);
1791 /******************************************************************
1792 * MMDRV_LoadMMDrvFunc16
1795 static unsigned MMDRV_LoadMMDrvFunc16(LPCSTR drvName
, LPWINE_DRIVER d
,
1796 LPWINE_MM_DRIVER lpDrv
)
1798 WINEMM_msgFunc16 func
;
1802 * DESCRIPTION 'wave,aux,mixer:Creative Labs Sound Blaster 16 Driver'
1803 * The beginning of the module description indicates the driver supports
1804 * waveform, auxiliary, and mixer devices. Use one of the following
1805 * device-type names, followed by a colon (:) to indicate the type of
1806 * device your driver supports. If the driver supports more than one
1807 * type of device, separate each device-type name with a comma (,).
1809 * wave for waveform audio devices
1810 * wavemapper for wave mappers
1811 * midi for MIDI audio devices
1812 * midimapper for midi mappers
1813 * aux for auxiliary audio devices
1814 * mixer for mixer devices
1817 if (d
->d
.d16
.hDriver16
) {
1818 HMODULE16 hMod16
= GetDriverModuleHandle16(d
->d
.d16
.hDriver16
);
1820 #define AA(_h,_w,_x,_y,_z) \
1821 func = (WINEMM_msgFunc##_y) _z ((_h), #_x); \
1823 { lpDrv->parts[_w].u.fnMessage##_y = func; count++; \
1824 TRACE("Got %d bit func '%s'\n", _y, #_x); }
1826 #define A(_x,_y) AA(hMod16,_x,_y,16,GetProcAddress16)
1827 A(MMDRV_AUX
, auxMessage
);
1828 A(MMDRV_MIXER
, mxdMessage
);
1829 A(MMDRV_MIDIIN
, midMessage
);
1830 A(MMDRV_MIDIOUT
,modMessage
);
1831 A(MMDRV_WAVEIN
, widMessage
);
1832 A(MMDRV_WAVEOUT
,wodMessage
);
1836 if (TRACE_ON(winmm
)) {
1837 if (MMDRV_GetDescription16(drvName
, buffer
, sizeof(buffer
)))
1838 TRACE("%s => %s\n", drvName
, buffer
);
1840 TRACE("%s => No description\n", drvName
);
1846 /* =================================
1848 * ================================= */
1850 /**************************************************************************
1851 * MCI_MapMsg16To32W [internal]
1853 static WINMM_MapType
MCI_MapMsg16To32W(WORD uDevType
, WORD wMsg
, DWORD dwFlags
, DWORD_PTR
* lParam
)
1856 return WINMM_MAP_OK
;
1857 /* FIXME: to add also (with seg/linear modifications to do):
1858 * MCI_LIST, MCI_LOAD, MCI_QUALITY, MCI_RESERVE, MCI_RESTORE, MCI_SAVE
1859 * MCI_SETAUDIO, MCI_SETTUNER, MCI_SETVIDEO
1862 /* case MCI_CAPTURE */
1864 case MCI_CLOSE_DRIVER
:
1871 case MCI_GETDEVCAPS
:
1872 /* case MCI_INDEX: */
1873 /* case MCI_MARK: */
1874 /* case MCI_MONITOR: */
1884 /* case MCI_SETTIMECODE:*/
1885 /* case MCI_SIGNAL:*/
1887 case MCI_STATUS
: /* FIXME: is wrong for digital video */
1890 /* case MCI_UNDO: */
1894 *lParam
= (DWORD
)MapSL(*lParam
);
1895 return WINMM_MAP_OK
;
1897 /* in fact, I would also need the dwFlags... to see
1898 * which members of lParam are effectively used
1900 *lParam
= (DWORD
)MapSL(*lParam
);
1901 FIXME("Current mapping may be wrong\n");
1905 LPMCI_BREAK_PARMS mbp32
= HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_BREAK_PARMS
));
1906 LPMCI_BREAK_PARMS16 mbp16
= MapSL(*lParam
);
1909 mbp32
->dwCallback
= mbp16
->dwCallback
;
1910 mbp32
->nVirtKey
= mbp16
->nVirtKey
;
1911 mbp32
->hwndBreak
= HWND_32(mbp16
->hwndBreak
);
1913 return WINMM_MAP_NOMEM
;
1915 *lParam
= (DWORD
)mbp32
;
1917 return WINMM_MAP_OKMEM
;
1920 LPMCI_VD_ESCAPE_PARMSW mvep32w
= HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_VD_ESCAPE_PARMSW
));
1921 LPMCI_VD_ESCAPE_PARMS16 mvep16
= MapSL(*lParam
);
1924 mvep32w
->dwCallback
= mvep16
->dwCallback
;
1925 mvep32w
->lpstrCommand
= MCI_strdupAtoW(MapSL(mvep16
->lpstrCommand
));
1927 return WINMM_MAP_NOMEM
;
1929 *lParam
= (DWORD
)mvep32w
;
1931 return WINMM_MAP_OKMEM
;
1934 LPMCI_INFO_PARMSW mip32w
= HeapAlloc(GetProcessHeap(), 0, sizeof(LPMCI_OPEN_PARMS16
) + sizeof(MCI_INFO_PARMSW
));
1935 LPMCI_INFO_PARMS16 mip16
= MapSL(*lParam
);
1937 /* FIXME this is wrong if device is of type
1938 * MCI_DEVTYPE_DIGITAL_VIDEO, some members are not mapped
1941 *(LPMCI_INFO_PARMS16
*)(mip32w
) = mip16
;
1942 mip32w
= (LPMCI_INFO_PARMSW
)((char*)mip32w
+ sizeof(LPMCI_INFO_PARMS16
));
1943 mip32w
->dwCallback
= mip16
->dwCallback
;
1944 mip32w
->lpstrReturn
= HeapAlloc(GetProcessHeap(), 0, mip16
->dwRetSize
* sizeof(WCHAR
));
1945 mip32w
->dwRetSize
= mip16
->dwRetSize
* sizeof(WCHAR
);
1947 return WINMM_MAP_NOMEM
;
1949 *lParam
= (DWORD
)mip32w
;
1951 return WINMM_MAP_OKMEM
;
1953 case MCI_OPEN_DRIVER
:
1955 LPMCI_OPEN_PARMSW mop32w
= HeapAlloc(GetProcessHeap(), 0, sizeof(LPMCI_OPEN_PARMS16
) + sizeof(MCI_OPEN_PARMSW
) + 2 * sizeof(DWORD
));
1956 LPMCI_OPEN_PARMS16 mop16
= MapSL(*lParam
);
1959 *(LPMCI_OPEN_PARMS16
*)(mop32w
) = mop16
;
1960 mop32w
= (LPMCI_OPEN_PARMSW
)((char*)mop32w
+ sizeof(LPMCI_OPEN_PARMS16
));
1961 mop32w
->dwCallback
= mop16
->dwCallback
;
1962 mop32w
->wDeviceID
= mop16
->wDeviceID
;
1963 if( ( dwFlags
& ( MCI_OPEN_TYPE
| MCI_OPEN_TYPE_ID
)) == MCI_OPEN_TYPE
)
1964 mop32w
->lpstrDeviceType
= MCI_strdupAtoW(MapSL(mop16
->lpstrDeviceType
));
1966 mop32w
->lpstrDeviceType
= (LPWSTR
) mop16
->lpstrDeviceType
;
1967 if( ( dwFlags
& ( MCI_OPEN_ELEMENT
| MCI_OPEN_ELEMENT_ID
)) == MCI_OPEN_ELEMENT
)
1968 mop32w
->lpstrElementName
= MCI_strdupAtoW(MapSL(mop16
->lpstrElementName
));
1970 mop32w
->lpstrElementName
= (LPWSTR
) mop16
->lpstrElementName
;
1971 if( ( dwFlags
& MCI_OPEN_ALIAS
))
1972 mop32w
->lpstrAlias
= MCI_strdupAtoW(MapSL(mop16
->lpstrAlias
));
1974 mop32w
->lpstrAlias
= (LPWSTR
) mop16
->lpstrAlias
;
1975 /* copy extended information if any...
1976 * FIXME: this may seg fault if initial structure does not contain them and
1977 * the reads after msip16 fail under LDT limits...
1978 * NOTE: this should be split in two. First pass, while calling MCI_OPEN, and
1979 * should not take care of extended parameters, and should be used by MCI_Open
1980 * to fetch uDevType. When, this is known, the mapping for sending the
1981 * MCI_OPEN_DRIVER shall be done depending on uDevType.
1983 memcpy(mop32w
+ 1, mop16
+ 1, 2 * sizeof(DWORD
));
1985 return WINMM_MAP_NOMEM
;
1987 *lParam
= (DWORD
)mop32w
;
1989 return WINMM_MAP_OKMEM
;
1992 LPMCI_SYSINFO_PARMSW msip32w
= HeapAlloc(GetProcessHeap(), 0, sizeof(LPMCI_OPEN_PARMS16
) + sizeof(MCI_SYSINFO_PARMSW
));
1993 LPMCI_SYSINFO_PARMS16 msip16
= MapSL(*lParam
);
1996 *(LPMCI_SYSINFO_PARMS16
*)(msip32w
) = msip16
;
1997 msip32w
= (LPMCI_SYSINFO_PARMSW
)((char*)msip32w
+ sizeof(LPMCI_OPEN_PARMS16
));
1998 msip32w
->dwCallback
= msip16
->dwCallback
;
1999 msip32w
->lpstrReturn
= HeapAlloc(GetProcessHeap(), 0, msip16
->dwRetSize
* sizeof(WCHAR
));
2000 msip32w
->dwRetSize
= msip16
->dwRetSize
;
2001 msip32w
->dwNumber
= msip16
->dwNumber
;
2002 msip32w
->wDeviceType
= msip16
->wDeviceType
;
2004 return WINMM_MAP_NOMEM
;
2006 *lParam
= (DWORD
)msip32w
;
2008 return WINMM_MAP_OKMEM
;
2011 LPMCI_SOUND_PARMSW mbp32
= HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_SOUND_PARMSW
));
2012 LPMCI_SOUND_PARMS16 mbp16
= MapSL(*lParam
);
2015 mbp32
->dwCallback
= mbp16
->dwCallback
;
2016 mbp32
->lpstrSoundName
= MCI_strdupAtoW(MapSL(mbp16
->lpstrSoundName
));
2018 return WINMM_MAP_NOMEM
;
2020 *lParam
= (DWORD
)mbp32
;
2022 return WINMM_MAP_OKMEM
;
2030 case DRV_QUERYCONFIGURE
:
2033 case DRV_EXITSESSION
:
2034 case DRV_EXITAPPLICATION
:
2036 FIXME("This is a hack\n");
2037 return WINMM_MAP_OK
;
2039 FIXME("Don't know how to map msg=%s\n", MCI_MessageToString(wMsg
));
2041 return WINMM_MAP_MSGERROR
;
2044 /**************************************************************************
2045 * MCI_UnMapMsg16To32W [internal]
2047 static WINMM_MapType
MCI_UnMapMsg16To32W(WORD uDevType
, WORD wMsg
, DWORD dwFlags
, DWORD_PTR lParam
)
2050 /* case MCI_CAPTURE */
2052 case MCI_CLOSE_DRIVER
:
2059 case MCI_GETDEVCAPS
:
2060 /* case MCI_INDEX: */
2061 /* case MCI_MARK: */
2062 /* case MCI_MONITOR: */
2072 /* case MCI_SETTIMECODE:*/
2073 /* case MCI_SIGNAL:*/
2078 /* case MCI_UNDO: */
2082 return WINMM_MAP_OK
;
2085 /* FIXME ?? see Map function */
2086 return WINMM_MAP_OK
;
2089 HeapFree(GetProcessHeap(), 0, (LPVOID
)lParam
);
2090 return WINMM_MAP_OK
;
2093 LPMCI_VD_ESCAPE_PARMSW mvep32W
= (LPMCI_VD_ESCAPE_PARMSW
)lParam
;
2094 HeapFree(GetProcessHeap(), 0, (LPVOID
)mvep32W
->lpstrCommand
);
2095 HeapFree(GetProcessHeap(), 0, (LPVOID
)lParam
);
2097 return WINMM_MAP_OK
;
2100 LPMCI_INFO_PARMSW mip32w
= (LPMCI_INFO_PARMSW
)lParam
;
2101 LPMCI_INFO_PARMS16 mip16
= *(LPMCI_INFO_PARMS16
*)((char*)mip32w
- sizeof(LPMCI_INFO_PARMS16
));
2103 WideCharToMultiByte(CP_ACP
, 0,
2104 mip32w
->lpstrReturn
, mip32w
->dwRetSize
/ sizeof(WCHAR
),
2105 MapSL(mip16
->lpstrReturn
), mip16
->dwRetSize
,
2107 HeapFree(GetProcessHeap(), 0, mip32w
->lpstrReturn
);
2108 HeapFree(GetProcessHeap(), 0, (LPVOID
)lParam
);
2110 return WINMM_MAP_OK
;
2113 LPMCI_SYSINFO_PARMSW msip32w
= (LPMCI_SYSINFO_PARMSW
)lParam
;
2114 LPMCI_SYSINFO_PARMS16 msip16
= *(LPMCI_SYSINFO_PARMS16
*)((char*)msip32w
- sizeof(LPMCI_SYSINFO_PARMS16
));
2116 WideCharToMultiByte(CP_ACP
, 0,
2117 msip32w
->lpstrReturn
, msip32w
->dwRetSize
,
2118 MapSL(msip16
->lpstrReturn
), msip16
->dwRetSize
,
2120 HeapFree(GetProcessHeap(), 0, msip32w
->lpstrReturn
);
2121 HeapFree(GetProcessHeap(), 0, (LPVOID
)lParam
);
2123 return WINMM_MAP_OK
;
2126 LPMCI_SOUND_PARMSW msp32W
= (LPMCI_SOUND_PARMSW
)lParam
;
2127 HeapFree(GetProcessHeap(), 0, (LPVOID
)msp32W
->lpstrSoundName
);
2128 HeapFree(GetProcessHeap(), 0, (LPVOID
)lParam
);
2130 return WINMM_MAP_OK
;
2132 case MCI_OPEN_DRIVER
:
2134 LPMCI_OPEN_PARMSW mop32w
= (LPMCI_OPEN_PARMSW
)lParam
;
2135 LPMCI_OPEN_PARMS16 mop16
= *(LPMCI_OPEN_PARMS16
*)((char*)mop32w
- sizeof(LPMCI_OPEN_PARMS16
));
2137 mop16
->wDeviceID
= mop32w
->wDeviceID
;
2138 if( ( dwFlags
& ( MCI_OPEN_TYPE
| MCI_OPEN_TYPE_ID
)) == MCI_OPEN_TYPE
)
2139 HeapFree(GetProcessHeap(), 0, (LPWSTR
)mop32w
->lpstrDeviceType
);
2140 if( ( dwFlags
& ( MCI_OPEN_ELEMENT
| MCI_OPEN_ELEMENT_ID
)) == MCI_OPEN_ELEMENT
)
2141 HeapFree(GetProcessHeap(), 0, (LPWSTR
)mop32w
->lpstrElementName
);
2142 if( ( dwFlags
& MCI_OPEN_ALIAS
))
2143 HeapFree(GetProcessHeap(), 0, (LPWSTR
)mop32w
->lpstrAlias
);
2144 if (!HeapFree(GetProcessHeap(), 0, (LPVOID
)(lParam
- sizeof(LPMCI_OPEN_PARMS16
))))
2145 FIXME("bad free line=%d\n", __LINE__
);
2147 return WINMM_MAP_OK
;
2155 case DRV_QUERYCONFIGURE
:
2158 case DRV_EXITSESSION
:
2159 case DRV_EXITAPPLICATION
:
2161 FIXME("This is a hack\n");
2162 return WINMM_MAP_OK
;
2164 FIXME("Map/Unmap internal error on msg=%s\n", MCI_MessageToString(wMsg
));
2166 return WINMM_MAP_MSGERROR
;
2171 * 0001 squeeze signed 4 bytes to 2 bytes *( LPINT16)D = ( INT16)*( LPINT16)S; D += 2; S += 4
2172 * 0010 squeeze unsigned 4 bytes to 2 bytes *(LPUINT16)D = (UINT16)*(LPUINT16)S; D += 2; S += 4
2175 * 0110 zero 4 bytes *(DWORD)D = 0 D += 4; S += 4
2176 * 0111 copy string *(LPSTR*)D = seg dup(*(LPSTR*)S) D += 4; S += 4
2177 * 1xxx copy xxx + 1 bytes memcpy(D, S, xxx + 1); D += xxx+1; S += xxx+1
2180 /**************************************************************************
2181 * MCI_MsgMapper32WTo16_Create [internal]
2183 * Helper for MCI_MapMsg32WTo16.
2184 * Maps the 32 bit pointer (*ptr), of size bytes, to an allocated 16 bit
2185 * segmented pointer.
2186 * map contains a list of action to be performed for the mapping (see list
2188 * if keep is TRUE, keeps track of in 32 bit ptr in allocated 16 bit area.
2190 static WINMM_MapType
MCI_MsgMapper32WTo16_Create(void** ptr
, int size16
, DWORD map
, BOOLEAN keep
)
2192 void* lp
= HeapAlloc( GetProcessHeap(), 0, (keep
? sizeof(void**) : 0) + size16
);
2196 return WINMM_MAP_NOMEM
;
2201 p16
= (LPBYTE
)lp
+ sizeof(void**);
2202 *ptr
= (char*)MapLS(lp
) + sizeof(void**);
2205 *ptr
= (void*)MapLS(lp
);
2209 memcpy(p16
, p32
, size16
);
2217 sz
= (nibble
& 7) + 1;
2218 memcpy(p16
, p32
, sz
);
2221 size16
-= sz
; /* DEBUG only */
2225 *(LPINT16
)p16
= *(LPINT
)p32
;
2226 p16
+= sizeof(INT16
);
2228 size16
-= sizeof(INT16
);
2231 *(LPUINT16
)p16
= *(LPUINT
)p32
;
2232 p16
+= sizeof(UINT16
);
2233 p32
+= sizeof(UINT
);
2234 size16
-= sizeof(UINT16
);
2238 p16
+= sizeof(DWORD
);
2239 p32
+= sizeof(DWORD
);
2240 size16
-= sizeof(DWORD
);
2243 *(SEGPTR
*)p16
= MapLS( MCI_strdupWtoA( *(LPCWSTR
*)p32
) );
2244 p16
+= sizeof(SEGPTR
);
2245 p32
+= sizeof(LPSTR
);
2246 size16
-= sizeof(SEGPTR
);
2249 FIXME("Unknown nibble for mapping (%x)\n", nibble
);
2254 if (size16
!= 0) /* DEBUG only */
2255 FIXME("Mismatch between 16 bit struct size and map nibbles serie\n");
2257 return WINMM_MAP_OKMEM
;
2260 /**************************************************************************
2261 * MCI_MsgMapper32WTo16_Destroy [internal]
2263 * Helper for MCI_UnMapMsg32WTo16.
2265 static WINMM_MapType
MCI_MsgMapper32WTo16_Destroy(void* ptr
, int size16
, DWORD map
, BOOLEAN kept
)
2268 void* msg16
= MapSL((SEGPTR
)ptr
);
2273 UnMapLS( (SEGPTR
)ptr
);
2275 alloc
= (char*)msg16
- sizeof(void**);
2276 p32
= *(void**)alloc
;
2280 memcpy(p32
, p16
, size16
);
2285 memcpy(p32
, p16
, (nibble
& 7) + 1);
2286 p16
+= (nibble
& 7) + 1;
2287 p32
+= (nibble
& 7) + 1;
2288 size16
-= (nibble
& 7) + 1;
2292 *(LPINT
)p32
= *(LPINT16
)p16
;
2293 p16
+= sizeof(INT16
);
2295 size16
-= sizeof(INT16
);
2298 *(LPUINT
)p32
= *(LPUINT16
)p16
;
2299 p16
+= sizeof(UINT16
);
2300 p32
+= sizeof(UINT
);
2301 size16
-= sizeof(UINT16
);
2304 p16
+= sizeof(UINT
);
2305 p32
+= sizeof(UINT
);
2306 size16
-= sizeof(UINT
);
2309 HeapFree(GetProcessHeap(), 0, MapSL(*(SEGPTR
*)p16
));
2310 UnMapLS( *(SEGPTR
*)p16
);
2311 p16
+= sizeof(SEGPTR
);
2312 p32
+= sizeof(char*);
2313 size16
-= sizeof(SEGPTR
);
2316 FIXME("Unknown nibble for mapping (%x)\n", nibble
);
2321 if (size16
!= 0) /* DEBUG only */
2322 FIXME("Mismatch between 16 bit struct size and map nibbles serie\n");
2328 HeapFree( GetProcessHeap(), 0, alloc
);
2330 return WINMM_MAP_OK
;
2333 /**************************************************************************
2334 * MCI_MapMsg32WTo16 [internal]
2336 * Map a 32W bit MCI message to a 16 bit MCI message.
2338 static WINMM_MapType
MCI_MapMsg32WTo16(WORD uDevType
, WORD wMsg
, DWORD dwFlags
, DWORD_PTR
* lParam
)
2341 BOOLEAN keep
= FALSE
;
2345 return WINMM_MAP_OK
;
2347 /* FIXME: to add also (with seg/linear modifications to do):
2348 * MCI_LIST, MCI_LOAD, MCI_QUALITY, MCI_RESERVE, MCI_RESTORE, MCI_SAVE
2349 * MCI_SETAUDIO, MCI_SETTUNER, MCI_SETVIDEO
2353 size
= sizeof(MCI_BREAK_PARMS
);
2355 /* case MCI_CAPTURE */
2357 case MCI_CLOSE_DRIVER
:
2359 size
= sizeof(MCI_GENERIC_PARMS
);
2361 /* case MCI_COPY: */
2364 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_CUE_PARMS
); break;
2365 case MCI_DEVTYPE_VCR
: /*size = sizeof(MCI_VCR_CUE_PARMS); break;*/ FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM
;
2366 default: size
= sizeof(MCI_GENERIC_PARMS
); break;
2372 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_DELETE_PARMS16
); map
= 0x0F1111FB; break;
2373 case MCI_DEVTYPE_WAVEFORM_AUDIO
:size
= sizeof(MCI_WAVE_DELETE_PARMS
); break;
2374 default: size
= sizeof(MCI_GENERIC_PARMS
); break;
2377 /* case MCI_ESCAPE: */
2380 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_FREEZE_PARMS
); map
= 0x0001111B; break;
2381 case MCI_DEVTYPE_OVERLAY
: size
= sizeof(MCI_OVLY_RECT_PARMS
); map
= 0x0001111B; break;
2382 default: size
= sizeof(MCI_GENERIC_PARMS
); break;
2385 case MCI_GETDEVCAPS
:
2387 size
= sizeof(MCI_GETDEVCAPS_PARMS
);
2389 /* case MCI_INDEX: */
2392 LPMCI_INFO_PARMSW mip32w
= (LPMCI_INFO_PARMSW
)(*lParam
);
2394 LPMCI_INFO_PARMS16 mip16
;
2397 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_INFO_PARMS16
); break;
2398 default: size
= sizeof(MCI_INFO_PARMS16
); break;
2400 ptr
= HeapAlloc( GetProcessHeap(), 0, sizeof(LPMCI_INFO_PARMSW
) + size
);
2403 *(LPMCI_INFO_PARMSW
*)ptr
= mip32w
;
2404 mip16
= (LPMCI_INFO_PARMS16
)(ptr
+ sizeof(LPMCI_INFO_PARMSW
));
2405 mip16
->dwCallback
= mip32w
->dwCallback
;
2406 mip16
->lpstrReturn
= MapLS( HeapAlloc(GetProcessHeap(), 0, mip32w
->dwRetSize
/ sizeof(WCHAR
)) );
2407 mip16
->dwRetSize
= mip32w
->dwRetSize
/ sizeof(WCHAR
);
2408 if (uDevType
== MCI_DEVTYPE_DIGITAL_VIDEO
) {
2409 ((LPMCI_DGV_INFO_PARMS16
)mip16
)->dwItem
= ((LPMCI_DGV_INFO_PARMSW
)mip32w
)->dwItem
;
2412 return WINMM_MAP_NOMEM
;
2414 *lParam
= (LPARAM
)MapLS(ptr
) + sizeof(LPMCI_INFO_PARMSW
);
2416 return WINMM_MAP_OKMEM
;
2417 /* case MCI_MARK: */
2418 /* case MCI_MONITOR: */
2420 case MCI_OPEN_DRIVER
:
2422 LPMCI_OPEN_PARMSW mop32w
= (LPMCI_OPEN_PARMSW
)(*lParam
);
2423 char* ptr
= HeapAlloc( GetProcessHeap(), 0,
2424 sizeof(LPMCI_OPEN_PARMSW
) + sizeof(MCI_OPEN_PARMS16
) + 2 * sizeof(DWORD
));
2425 LPMCI_OPEN_PARMS16 mop16
;
2429 *(LPMCI_OPEN_PARMSW
*)(ptr
) = mop32w
;
2430 mop16
= (LPMCI_OPEN_PARMS16
)(ptr
+ sizeof(LPMCI_OPEN_PARMSW
));
2431 mop16
->dwCallback
= mop32w
->dwCallback
;
2432 mop16
->wDeviceID
= mop32w
->wDeviceID
;
2433 if (dwFlags
& MCI_OPEN_TYPE
) {
2434 if (dwFlags
& MCI_OPEN_TYPE_ID
) {
2435 /* dword "transparent" value */
2436 mop16
->lpstrDeviceType
= (SEGPTR
)mop32w
->lpstrDeviceType
;
2439 mop16
->lpstrDeviceType
= MapLS( MCI_strdupWtoA(mop32w
->lpstrDeviceType
) );
2443 mop16
->lpstrDeviceType
= 0;
2445 if (dwFlags
& MCI_OPEN_ELEMENT
) {
2446 if (dwFlags
& MCI_OPEN_ELEMENT_ID
) {
2447 mop16
->lpstrElementName
= (SEGPTR
)mop32w
->lpstrElementName
;
2449 mop16
->lpstrElementName
= MapLS( MCI_strdupWtoA(mop32w
->lpstrElementName
) );
2452 mop16
->lpstrElementName
= 0;
2454 if (dwFlags
& MCI_OPEN_ALIAS
) {
2455 mop16
->lpstrAlias
= MapLS( MCI_strdupWtoA(mop32w
->lpstrAlias
) );
2457 mop16
->lpstrAlias
= 0;
2459 /* copy extended information if any...
2460 * FIXME: this may seg fault if initial structure does not contain them and
2461 * the reads after msip16 fail under LDT limits...
2462 * NOTE: this should be split in two. First pass, while calling MCI_OPEN, and
2463 * should not take care of extended parameters, and should be used by MCI_Open
2464 * to fetch uDevType. When, this is known, the mapping for sending the
2465 * MCI_OPEN_DRIVER shall be done depending on uDevType.
2467 memcpy(mop16
+ 1, mop32w
+ 1, 2 * sizeof(DWORD
));
2469 return WINMM_MAP_NOMEM
;
2471 *lParam
= (LPARAM
)MapLS(ptr
) + sizeof(LPMCI_OPEN_PARMSW
);
2473 return WINMM_MAP_OKMEM
;
2474 /* case MCI_PASTE:*/
2476 size
= sizeof(MCI_GENERIC_PARMS
);
2479 size
= sizeof(MCI_PLAY_PARMS
);
2483 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_RECT_PARMS16
); map
= 0x0001111B; break;
2484 case MCI_DEVTYPE_OVERLAY
: size
= sizeof(MCI_OVLY_RECT_PARMS
); map
= 0x0001111B; break;
2485 default: size
= sizeof(MCI_GENERIC_PARMS
); break;
2489 size
= sizeof(MCI_GENERIC_PARMS
);
2493 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_RECORD_PARMS16
); map
= 0x0F1111FB; break;
2494 case MCI_DEVTYPE_VCR
: /*size = sizeof(MCI_VCR_RECORD_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM
;
2495 default: size
= sizeof(MCI_RECORD_PARMS
); break;
2499 size
= sizeof(MCI_GENERIC_PARMS
);
2503 case MCI_DEVTYPE_VCR
: /*size = sizeof(MCI_VCR_SEEK_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM
;
2504 default: size
= sizeof(MCI_SEEK_PARMS
); break;
2509 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_SET_PARMS
); break;
2510 case MCI_DEVTYPE_VCR
: /*size = sizeof(MCI_VCR_SET_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM
;
2511 case MCI_DEVTYPE_SEQUENCER
: size
= sizeof(MCI_SEQ_SET_PARMS
); break;
2512 /* FIXME: normally the 16 and 32 bit structures are byte by byte aligned,
2513 * so not doing anything should work...
2515 case MCI_DEVTYPE_WAVEFORM_AUDIO
:size
= sizeof(MCI_WAVE_SET_PARMS
); break;
2516 default: size
= sizeof(MCI_SET_PARMS
); break;
2521 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_SETAUDIO_PARMS16
);map
= 0x0000077FF; break;
2522 case MCI_DEVTYPE_VCR
: /*size = sizeof(MCI_VCR_SETAUDIO_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM
;
2523 default: size
= sizeof(MCI_GENERIC_PARMS
); break;
2526 /* case MCI_SETTIMECODE:*/
2527 /* case MCI_SIGNAL:*/
2528 /* case MCI_SOUND:*/
2530 size
= sizeof(MCI_SET_PARMS
);
2536 * don't know if buffer for value is the one passed through lpstrDevice
2537 * or is provided by MCI driver.
2538 * Assuming solution 2: provided by MCI driver, so zeroing on entry
2540 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_STATUS_PARMS16
); map
= 0x0B6FF; break;
2541 case MCI_DEVTYPE_VCR
: /*size = sizeof(MCI_VCR_STATUS_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM
;
2542 default: size
= sizeof(MCI_STATUS_PARMS
); break;
2547 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_STEP_PARMS
); break;
2548 case MCI_DEVTYPE_VCR
: /*size = sizeof(MCI_VCR_STEP_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM
;
2549 case MCI_DEVTYPE_VIDEODISC
: size
= sizeof(MCI_VD_STEP_PARMS
); break;
2550 default: size
= sizeof(MCI_GENERIC_PARMS
); break;
2554 size
= sizeof(MCI_SET_PARMS
);
2558 LPMCI_SYSINFO_PARMSW msip32w
= (LPMCI_SYSINFO_PARMSW
)(*lParam
);
2559 LPMCI_SYSINFO_PARMS16 msip16
;
2560 char* ptr
= HeapAlloc( GetProcessHeap(), 0,
2561 sizeof(LPMCI_SYSINFO_PARMSW
) + sizeof(MCI_SYSINFO_PARMS16
) );
2564 *(LPMCI_SYSINFO_PARMSW
*)(ptr
) = msip32w
;
2565 msip16
= (LPMCI_SYSINFO_PARMS16
)(ptr
+ sizeof(LPMCI_SYSINFO_PARMSW
));
2567 msip16
->dwCallback
= msip32w
->dwCallback
;
2568 msip16
->lpstrReturn
= MapLS( HeapAlloc(GetProcessHeap(), 0, msip32w
->dwRetSize
) );
2569 msip16
->dwRetSize
= msip32w
->dwRetSize
;
2570 msip16
->dwNumber
= msip32w
->dwNumber
;
2571 msip16
->wDeviceType
= msip32w
->wDeviceType
;
2573 return WINMM_MAP_NOMEM
;
2575 *lParam
= (LPARAM
)MapLS(ptr
) + sizeof(LPMCI_SYSINFO_PARMSW
);
2577 return WINMM_MAP_OKMEM
;
2578 /* case MCI_UNDO: */
2581 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_RECT_PARMS16
); map
= 0x0001111B; break;
2582 case MCI_DEVTYPE_OVERLAY
: size
= sizeof(MCI_OVLY_RECT_PARMS16
); map
= 0x0001111B; break;
2583 default: size
= sizeof(MCI_GENERIC_PARMS
); break;
2588 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_UPDATE_PARMS16
); map
= 0x000B1111B; break;
2589 default: size
= sizeof(MCI_GENERIC_PARMS
); break;
2594 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_RECT_PARMS16
); map
= 0x0001111B; keep
= TRUE
; break;
2595 case MCI_DEVTYPE_OVERLAY
: size
= sizeof(MCI_OVLY_RECT_PARMS16
); map
= 0x0001111B; keep
= TRUE
; break;
2596 default: size
= sizeof(MCI_GENERIC_PARMS
); break;
2601 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_WINDOW_PARMS16
); if (dwFlags
& MCI_DGV_WINDOW_TEXT
) map
= 0x7FB; break;
2602 case MCI_DEVTYPE_OVERLAY
: size
= sizeof(MCI_OVLY_WINDOW_PARMS16
); if (dwFlags
& MCI_OVLY_WINDOW_TEXT
) map
= 0x7FB; break;
2603 default: size
= sizeof(MCI_GENERIC_PARMS
); break;
2608 LPMCI_OPEN_DRIVER_PARMSW modp32w
= (LPMCI_OPEN_DRIVER_PARMSW
)(*lParam
);
2609 LPMCI_OPEN_DRIVER_PARMS16 modp16
;
2610 char *ptr
= HeapAlloc( GetProcessHeap(), 0,
2611 sizeof(LPMCI_OPEN_DRIVER_PARMSW
) + sizeof(MCI_OPEN_DRIVER_PARMS16
));
2614 *(LPMCI_OPEN_DRIVER_PARMSW
*)(ptr
) = modp32w
;
2615 modp16
= (LPMCI_OPEN_DRIVER_PARMS16
)(ptr
+ sizeof(LPMCI_OPEN_DRIVER_PARMSW
));
2616 modp16
->wDeviceID
= modp32w
->wDeviceID
;
2617 modp16
->lpstrParams
= MapLS( MCI_strdupWtoA(modp32w
->lpstrParams
) );
2618 /* other fields are gonna be filled by the driver, don't copy them */
2620 return WINMM_MAP_NOMEM
;
2622 *lParam
= (LPARAM
)MapLS(ptr
) + sizeof(LPMCI_OPEN_DRIVER_PARMSW
);
2624 return WINMM_MAP_OKMEM
;
2631 case DRV_QUERYCONFIGURE
:
2634 case DRV_EXITSESSION
:
2635 case DRV_EXITAPPLICATION
:
2637 return WINMM_MAP_OK
;
2640 FIXME("Don't know how to map msg=%s\n", MCI_MessageToString(wMsg
));
2641 return WINMM_MAP_MSGERROR
;
2643 return MCI_MsgMapper32WTo16_Create((void**)lParam
, size
, map
, keep
);
2646 /**************************************************************************
2647 * MCI_UnMapMsg32WTo16 [internal]
2649 static WINMM_MapType
MCI_UnMapMsg32WTo16(WORD uDevType
, WORD wMsg
, DWORD dwFlags
, DWORD_PTR lParam
)
2652 BOOLEAN kept
= FALSE
; /* there is no need to compute size when kept is FALSE */
2658 /* case MCI_CAPTURE */
2660 case MCI_CLOSE_DRIVER
:
2663 /* case MCI_COPY: */
2669 /* case MCI_ESCAPE: */
2672 case MCI_GETDEVCAPS
:
2674 size
= sizeof(MCI_GETDEVCAPS_PARMS
);
2676 /* case MCI_INDEX: */
2679 LPMCI_INFO_PARMS16 mip16
= (LPMCI_INFO_PARMS16
)MapSL(lParam
);
2680 LPMCI_INFO_PARMSW mip32w
= *(LPMCI_INFO_PARMSW
*)((char*)mip16
- sizeof(LPMCI_INFO_PARMSW
));
2682 MultiByteToWideChar(CP_ACP
, 0, MapSL(mip16
->lpstrReturn
), mip16
->dwRetSize
,
2683 mip32w
->lpstrReturn
, mip32w
->dwRetSize
/ sizeof(WCHAR
));
2685 UnMapLS( mip16
->lpstrReturn
);
2686 HeapFree( GetProcessHeap(), 0, MapSL(mip16
->lpstrReturn
) );
2687 HeapFree( GetProcessHeap(), 0, (char*)mip16
- sizeof(LPMCI_OPEN_PARMSW
) );
2689 return WINMM_MAP_OK
;
2690 /* case MCI_MARK: */
2691 /* case MCI_MONITOR: */
2693 case MCI_OPEN_DRIVER
:
2695 LPMCI_OPEN_PARMS16 mop16
= (LPMCI_OPEN_PARMS16
)MapSL(lParam
);
2696 LPMCI_OPEN_PARMSW mop32w
= *(LPMCI_OPEN_PARMSW
*)((char*)mop16
- sizeof(LPMCI_OPEN_PARMSW
));
2698 mop32w
->wDeviceID
= mop16
->wDeviceID
;
2699 if ((dwFlags
& MCI_OPEN_TYPE
) && !(dwFlags
& MCI_OPEN_TYPE_ID
))
2701 HeapFree(GetProcessHeap(), 0, MapSL(mop16
->lpstrDeviceType
));
2702 UnMapLS( mop16
->lpstrDeviceType
);
2704 if ((dwFlags
& MCI_OPEN_ELEMENT
) && !(dwFlags
& MCI_OPEN_ELEMENT_ID
))
2706 HeapFree(GetProcessHeap(), 0, MapSL(mop16
->lpstrElementName
));
2707 UnMapLS( mop16
->lpstrElementName
);
2709 if (dwFlags
& MCI_OPEN_ALIAS
)
2711 HeapFree(GetProcessHeap(), 0, MapSL(mop16
->lpstrAlias
));
2712 UnMapLS( mop16
->lpstrAlias
);
2714 HeapFree( GetProcessHeap(), 0, (char*)mop16
- sizeof(LPMCI_OPEN_PARMSW
) );
2716 return WINMM_MAP_OK
;
2717 /* case MCI_PASTE:*/
2736 case MCI_DEVTYPE_DIGITAL_VIDEO
: map
= 0x0000077FF; break;
2737 case MCI_DEVTYPE_VCR
: /*size = sizeof(MCI_VCR_SETAUDIO_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM
;
2740 /* case MCI_SETTIMECODE:*/
2741 /* case MCI_SIGNAL:*/
2742 /* case MCI_SOUND:*/
2748 case MCI_DEVTYPE_DIGITAL_VIDEO
:
2750 LPMCI_DGV_STATUS_PARMS16 mdsp16
= (LPMCI_DGV_STATUS_PARMS16
)MapSL(lParam
);
2751 LPMCI_DGV_STATUS_PARMSA mdsp32a
= *(LPMCI_DGV_STATUS_PARMSA
*)((char*)mdsp16
- sizeof(LPMCI_DGV_STATUS_PARMSA
));
2755 mdsp32a
->dwReturn
= mdsp16
->dwReturn
;
2756 if (dwFlags
& MCI_DGV_STATUS_DISKSPACE
) {
2757 TRACE("MCI_STATUS (DGV) lpstrDrive=%08x\n", mdsp16
->lpstrDrive
);
2758 TRACE("MCI_STATUS (DGV) lpstrDrive=%s\n", (LPSTR
)MapSL(mdsp16
->lpstrDrive
));
2759 UnMapLS( mdsp16
->lpstrDrive
);
2761 HeapFree( GetProcessHeap(), 0, (char*)mdsp16
- sizeof(LPMCI_DGV_STATUS_PARMSA
) );
2763 return WINMM_MAP_NOMEM
;
2766 return WINMM_MAP_OKMEM
;
2767 case MCI_DEVTYPE_VCR
: /*size = sizeof(MCI_VCR_STATUS_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM
;
2768 default: size
= sizeof(MCI_STATUS_PARMS
); break;
2777 LPMCI_SYSINFO_PARMS16 msip16
= (LPMCI_SYSINFO_PARMS16
)MapSL(lParam
);
2778 LPMCI_SYSINFO_PARMSW msip32w
= *(LPMCI_SYSINFO_PARMSW
*)((char*)msip16
- sizeof(LPMCI_SYSINFO_PARMSW
));
2782 MultiByteToWideChar(CP_ACP
, 0, MapSL(msip16
->lpstrReturn
), msip16
->dwRetSize
,
2783 msip32w
->lpstrReturn
, msip32w
->dwRetSize
/sizeof(WCHAR
));
2784 UnMapLS( msip16
->lpstrReturn
);
2785 HeapFree( GetProcessHeap(), 0, MapSL(msip16
->lpstrReturn
) );
2786 HeapFree( GetProcessHeap(), 0, (char*)msip16
- sizeof(LPMCI_SYSINFO_PARMSW
) );
2788 return WINMM_MAP_NOMEM
;
2791 return WINMM_MAP_OKMEM
;
2792 /* case MCI_UNDO: */
2799 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_RECT_PARMS16
); map
= 0x0001111B; kept
= TRUE
; break;
2800 case MCI_DEVTYPE_OVERLAY
: size
= sizeof(MCI_OVLY_RECT_PARMS16
); map
= 0x0001111B; kept
= TRUE
; break;
2806 case MCI_DEVTYPE_DIGITAL_VIDEO
: size
= sizeof(MCI_DGV_WINDOW_PARMS16
); if (dwFlags
& MCI_DGV_WINDOW_TEXT
) map
= 0x7666; break;
2807 case MCI_DEVTYPE_OVERLAY
: size
= sizeof(MCI_OVLY_WINDOW_PARMS16
); if (dwFlags
& MCI_OVLY_WINDOW_TEXT
) map
= 0x7666; break;
2810 /* FIXME: see map function */
2814 LPMCI_OPEN_DRIVER_PARMS16 modp16
= (LPMCI_OPEN_DRIVER_PARMS16
)MapSL(lParam
);
2815 LPMCI_OPEN_DRIVER_PARMSW modp32w
= *(LPMCI_OPEN_DRIVER_PARMSW
*)((char*)modp16
- sizeof(LPMCI_OPEN_DRIVER_PARMSW
));
2818 modp32w
->wCustomCommandTable
= modp16
->wCustomCommandTable
;
2819 modp32w
->wType
= modp16
->wType
;
2820 HeapFree(GetProcessHeap(), 0, MapSL(modp16
->lpstrParams
));
2821 UnMapLS( modp16
->lpstrParams
);
2822 HeapFree( GetProcessHeap(), 0, (char *)modp16
- sizeof(LPMCI_OPEN_DRIVER_PARMSW
) );
2824 return WINMM_MAP_OK
;
2831 case DRV_QUERYCONFIGURE
:
2834 case DRV_EXITSESSION
:
2835 case DRV_EXITAPPLICATION
:
2837 FIXME("This is a hack\n");
2838 return WINMM_MAP_OK
;
2841 FIXME("Map/Unmap internal error on msg=%s\n", MCI_MessageToString(wMsg
));
2842 return WINMM_MAP_MSGERROR
;
2844 return MCI_MsgMapper32WTo16_Destroy((void*)lParam
, size
, map
, kept
);
2847 void MMDRV_Init16(void)
2849 #define A(_x,_y) MMDRV_InstallMap(_x, \
2850 MMDRV_##_y##_Map16To32W, MMDRV_##_y##_UnMap16To32W, \
2851 MMDRV_##_y##_Map32WTo16, MMDRV_##_y##_UnMap32WTo16, \
2852 MMDRV_##_y##_Callback)
2854 A(MMDRV_MIXER
, Mixer
);
2855 A(MMDRV_MIDIIN
, MidiIn
);
2856 A(MMDRV_MIDIOUT
, MidiOut
);
2857 A(MMDRV_WAVEIN
, WaveIn
);
2858 A(MMDRV_WAVEOUT
, WaveOut
);
2861 pFnCallMMDrvFunc16
= MMDRV_CallMMDrvFunc16
;
2862 pFnLoadMMDrvFunc16
= MMDRV_LoadMMDrvFunc16
;
2864 pFnMciMapMsg16To32W
= MCI_MapMsg16To32W
;
2865 pFnMciUnMapMsg16To32W
= MCI_UnMapMsg16To32W
;
2866 pFnMciMapMsg32WTo16
= MCI_MapMsg32WTo16
;
2867 pFnMciUnMapMsg32WTo16
= MCI_UnMapMsg32WTo16
;