1 /* -*- tab-width: 8; c-basic-offset: 4 -*- */
4 * MMSYSTEM MCI and low level mapping functions
6 * Copyright 1999 Eric Pouech
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include "wine/winbase16.h"
35 #include "wine/debug.h"
37 WINE_DEFAULT_DEBUG_CHANNEL(winmm);
39 /**************************************************************************
40 * MMDRV_Callback [internal]
42 static void MMDRV_Callback(LPWINE_MLD mld, HDRVR hDev, UINT uMsg, DWORD dwParam1, DWORD dwParam2)
44 TRACE("CB (*%08lx)(%p %08x %08lx %08lx %08lx\n",
45 mld->dwCallback, hDev, uMsg, mld->dwClientInstance, dwParam1, dwParam2);
47 if (!mld->bFrom32 && (mld->dwFlags & DCB_TYPEMASK) == DCB_FUNCTION)
50 /* 16 bit func, call it */
51 TRACE("Function (16 bit) !\n");
53 args[7] = HDRVR_16(hDev);
55 args[5] = HIWORD(mld->dwClientInstance);
56 args[4] = LOWORD(mld->dwClientInstance);
57 args[3] = HIWORD(dwParam1);
58 args[2] = LOWORD(dwParam1);
59 args[1] = HIWORD(dwParam2);
60 args[0] = LOWORD(dwParam2);
61 WOWCallback16Ex( mld->dwCallback, WCB16_PASCAL, sizeof(args), args, NULL );
63 DriverCallback(mld->dwCallback, mld->dwFlags, hDev, uMsg,
64 mld->dwClientInstance, dwParam1, dwParam2);
68 /* =================================
70 * ================================= */
72 /**************************************************************************
73 * MMDRV_Aux_Map16To32A [internal]
75 static WINMM_MapType MMDRV_Aux_Map16To32A (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
77 return WINMM_MAP_MSGERROR;
80 /**************************************************************************
81 * MMDRV_Aux_UnMap16To32A [internal]
83 static WINMM_MapType MMDRV_Aux_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
85 return WINMM_MAP_MSGERROR;
88 /**************************************************************************
89 * MMDRV_Aux_Map32ATo16 [internal]
91 static WINMM_MapType MMDRV_Aux_Map32ATo16 (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
93 return WINMM_MAP_MSGERROR;
96 /**************************************************************************
97 * MMDRV_Aux_UnMap32ATo16 [internal]
99 static WINMM_MapType MMDRV_Aux_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
102 case AUXDM_GETDEVCAPS:
103 lpCaps->wMid = ac16.wMid;
104 lpCaps->wPid = ac16.wPid;
105 lpCaps->vDriverVersion = ac16.vDriverVersion;
106 strcpy(lpCaps->szPname, ac16.szPname);
107 lpCaps->wTechnology = ac16.wTechnology;
108 lpCaps->dwSupport = ac16.dwSupport;
110 return WINMM_MAP_MSGERROR;
113 /**************************************************************************
114 * MMDRV_Aux_Callback [internal]
116 static void CALLBACK MMDRV_Aux_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
118 LPWINE_MLD mld = (LPWINE_MLD)dwInstance;
121 MMDRV_Callback(mld, hDev, uMsg, dwParam1, dwParam2);
124 /* =================================
125 * M I X E R M A P P E R S
126 * ================================= */
128 /**************************************************************************
129 * xMMDRV_Mixer_Map16To32A [internal]
131 static WINMM_MapType MMDRV_Mixer_Map16To32A (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
133 return WINMM_MAP_MSGERROR;
136 /**************************************************************************
137 * MMDRV_Mixer_UnMap16To32A [internal]
139 static WINMM_MapType MMDRV_Mixer_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
143 UINT ret = mixerGetDevCapsA(devid, &micA, sizeof(micA));
145 if (ret == MMSYSERR_NOERROR) {
146 mixcaps->wMid = micA.wMid;
147 mixcaps->wPid = micA.wPid;
148 mixcaps->vDriverVersion = micA.vDriverVersion;
149 strcpy(mixcaps->szPname, micA.szPname);
150 mixcaps->fdwSupport = micA.fdwSupport;
151 mixcaps->cDestinations = micA.cDestinations;
155 return WINMM_MAP_MSGERROR;
158 /**************************************************************************
159 * MMDRV_Mixer_Map32ATo16 [internal]
161 static WINMM_MapType MMDRV_Mixer_Map32ATo16 (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
163 return WINMM_MAP_MSGERROR;
166 /**************************************************************************
167 * MMDRV_Mixer_UnMap32ATo16 [internal]
169 static WINMM_MapType MMDRV_Mixer_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
171 return WINMM_MAP_MSGERROR;
174 /**************************************************************************
175 * MMDRV_Mixer_Callback [internal]
177 static void CALLBACK MMDRV_Mixer_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
179 LPWINE_MLD mld = (LPWINE_MLD)dwInstance;
182 MMDRV_Callback(mld, hDev, uMsg, dwParam1, dwParam2);
185 /* =================================
186 * M I D I I N M A P P E R S
187 * ================================= */
189 /**************************************************************************
190 * MMDRV_MidiIn_Map16To32A [internal]
192 static WINMM_MapType MMDRV_MidiIn_Map16To32A (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
194 return WINMM_MAP_MSGERROR;
197 /**************************************************************************
198 * MMDRV_MidiIn_UnMap16To32A [internal]
200 static WINMM_MapType MMDRV_MidiIn_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
202 return WINMM_MAP_MSGERROR;
205 /**************************************************************************
206 * MMDRV_MidiIn_Map32ATo16 [internal]
208 static WINMM_MapType MMDRV_MidiIn_Map32ATo16 (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
210 return WINMM_MAP_MSGERROR;
213 /**************************************************************************
214 * MMDRV_MidiIn_UnMap32ATo16 [internal]
216 static WINMM_MapType MMDRV_MidiIn_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
218 return WINMM_MAP_MSGERROR;
221 /**************************************************************************
222 * MMDRV_MidiIn_Callback [internal]
224 static void CALLBACK MMDRV_MidiIn_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
226 LPWINE_MLD mld = (LPWINE_MLD)dwInstance;
231 /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
236 /* dwParam1 & dwParam2 are are data, nothing to do */
240 /* dwParam1 points to a MidiHdr, work to be done !!! */
241 if (mld->bFrom32 && !MMDRV_Is32(mld->mmdIndex)) {
242 /* initial map is: 32 => 16 */
243 LPMIDIHDR mh16 = MapSL(dwParam1);
244 LPMIDIHDR mh32 = *(LPMIDIHDR*)((LPSTR)mh16 - sizeof(LPMIDIHDR));
246 dwParam1 = (DWORD)mh32;
247 mh32->dwFlags = mh16->dwFlags;
248 mh32->dwBytesRecorded = mh16->dwBytesRecorded;
249 if (mh32->reserved >= sizeof(MIDIHDR))
250 mh32->dwOffset = mh16->dwOffset;
251 } else if (!mld->bFrom32 && MMDRV_Is32(mld->mmdIndex)) {
252 /* initial map is: 16 => 32 */
253 LPMIDIHDR mh32 = (LPMIDIHDR)(dwParam1);
254 SEGPTR segmh16 = *(SEGPTR*)((LPSTR)mh32 - sizeof(LPMIDIHDR));
255 LPMIDIHDR mh16 = MapSL(segmh16);
257 dwParam1 = (DWORD)segmh16;
258 mh16->dwFlags = mh32->dwFlags;
259 mh16->dwBytesRecorded = mh32->dwBytesRecorded;
260 if (mh16->reserved >= sizeof(MIDIHDR))
261 mh16->dwOffset = mh32->dwOffset;
263 /* else { 16 => 16 or 32 => 32, nothing to do, same struct is kept }*/
265 /* case MOM_POSITIONCB: */
267 ERR("Unknown msg %u\n", uMsg);
270 MMDRV_Callback(mld, hDev, uMsg, dwParam1, dwParam2);
273 /* =================================
274 * M I D I O U T M A P P E R S
275 * ================================= */
277 /**************************************************************************
278 * MMDRV_MidiOut_Map16To32A [internal]
280 static WINMM_MapType MMDRV_MidiOut_Map16To32A (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
282 WINMM_MapType ret = WINMM_MAP_MSGERROR;
285 case MODM_GETNUMDEVS:
295 FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
298 case MODM_GETDEVCAPS:
300 LPMIDIOUTCAPSW moc32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMIDIOUTCAPS16) + sizeof(MIDIOUTCAPSW));
301 LPMIDIOUTCAPS16 moc16 = MapSL(*lpParam1);
304 *(LPMIDIOUTCAPS16*)moc32 = moc16;
305 moc32 = (LPMIDIOUTCAPSW)((LPSTR)moc32 + sizeof(LPMIDIOUTCAPS16));
306 *lpParam1 = (DWORD)moc32;
307 *lpParam2 = sizeof(MIDIOUTCAPSW);
309 ret = WINMM_MAP_OKMEM;
311 ret = WINMM_MAP_NOMEM;
317 LPMIDIHDR mh32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMIDIHDR) + sizeof(MIDIHDR));
318 LPMIDIHDR mh16 = MapSL(*lpParam1);
321 *(LPMIDIHDR*)mh32 = (LPMIDIHDR)*lpParam1;
322 mh32 = (LPMIDIHDR)((LPSTR)mh32 + sizeof(LPMIDIHDR));
323 mh32->lpData = MapSL((SEGPTR)mh16->lpData);
324 mh32->dwBufferLength = mh16->dwBufferLength;
325 mh32->dwBytesRecorded = mh16->dwBytesRecorded;
326 mh32->dwUser = mh16->dwUser;
327 mh32->dwFlags = mh16->dwFlags;
328 /* FIXME: nothing on mh32->lpNext */
329 /* could link the mh32->lpNext at this level for memory house keeping */
330 mh32->dwOffset = (*lpParam2 >= sizeof(MIDIHDR)) ? ((LPMIDIHDR)mh16)->dwOffset : 0;
331 mh16->lpNext = mh32; /* for reuse in unprepare and write */
332 /* store size of passed MIDIHDR?? structure to know if dwOffset is available or not */
333 mh16->reserved = *lpParam2;
334 *lpParam1 = (DWORD)mh32;
335 *lpParam2 = sizeof(MIDIHDR);
337 ret = WINMM_MAP_OKMEM;
339 ret = WINMM_MAP_NOMEM;
346 LPMIDIHDR mh16 = MapSL(*lpParam1);
347 LPMIDIHDR mh32 = (LPMIDIHDR)mh16->lpNext;
349 *lpParam1 = (DWORD)mh32;
350 *lpParam2 = sizeof(MIDIHDR);
351 /* dwBufferLength can be reduced between prepare & write */
352 if (wMsg == MODM_LONGDATA && mh32->dwBufferLength < mh16->dwBufferLength) {
353 ERR("Size of buffer has been increased from %ld to %ld, keeping initial value\n",
354 mh32->dwBufferLength, mh16->dwBufferLength);
356 mh32->dwBufferLength = mh16->dwBufferLength;
357 ret = WINMM_MAP_OKMEM;
361 case MODM_CACHEPATCHES:
362 case MODM_CACHEDRUMPATCHES:
364 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
370 /**************************************************************************
371 * MMDRV_MidiOut_UnMap16To32A [internal]
373 static WINMM_MapType MMDRV_MidiOut_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
375 WINMM_MapType ret = WINMM_MAP_MSGERROR;
378 case MODM_GETNUMDEVS:
388 FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
391 case MODM_GETDEVCAPS:
393 LPMIDIOUTCAPSW moc32 = (LPMIDIOUTCAPSW)(*lpParam1);
394 LPMIDIOUTCAPS16 moc16 = *(LPMIDIOUTCAPS16*)((LPSTR)moc32 - sizeof(LPMIDIOUTCAPS16));
396 moc16->wMid = moc32->wMid;
397 moc16->wPid = moc32->wPid;
398 moc16->vDriverVersion = moc32->vDriverVersion;
399 WideCharToMultiByte( CP_ACP, 0, moc32->szPname, -1, moc16->szPname,
400 sizeof(moc16->szPname), NULL, NULL );
401 moc16->wTechnology = moc32->wTechnology;
402 moc16->wVoices = moc32->wVoices;
403 moc16->wNotes = moc32->wNotes;
404 moc16->wChannelMask = moc32->wChannelMask;
405 moc16->dwSupport = moc32->dwSupport;
406 HeapFree(GetProcessHeap(), 0, (LPSTR)moc32 - sizeof(LPMIDIOUTCAPS16));
414 LPMIDIHDR mh32 = (LPMIDIHDR)(*lpParam1);
415 LPMIDIHDR mh16 = MapSL(*(SEGPTR*)((LPSTR)mh32 - sizeof(LPMIDIHDR)));
417 assert(mh16->lpNext == mh32);
418 mh16->dwBufferLength = mh32->dwBufferLength;
419 mh16->dwBytesRecorded = mh32->dwBytesRecorded;
420 mh16->dwUser = mh32->dwUser;
421 mh16->dwFlags = mh32->dwFlags;
422 if (mh16->reserved >= sizeof(MIDIHDR))
423 mh16->dwOffset = mh32->dwOffset;
425 if (wMsg == MODM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) {
426 HeapFree(GetProcessHeap(), 0, (LPSTR)mh32 - sizeof(LPMIDIHDR));
433 case MODM_CACHEPATCHES:
434 case MODM_CACHEDRUMPATCHES:
436 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
442 /**************************************************************************
443 * MMDRV_MidiOut_Map32ATo16 [internal]
445 static WINMM_MapType MMDRV_MidiOut_Map32ATo16 (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
447 WINMM_MapType ret = WINMM_MAP_MSGERROR;
451 case MODM_GETNUMDEVS:
457 case MODM_GETDEVCAPS:
459 LPMIDIOUTCAPSW moc32 = (LPMIDIOUTCAPSW)*lpParam1;
460 LPSTR ptr = HeapAlloc( GetProcessHeap(), 0, sizeof(LPMIDIOUTCAPSW)+sizeof(MIDIOUTCAPS16));
463 *(LPMIDIOUTCAPSW*)ptr = moc32;
464 ret = WINMM_MAP_OKMEM;
466 ret = WINMM_MAP_NOMEM;
468 *lpParam1 = (DWORD)MapLS(ptr) + sizeof(LPMIDIOUTCAPSW);
469 *lpParam2 = sizeof(MIDIOUTCAPS16);
474 LPMIDIHDR mh32 = (LPMIDIHDR)*lpParam1;
476 LPVOID ptr = HeapAlloc( GetProcessHeap(), 0,
477 sizeof(LPMIDIHDR) + sizeof(MIDIHDR) + mh32->dwBufferLength);
480 *(LPMIDIHDR*)ptr = mh32;
481 mh16 = (LPMIDIHDR)((LPSTR)ptr + sizeof(LPMIDIHDR));
482 *lpParam1 = MapLS(mh16);
483 mh16->lpData = (LPSTR)*lpParam1 + sizeof(MIDIHDR);
484 /* data will be copied on WODM_WRITE */
485 mh16->dwBufferLength = mh32->dwBufferLength;
486 mh16->dwBytesRecorded = mh32->dwBytesRecorded;
487 mh16->dwUser = mh32->dwUser;
488 mh16->dwFlags = mh32->dwFlags;
489 /* FIXME: nothing on mh32->lpNext */
490 /* could link the mh32->lpNext at this level for memory house keeping */
491 mh16->dwOffset = (*lpParam2 >= sizeof(MIDIHDR)) ? mh32->dwOffset : 0;
493 mh32->lpNext = (LPMIDIHDR)mh16; /* for reuse in unprepare and write */
494 mh32->reserved = *lpParam2;
496 TRACE("mh16=%08lx mh16->lpData=%08lx mh32->buflen=%lu mh32->lpData=%08lx\n",
497 *lpParam1, (DWORD)mh16->lpData,
498 mh32->dwBufferLength, (DWORD)mh32->lpData);
499 *lpParam2 = sizeof(MIDIHDR);
501 ret = WINMM_MAP_OKMEM;
503 ret = WINMM_MAP_NOMEM;
510 LPMIDIHDR mh32 = (LPMIDIHDR)(*lpParam1);
511 LPMIDIHDR mh16 = (LPMIDIHDR)mh32->lpNext;
512 LPSTR ptr = (LPSTR)mh16 - sizeof(LPMIDIHDR);
514 assert(*(LPMIDIHDR*)ptr == mh32);
516 if (wMsg == MODM_LONGDATA)
517 memcpy((LPSTR)mh16 + sizeof(MIDIHDR), mh32->lpData, mh32->dwBufferLength);
519 *lpParam1 = MapLS(mh16);
520 *lpParam2 = sizeof(MIDIHDR);
521 TRACE("mh16=%08lx mh16->lpData=%08lx mh32->buflen=%lu mh32->lpData=%08lx\n",
522 *lpParam1, (DWORD)mh16->lpData, mh32->dwBufferLength, (DWORD)mh32->lpData);
524 /* dwBufferLength can be reduced between prepare & write */
525 if (wMsg == MODM_LONGDATA && mh16->dwBufferLength < mh32->dwBufferLength) {
526 ERR("Size of buffer has been increased from %ld to %ld, keeping initial value\n",
527 mh16->dwBufferLength, mh32->dwBufferLength);
529 mh16->dwBufferLength = mh32->dwBufferLength;
530 ret = WINMM_MAP_OKMEM;
535 LPMIDIOPENDESC mod32 = (LPMIDIOPENDESC)*lpParam1;
537 LPMIDIOPENDESC16 mod16;
539 /* allocated data are mapped as follows:
540 LPMIDIOPENDESC ptr to orig lParam1
541 DWORD orig dwUser, which is a pointer to DWORD:driver dwInstance
542 DWORD dwUser passed to driver
543 MIDIOPENDESC16 mod16: openDesc passed to driver
546 ptr = HeapAlloc( GetProcessHeap(), 0,
547 sizeof(LPMIDIOPENDESC) + 2*sizeof(DWORD) + sizeof(MIDIOPENDESC16) +
548 mod32->cIds ? (mod32->cIds - 1) * sizeof(MIDIOPENSTRMID) : 0);
551 SEGPTR segptr = MapLS(ptr);
552 *(LPMIDIOPENDESC*)ptr = mod32;
553 *(LPDWORD)((char*)ptr + sizeof(LPMIDIOPENDESC)) = *lpdwUser;
554 mod16 = (LPMIDIOPENDESC16)((LPSTR)ptr + sizeof(LPMIDIOPENDESC) + 2*sizeof(DWORD));
556 mod16->hMidi = HMIDI_16(mod32->hMidi);
557 mod16->dwCallback = mod32->dwCallback;
558 mod16->dwInstance = mod32->dwInstance;
559 mod16->dnDevNode = mod32->dnDevNode;
560 mod16->cIds = mod32->cIds;
561 memcpy(&mod16->rgIds, &mod32->rgIds, mod32->cIds * sizeof(MIDIOPENSTRMID));
563 *lpParam1 = (DWORD)segptr + sizeof(LPMIDIOPENDESC) + 2*sizeof(DWORD);
564 *lpdwUser = (DWORD)segptr + sizeof(LPMIDIOPENDESC) + sizeof(DWORD);
566 ret = WINMM_MAP_OKMEM;
568 ret = WINMM_MAP_NOMEM;
573 case MODM_CACHEPATCHES:
574 case MODM_CACHEDRUMPATCHES:
576 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
582 /**************************************************************************
583 * MMDRV_MidiOut_UnMap32ATo16 [internal]
585 static WINMM_MapType MMDRV_MidiOut_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
587 WINMM_MapType ret = WINMM_MAP_MSGERROR;
591 case MODM_GETNUMDEVS:
597 case MODM_GETDEVCAPS:
599 LPMIDIOUTCAPS16 moc16 = MapSL(*lpParam1);
600 LPSTR ptr = (LPSTR)moc16 - sizeof(LPMIDIOUTCAPSW);
601 LPMIDIOUTCAPSW moc32 = *(LPMIDIOUTCAPSW*)ptr;
603 moc32->wMid = moc16->wMid;
604 moc32->wPid = moc16->wPid;
605 moc32->vDriverVersion = moc16->vDriverVersion;
606 WideCharToMultiByte( CP_ACP, 0, moc32->szPname, -1, moc16->szPname,
607 sizeof(moc16->szPname), NULL, NULL );
608 moc32->wTechnology = moc16->wTechnology;
609 moc32->wVoices = moc16->wVoices;
610 moc32->wNotes = moc16->wNotes;
611 moc32->wChannelMask = moc16->wChannelMask;
612 moc32->dwSupport = moc16->dwSupport;
613 UnMapLS( *lpParam1 );
614 HeapFree( GetProcessHeap(), 0, ptr );
622 LPMIDIHDR mh16 = MapSL(*lpParam1);
623 LPSTR ptr = (LPSTR)mh16 - sizeof(LPMIDIHDR);
624 LPMIDIHDR mh32 = *(LPMIDIHDR*)ptr;
626 assert(mh32->lpNext == (LPMIDIHDR)mh16);
627 UnMapLS( *lpParam1 );
628 mh32->dwBytesRecorded = mh16->dwBytesRecorded;
629 mh32->dwUser = mh16->dwUser;
630 mh32->dwFlags = mh16->dwFlags;
632 if (wMsg == MODM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) {
633 HeapFree( GetProcessHeap(), 0, ptr );
641 LPMIDIOPENDESC16 mod16 = MapSL(*lpParam1);
642 LPSTR ptr = (LPSTR)mod16 - sizeof(LPMIDIOPENDESC) - 2*sizeof(DWORD);
643 UnMapLS( *lpParam1 );
644 **(DWORD**)(ptr + sizeof(LPMIDIOPENDESC)) = *(LPDWORD)(ptr + sizeof(LPMIDIOPENDESC) + sizeof(DWORD));
646 HeapFree( GetProcessHeap(), 0, ptr );
651 case MODM_CACHEPATCHES:
652 case MODM_CACHEDRUMPATCHES:
654 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
660 /**************************************************************************
661 * MMDRV_MidiOut_Callback [internal]
663 static void CALLBACK MMDRV_MidiOut_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
665 LPWINE_MLD mld = (LPWINE_MLD)dwInstance;
670 /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
673 if (mld->bFrom32 && !MMDRV_Is32(mld->mmdIndex)) {
674 /* initial map is: 32 => 16 */
675 LPMIDIHDR mh16 = MapSL(dwParam1);
676 LPMIDIHDR mh32 = *(LPMIDIHDR*)((LPSTR)mh16 - sizeof(LPMIDIHDR));
678 dwParam1 = (DWORD)mh32;
679 mh32->dwFlags = mh16->dwFlags;
680 mh32->dwOffset = mh16->dwOffset;
681 if (mh32->reserved >= sizeof(MIDIHDR))
682 mh32->dwOffset = mh16->dwOffset;
683 } else if (!mld->bFrom32 && MMDRV_Is32(mld->mmdIndex)) {
684 /* initial map is: 16 => 32 */
685 LPMIDIHDR mh32 = (LPMIDIHDR)(dwParam1);
686 SEGPTR segmh16 = *(SEGPTR*)((LPSTR)mh32 - sizeof(LPMIDIHDR));
687 LPMIDIHDR mh16 = MapSL(segmh16);
689 dwParam1 = (DWORD)segmh16;
690 mh16->dwFlags = mh32->dwFlags;
691 if (mh16->reserved >= sizeof(MIDIHDR))
692 mh16->dwOffset = mh32->dwOffset;
694 /* else { 16 => 16 or 32 => 32, nothing to do, same struct is kept }*/
696 /* case MOM_POSITIONCB: */
698 ERR("Unknown msg %u\n", uMsg);
701 MMDRV_Callback(mld, hDev, uMsg, dwParam1, dwParam2);
704 /* =================================
705 * W A V E I N M A P P E R S
706 * ================================= */
708 /**************************************************************************
709 * MMDRV_WaveIn_Map16To32A [internal]
711 static WINMM_MapType MMDRV_WaveIn_Map16To32A (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
713 WINMM_MapType ret = WINMM_MAP_MSGERROR;
716 case WIDM_GETNUMDEVS:
724 FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
726 case WIDM_GETDEVCAPS:
728 LPWAVEINCAPSW wic32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEINCAPS16) + sizeof(WAVEINCAPSW));
729 LPWAVEINCAPS16 wic16 = MapSL(*lpParam1);
732 *(LPWAVEINCAPS16*)wic32 = wic16;
733 wic32 = (LPWAVEINCAPSW)((LPSTR)wic32 + sizeof(LPWAVEINCAPS16));
734 *lpParam1 = (DWORD)wic32;
735 *lpParam2 = sizeof(WAVEINCAPSW);
737 ret = WINMM_MAP_OKMEM;
739 ret = WINMM_MAP_NOMEM;
745 LPMMTIME mmt32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMMTIME16) + sizeof(MMTIME));
746 LPMMTIME16 mmt16 = MapSL(*lpParam1);
749 *(LPMMTIME16*)mmt32 = mmt16;
750 mmt32 = (LPMMTIME)((LPSTR)mmt32 + sizeof(LPMMTIME16));
752 mmt32->wType = mmt16->wType;
753 *lpParam1 = (DWORD)mmt32;
754 *lpParam2 = sizeof(MMTIME);
756 ret = WINMM_MAP_OKMEM;
758 ret = WINMM_MAP_NOMEM;
764 LPWAVEHDR wh32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEHDR) + sizeof(WAVEHDR));
765 LPWAVEHDR wh16 = MapSL(*lpParam1);
768 *(LPWAVEHDR*)wh32 = (LPWAVEHDR)*lpParam1;
769 wh32 = (LPWAVEHDR)((LPSTR)wh32 + sizeof(LPWAVEHDR));
770 wh32->lpData = MapSL((SEGPTR)wh16->lpData);
771 wh32->dwBufferLength = wh16->dwBufferLength;
772 wh32->dwBytesRecorded = wh16->dwBytesRecorded;
773 wh32->dwUser = wh16->dwUser;
774 wh32->dwFlags = wh16->dwFlags;
775 wh32->dwLoops = wh16->dwLoops;
776 /* FIXME: nothing on wh32->lpNext */
777 /* could link the wh32->lpNext at this level for memory house keeping */
778 wh16->lpNext = wh32; /* for reuse in unprepare and write */
779 *lpParam1 = (DWORD)wh32;
780 *lpParam2 = sizeof(WAVEHDR);
782 ret = WINMM_MAP_OKMEM;
784 ret = WINMM_MAP_NOMEM;
791 LPWAVEHDR wh16 = MapSL(*lpParam1);
792 LPWAVEHDR wh32 = (LPWAVEHDR)wh16->lpNext;
794 *lpParam1 = (DWORD)wh32;
795 *lpParam2 = sizeof(WAVEHDR);
796 /* dwBufferLength can be reduced between prepare & write */
797 if (wMsg == WIDM_ADDBUFFER && wh32->dwBufferLength < wh16->dwBufferLength) {
798 ERR("Size of buffer has been increased from %ld to %ld, keeping initial value\n",
799 wh32->dwBufferLength, wh16->dwBufferLength);
801 wh32->dwBufferLength = wh16->dwBufferLength;
802 ret = WINMM_MAP_OKMEM;
805 case WIDM_MAPPER_STATUS:
806 /* just a single DWORD */
807 *lpParam2 = (DWORD)MapSL(*lpParam2);
811 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
817 /**************************************************************************
818 * MMDRV_WaveIn_UnMap16To32A [internal]
820 static WINMM_MapType MMDRV_WaveIn_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
822 WINMM_MapType ret = WINMM_MAP_MSGERROR;
825 case WIDM_GETNUMDEVS:
829 case WIDM_MAPPER_STATUS:
834 FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
836 case WIDM_GETDEVCAPS:
838 LPWAVEINCAPSW wic32 = (LPWAVEINCAPSW)(*lpParam1);
839 LPWAVEINCAPS16 wic16 = *(LPWAVEINCAPS16*)((LPSTR)wic32 - sizeof(LPWAVEINCAPS16));
841 wic16->wMid = wic32->wMid;
842 wic16->wPid = wic32->wPid;
843 wic16->vDriverVersion = wic32->vDriverVersion;
844 WideCharToMultiByte( CP_ACP, 0, wic32->szPname, -1, wic16->szPname,
845 sizeof(wic16->szPname), NULL, NULL );
846 wic16->dwFormats = wic32->dwFormats;
847 wic16->wChannels = wic32->wChannels;
848 HeapFree(GetProcessHeap(), 0, (LPSTR)wic32 - sizeof(LPWAVEINCAPS16));
854 LPMMTIME mmt32 = (LPMMTIME)(*lpParam1);
855 LPMMTIME16 mmt16 = *(LPMMTIME16*)((LPSTR)mmt32 - sizeof(LPMMTIME16));
857 MMSYSTEM_MMTIME32to16(mmt16, mmt32);
858 HeapFree(GetProcessHeap(), 0, (LPSTR)mmt32 - sizeof(LPMMTIME16));
866 LPWAVEHDR wh32 = (LPWAVEHDR)(*lpParam1);
867 LPWAVEHDR wh16 = MapSL(*(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR)));
869 assert(wh16->lpNext == wh32);
870 wh16->dwBufferLength = wh32->dwBufferLength;
871 wh16->dwBytesRecorded = wh32->dwBytesRecorded;
872 wh16->dwUser = wh32->dwUser;
873 wh16->dwFlags = wh32->dwFlags;
874 wh16->dwLoops = wh32->dwLoops;
876 if (wMsg == WIDM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) {
877 HeapFree(GetProcessHeap(), 0, (LPSTR)wh32 - sizeof(LPWAVEHDR));
884 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
890 /**************************************************************************
891 * MMDRV_WaveIn_Map32ATo16 [internal]
893 static WINMM_MapType MMDRV_WaveIn_Map32ATo16 (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
895 WINMM_MapType ret = WINMM_MAP_MSGERROR;
899 case WIDM_GETNUMDEVS:
908 LPWAVEOPENDESC wod32 = (LPWAVEOPENDESC)*lpParam1;
909 int sz = sizeof(WAVEFORMATEX);
911 LPWAVEOPENDESC16 wod16;
913 /* allocated data are mapped as follows:
914 LPWAVEOPENDESC ptr to orig lParam1
915 DWORD orig dwUser, which is a pointer to DWORD:driver dwInstance
916 DWORD dwUser passed to driver
917 WAVEOPENDESC16 wod16: openDesc passed to driver
918 WAVEFORMATEX openDesc->lpFormat passed to driver
919 xxx extra bytes to WAVEFORMATEX
921 if (wod32->lpFormat->wFormatTag != WAVE_FORMAT_PCM) {
922 TRACE("Allocating %u extra bytes (%d)\n", ((LPWAVEFORMATEX)wod32->lpFormat)->cbSize, wod32->lpFormat->wFormatTag);
923 sz += ((LPWAVEFORMATEX)wod32->lpFormat)->cbSize;
926 ptr = HeapAlloc( GetProcessHeap(), 0,
927 sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD) + sizeof(WAVEOPENDESC16) + sz);
930 SEGPTR seg_ptr = MapLS( ptr );
931 *(LPWAVEOPENDESC*)ptr = wod32;
932 *(LPDWORD)((char*)ptr + sizeof(LPWAVEOPENDESC)) = *lpdwUser;
933 wod16 = (LPWAVEOPENDESC16)((LPSTR)ptr + sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD));
935 wod16->hWave = HWAVE_16(wod32->hWave);
936 wod16->lpFormat = (LPWAVEFORMATEX)(seg_ptr + sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD) + sizeof(WAVEOPENDESC16));
937 memcpy(wod16 + 1, wod32->lpFormat, sz);
939 wod16->dwCallback = wod32->dwCallback;
940 wod16->dwInstance = wod32->dwInstance;
941 wod16->uMappedDeviceID = wod32->uMappedDeviceID;
942 wod16->dnDevNode = wod32->dnDevNode;
944 *lpParam1 = seg_ptr + sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD);
945 *lpdwUser = seg_ptr + sizeof(LPWAVEOPENDESC) + sizeof(DWORD);
947 ret = WINMM_MAP_OKMEM;
949 ret = WINMM_MAP_NOMEM;
955 LPWAVEHDR wh32 = (LPWAVEHDR)*lpParam1;
957 LPVOID ptr = HeapAlloc( GetProcessHeap(), 0,
958 sizeof(LPWAVEHDR) + sizeof(WAVEHDR) + wh32->dwBufferLength);
961 SEGPTR seg_ptr = MapLS( ptr );
962 *(LPWAVEHDR*)ptr = wh32;
963 wh16 = (LPWAVEHDR)((LPSTR)ptr + sizeof(LPWAVEHDR));
964 wh16->lpData = (LPSTR)seg_ptr + sizeof(LPWAVEHDR) + sizeof(WAVEHDR);
965 /* data will be copied on WODM_WRITE */
966 wh16->dwBufferLength = wh32->dwBufferLength;
967 wh16->dwBytesRecorded = wh32->dwBytesRecorded;
968 wh16->dwUser = wh32->dwUser;
969 wh16->dwFlags = wh32->dwFlags;
970 wh16->dwLoops = wh32->dwLoops;
971 /* FIXME: nothing on wh32->lpNext */
972 /* could link the wh32->lpNext at this level for memory house keeping */
973 wh32->lpNext = wh16; /* for reuse in unprepare and write */
974 TRACE("wh16=%08lx wh16->lpData=%08lx wh32->buflen=%lu wh32->lpData=%08lx\n",
975 seg_ptr + sizeof(LPWAVEHDR), (DWORD)wh16->lpData,
976 wh32->dwBufferLength, (DWORD)wh32->lpData);
977 *lpParam1 = seg_ptr + sizeof(LPWAVEHDR);
978 *lpParam2 = sizeof(WAVEHDR);
980 ret = WINMM_MAP_OKMEM;
982 ret = WINMM_MAP_NOMEM;
989 LPWAVEHDR wh32 = (LPWAVEHDR)(*lpParam1);
990 LPWAVEHDR wh16 = wh32->lpNext;
991 LPSTR ptr = (LPSTR)wh16 - sizeof(LPWAVEHDR);
992 SEGPTR seg_ptr = MapLS( ptr );
994 assert(*(LPWAVEHDR*)ptr == wh32);
996 TRACE("wh16=%08lx wh16->lpData=%08lx wh32->buflen=%lu wh32->lpData=%08lx\n",
997 seg_ptr + sizeof(LPWAVEHDR), (DWORD)wh16->lpData,
998 wh32->dwBufferLength, (DWORD)wh32->lpData);
1000 if (wMsg == WIDM_ADDBUFFER)
1001 memcpy((LPSTR)wh16 + sizeof(WAVEHDR), wh32->lpData, wh32->dwBufferLength);
1003 *lpParam1 = seg_ptr + sizeof(LPWAVEHDR);
1004 *lpParam2 = sizeof(WAVEHDR);
1005 /* dwBufferLength can be reduced between prepare & write */
1006 if (wMsg == WIDM_ADDBUFFER && wh16->dwBufferLength < wh32->dwBufferLength) {
1007 ERR("Size of buffer has been increased from %ld to %ld, keeping initial value\n",
1008 wh16->dwBufferLength, wh32->dwBufferLength);
1010 wh16->dwBufferLength = wh32->dwBufferLength;
1011 ret = WINMM_MAP_OKMEM;
1014 case WIDM_GETDEVCAPS:
1016 LPWAVEINCAPSW wic32 = (LPWAVEINCAPSW)*lpParam1;
1017 LPSTR ptr = HeapAlloc( GetProcessHeap(), 0 ,sizeof(LPWAVEINCAPSW) + sizeof(WAVEINCAPS16));
1020 *(LPWAVEINCAPSW*)ptr = wic32;
1021 ret = WINMM_MAP_OKMEM;
1023 ret = WINMM_MAP_NOMEM;
1025 *lpParam1 = MapLS(ptr) + sizeof(LPWAVEINCAPSW);
1026 *lpParam2 = sizeof(WAVEINCAPS16);
1031 LPMMTIME mmt32 = (LPMMTIME)*lpParam1;
1032 LPSTR ptr = HeapAlloc( GetProcessHeap(), 0, sizeof(LPMMTIME) + sizeof(MMTIME16));
1033 LPMMTIME16 mmt16 = (LPMMTIME16)(ptr + sizeof(LPMMTIME));
1036 *(LPMMTIME*)ptr = mmt32;
1037 mmt16->wType = mmt32->wType;
1038 ret = WINMM_MAP_OKMEM;
1040 ret = WINMM_MAP_NOMEM;
1042 *lpParam1 = MapLS(ptr) + sizeof(LPMMTIME);
1043 *lpParam2 = sizeof(MMTIME16);
1046 case DRVM_MAPPER_STATUS:
1048 LPDWORD p32 = (LPDWORD)*lpParam2;
1049 *lpParam2 = MapLS(p32);
1050 ret = WINMM_MAP_OKMEM;
1054 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
1060 /**************************************************************************
1061 * MMDRV_WaveIn_UnMap32ATo16 [internal]
1063 static WINMM_MapType MMDRV_WaveIn_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
1065 WINMM_MapType ret = WINMM_MAP_MSGERROR;
1069 case WIDM_GETNUMDEVS:
1078 LPWAVEOPENDESC16 wod16 = MapSL(*lpParam1);
1079 LPSTR ptr = (LPSTR)wod16 - sizeof(LPWAVEOPENDESC) - 2*sizeof(DWORD);
1080 LPWAVEOPENDESC wod32 = *(LPWAVEOPENDESC*)ptr;
1082 UnMapLS( *lpParam1 );
1083 wod32->uMappedDeviceID = wod16->uMappedDeviceID;
1084 **(DWORD**)(ptr + sizeof(LPWAVEOPENDESC)) = *(LPDWORD)(ptr + sizeof(LPWAVEOPENDESC) + sizeof(DWORD));
1085 HeapFree( GetProcessHeap(), 0, ptr );
1090 case WIDM_ADDBUFFER:
1092 case WIDM_UNPREPARE:
1094 LPWAVEHDR wh16 = MapSL(*lpParam1);
1095 LPSTR ptr = (LPSTR)wh16 - sizeof(LPWAVEHDR);
1096 LPWAVEHDR wh32 = *(LPWAVEHDR*)ptr;
1098 assert(wh32->lpNext == wh16);
1099 wh32->dwBytesRecorded = wh16->dwBytesRecorded;
1100 wh32->dwUser = wh16->dwUser;
1101 wh32->dwFlags = wh16->dwFlags;
1102 wh32->dwLoops = wh16->dwLoops;
1103 UnMapLS( *lpParam1 );
1105 if (wMsg == WIDM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) {
1106 HeapFree( GetProcessHeap(), 0, ptr );
1112 case WIDM_GETDEVCAPS:
1114 LPWAVEINCAPS16 wic16 = MapSL(*lpParam1);
1115 LPSTR ptr = (LPSTR)wic16 - sizeof(LPWAVEINCAPSW);
1116 LPWAVEINCAPSW wic32 = *(LPWAVEINCAPSW*)ptr;
1118 wic32->wMid = wic16->wMid;
1119 wic32->wPid = wic16->wPid;
1120 wic32->vDriverVersion = wic16->vDriverVersion;
1121 WideCharToMultiByte( CP_ACP, 0, wic32->szPname, -1, wic16->szPname,
1122 sizeof(wic16->szPname), NULL, NULL );
1123 wic32->dwFormats = wic16->dwFormats;
1124 wic32->wChannels = wic16->wChannels;
1125 UnMapLS( *lpParam1 );
1126 HeapFree( GetProcessHeap(), 0, ptr );
1132 LPMMTIME16 mmt16 = MapSL(*lpParam1);
1133 LPSTR ptr = (LPSTR)mmt16 - sizeof(LPMMTIME);
1134 LPMMTIME mmt32 = *(LPMMTIME*)ptr;
1136 MMSYSTEM_MMTIME16to32(mmt32, mmt16);
1137 UnMapLS( *lpParam1 );
1138 HeapFree( GetProcessHeap(), 0, ptr );
1142 case DRVM_MAPPER_STATUS:
1144 UnMapLS( *lpParam2 );
1149 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
1155 /**************************************************************************
1156 * MMDRV_WaveIn_Callback [internal]
1158 static void CALLBACK MMDRV_WaveIn_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
1160 LPWINE_MLD mld = (LPWINE_MLD)dwInstance;
1165 /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
1168 if (mld->bFrom32 && !MMDRV_Is32(mld->mmdIndex)) {
1169 /* initial map is: 32 => 16 */
1170 LPWAVEHDR wh16 = MapSL(dwParam1);
1171 LPWAVEHDR wh32 = *(LPWAVEHDR*)((LPSTR)wh16 - sizeof(LPWAVEHDR));
1173 dwParam1 = (DWORD)wh32;
1174 wh32->dwFlags = wh16->dwFlags;
1175 wh32->dwBytesRecorded = wh16->dwBytesRecorded;
1176 } else if (!mld->bFrom32 && MMDRV_Is32(mld->mmdIndex)) {
1177 /* initial map is: 16 => 32 */
1178 LPWAVEHDR wh32 = (LPWAVEHDR)(dwParam1);
1179 SEGPTR segwh16 = *(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR));
1180 LPWAVEHDR wh16 = MapSL(segwh16);
1182 dwParam1 = (DWORD)segwh16;
1183 wh16->dwFlags = wh32->dwFlags;
1184 wh16->dwBytesRecorded = wh32->dwBytesRecorded;
1186 /* else { 16 => 16 or 32 => 32, nothing to do, same struct is kept }*/
1189 ERR("Unknown msg %u\n", uMsg);
1192 MMDRV_Callback(mld, hDev, uMsg, dwParam1, dwParam2);
1195 /* =================================
1196 * W A V E O U T M A P P E R S
1197 * ================================= */
1199 /**************************************************************************
1200 * MMDRV_WaveOut_Map16To32A [internal]
1202 static WINMM_MapType MMDRV_WaveOut_Map16To32A (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
1204 WINMM_MapType ret = WINMM_MAP_MSGERROR;
1208 case WODM_BREAKLOOP:
1210 case WODM_GETNUMDEVS:
1215 case WODM_SETPLAYBACKRATE:
1216 case WODM_SETVOLUME:
1221 case WODM_GETPLAYBACKRATE:
1222 case WODM_GETVOLUME:
1224 FIXME("Shouldn't be used: the corresponding 16 bit functions use the 32 bit interface\n");
1227 case WODM_GETDEVCAPS:
1229 LPWAVEOUTCAPSW woc32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEOUTCAPS16) + sizeof(WAVEOUTCAPSW));
1230 LPWAVEOUTCAPS16 woc16 = MapSL(*lpParam1);
1233 *(LPWAVEOUTCAPS16*)woc32 = woc16;
1234 woc32 = (LPWAVEOUTCAPSW)((LPSTR)woc32 + sizeof(LPWAVEOUTCAPS16));
1235 *lpParam1 = (DWORD)woc32;
1236 *lpParam2 = sizeof(WAVEOUTCAPSW);
1238 ret = WINMM_MAP_OKMEM;
1240 ret = WINMM_MAP_NOMEM;
1246 LPMMTIME mmt32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMMTIME16) + sizeof(MMTIME));
1247 LPMMTIME16 mmt16 = MapSL(*lpParam1);
1250 *(LPMMTIME16*)mmt32 = mmt16;
1251 mmt32 = (LPMMTIME)((LPSTR)mmt32 + sizeof(LPMMTIME16));
1253 mmt32->wType = mmt16->wType;
1254 *lpParam1 = (DWORD)mmt32;
1255 *lpParam2 = sizeof(MMTIME);
1257 ret = WINMM_MAP_OKMEM;
1259 ret = WINMM_MAP_NOMEM;
1265 LPWAVEHDR wh32 = HeapAlloc(GetProcessHeap(), 0, sizeof(LPWAVEHDR) + sizeof(WAVEHDR));
1266 LPWAVEHDR wh16 = MapSL(*lpParam1);
1269 *(LPWAVEHDR*)wh32 = (LPWAVEHDR)*lpParam1;
1270 wh32 = (LPWAVEHDR)((LPSTR)wh32 + sizeof(LPWAVEHDR));
1271 wh32->lpData = MapSL((SEGPTR)wh16->lpData);
1272 wh32->dwBufferLength = wh16->dwBufferLength;
1273 wh32->dwBytesRecorded = wh16->dwBytesRecorded;
1274 wh32->dwUser = wh16->dwUser;
1275 wh32->dwFlags = wh16->dwFlags;
1276 wh32->dwLoops = wh16->dwLoops;
1277 /* FIXME: nothing on wh32->lpNext */
1278 /* could link the wh32->lpNext at this level for memory house keeping */
1279 wh16->lpNext = wh32; /* for reuse in unprepare and write */
1280 *lpParam1 = (DWORD)wh32;
1281 *lpParam2 = sizeof(WAVEHDR);
1283 ret = WINMM_MAP_OKMEM;
1285 ret = WINMM_MAP_NOMEM;
1289 case WODM_UNPREPARE:
1292 LPWAVEHDR wh16 = MapSL(*lpParam1);
1293 LPWAVEHDR wh32 = (LPWAVEHDR)wh16->lpNext;
1295 *lpParam1 = (DWORD)wh32;
1296 *lpParam2 = sizeof(WAVEHDR);
1297 /* dwBufferLength can be reduced between prepare & write */
1298 if (wMsg == WODM_WRITE && wh32->dwBufferLength < wh16->dwBufferLength) {
1299 ERR("Size of buffer has been increased from %ld to %ld, keeping initial value\n",
1300 wh32->dwBufferLength, wh16->dwBufferLength);
1302 wh32->dwBufferLength = wh16->dwBufferLength;
1303 ret = WINMM_MAP_OKMEM;
1306 case WODM_MAPPER_STATUS:
1307 *lpParam2 = (DWORD)MapSL(*lpParam2);
1311 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
1317 /**************************************************************************
1318 * MMDRV_WaveOut_UnMap16To32A [internal]
1320 static WINMM_MapType MMDRV_WaveOut_UnMap16To32A(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
1322 WINMM_MapType ret = WINMM_MAP_MSGERROR;
1326 case WODM_BREAKLOOP:
1328 case WODM_GETNUMDEVS:
1333 case WODM_SETPLAYBACKRATE:
1334 case WODM_SETVOLUME:
1335 case WODM_MAPPER_STATUS:
1340 case WODM_GETPLAYBACKRATE:
1341 case WODM_GETVOLUME:
1343 FIXME("Shouldn't be used: those 16 bit functions use the 32 bit interface\n");
1346 case WODM_GETDEVCAPS:
1348 LPWAVEOUTCAPSW woc32 = (LPWAVEOUTCAPSW)(*lpParam1);
1349 LPWAVEOUTCAPS16 woc16 = *(LPWAVEOUTCAPS16*)((LPSTR)woc32 - sizeof(LPWAVEOUTCAPS16));
1351 woc16->wMid = woc32->wMid;
1352 woc16->wPid = woc32->wPid;
1353 woc16->vDriverVersion = woc32->vDriverVersion;
1354 WideCharToMultiByte( CP_ACP, 0, woc32->szPname, -1, woc16->szPname,
1355 sizeof(woc16->szPname), NULL, NULL );
1356 woc16->dwFormats = woc32->dwFormats;
1357 woc16->wChannels = woc32->wChannels;
1358 woc16->dwSupport = woc32->dwSupport;
1359 HeapFree(GetProcessHeap(), 0, (LPSTR)woc32 - sizeof(LPWAVEOUTCAPS16));
1365 LPMMTIME mmt32 = (LPMMTIME)(*lpParam1);
1366 LPMMTIME16 mmt16 = *(LPMMTIME16*)((LPSTR)mmt32 - sizeof(LPMMTIME16));
1368 MMSYSTEM_MMTIME32to16(mmt16, mmt32);
1369 HeapFree(GetProcessHeap(), 0, (LPSTR)mmt32 - sizeof(LPMMTIME16));
1374 case WODM_UNPREPARE:
1377 LPWAVEHDR wh32 = (LPWAVEHDR)(*lpParam1);
1378 LPWAVEHDR wh16 = MapSL(*(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR)));
1380 assert(wh16->lpNext == wh32);
1381 wh16->dwBufferLength = wh32->dwBufferLength;
1382 wh16->dwBytesRecorded = wh32->dwBytesRecorded;
1383 wh16->dwUser = wh32->dwUser;
1384 wh16->dwFlags = wh32->dwFlags;
1385 wh16->dwLoops = wh32->dwLoops;
1387 if (wMsg == WODM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) {
1388 HeapFree(GetProcessHeap(), 0, (LPSTR)wh32 - sizeof(LPWAVEHDR));
1395 FIXME("NIY: no conversion yet for %u [%lx,%lx]\n", wMsg, *lpParam1, *lpParam2);
1401 /**************************************************************************
1402 * MMDRV_WaveOut_Map32ATo16 [internal]
1404 static WINMM_MapType MMDRV_WaveOut_Map32ATo16 (UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2)
1410 case WODM_BREAKLOOP:
1412 case WODM_GETNUMDEVS:
1417 case WODM_SETPLAYBACKRATE:
1418 case WODM_SETVOLUME:
1422 case WODM_GETDEVCAPS:
1424 LPWAVEOUTCAPSW woc32 = (LPWAVEOUTCAPSW)*lpParam1;
1425 LPSTR ptr = HeapAlloc( GetProcessHeap(), 0,
1426 sizeof(LPWAVEOUTCAPSW) + sizeof(WAVEOUTCAPS16));
1429 *(LPWAVEOUTCAPSW*)ptr = woc32;
1430 ret = WINMM_MAP_OKMEM;
1432 ret = WINMM_MAP_NOMEM;
1434 *lpParam1 = MapLS(ptr) + sizeof(LPWAVEOUTCAPSW);
1435 *lpParam2 = sizeof(WAVEOUTCAPS16);
1439 FIXME("NIY: no conversion yet\n");
1440 ret = WINMM_MAP_MSGERROR;
1442 case WODM_GETPLAYBACKRATE:
1443 FIXME("NIY: no conversion yet\n");
1444 ret = WINMM_MAP_MSGERROR;
1448 LPMMTIME mmt32 = (LPMMTIME)*lpParam1;
1449 LPSTR ptr = HeapAlloc( GetProcessHeap(), 0, sizeof(LPMMTIME) + sizeof(MMTIME16));
1450 LPMMTIME16 mmt16 = (LPMMTIME16)(ptr + sizeof(LPMMTIME));
1453 *(LPMMTIME*)ptr = mmt32;
1454 mmt16->wType = mmt32->wType;
1455 ret = WINMM_MAP_OKMEM;
1457 ret = WINMM_MAP_NOMEM;
1459 *lpParam1 = MapLS(ptr) + sizeof(LPMMTIME);
1460 *lpParam2 = sizeof(MMTIME16);
1463 case WODM_GETVOLUME:
1464 FIXME("NIY: no conversion yet\n");
1465 ret = WINMM_MAP_MSGERROR;
1469 LPWAVEOPENDESC wod32 = (LPWAVEOPENDESC)*lpParam1;
1470 int sz = sizeof(WAVEFORMATEX);
1472 LPWAVEOPENDESC16 wod16;
1474 /* allocated data are mapped as follows:
1475 LPWAVEOPENDESC ptr to orig lParam1
1476 DWORD orig dwUser, which is a pointer to DWORD:driver dwInstance
1477 DWORD dwUser passed to driver
1478 WAVEOPENDESC16 wod16: openDesc passed to driver
1479 WAVEFORMATEX openDesc->lpFormat passed to driver
1480 xxx extra bytes to WAVEFORMATEX
1482 if (wod32->lpFormat->wFormatTag != WAVE_FORMAT_PCM) {
1483 TRACE("Allocating %u extra bytes (%d)\n", ((LPWAVEFORMATEX)wod32->lpFormat)->cbSize, wod32->lpFormat->wFormatTag);
1484 sz += ((LPWAVEFORMATEX)wod32->lpFormat)->cbSize;
1487 ptr = HeapAlloc( GetProcessHeap(), 0,
1488 sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD) + sizeof(WAVEOPENDESC16) + sz);
1491 SEGPTR seg_ptr = MapLS( ptr );
1492 *(LPWAVEOPENDESC*)ptr = wod32;
1493 *(LPDWORD)((char*)ptr + sizeof(LPWAVEOPENDESC)) = *lpdwUser;
1494 wod16 = (LPWAVEOPENDESC16)((LPSTR)ptr + sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD));
1496 wod16->hWave = HWAVE_16(wod32->hWave);
1497 wod16->lpFormat = (LPWAVEFORMATEX)(seg_ptr + sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD) + sizeof(WAVEOPENDESC16));
1498 memcpy(wod16 + 1, wod32->lpFormat, sz);
1500 wod16->dwCallback = wod32->dwCallback;
1501 wod16->dwInstance = wod32->dwInstance;
1502 wod16->uMappedDeviceID = wod32->uMappedDeviceID;
1503 wod16->dnDevNode = wod32->dnDevNode;
1505 *lpParam1 = seg_ptr + sizeof(LPWAVEOPENDESC) + 2*sizeof(DWORD);
1506 *lpdwUser = seg_ptr + sizeof(LPWAVEOPENDESC) + sizeof(DWORD);
1508 ret = WINMM_MAP_OKMEM;
1510 ret = WINMM_MAP_NOMEM;
1516 LPWAVEHDR wh32 = (LPWAVEHDR)*lpParam1;
1518 LPVOID ptr = HeapAlloc( GetProcessHeap(), 0,
1519 sizeof(LPWAVEHDR) + sizeof(WAVEHDR) + wh32->dwBufferLength);
1522 SEGPTR seg_ptr = MapLS( ptr );
1523 *(LPWAVEHDR*)ptr = wh32;
1524 wh16 = (LPWAVEHDR)((LPSTR)ptr + sizeof(LPWAVEHDR));
1525 wh16->lpData = (LPSTR)seg_ptr + sizeof(LPWAVEHDR) + sizeof(WAVEHDR);
1526 /* data will be copied on WODM_WRITE */
1527 wh16->dwBufferLength = wh32->dwBufferLength;
1528 wh16->dwBytesRecorded = wh32->dwBytesRecorded;
1529 wh16->dwUser = wh32->dwUser;
1530 wh16->dwFlags = wh32->dwFlags;
1531 wh16->dwLoops = wh32->dwLoops;
1532 /* FIXME: nothing on wh32->lpNext */
1533 /* could link the wh32->lpNext at this level for memory house keeping */
1534 wh32->lpNext = wh16; /* for reuse in unprepare and write */
1535 TRACE("wh16=%08lx wh16->lpData=%08lx wh32->buflen=%lu wh32->lpData=%08lx\n",
1536 seg_ptr + sizeof(LPWAVEHDR), (DWORD)wh16->lpData,
1537 wh32->dwBufferLength, (DWORD)wh32->lpData);
1538 *lpParam1 = seg_ptr + sizeof(LPWAVEHDR);
1539 *lpParam2 = sizeof(WAVEHDR);
1541 ret = WINMM_MAP_OKMEM;
1543 ret = WINMM_MAP_NOMEM;
1547 case WODM_UNPREPARE:
1550 LPWAVEHDR wh32 = (LPWAVEHDR)(*lpParam1);
1551 LPWAVEHDR wh16 = wh32->lpNext;
1552 LPSTR ptr = (LPSTR)wh16 - sizeof(LPWAVEHDR);
1553 SEGPTR seg_ptr = MapLS( ptr );
1555 assert(*(LPWAVEHDR*)ptr == wh32);
1557 TRACE("wh16=%08lx wh16->lpData=%08lx wh32->buflen=%lu wh32->lpData=%08lx\n",
1558 seg_ptr + sizeof(LPWAVEHDR), (DWORD)wh16->lpData,
1559 wh32->dwBufferLength, (DWORD)wh32->lpData);
1561 if (wMsg == WODM_WRITE)
1562 memcpy((LPSTR)wh16 + sizeof(WAVEHDR), wh32->lpData, wh32->dwBufferLength);
1564 *lpParam1 = seg_ptr + sizeof(LPWAVEHDR);
1565 *lpParam2 = sizeof(WAVEHDR);
1566 /* dwBufferLength can be reduced between prepare & write */
1567 if (wMsg == WODM_WRITE && wh16->dwBufferLength < wh32->dwBufferLength) {
1568 ERR("Size of buffer has been increased from %ld to %ld, keeping initial value\n",
1569 wh16->dwBufferLength, wh32->dwBufferLength);
1571 wh16->dwBufferLength = wh32->dwBufferLength;
1572 ret = WINMM_MAP_OKMEM;
1575 case DRVM_MAPPER_STATUS:
1577 LPDWORD p32 = (LPDWORD)*lpParam2;
1578 *lpParam2 = MapLS(p32);
1579 ret = WINMM_MAP_OKMEM;
1583 FIXME("NIY: no conversion yet\n");
1584 ret = WINMM_MAP_MSGERROR;
1590 /**************************************************************************
1591 * MMDRV_WaveOut_UnMap32ATo16 [internal]
1593 static WINMM_MapType MMDRV_WaveOut_UnMap32ATo16(UINT wMsg, LPDWORD lpdwUser, LPDWORD lpParam1, LPDWORD lpParam2, MMRESULT fn_ret)
1599 case WODM_BREAKLOOP:
1601 case WODM_GETNUMDEVS:
1606 case WODM_SETPLAYBACKRATE:
1607 case WODM_SETVOLUME:
1611 case WODM_GETDEVCAPS:
1613 LPWAVEOUTCAPS16 woc16 = MapSL(*lpParam1);
1614 LPSTR ptr = (LPSTR)woc16 - sizeof(LPWAVEOUTCAPSW);
1615 LPWAVEOUTCAPSW woc32 = *(LPWAVEOUTCAPSW*)ptr;
1617 woc32->wMid = woc16->wMid;
1618 woc32->wPid = woc16->wPid;
1619 woc32->vDriverVersion = woc16->vDriverVersion;
1620 WideCharToMultiByte( CP_ACP, 0, woc32->szPname, -1, woc16->szPname,
1621 sizeof(woc16->szPname), NULL, NULL );
1622 woc32->dwFormats = woc16->dwFormats;
1623 woc32->wChannels = woc16->wChannels;
1624 woc32->dwSupport = woc16->dwSupport;
1625 UnMapLS( *lpParam1 );
1626 HeapFree( GetProcessHeap(), 0, ptr );
1631 FIXME("NIY: no conversion yet\n");
1632 ret = WINMM_MAP_MSGERROR;
1634 case WODM_GETPLAYBACKRATE:
1635 FIXME("NIY: no conversion yet\n");
1636 ret = WINMM_MAP_MSGERROR;
1640 LPMMTIME16 mmt16 = MapSL(*lpParam1);
1641 LPSTR ptr = (LPSTR)mmt16 - sizeof(LPMMTIME);
1642 LPMMTIME mmt32 = *(LPMMTIME*)ptr;
1644 MMSYSTEM_MMTIME16to32(mmt32, mmt16);
1645 UnMapLS( *lpParam1 );
1646 HeapFree( GetProcessHeap(), 0, ptr );
1652 LPWAVEOPENDESC16 wod16 = MapSL(*lpParam1);
1653 LPSTR ptr = (LPSTR)wod16 - sizeof(LPWAVEOPENDESC) - 2*sizeof(DWORD);
1654 LPWAVEOPENDESC wod32 = *(LPWAVEOPENDESC*)ptr;
1656 wod32->uMappedDeviceID = wod16->uMappedDeviceID;
1657 **(DWORD**)(ptr + sizeof(LPWAVEOPENDESC)) = *(LPDWORD)(ptr + sizeof(LPWAVEOPENDESC) + sizeof(DWORD));
1658 UnMapLS( *lpParam1 );
1659 HeapFree( GetProcessHeap(), 0, ptr );
1664 case WODM_UNPREPARE:
1667 LPWAVEHDR wh16 = MapSL(*lpParam1);
1668 LPSTR ptr = (LPSTR)wh16 - sizeof(LPWAVEHDR);
1669 LPWAVEHDR wh32 = *(LPWAVEHDR*)ptr;
1671 assert(wh32->lpNext == wh16);
1672 wh32->dwBytesRecorded = wh16->dwBytesRecorded;
1673 wh32->dwUser = wh16->dwUser;
1674 wh32->dwFlags = wh16->dwFlags;
1675 wh32->dwLoops = wh16->dwLoops;
1677 UnMapLS( *lpParam1 );
1678 if (wMsg == WODM_UNPREPARE && fn_ret == MMSYSERR_NOERROR) {
1679 HeapFree( GetProcessHeap(), 0, ptr );
1685 case WODM_GETVOLUME:
1686 FIXME("NIY: no conversion yet\n");
1687 ret = WINMM_MAP_MSGERROR;
1689 case DRVM_MAPPER_STATUS:
1691 UnMapLS( *lpParam2 );
1696 FIXME("NIY: no conversion yet\n");
1697 ret = WINMM_MAP_MSGERROR;
1703 /**************************************************************************
1704 * MMDRV_WaveOut_Callback [internal]
1706 static void CALLBACK MMDRV_WaveOut_Callback(HDRVR hDev, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
1708 LPWINE_MLD mld = (LPWINE_MLD)dwInstance;
1713 /* dwParam1 & dwParam2 are supposed to be 0, nothing to do */
1716 if (mld->bFrom32 && !MMDRV_Is32(mld->mmdIndex)) {
1717 /* initial map is: 32 => 16 */
1718 LPWAVEHDR wh16 = MapSL(dwParam1);
1719 LPWAVEHDR wh32 = *(LPWAVEHDR*)((LPSTR)wh16 - sizeof(LPWAVEHDR));
1721 dwParam1 = (DWORD)wh32;
1722 wh32->dwFlags = wh16->dwFlags;
1723 } else if (!mld->bFrom32 && MMDRV_Is32(mld->mmdIndex)) {
1724 /* initial map is: 16 => 32 */
1725 LPWAVEHDR wh32 = (LPWAVEHDR)(dwParam1);
1726 SEGPTR segwh16 = *(SEGPTR*)((LPSTR)wh32 - sizeof(LPWAVEHDR));
1727 LPWAVEHDR wh16 = MapSL(segwh16);
1729 dwParam1 = (DWORD)segwh16;
1730 wh16->dwFlags = wh32->dwFlags;
1732 /* else { 16 => 16 or 32 => 32, nothing to do, same struct is kept }*/
1735 ERR("Unknown msg %u\n", uMsg);
1738 MMDRV_Callback(mld, hDev, uMsg, dwParam1, dwParam2);
1741 /* =================================
1742 * M A P P E R S H A N D L I N G
1743 * ================================= */
1745 static LRESULT MMDRV_CallMMDrvFunc16(DWORD fp16, WORD dev, WORD msg, LONG instance,
1753 args[5] = HIWORD(instance);
1754 args[4] = LOWORD(instance);
1755 args[3] = HIWORD(lp1);
1756 args[2] = LOWORD(lp1);
1757 args[1] = HIWORD(lp2);
1758 args[0] = LOWORD(lp2);
1759 WOWCallback16Ex( fp16, WCB16_PASCAL, sizeof(args), args, &ret );
1763 /**************************************************************************
1764 * MMDRV_GetDescription16 [internal]
1766 static BOOL MMDRV_GetDescription16(const char* fname, char* buf, int buflen)
1774 if ((hFile = OpenFile(fname, &ofs, OF_READ | OF_SHARE_DENY_WRITE)) == HFILE_ERROR) {
1775 ERR("Can't open file %s (builtin driver ?)\n", fname);
1779 #define E(_x) do {TRACE _x;goto theEnd;} while(0)
1781 if (_lread(hFile, &w, 2) != 2) E(("Can't read sig\n"));
1782 if (w != ('Z' * 256 + 'M')) E(("Bad sig %04x\n", w));
1783 if (_llseek(hFile, 0x3C, SEEK_SET) < 0) E(("Can't seek to ext header offset\n"));
1784 if (_lread(hFile, &dw, 4) != 4) E(("Can't read ext header offset\n"));
1785 if (_llseek(hFile, dw + 0x2C, SEEK_SET) < 0) E(("Can't seek to ext header.nr table %lu\n", dw+0x2C));
1786 if (_lread(hFile, &dw, 4) != 4) E(("Can't read nr table offset\n"));
1787 if (_llseek(hFile, dw, SEEK_SET) < 0) E(("Can't seek to nr table %lu\n", dw));
1788 if (_lread(hFile, buf, 1) != 1) E(("Can't read descr length\n"));
1789 buflen = min((int)(unsigned)(BYTE)buf[0], buflen - 1);
1790 if (_lread(hFile, buf, buflen) != buflen) E(("Can't read descr (%d)\n", buflen));
1793 TRACE("Got '%s' [%d]\n", buf, buflen);
1799 /******************************************************************
1800 * MMDRV_LoadMMDrvFunc16
1803 unsigned MMDRV_LoadMMDrvFunc16(LPCSTR drvName, LPWINE_DRIVER d,
1804 LPWINE_MM_DRIVER lpDrv)
1806 WINEMM_msgFunc16 func;
1810 * DESCRIPTION 'wave,aux,mixer:Creative Labs Sound Blaster 16 Driver'
1811 * The beginning of the module description indicates the driver supports
1812 * waveform, auxiliary, and mixer devices. Use one of the following
1813 * device-type names, followed by a colon (:) to indicate the type of
1814 * device your driver supports. If the driver supports more than one
1815 * type of device, separate each device-type name with a comma (,).
1817 * wave for waveform audio devices
1818 * wavemapper for wave mappers
1819 * midi for MIDI audio devices
1820 * midimapper for midi mappers
1821 * aux for auxiliary audio devices
1822 * mixer for mixer devices
1825 if (d->d.d16.hDriver16) {
1826 HMODULE16 hMod16 = GetDriverModuleHandle16(d->d.d16.hDriver16);
1828 #define AA(_h,_w,_x,_y,_z) \
1829 func = (WINEMM_msgFunc##_y) _z ((_h), #_x); \
1831 { lpDrv->parts[_w].u.fnMessage##_y = func; count++; \
1832 TRACE("Got %d bit func '%s'\n", _y, #_x); }
1834 #define A(_x,_y) AA(hMod16,_x,_y,16,GetProcAddress16)
1835 A(MMDRV_AUX, auxMessage);
1836 A(MMDRV_MIXER, mxdMessage);
1837 A(MMDRV_MIDIIN, midMessage);
1838 A(MMDRV_MIDIOUT,modMessage);
1839 A(MMDRV_WAVEIN, widMessage);
1840 A(MMDRV_WAVEOUT,wodMessage);
1844 if (TRACE_ON(winmm)) {
1845 if (MMDRV_GetDescription16(drvName, buffer, sizeof(buffer)))
1846 TRACE("%s => %s\n", drvName, buffer);
1848 TRACE("%s => No description\n", drvName);
1854 /* =================================
1856 * ================================= */
1858 /**************************************************************************
1859 * MCI_MapMsg16To32A [internal]
1861 static WINMM_MapType MCI_MapMsg16To32A(WORD uDevType, WORD wMsg, DWORD* lParam)
1864 return WINMM_MAP_OK;
1865 /* FIXME: to add also (with seg/linear modifications to do):
1866 * MCI_LIST, MCI_LOAD, MCI_QUALITY, MCI_RESERVE, MCI_RESTORE, MCI_SAVE
1867 * MCI_SETAUDIO, MCI_SETTUNER, MCI_SETVIDEO
1870 /* case MCI_CAPTURE */
1872 case MCI_CLOSE_DRIVER:
1879 case MCI_GETDEVCAPS:
1880 /* case MCI_INDEX: */
1881 /* case MCI_MARK: */
1882 /* case MCI_MONITOR: */
1892 /* case MCI_SETTIMECODE:*/
1893 /* case MCI_SIGNAL:*/
1895 case MCI_STATUS: /* FIXME: is wrong for digital video */
1898 /* case MCI_UNDO: */
1902 *lParam = (DWORD)MapSL(*lParam);
1903 return WINMM_MAP_OK;
1905 /* in fact, I would also need the dwFlags... to see
1906 * which members of lParam are effectively used
1908 *lParam = (DWORD)MapSL(*lParam);
1909 FIXME("Current mapping may be wrong\n");
1913 LPMCI_BREAK_PARMS mbp32 = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_BREAK_PARMS));
1914 LPMCI_BREAK_PARMS16 mbp16 = MapSL(*lParam);
1917 mbp32->dwCallback = mbp16->dwCallback;
1918 mbp32->nVirtKey = mbp16->nVirtKey;
1919 mbp32->hwndBreak = HWND_32(mbp16->hwndBreak);
1921 return WINMM_MAP_NOMEM;
1923 *lParam = (DWORD)mbp32;
1925 return WINMM_MAP_OKMEM;
1928 LPMCI_VD_ESCAPE_PARMSA mvep32a = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_VD_ESCAPE_PARMSA));
1929 LPMCI_VD_ESCAPE_PARMS16 mvep16 = MapSL(*lParam);
1932 mvep32a->dwCallback = mvep16->dwCallback;
1933 mvep32a->lpstrCommand = MapSL(mvep16->lpstrCommand);
1935 return WINMM_MAP_NOMEM;
1937 *lParam = (DWORD)mvep32a;
1939 return WINMM_MAP_OKMEM;
1942 LPMCI_INFO_PARMSA mip32a = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_INFO_PARMSA));
1943 LPMCI_INFO_PARMS16 mip16 = MapSL(*lParam);
1945 /* FIXME this is wrong if device is of type
1946 * MCI_DEVTYPE_DIGITAL_VIDEO, some members are not mapped
1949 mip32a->dwCallback = mip16->dwCallback;
1950 mip32a->lpstrReturn = MapSL(mip16->lpstrReturn);
1951 mip32a->dwRetSize = mip16->dwRetSize;
1953 return WINMM_MAP_NOMEM;
1955 *lParam = (DWORD)mip32a;
1957 return WINMM_MAP_OKMEM;
1959 case MCI_OPEN_DRIVER:
1961 LPMCI_OPEN_PARMSA mop32a = HeapAlloc(GetProcessHeap(), 0, sizeof(LPMCI_OPEN_PARMS16) + sizeof(MCI_OPEN_PARMSA) + 2 * sizeof(DWORD));
1962 LPMCI_OPEN_PARMS16 mop16 = MapSL(*lParam);
1965 *(LPMCI_OPEN_PARMS16*)(mop32a) = mop16;
1966 mop32a = (LPMCI_OPEN_PARMSA)((char*)mop32a + sizeof(LPMCI_OPEN_PARMS16));
1967 mop32a->dwCallback = mop16->dwCallback;
1968 mop32a->wDeviceID = mop16->wDeviceID;
1969 mop32a->lpstrDeviceType = MapSL(mop16->lpstrDeviceType);
1970 mop32a->lpstrElementName = MapSL(mop16->lpstrElementName);
1971 mop32a->lpstrAlias = MapSL(mop16->lpstrAlias);
1972 /* copy extended information if any...
1973 * FIXME: this may seg fault if initial structure does not contain them and
1974 * the reads after msip16 fail under LDT limits...
1975 * NOTE: this should be split in two. First pass, while calling MCI_OPEN, and
1976 * should not take care of extended parameters, and should be used by MCI_Open
1977 * to fetch uDevType. When, this is known, the mapping for sending the
1978 * MCI_OPEN_DRIVER shall be done depending on uDevType.
1980 memcpy(mop32a + 1, mop16 + 1, 2 * sizeof(DWORD));
1982 return WINMM_MAP_NOMEM;
1984 *lParam = (DWORD)mop32a;
1986 return WINMM_MAP_OKMEM;
1989 LPMCI_SYSINFO_PARMSA msip32a = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_SYSINFO_PARMSA));
1990 LPMCI_SYSINFO_PARMS16 msip16 = MapSL(*lParam);
1993 msip32a->dwCallback = msip16->dwCallback;
1994 msip32a->lpstrReturn = MapSL(msip16->lpstrReturn);
1995 msip32a->dwRetSize = msip16->dwRetSize;
1996 msip32a->dwNumber = msip16->dwNumber;
1997 msip32a->wDeviceType = msip16->wDeviceType;
1999 return WINMM_MAP_NOMEM;
2001 *lParam = (DWORD)msip32a;
2003 return WINMM_MAP_OKMEM;
2006 LPMCI_SOUND_PARMS mbp32 = HeapAlloc(GetProcessHeap(), 0, sizeof(MCI_SOUND_PARMS));
2007 LPMCI_SOUND_PARMS16 mbp16 = MapSL(*lParam);
2010 mbp32->dwCallback = mbp16->dwCallback;
2011 mbp32->lpstrSoundName = MapSL(mbp16->lpstrSoundName);
2013 return WINMM_MAP_NOMEM;
2015 *lParam = (DWORD)mbp32;
2017 return WINMM_MAP_OKMEM;
2025 case DRV_QUERYCONFIGURE:
2028 case DRV_EXITSESSION:
2029 case DRV_EXITAPPLICATION:
2031 FIXME("This is a hack\n");
2032 return WINMM_MAP_OK;
2035 WARN("Don't know how to map msg=%s\n", MCI_MessageToString(wMsg));
2037 return WINMM_MAP_MSGERROR;
2040 /**************************************************************************
2041 * MCI_UnMapMsg16To32A [internal]
2043 static WINMM_MapType MCI_UnMapMsg16To32A(WORD uDevType, WORD wMsg, DWORD lParam)
2046 /* case MCI_CAPTURE */
2048 case MCI_CLOSE_DRIVER:
2055 case MCI_GETDEVCAPS:
2056 /* case MCI_INDEX: */
2057 /* case MCI_MARK: */
2058 /* case MCI_MONITOR: */
2068 /* case MCI_SETTIMECODE:*/
2069 /* case MCI_SIGNAL:*/
2074 /* case MCI_UNDO: */
2078 return WINMM_MAP_OK;
2081 /* FIXME ?? see Map function */
2082 return WINMM_MAP_OK;
2089 HeapFree(GetProcessHeap(), 0, (LPVOID)lParam);
2090 return WINMM_MAP_OK;
2092 case MCI_OPEN_DRIVER:
2094 LPMCI_OPEN_PARMSA mop32a = (LPMCI_OPEN_PARMSA)lParam;
2095 LPMCI_OPEN_PARMS16 mop16 = *(LPMCI_OPEN_PARMS16*)((char*)mop32a - sizeof(LPMCI_OPEN_PARMS16));
2097 mop16->wDeviceID = mop32a->wDeviceID;
2098 if (!HeapFree(GetProcessHeap(), 0, (LPVOID)(lParam - sizeof(LPMCI_OPEN_PARMS16))))
2099 FIXME("bad free line=%d\n", __LINE__);
2101 return WINMM_MAP_OK;
2109 case DRV_QUERYCONFIGURE:
2112 case DRV_EXITSESSION:
2113 case DRV_EXITAPPLICATION:
2115 FIXME("This is a hack\n");
2116 return WINMM_MAP_OK;
2118 FIXME("Map/Unmap internal error on msg=%s\n", MCI_MessageToString(wMsg));
2120 return WINMM_MAP_MSGERROR;
2125 * 0001 squeeze signed 4 bytes to 2 bytes *( LPINT16)D = ( INT16)*( LPINT16)S; D += 2; S += 4
2126 * 0010 squeeze unsigned 4 bytes to 2 bytes *(LPUINT16)D = (UINT16)*(LPUINT16)S; D += 2; S += 4
2129 * 0110 zero 4 bytes *(DWORD)D = 0 D += 4; S += 4
2130 * 0111 copy string *(LPSTR*)D = seg dup(*(LPSTR*)S) D += 4; S += 4
2131 * 1xxx copy xxx + 1 bytes memcpy(D, S, xxx + 1); D += xxx+1; S += xxx+1
2134 /**************************************************************************
2135 * MCI_MsgMapper32To16_Create [internal]
2137 * Helper for MCI_MapMsg32ATo16.
2138 * Maps the 32 bit pointer (*ptr), of size bytes, to an allocated 16 bit
2139 * segmented pointer.
2140 * map contains a list of action to be performed for the mapping (see list
2142 * if keep is TRUE, keeps track of in 32 bit ptr in allocated 16 bit area.
2144 static WINMM_MapType MCI_MsgMapper32To16_Create(void** ptr, int size16, DWORD map, BOOLEAN keep)
2146 void* lp = HeapAlloc( GetProcessHeap(), 0, (keep ? sizeof(void**) : 0) + size16 );
2150 return WINMM_MAP_NOMEM;
2152 p32 = (LPBYTE)(*ptr);
2155 p16 = (LPBYTE)lp + sizeof(void**);
2156 *ptr = (char*)MapLS(lp) + sizeof(void**);
2159 *ptr = (void*)MapLS(lp);
2163 memcpy(p16, p32, size16);
2171 sz = (nibble & 7) + 1;
2172 memcpy(p16, p32, sz);
2175 size16 -= sz; /* DEBUG only */
2179 *(LPINT16)p16 = *(LPINT)p32;
2180 p16 += sizeof(INT16);
2182 size16 -= sizeof(INT16);
2185 *(LPUINT16)p16 = *(LPUINT)p32;
2186 p16 += sizeof(UINT16);
2187 p32 += sizeof(UINT);
2188 size16 -= sizeof(UINT16);
2192 p16 += sizeof(DWORD);
2193 p32 += sizeof(DWORD);
2194 size16 -= sizeof(DWORD);
2197 *(SEGPTR *)p16 = MapLS( *(LPSTR *)p32 );
2198 p16 += sizeof(SEGPTR);
2199 p32 += sizeof(LPSTR);
2200 size16 -= sizeof(SEGPTR);
2203 FIXME("Unknown nibble for mapping (%x)\n", nibble);
2208 if (size16 != 0) /* DEBUG only */
2209 FIXME("Mismatch between 16 bit struct size and map nibbles serie\n");
2211 return WINMM_MAP_OKMEM;
2214 /**************************************************************************
2215 * MCI_MsgMapper32To16_Destroy [internal]
2217 * Helper for MCI_UnMapMsg32ATo16.
2219 static WINMM_MapType MCI_MsgMapper32To16_Destroy(void* ptr, int size16, DWORD map, BOOLEAN kept)
2222 void* msg16 = MapSL((SEGPTR)ptr);
2227 UnMapLS( (SEGPTR)ptr );
2229 alloc = (char*)msg16 - sizeof(void**);
2230 p32 = *(void**)alloc;
2234 memcpy(p32, p16, size16);
2239 memcpy(p32, p16, (nibble & 7) + 1);
2240 p16 += (nibble & 7) + 1;
2241 p32 += (nibble & 7) + 1;
2242 size16 -= (nibble & 7) + 1;
2246 *(LPINT)p32 = *(LPINT16)p16;
2247 p16 += sizeof(INT16);
2249 size16 -= sizeof(INT16);
2252 *(LPUINT)p32 = *(LPUINT16)p16;
2253 p16 += sizeof(UINT16);
2254 p32 += sizeof(UINT);
2255 size16 -= sizeof(UINT16);
2258 p16 += sizeof(UINT);
2259 p32 += sizeof(UINT);
2260 size16 -= sizeof(UINT);
2263 UnMapLS( *(SEGPTR *)p16 );
2264 p16 += sizeof(SEGPTR);
2265 p32 += sizeof(char*);
2266 size16 -= sizeof(SEGPTR);
2269 FIXME("Unknown nibble for mapping (%x)\n", nibble);
2274 if (size16 != 0) /* DEBUG only */
2275 FIXME("Mismatch between 16 bit struct size and map nibbles serie\n");
2281 HeapFree( GetProcessHeap(), 0, alloc );
2283 return WINMM_MAP_OK;
2286 /**************************************************************************
2287 * MCI_MapMsg32ATo16 [internal]
2289 * Map a 32-A bit MCI message to a 16 bit MCI message.
2291 static WINMM_MapType MCI_MapMsg32ATo16(WORD uDevType, WORD wMsg, DWORD dwFlags, DWORD* lParam)
2294 BOOLEAN keep = FALSE;
2298 return WINMM_MAP_OK;
2300 /* FIXME: to add also (with seg/linear modifications to do):
2301 * MCI_LIST, MCI_LOAD, MCI_QUALITY, MCI_RESERVE, MCI_RESTORE, MCI_SAVE
2302 * MCI_SETAUDIO, MCI_SETTUNER, MCI_SETVIDEO
2306 size = sizeof(MCI_BREAK_PARMS);
2308 /* case MCI_CAPTURE */
2310 case MCI_CLOSE_DRIVER:
2312 size = sizeof(MCI_GENERIC_PARMS);
2314 /* case MCI_COPY: */
2317 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_CUE_PARMS); break;
2318 case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_CUE_PARMS); break;*/ FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM;
2319 default: size = sizeof(MCI_GENERIC_PARMS); break;
2325 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_DELETE_PARMS16); map = 0x0F1111FB; break;
2326 case MCI_DEVTYPE_WAVEFORM_AUDIO:size = sizeof(MCI_WAVE_DELETE_PARMS); break;
2327 default: size = sizeof(MCI_GENERIC_PARMS); break;
2330 /* case MCI_ESCAPE: */
2333 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_FREEZE_PARMS); map = 0x0001111B; break;
2334 case MCI_DEVTYPE_OVERLAY: size = sizeof(MCI_OVLY_RECT_PARMS); map = 0x0001111B; break;
2335 default: size = sizeof(MCI_GENERIC_PARMS); break;
2338 case MCI_GETDEVCAPS:
2340 size = sizeof(MCI_GETDEVCAPS_PARMS);
2342 /* case MCI_INDEX: */
2345 LPMCI_INFO_PARMSA mip32a = (LPMCI_INFO_PARMSA)(*lParam);
2346 LPMCI_INFO_PARMS16 mip16;
2349 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_INFO_PARMS16); break;
2350 default: size = sizeof(MCI_INFO_PARMS16); break;
2352 mip16 = HeapAlloc( GetProcessHeap(), 0, size);
2355 mip16->dwCallback = mip32a->dwCallback;
2356 mip16->lpstrReturn = MapLS( mip32a->lpstrReturn );
2357 mip16->dwRetSize = mip32a->dwRetSize;
2358 if (uDevType == MCI_DEVTYPE_DIGITAL_VIDEO) {
2359 ((LPMCI_DGV_INFO_PARMS16)mip16)->dwItem = ((LPMCI_DGV_INFO_PARMSA)mip32a)->dwItem;
2362 return WINMM_MAP_NOMEM;
2364 *lParam = MapLS(mip16);
2366 return WINMM_MAP_OKMEM;
2367 /* case MCI_MARK: */
2368 /* case MCI_MONITOR: */
2370 case MCI_OPEN_DRIVER:
2372 LPMCI_OPEN_PARMSA mop32a = (LPMCI_OPEN_PARMSA)(*lParam);
2373 char* ptr = HeapAlloc( GetProcessHeap(), 0,
2374 sizeof(LPMCI_OPEN_PARMSA) + sizeof(MCI_OPEN_PARMS16) + 2 * sizeof(DWORD));
2375 LPMCI_OPEN_PARMS16 mop16;
2379 *(LPMCI_OPEN_PARMSA*)(ptr) = mop32a;
2380 mop16 = (LPMCI_OPEN_PARMS16)(ptr + sizeof(LPMCI_OPEN_PARMSA));
2381 mop16->dwCallback = mop32a->dwCallback;
2382 mop16->wDeviceID = mop32a->wDeviceID;
2383 if (dwFlags & MCI_OPEN_TYPE) {
2384 if (dwFlags & MCI_OPEN_TYPE_ID) {
2385 /* dword "transparent" value */
2386 mop16->lpstrDeviceType = (SEGPTR)mop32a->lpstrDeviceType;
2389 mop16->lpstrDeviceType = MapLS( mop32a->lpstrDeviceType );
2393 mop16->lpstrDeviceType = 0;
2395 if (dwFlags & MCI_OPEN_ELEMENT) {
2396 if (dwFlags & MCI_OPEN_ELEMENT_ID) {
2397 mop16->lpstrElementName = (SEGPTR)mop32a->lpstrElementName;
2399 mop16->lpstrElementName = MapLS( mop32a->lpstrElementName );
2402 mop16->lpstrElementName = 0;
2404 if (dwFlags & MCI_OPEN_ALIAS) {
2405 mop16->lpstrAlias = MapLS( mop32a->lpstrAlias );
2407 mop16->lpstrAlias = 0;
2409 /* copy extended information if any...
2410 * FIXME: this may seg fault if initial structure does not contain them and
2411 * the reads after msip16 fail under LDT limits...
2412 * NOTE: this should be split in two. First pass, while calling MCI_OPEN, and
2413 * should not take care of extended parameters, and should be used by MCI_Open
2414 * to fetch uDevType. When, this is known, the mapping for sending the
2415 * MCI_OPEN_DRIVER shall be done depending on uDevType.
2417 memcpy(mop16 + 1, mop32a + 1, 2 * sizeof(DWORD));
2419 return WINMM_MAP_NOMEM;
2421 *lParam = (LPARAM)MapLS(ptr) + sizeof(LPMCI_OPEN_PARMSA);
2423 return WINMM_MAP_OKMEM;
2424 /* case MCI_PASTE:*/
2426 size = sizeof(MCI_GENERIC_PARMS);
2429 size = sizeof(MCI_PLAY_PARMS);
2433 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_RECT_PARMS16); map = 0x0001111B; break;
2434 case MCI_DEVTYPE_OVERLAY: size = sizeof(MCI_OVLY_RECT_PARMS); map = 0x0001111B; break;
2435 default: size = sizeof(MCI_GENERIC_PARMS); break;
2439 size = sizeof(MCI_GENERIC_PARMS);
2443 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_RECORD_PARMS16); map = 0x0F1111FB; break;
2444 case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_RECORD_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM;
2445 default: size = sizeof(MCI_RECORD_PARMS); break;
2449 size = sizeof(MCI_GENERIC_PARMS);
2453 case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_SEEK_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM;
2454 default: size = sizeof(MCI_SEEK_PARMS); break;
2459 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_SET_PARMS); break;
2460 case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_SET_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM;
2461 case MCI_DEVTYPE_SEQUENCER: size = sizeof(MCI_SEQ_SET_PARMS); break;
2462 /* FIXME: normally the 16 and 32 bit structures are byte by byte aligned,
2463 * so not doing anything should work...
2465 case MCI_DEVTYPE_WAVEFORM_AUDIO:size = sizeof(MCI_WAVE_SET_PARMS); break;
2466 default: size = sizeof(MCI_SET_PARMS); break;
2471 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_SETAUDIO_PARMS16);map = 0x0000077FF; break;
2472 case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_SETAUDIO_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM;
2473 default: size = sizeof(MCI_GENERIC_PARMS); break;
2476 /* case MCI_SETTIMECODE:*/
2477 /* case MCI_SIGNAL:*/
2478 /* case MCI_SOUND:*/
2480 size = sizeof(MCI_SET_PARMS);
2486 * don't know if buffer for value is the one passed through lpstrDevice
2487 * or is provided by MCI driver.
2488 * Assuming solution 2: provided by MCI driver, so zeroing on entry
2490 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_STATUS_PARMS16); map = 0x0B6FF; break;
2491 case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_STATUS_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM;
2492 default: size = sizeof(MCI_STATUS_PARMS); break;
2497 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_STEP_PARMS); break;
2498 case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_STEP_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM;
2499 case MCI_DEVTYPE_VIDEODISC: size = sizeof(MCI_VD_STEP_PARMS); break;
2500 default: size = sizeof(MCI_GENERIC_PARMS); break;
2504 size = sizeof(MCI_SET_PARMS);
2508 LPMCI_SYSINFO_PARMSA msip32a = (LPMCI_SYSINFO_PARMSA)(*lParam);
2509 LPMCI_SYSINFO_PARMS16 msip16;
2510 char* ptr = HeapAlloc( GetProcessHeap(), 0,
2511 sizeof(LPMCI_SYSINFO_PARMSA) + sizeof(MCI_SYSINFO_PARMS16) );
2514 *(LPMCI_SYSINFO_PARMSA*)(ptr) = msip32a;
2515 msip16 = (LPMCI_SYSINFO_PARMS16)(ptr + sizeof(LPMCI_SYSINFO_PARMSA));
2517 msip16->dwCallback = msip32a->dwCallback;
2518 msip16->lpstrReturn = MapLS( msip32a->lpstrReturn );
2519 msip16->dwRetSize = msip32a->dwRetSize;
2520 msip16->dwNumber = msip32a->dwNumber;
2521 msip16->wDeviceType = msip32a->wDeviceType;
2523 return WINMM_MAP_NOMEM;
2525 *lParam = (LPARAM)MapLS(ptr) + sizeof(LPMCI_SYSINFO_PARMSA);
2527 return WINMM_MAP_OKMEM;
2528 /* case MCI_UNDO: */
2531 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_RECT_PARMS16); map = 0x0001111B; break;
2532 case MCI_DEVTYPE_OVERLAY: size = sizeof(MCI_OVLY_RECT_PARMS16); map = 0x0001111B; break;
2533 default: size = sizeof(MCI_GENERIC_PARMS); break;
2538 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_UPDATE_PARMS16); map = 0x000B1111B; break;
2539 default: size = sizeof(MCI_GENERIC_PARMS); break;
2544 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_RECT_PARMS16); map = 0x0001111B; keep = TRUE; break;
2545 case MCI_DEVTYPE_OVERLAY: size = sizeof(MCI_OVLY_RECT_PARMS16); map = 0x0001111B; keep = TRUE; break;
2546 default: size = sizeof(MCI_GENERIC_PARMS); break;
2551 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_WINDOW_PARMS16); if (dwFlags & MCI_DGV_WINDOW_TEXT) map = 0x7FB; break;
2552 case MCI_DEVTYPE_OVERLAY: size = sizeof(MCI_OVLY_WINDOW_PARMS16); if (dwFlags & MCI_OVLY_WINDOW_TEXT) map = 0x7FB; break;
2553 default: size = sizeof(MCI_GENERIC_PARMS); break;
2558 LPMCI_OPEN_DRIVER_PARMSA modp32a = (LPMCI_OPEN_DRIVER_PARMSA)(*lParam);
2559 LPMCI_OPEN_DRIVER_PARMS16 modp16;
2560 char *ptr = HeapAlloc( GetProcessHeap(), 0,
2561 sizeof(LPMCI_OPEN_DRIVER_PARMSA) + sizeof(MCI_OPEN_DRIVER_PARMS16));
2564 *(LPMCI_OPEN_DRIVER_PARMSA*)(ptr) = modp32a;
2565 modp16 = (LPMCI_OPEN_DRIVER_PARMS16)(ptr + sizeof(LPMCI_OPEN_DRIVER_PARMSA));
2566 modp16->wDeviceID = modp32a->wDeviceID;
2567 modp16->lpstrParams = MapLS( modp32a->lpstrParams );
2568 /* other fields are gonna be filled by the driver, don't copy them */
2570 return WINMM_MAP_NOMEM;
2572 *lParam = (LPARAM)MapLS(ptr) + sizeof(LPMCI_OPEN_DRIVER_PARMSA);
2574 return WINMM_MAP_OKMEM;
2581 case DRV_QUERYCONFIGURE:
2584 case DRV_EXITSESSION:
2585 case DRV_EXITAPPLICATION:
2587 return WINMM_MAP_OK;
2590 WARN("Don't know how to map msg=%s\n", MCI_MessageToString(wMsg));
2591 return WINMM_MAP_MSGERROR;
2593 return MCI_MsgMapper32To16_Create((void**)lParam, size, map, keep);
2596 /**************************************************************************
2597 * MCI_UnMapMsg32ATo16 [internal]
2599 static WINMM_MapType MCI_UnMapMsg32ATo16(WORD uDevType, WORD wMsg, DWORD dwFlags, DWORD lParam)
2602 BOOLEAN kept = FALSE; /* there is no need to compute size when kept is FALSE */
2608 /* case MCI_CAPTURE */
2610 case MCI_CLOSE_DRIVER:
2613 /* case MCI_COPY: */
2619 /* case MCI_ESCAPE: */
2622 case MCI_GETDEVCAPS:
2624 size = sizeof(MCI_GETDEVCAPS_PARMS);
2626 /* case MCI_INDEX: */
2629 LPMCI_INFO_PARMS16 mip16 = (LPMCI_INFO_PARMS16)MapSL(lParam);
2631 UnMapLS( mip16->lpstrReturn );
2632 HeapFree( GetProcessHeap(), 0, mip16 );
2634 return WINMM_MAP_OK;
2635 /* case MCI_MARK: */
2636 /* case MCI_MONITOR: */
2638 case MCI_OPEN_DRIVER:
2640 LPMCI_OPEN_PARMS16 mop16 = (LPMCI_OPEN_PARMS16)MapSL(lParam);
2641 LPMCI_OPEN_PARMSA mop32a = *(LPMCI_OPEN_PARMSA*)((char*)mop16 - sizeof(LPMCI_OPEN_PARMSA));
2643 mop32a->wDeviceID = mop16->wDeviceID;
2644 if ((dwFlags & MCI_OPEN_TYPE) && !(dwFlags & MCI_OPEN_TYPE_ID))
2645 UnMapLS( mop16->lpstrDeviceType );
2646 if ((dwFlags & MCI_OPEN_ELEMENT) && !(dwFlags & MCI_OPEN_ELEMENT_ID))
2647 UnMapLS( mop16->lpstrElementName );
2648 if (dwFlags & MCI_OPEN_ALIAS)
2649 UnMapLS( mop16->lpstrAlias );
2650 HeapFree( GetProcessHeap(), 0, (char*)mop16 - sizeof(LPMCI_OPEN_PARMSA) );
2652 return WINMM_MAP_OK;
2653 /* case MCI_PASTE:*/
2672 case MCI_DEVTYPE_DIGITAL_VIDEO: map = 0x0000077FF; break;
2673 case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_SETAUDIO_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM;
2676 /* case MCI_SETTIMECODE:*/
2677 /* case MCI_SIGNAL:*/
2678 /* case MCI_SOUND:*/
2684 case MCI_DEVTYPE_DIGITAL_VIDEO:
2686 LPMCI_DGV_STATUS_PARMS16 mdsp16 = (LPMCI_DGV_STATUS_PARMS16)MapSL(lParam);
2687 LPMCI_DGV_STATUS_PARMSA mdsp32a = *(LPMCI_DGV_STATUS_PARMSA*)((char*)mdsp16 - sizeof(LPMCI_DGV_STATUS_PARMSA));
2691 mdsp32a->dwReturn = mdsp16->dwReturn;
2692 if (dwFlags & MCI_DGV_STATUS_DISKSPACE) {
2693 TRACE("MCI_STATUS (DGV) lpstrDrive=%08lx\n", mdsp16->lpstrDrive);
2694 TRACE("MCI_STATUS (DGV) lpstrDrive=%s\n", (LPSTR)MapSL(mdsp16->lpstrDrive));
2695 UnMapLS( mdsp16->lpstrDrive );
2697 HeapFree( GetProcessHeap(), 0, (char*)mdsp16 - sizeof(LPMCI_DGV_STATUS_PARMSA) );
2699 return WINMM_MAP_NOMEM;
2702 return WINMM_MAP_OKMEM;
2703 case MCI_DEVTYPE_VCR: /*size = sizeof(MCI_VCR_STATUS_PARMS); break;*/FIXME("NIY vcr\n"); return WINMM_MAP_NOMEM;
2704 default: size = sizeof(MCI_STATUS_PARMS); break;
2713 LPMCI_SYSINFO_PARMS16 msip16 = (LPMCI_SYSINFO_PARMS16)MapSL(lParam);
2714 LPMCI_SYSINFO_PARMSA msip32a = *(LPMCI_SYSINFO_PARMSA*)((char*)msip16 - sizeof(LPMCI_SYSINFO_PARMSA));
2718 msip16->dwCallback = msip32a->dwCallback;
2719 UnMapLS( msip16->lpstrReturn );
2720 HeapFree( GetProcessHeap(), 0, (char*)msip16 - sizeof(LPMCI_SYSINFO_PARMSA) );
2722 return WINMM_MAP_NOMEM;
2725 return WINMM_MAP_OKMEM;
2726 /* case MCI_UNDO: */
2733 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_RECT_PARMS16); map = 0x0001111B; kept = TRUE; break;
2734 case MCI_DEVTYPE_OVERLAY: size = sizeof(MCI_OVLY_RECT_PARMS16); map = 0x0001111B; kept = TRUE; break;
2740 case MCI_DEVTYPE_DIGITAL_VIDEO: size = sizeof(MCI_DGV_WINDOW_PARMS16); if (dwFlags & MCI_DGV_WINDOW_TEXT) map = 0x7666; break;
2741 case MCI_DEVTYPE_OVERLAY: size = sizeof(MCI_OVLY_WINDOW_PARMS16); if (dwFlags & MCI_OVLY_WINDOW_TEXT) map = 0x7666; break;
2744 /* FIXME: see map function */
2749 LPMCI_OPEN_DRIVER_PARMS16 modp16 = (LPMCI_OPEN_DRIVER_PARMS16)MapSL(lParam);
2750 LPMCI_OPEN_DRIVER_PARMSA modp32a = *(LPMCI_OPEN_DRIVER_PARMSA*)((char*)modp16 - sizeof(LPMCI_OPEN_DRIVER_PARMSA));
2753 modp32a->wCustomCommandTable = modp16->wCustomCommandTable;
2754 modp32a->wType = modp16->wType;
2755 UnMapLS( modp16->lpstrParams );
2756 HeapFree( GetProcessHeap(), 0, (char *)modp16 - sizeof(LPMCI_OPEN_DRIVER_PARMSA) );
2758 return WINMM_MAP_OK;
2765 case DRV_QUERYCONFIGURE:
2768 case DRV_EXITSESSION:
2769 case DRV_EXITAPPLICATION:
2771 FIXME("This is a hack\n");
2772 return WINMM_MAP_OK;
2774 FIXME("Map/Unmap internal error on msg=%s\n", MCI_MessageToString(wMsg));
2775 return WINMM_MAP_MSGERROR;
2777 return MCI_MsgMapper32To16_Destroy((void*)lParam, size, map, kept);
2780 void MMDRV_Init16(void)
2782 #define A(_x,_y) MMDRV_InstallMap(_x, \
2783 MMDRV_##_y##_Map16To32A, MMDRV_##_y##_UnMap16To32A, \
2784 MMDRV_##_y##_Map32ATo16, MMDRV_##_y##_UnMap32ATo16, \
2785 MMDRV_##_y##_Callback)
2787 A(MMDRV_MIXER, Mixer);
2788 A(MMDRV_MIDIIN, MidiIn);
2789 A(MMDRV_MIDIOUT, MidiOut);
2790 A(MMDRV_WAVEIN, WaveIn);
2791 A(MMDRV_WAVEOUT, WaveOut);
2794 pFnCallMMDrvFunc16 = MMDRV_CallMMDrvFunc16;
2795 pFnLoadMMDrvFunc16 = MMDRV_LoadMMDrvFunc16;
2797 pFnMciMapMsg16To32A = MCI_MapMsg16To32A;
2798 pFnMciUnMapMsg16To32A = MCI_UnMapMsg16To32A;
2799 pFnMciMapMsg32ATo16 = MCI_MapMsg32ATo16;
2800 pFnMciUnMapMsg32ATo16 = MCI_UnMapMsg32ATo16;