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 MMSYSTEM_MapType MCI_MapMsg16To32W(WORD wMsg, DWORD dwFlags, DWORD_PTR* lParam)
1856 return MMSYSTEM_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 MMSYSTEM_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 MMSYSTEM_MAP_NOMEM;
1915 *lParam = (DWORD)mbp32;
1917 return MMSYSTEM_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 MMSYSTEM_MAP_NOMEM;
1929 *lParam = (DWORD)mvep32w;
1931 return MMSYSTEM_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 MMSYSTEM_MAP_NOMEM;
1949 *lParam = (DWORD)mip32w;
1951 return MMSYSTEM_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 MMSYSTEM_MAP_NOMEM;
1987 *lParam = (DWORD)mop32w;
1989 return MMSYSTEM_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 MMSYSTEM_MAP_NOMEM;
2006 *lParam = (DWORD)msip32w;
2008 return MMSYSTEM_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 MMSYSTEM_MAP_NOMEM;
2020 *lParam = (DWORD)mbp32;
2022 return MMSYSTEM_MAP_OKMEM;
2030 case DRV_QUERYCONFIGURE:
2033 case DRV_EXITSESSION:
2034 case DRV_EXITAPPLICATION:
2036 FIXME("This is a hack\n");
2037 return MMSYSTEM_MAP_OK;
2039 FIXME("Don't know how to map msg=%s\n", MCI_MessageToString(wMsg));
2041 return MMSYSTEM_MAP_MSGERROR;
2044 /**************************************************************************
2045 * MCI_UnMapMsg16To32W [internal]
2047 MMSYSTEM_MapType MCI_UnMapMsg16To32W(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 MMSYSTEM_MAP_OK;
2085 /* FIXME ?? see Map function */
2086 return MMSYSTEM_MAP_OK;
2089 HeapFree(GetProcessHeap(), 0, (LPVOID)lParam);
2090 return MMSYSTEM_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 MMSYSTEM_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 MMSYSTEM_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 MMSYSTEM_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 MMSYSTEM_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 MMSYSTEM_MAP_OK;
2155 case DRV_QUERYCONFIGURE:
2158 case DRV_EXITSESSION:
2159 case DRV_EXITAPPLICATION:
2161 FIXME("This is a hack\n");
2162 return MMSYSTEM_MAP_OK;
2164 FIXME("Map/Unmap internal error on msg=%s\n", MCI_MessageToString(wMsg));
2166 return MMSYSTEM_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 pFnMciMapMsg32WTo16 = MCI_MapMsg32WTo16;
2865 pFnMciUnMapMsg32WTo16 = MCI_UnMapMsg32WTo16;