this is the third attempt for splitting 16 bit MMIO out of WINMM A+
Name: mm1632_3 ChangeLog: keep on moving 16 bit code out of winmm now only using linear addresses for buffers License: X11 GenDate: 2002/10/20 09:33:40 UTC ModifiedFiles: dlls/winmm/mmio.c dlls/winmm/mmsystem.c dlls/winmm/winemm.h AddedFiles: =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/dlls/winmm/mmio.c,v retrieving revision 1.34 diff -u -u -r1.34 mmio.c --- dlls/winmm/mmio.c 9 Aug 2002 19:51:01 -0000 1.34 +++ dlls/winmm/mmio.c 20 Oct 2002 08:42:36 -0000 @@ -4,7 +4,7 @@ * * Copyright 1998 Andrew Taylor * Copyright 1998 Ove Kåven - * Copyright 2000 Eric Pouech + * Copyright 2000,2002 Eric Pouech * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,15 +22,13 @@ */ /* Still to be done: - * + correct handling of global/local IOProcs + * + correct handling of global/local IOProcs (and temporary IOProcs) * + mode of mmio objects is not used (read vs write vs readwrite) - * + optimization of internal buffers (seg / lin) - * + even in 32 bit only, a seg ptr IO buffer is allocated (after this is - * fixed, we'll have a proper 32/16 separation) * + thread safeness - * + rename operation is broken + * + 32 A <=> W message mapping */ + #include <ctype.h> #include <stdlib.h> #include <string.h> @@ -39,9 +37,6 @@ #include "mmsystem.h" #include "windef.h" - -#include "wine/mmsystem16.h" -#include "wine/winbase16.h" #include "heap.h" #include "winemm.h" @@ -64,11 +59,10 @@ { /* Parameters: * lParam1 = szFileName parameter from mmioOpen - * lParam2 = reserved (we use it for 16-bitness) + * lParam2 = reserved * Returns: zero on success, error code on error * NOTE: lDiskOffset automatically set to zero */ - OFSTRUCT ofs; LPCSTR szFileName = (LPCSTR)lParam1; if (lpmmioinfo->dwFlags & MMIO_GETTEMP) { @@ -78,11 +72,11 @@ /* if filename NULL, assume open file handle in adwInfo[0] */ if (!szFileName) { - if (lParam2) - lpmmioinfo->adwInfo[0] = DosFileHandleToWin32Handle(lpmmioinfo->adwInfo[0]); - break; - } - lpmmioinfo->adwInfo[0] = (DWORD)OpenFile(szFileName, &ofs, lpmmioinfo->dwFlags & 0xFFFF); + lpmmioinfo->adwInfo[0] = DosFileHandleToWin32Handle(lpmmioinfo->adwInfo[0]); + } else { + OFSTRUCT ofs; + lpmmioinfo->adwInfo[0] = (DWORD)OpenFile(szFileName, &ofs, lpmmioinfo->dwFlags & 0xFFFF); + } if (lpmmioinfo->adwInfo[0] == (DWORD)HFILE_ERROR) ret = MMIOERR_CANNOTOPEN; } @@ -168,7 +162,7 @@ case MMIOM_OPEN: /* Parameters: * lParam1 = filename (must be NULL) - * lParam2 = reserved (we use it for 16-bitness) + * lParam2 = reserved * Returns: zero on success, error code on error * NOTE: lDiskOffset automatically set to zero */ @@ -229,19 +223,9 @@ return 0; } - -enum mmioProcType {MMIO_PROC_16,MMIO_PROC_32A,MMIO_PROC_32W}; - -struct IOProcList -{ - struct IOProcList*pNext; /* Next item in linked list */ - FOURCC fourCC; /* four-character code identifying IOProc */ - LPMMIOPROC pIOProc; /* pointer to IProc */ - enum mmioProcType type; /* 16, 32A or 32W */ - int count; /* number of objects linked to it */ -}; - -/* This array will be the entire list for most apps */ +/* This array will be the entire list for most apps + * Note that temporary ioProcs will be stored with a 0 fourCC code + */ static struct IOProcList defaultProcs[] = { {&defaultProcs[1], FOURCC_DOS, (LPMMIOPROC)mmioDosIOProc, MMIO_PROC_32A, 0}, @@ -270,8 +254,8 @@ /**************************************************************** * MMIO_InstallIOProc [INTERNAL] */ -static LPMMIOPROC MMIO_InstallIOProc(FOURCC fccIOProc, LPMMIOPROC pIOProc, - DWORD dwFlags, enum mmioProcType type) +LPMMIOPROC MMIO_InstallIOProc(FOURCC fccIOProc, LPMMIOPROC pIOProc, + DWORD dwFlags, enum mmioProcType type) { LPMMIOPROC lpProc = NULL; struct IOProcList* pListNode; @@ -305,13 +289,18 @@ case MMIO_REMOVEPROC: /* - * Search for the node that we're trying to remove - note - * that this method won't find the first item on the list, but + * Search for the node that we're trying to remove + * We search for a matching fourCC code if it's non null, or the proc + * address otherwise + * note that this method won't find the first item on the list, but * since the first two items on this list are ones we won't * let the user delete anyway, that's okay */ ppListNode = &pIOProcListAnchor; - while ((*ppListNode) && (*ppListNode)->fourCC != fccIOProc) + while ((*ppListNode) && + ((fccIOProc != 0) ? + (*ppListNode)->fourCC != fccIOProc : + (*ppListNode)->pIOProc != pIOProc)) ppListNode = &((*ppListNode)->pNext); if (*ppListNode) { /* found it */ @@ -347,125 +336,59 @@ } /**************************************************************** - * MMIO_Map32To16 [INTERNAL] - */ -static LRESULT MMIO_Map32To16(DWORD wMsg, LPARAM* lp1, LPARAM* lp2) -{ - switch (wMsg) { - case MMIOM_CLOSE: - case MMIOM_SEEK: - /* nothing to do */ - break; - case MMIOM_OPEN: - case MMIOM_READ: - case MMIOM_WRITE: - case MMIOM_WRITEFLUSH: - *lp1 = MapLS( (void *)*lp1 ); - break; - default: - TRACE("Not a mappable message (%ld)\n", wMsg); - } - return MMSYSERR_NOERROR; -} - -/**************************************************************** - * MMIO_UnMap32To16 [INTERNAL] + * send_message [INTERNAL] */ -static LRESULT MMIO_UnMap32To16(DWORD wMsg, LPARAM lParam1, LPARAM lParam2, - LPARAM lp1, LPARAM lp2) +static LRESULT send_message(struct IOProcList* ioProc, LPMMIOINFO mmioinfo, + DWORD wMsg, LPARAM lParam1, + LPARAM lParam2, enum mmioProcType type) { - switch (wMsg) { - case MMIOM_CLOSE: - case MMIOM_SEEK: - /* nothing to do */ - break; - case MMIOM_OPEN: - case MMIOM_READ: - case MMIOM_WRITE: - case MMIOM_WRITEFLUSH: - UnMapLS( lp1 ); - break; - default: - TRACE("Not a mappable message (%ld)\n", wMsg); - } - return MMSYSERR_NOERROR; -} - -/**************************************************************** - * MMIO_SendMessage [INTERNAL] - */ -static LRESULT MMIO_SendMessage(LPWINE_MMIO wm, DWORD wMsg, LPARAM lParam1, - LPARAM lParam2, enum mmioProcType type) -{ - MMIOINFO16 mmioInfo16; - LRESULT result; - SEGPTR segmmioInfo16; + LRESULT result = MMSYSERR_ERROR; LPARAM lp1 = lParam1, lp2 = lParam2; - if (!wm->ioProc || !wm->info.pIOProc) { + if (!ioProc) { ERR("brrr\n"); result = MMSYSERR_INVALPARAM; } - switch (wm->ioProc->type) { + switch (ioProc->type) { case MMIO_PROC_16: - memset( &mmioInfo16, 0, sizeof(MMIOINFO16)); - mmioInfo16.lDiskOffset = wm->info.lDiskOffset; - mmioInfo16.adwInfo[0] = wm->info.adwInfo[0]; - mmioInfo16.adwInfo[1] = wm->info.adwInfo[1]; - mmioInfo16.adwInfo[2] = wm->info.adwInfo[2]; - mmioInfo16.adwInfo[3] = wm->info.adwInfo[3]; - if (wm->ioProc->type != type) { - /* map (lParam1, lParam2) into (lp1, lp2) 32=>16 */ - if ((result = MMIO_Map32To16(wMsg, &lp1, &lp2)) != MMSYSERR_NOERROR) - return result; - } - /* FIXME: is wm->info.pIOProc a segmented or a linear address ? - * sounds to me it's a segmented one, should use a thunk somewhere - */ - segmmioInfo16 = MapLS( &mmioInfo16 ); - result = ((LPMMIOPROC16)wm->info.pIOProc)((LPSTR)segmmioInfo16, wMsg, lp1, lp2); - UnMapLS( segmmioInfo16 ); - if (wm->ioProc->type != type) { - MMIO_UnMap32To16(wMsg, lParam1, lParam2, lp1, lp2); - } - wm->info.lDiskOffset = mmioInfo16.lDiskOffset; - wm->info.adwInfo[0] = mmioInfo16.adwInfo[0]; - wm->info.adwInfo[1] = mmioInfo16.adwInfo[1]; - wm->info.adwInfo[2] = mmioInfo16.adwInfo[2]; - wm->info.adwInfo[3] = mmioInfo16.adwInfo[3]; - break; + { + LPWINE_MM_IDATA iData = MULTIMEDIA_GetIData(); + if (iData && iData->pFnMmioCallback16) + result = iData->pFnMmioCallback16((SEGPTR)ioProc->pIOProc, + mmioinfo, wMsg, lp1, lp2); + } + break; case MMIO_PROC_32A: case MMIO_PROC_32W: - if (wm->ioProc->type != type) { - /* map (lParam1, lParam2) into (lp1, lp2) 16=>32 */ - WARN("NIY\n"); + if (ioProc->type != type) { + /* map (lParam1, lParam2) into (lp1, lp2) 32 A<=>W */ + FIXME("NIY 32 A<=>W mapping\n"); } - result = (wm->info.pIOProc)((LPSTR)&wm->info, wMsg, lp1, lp2); + result = (ioProc->pIOProc)((LPSTR)mmioinfo, wMsg, lp1, lp2); #if 0 - if (wm->ioProc->type != type) { - /* unmap (lParam1, lParam2) into (lp1, lp2) 16=>32 */ + if (ioProc->type != type) { + /* unmap (lParam1, lParam2) into (lp1, lp2) 32 A<=>W */ } #endif break; default: FIXME("Internal error\n"); - result = MMSYSERR_ERROR; } return result; } /************************************************************************** - * MMIO_ParseExt [internal] + * MMIO_ParseExtA [internal] * * Parses a filename for the extension. * * RETURNS * The FOURCC code for the extension if found, else 0. */ -static FOURCC MMIO_ParseExt(LPCSTR szFileName) +static FOURCC MMIO_ParseExtA(LPCSTR szFileName) { /* Filenames are of the form file.ext+ABC FIXME: What if a '+' is part of the file name? @@ -476,7 +399,7 @@ /* Note that ext{Start,End} point to the . and + respectively */ LPSTR extEnd; - TRACE("(%s)\n",debugstr_a(szFileName)); + TRACE("(%s)\n", debugstr_a(szFileName)); if (!szFileName) return ret; @@ -497,7 +420,7 @@ if (extEnd - extStart - 1 > 4) WARN("Extension length > 4\n"); - lstrcpynA(ext,extStart + 1,min(extEnd-extStart,5)); + lstrcpynA(ext, extStart + 1, min(extEnd-extStart,5)); TRACE("Got extension: %s\n", debugstr_a(ext)); /* FOURCC codes identifying file-extensions must be uppercase */ ret = mmioStringToFOURCCA(ext, MMIO_TOUPPER); @@ -511,7 +434,7 @@ * * Retrieves the mmio object from current process */ -static LPWINE_MMIO MMIO_Get(LPWINE_MM_IDATA iData, HMMIO h) +LPWINE_MMIO MMIO_Get(LPWINE_MM_IDATA iData, HMMIO h) { LPWINE_MMIO wm = NULL; @@ -540,7 +463,8 @@ wm = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MMIO)); if (wm) { EnterCriticalSection(&iData->cs); - while (MMIO_Get(iData, HMMIO_32(++MMIO_counter))); + /* lookup next unallocated WORD handle, with a non NULL value */ + while (++MMIO_counter == 0 || MMIO_Get(iData, HMMIO_32(MMIO_counter))); wm->info.hmmio = HMMIO_32(MMIO_counter); wm->lpNext = iData->lpMMIO; iData->lpMMIO = wm; @@ -582,10 +506,11 @@ /* not quite sure what to do here, but I'll guess */ if (wm->info.dwFlags & MMIO_DIRTY) { /* FIXME: error handling */ - MMIO_SendMessage(wm, MMIOM_SEEK, wm->info.lBufOffset, - SEEK_SET, MMIO_PROC_32A); - MMIO_SendMessage(wm, MMIOM_WRITE, (LPARAM)wm->info.pchBuffer, - wm->info.pchNext - wm->info.pchBuffer, MMIO_PROC_32A); + send_message(wm->ioProc, &wm->info, MMIOM_SEEK, + wm->info.lBufOffset, SEEK_SET, MMIO_PROC_32A); + send_message(wm->ioProc, &wm->info, MMIOM_WRITE, + (LPARAM)wm->info.pchBuffer, + wm->info.pchNext - wm->info.pchBuffer, MMIO_PROC_32A); } if (uFlags & MMIO_EMPTYBUF) wm->info.pchNext = wm->info.pchEndRead = wm->info.pchBuffer; @@ -604,7 +529,7 @@ TRACE("bo=%lx do=%lx of=%lx\n", wm->info.lBufOffset, wm->info.lDiskOffset, - MMIO_SendMessage(wm, MMIOM_SEEK, 0, SEEK_CUR, MMIO_PROC_32A)); + send_message(wm->ioProc, &wm->info, MMIOM_SEEK, 0, SEEK_CUR, MMIO_PROC_32A)); wm->info.lBufOffset = wm->info.lDiskOffset; wm->info.pchNext = wm->info.pchBuffer; @@ -612,8 +537,8 @@ wm->info.pchEndWrite = wm->info.pchBuffer + wm->info.cchBuffer; if (for_read) { - size = MMIO_SendMessage(wm, MMIOM_READ, (LPARAM)wm->info.pchBuffer, - size, MMIO_PROC_32A); + size = send_message(wm->ioProc, &wm->info, MMIOM_READ, + (LPARAM)wm->info.pchBuffer, size, MMIO_PROC_32A); if (size > 0) wm->info.pchEndRead += size; } @@ -626,9 +551,9 @@ * MMIO_SetBuffer [INTERNAL] */ static MMRESULT MMIO_SetBuffer(WINE_MMIO* wm, void* pchBuffer, LONG cchBuffer, - UINT uFlags, BOOL bFrom32) + UINT uFlags) { - TRACE("(%p %p %ld %u %d)\n", wm, pchBuffer, cchBuffer, uFlags, bFrom32); + TRACE("(%p %p %ld %u)\n", wm, pchBuffer, cchBuffer, uFlags); if (uFlags) return MMSYSERR_INVALPARAM; if (cchBuffer > 0xFFFF) @@ -637,36 +562,32 @@ if (MMIO_Flush(wm, 0) != MMSYSERR_NOERROR) return MMIOERR_CANNOTWRITE; - if (wm->hMem && (wm->info.dwFlags & MMIO_ALLOCBUF)) { - GlobalUnlock16(wm->hMem); - GlobalFree16(wm->hMem); - wm->hMem = 0; + /* free previous buffer if allocated */ + if (wm->info.dwFlags & MMIO_ALLOCBUF) { + HeapFree(GetProcessHeap(), 0, wm->info.pchBuffer); + wm->info.pchBuffer = NULL; wm->info.dwFlags &= ~MMIO_ALLOCBUF; } + /* free segmented ptr mapping, if any */ + if (wm->info.dwReserved1 != 0L) + { + UnMapLS(wm->info.dwReserved1); + wm->info.dwReserved1 = 0L; + } + if (pchBuffer) { - if (bFrom32) { - wm->info.pchBuffer = pchBuffer; - wm->buffer16 = 0; - } else { - wm->info.pchBuffer = MapSL((SEGPTR)pchBuffer); - wm->buffer16 = (SEGPTR)pchBuffer; - } - wm->hMem = 0; + wm->info.pchBuffer = pchBuffer; } else if (cchBuffer) { - if (!(wm->hMem = GlobalAlloc16(GMEM_MOVEABLE, cchBuffer))) + if (!(wm->info.pchBuffer = HeapAlloc(GetProcessHeap(), 0, cchBuffer))) return MMIOERR_OUTOFMEMORY; wm->info.dwFlags |= MMIO_ALLOCBUF; } else { wm->info.pchBuffer = NULL; - wm->hMem = 0; - wm->buffer16 = 0; } - if (wm->hMem) { - wm->buffer16 = K32WOWGlobalLock16(wm->hMem); - wm->info.pchBuffer = MapSL(wm->buffer16); - } + if (wm->ioProc->type == MMIO_PROC_16) + wm->info.dwReserved1 = MapLS(wm->info.pchBuffer); wm->info.cchBuffer = cchBuffer; wm->info.pchNext = wm->info.pchBuffer; @@ -679,15 +600,26 @@ } /************************************************************************** - * MMIO_Open [internal] + * MMIO_Open [internal] */ -static HMMIO MMIO_Open(LPSTR szFileName, MMIOINFO* refmminfo, - DWORD dwOpenFlags, enum mmioProcType type) +HMMIO MMIO_Open(LPSTR szFileName, MMIOINFO* refmminfo, DWORD dwOpenFlags, + enum mmioProcType type) { LPWINE_MMIO wm; + MMIOINFO mmioinfo; TRACE("('%s', %p, %08lX, %d);\n", szFileName, refmminfo, dwOpenFlags, type); + if (!refmminfo) { + refmminfo = &mmioinfo; + + mmioinfo.fccIOProc = 0; + mmioinfo.pIOProc = NULL; + mmioinfo.pchBuffer = NULL; + mmioinfo.cchBuffer = 0; + type = MMIO_PROC_32A; + } + if (dwOpenFlags & (MMIO_PARSE|MMIO_EXIST)) { char buffer[MAX_PATH]; @@ -704,30 +636,26 @@ /* If both params are NULL, then parse the file name if available */ if (refmminfo->fccIOProc == 0 && refmminfo->pIOProc == NULL) { - wm->info.fccIOProc = MMIO_ParseExt(szFileName); + wm->info.fccIOProc = MMIO_ParseExtA(szFileName); /* Handle any unhandled/error case. Assume DOS file */ if (wm->info.fccIOProc == 0) wm->info.fccIOProc = FOURCC_DOS; if (!(wm->ioProc = MMIO_FindProcNode(wm->info.fccIOProc))) goto error2; - wm->info.pIOProc = wm->ioProc->pIOProc; wm->bTmpIOProc = FALSE; } /* if just the four character code is present, look up IO proc */ else if (refmminfo->pIOProc == NULL) { wm->info.fccIOProc = refmminfo->fccIOProc; if (!(wm->ioProc = MMIO_FindProcNode(wm->info.fccIOProc))) goto error2; - wm->info.pIOProc = wm->ioProc->pIOProc; wm->bTmpIOProc = FALSE; } /* if IO proc specified, use it and specified four character code */ else { wm->info.fccIOProc = refmminfo->fccIOProc; - wm->info.pIOProc = refmminfo->pIOProc; - MMIO_InstallIOProc(wm->info.fccIOProc, wm->info.pIOProc, - MMIO_INSTALLPROC, type); + MMIO_InstallIOProc(wm->info.fccIOProc, refmminfo->pIOProc, + MMIO_INSTALLPROC, type); if (!(wm->ioProc = MMIO_FindProcNode(wm->info.fccIOProc))) goto error2; assert(wm->ioProc->pIOProc == refmminfo->pIOProc); - wm->info.pIOProc = wm->ioProc->pIOProc; wm->bTmpIOProc = TRUE; } @@ -735,13 +663,10 @@ wm->ioProc->count++; if (dwOpenFlags & MMIO_ALLOCBUF) { - if ((refmminfo->wErrorRet = MMIO_SetBuffer(wm, NULL, MMIO_DEFAULTBUFFER, 0, - type != MMIO_PROC_16))) + if ((refmminfo->wErrorRet = MMIO_SetBuffer(wm, NULL, MMIO_DEFAULTBUFFER, 0))) goto error1; } else if (wm->info.fccIOProc == FOURCC_MEM) { - refmminfo->wErrorRet = MMIO_SetBuffer(wm, refmminfo->pchBuffer, - refmminfo->cchBuffer, 0, - type != MMIO_PROC_16); + refmminfo->wErrorRet = MMIO_SetBuffer(wm, refmminfo->pchBuffer, refmminfo->cchBuffer, 0); if (refmminfo->wErrorRet != MMSYSERR_NOERROR) goto error1; wm->bBufferLoaded = TRUE; @@ -752,8 +677,8 @@ wm->info.dwFlags = dwOpenFlags; /* call IO proc to actually open file */ - refmminfo->wErrorRet = MMIO_SendMessage(wm, MMIOM_OPEN, (LPARAM)szFileName, - type == MMIO_PROC_16, MMIO_PROC_32A); + refmminfo->wErrorRet = send_message(wm->ioProc, &wm->info, MMIOM_OPEN, + (LPARAM)szFileName, 0, MMIO_PROC_32A); /* grab file size, when possible */ wm->dwFileSize = GetFileSize(wm->info.adwInfo[0], NULL); @@ -776,18 +701,7 @@ HMMIO ret; LPSTR szFn = HEAP_strdupWtoA(GetProcessHeap(), 0, szFileName); - if (lpmmioinfo) { - ret = MMIO_Open(szFn, lpmmioinfo, dwOpenFlags, MMIO_PROC_32W); - } else { - MMIOINFO mmioinfo; - - mmioinfo.fccIOProc = 0; - mmioinfo.pIOProc = NULL; - mmioinfo.pchBuffer = NULL; - mmioinfo.cchBuffer = 0; - - ret = MMIO_Open(szFn, &mmioinfo, dwOpenFlags, MMIO_PROC_32W); - } + ret = MMIO_Open(szFn, lpmmioinfo, dwOpenFlags, MMIO_PROC_32W); HeapFree(GetProcessHeap(), 0, szFn); return ret; @@ -799,63 +713,10 @@ HMMIO WINAPI mmioOpenA(LPSTR szFileName, MMIOINFO* lpmmioinfo, DWORD dwOpenFlags) { - HMMIO ret; - - if (lpmmioinfo) { - ret = MMIO_Open(szFileName, lpmmioinfo, dwOpenFlags, MMIO_PROC_32A); - } else { - MMIOINFO mmioinfo; - - mmioinfo.fccIOProc = 0; - mmioinfo.pIOProc = NULL; - mmioinfo.pchBuffer = NULL; - mmioinfo.cchBuffer = 0; - - ret = MMIO_Open(szFileName, &mmioinfo, dwOpenFlags, MMIO_PROC_32A); - } - return ret; + return MMIO_Open(szFileName, lpmmioinfo, dwOpenFlags, MMIO_PROC_32A); } /************************************************************************** - * mmioOpen [MMSYSTEM.1210] - */ -HMMIO16 WINAPI mmioOpen16(LPSTR szFileName, MMIOINFO16* lpmmioinfo16, - DWORD dwOpenFlags) -{ - HMMIO ret; - MMIOINFO mmio; - - if (lpmmioinfo16) { - MMIOINFO mmioinfo; - - memset(&mmioinfo, 0, sizeof(mmioinfo)); - - mmioinfo.dwFlags = lpmmioinfo16->dwFlags; - mmioinfo.fccIOProc = lpmmioinfo16->fccIOProc; - mmioinfo.pIOProc = (LPMMIOPROC)lpmmioinfo16->pIOProc; - mmioinfo.cchBuffer = lpmmioinfo16->cchBuffer; - mmioinfo.pchBuffer = lpmmioinfo16->pchBuffer; - mmioinfo.adwInfo[0] = lpmmioinfo16->adwInfo[0]; - mmioinfo.adwInfo[1] = lpmmioinfo16->adwInfo[1]; - mmioinfo.adwInfo[2] = lpmmioinfo16->adwInfo[2]; - mmioinfo.adwInfo[3] = lpmmioinfo16->adwInfo[3]; - - ret = MMIO_Open(szFileName, &mmioinfo, dwOpenFlags, MMIO_PROC_16); - - mmioGetInfo16(HMMIO_16(mmioinfo.hmmio), lpmmioinfo16, 0); - lpmmioinfo16->wErrorRet = HMMIO_16(ret); - } else { - mmio.fccIOProc = 0; - mmio.pIOProc = NULL; - mmio.pchBuffer = NULL; - mmio.cchBuffer = 0; - ret = MMIO_Open(szFileName, &mmio, dwOpenFlags, FALSE); - } - return HMMIO_16(ret); -} - - -/************************************************************************** * mmioClose [WINMM.@] */ MMRESULT WINAPI mmioClose(HMMIO hmmio, UINT uFlags) @@ -871,15 +732,16 @@ if ((result = MMIO_Flush(wm, 0)) != MMSYSERR_NOERROR) return result; - result = MMIO_SendMessage(wm, MMIOM_CLOSE, uFlags, 0, MMIO_PROC_32A); + result = send_message(wm->ioProc, &wm->info, MMIOM_CLOSE, + uFlags, 0, MMIO_PROC_32A); - MMIO_SetBuffer(wm, NULL, 0, 0, TRUE); + MMIO_SetBuffer(wm, NULL, 0, 0); wm->ioProc->count--; if (wm->bTmpIOProc) - MMIO_InstallIOProc(wm->info.fccIOProc, NULL, - MMIO_REMOVEPROC, wm->ioProc->type); + MMIO_InstallIOProc(wm->info.fccIOProc, wm->ioProc->pIOProc, + MMIO_REMOVEPROC, wm->ioProc->type); MMIO_Destroy(wm); @@ -887,14 +749,6 @@ } /************************************************************************** - * mmioClose [MMSYSTEM.1211] - */ -MMRESULT16 WINAPI mmioClose16(HMMIO16 hmmio, UINT16 uFlags) -{ - return mmioClose(HMMIO_32(hmmio), uFlags); -} - -/************************************************************************** * mmioRead [WINMM.@] */ LONG WINAPI mmioRead(HMMIO hmmio, HPSTR pch, LONG cch) @@ -909,7 +763,8 @@ /* unbuffered case first */ if (!wm->info.pchBuffer) - return MMIO_SendMessage(wm, MMIOM_READ, (LPARAM)pch, cch, MMIO_PROC_32A); + return send_message(wm->ioProc, &wm->info, MMIOM_READ, + (LPARAM)pch, cch, MMIO_PROC_32A); /* first try from current buffer */ if (wm->info.pchNext != wm->info.pchEndRead) { @@ -944,14 +799,6 @@ } /************************************************************************** - * mmioRead [MMSYSTEM.1212] - */ -LONG WINAPI mmioRead16(HMMIO16 hmmio, HPSTR pch, LONG cch) -{ - return mmioRead(HMMIO_32(hmmio), pch, cch); -} - -/************************************************************************** * mmioWrite [WINMM.@] */ LONG WINAPI mmioWrite(HMMIO hmmio, HPCSTR pch, LONG cch) @@ -997,7 +844,8 @@ } count = bytesW; } else { - count = MMIO_SendMessage(wm, MMIOM_WRITE, (LPARAM)pch, cch, MMIO_PROC_32A); + count = send_message(wm->ioProc, &wm->info, MMIOM_WRITE, + (LPARAM)pch, cch, MMIO_PROC_32A); wm->info.lBufOffset = wm->info.lDiskOffset; } @@ -1006,14 +854,6 @@ } /************************************************************************** - * mmioWrite [MMSYSTEM.1213] - */ -LONG WINAPI mmioWrite16(HMMIO16 hmmio, HPCSTR pch, LONG cch) -{ - return mmioWrite(HMMIO_32(hmmio),pch,cch); -} - -/************************************************************************** * mmioSeek [WINMM.@] */ LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, INT iOrigin) @@ -1028,7 +868,8 @@ /* not buffered, direct seek on file */ if (!wm->info.pchBuffer) - return MMIO_SendMessage(wm, MMIOM_SEEK, lOffset, iOrigin, MMIO_PROC_32A); + return send_message(wm->ioProc, &wm->info, MMIOM_SEEK, + lOffset, iOrigin, MMIO_PROC_32A); switch (iOrigin) { case SEEK_SET: @@ -1065,9 +906,9 @@ if ((wm->info.fccIOProc == FOURCC_MEM) || MMIO_Flush(wm, 0) != MMSYSERR_NOERROR || /* this also sets the wm->info.lDiskOffset field */ - MMIO_SendMessage(wm, MMIOM_SEEK, - (offset / wm->info.cchBuffer) * wm->info.cchBuffer, - SEEK_SET, MMIO_PROC_32A) == -1) + send_message(wm->ioProc, &wm->info, MMIOM_SEEK, + (offset / wm->info.cchBuffer) * wm->info.cchBuffer, + SEEK_SET, MMIO_PROC_32A) == -1) return -1; MMIO_GrabNextBuffer(wm, TRUE); } @@ -1079,52 +920,6 @@ } /************************************************************************** - * mmioSeek [MMSYSTEM.1214] - */ -LONG WINAPI mmioSeek16(HMMIO16 hmmio, LONG lOffset, INT16 iOrigin) -{ - return mmioSeek(HMMIO_32(hmmio), lOffset, iOrigin); -} - -/************************************************************************** - * mmioGetInfo [MMSYSTEM.1215] - */ -MMRESULT16 WINAPI mmioGetInfo16(HMMIO16 hmmio, MMIOINFO16* lpmmioinfo, UINT16 uFlags) -{ - LPWINE_MMIO wm; - - TRACE("(0x%04x,%p,0x%08x)\n",hmmio,lpmmioinfo,uFlags); - - if ((wm = MMIO_Get(NULL, HMMIO_32(hmmio))) == NULL) - return MMSYSERR_INVALHANDLE; - - if (!wm->buffer16) - return MMSYSERR_ERROR; - - lpmmioinfo->dwFlags = wm->info.dwFlags; - lpmmioinfo->fccIOProc = wm->info.fccIOProc; - lpmmioinfo->pIOProc = (LPMMIOPROC16)wm->info.pIOProc; - lpmmioinfo->wErrorRet = wm->info.wErrorRet; - lpmmioinfo->hTask = wm->info.hTask; - lpmmioinfo->cchBuffer = wm->info.cchBuffer; - lpmmioinfo->pchBuffer = (void*)wm->buffer16; - lpmmioinfo->pchNext = (void*)(wm->buffer16 + (wm->info.pchNext - wm->info.pchBuffer)); - lpmmioinfo->pchEndRead = (void*)(wm->buffer16 + (wm->info.pchEndRead - wm->info.pchBuffer)); - lpmmioinfo->pchEndWrite = (void*)(wm->buffer16 + (wm->info.pchEndWrite - wm->info.pchBuffer)); - lpmmioinfo->lBufOffset = wm->info.lBufOffset; - lpmmioinfo->lDiskOffset = wm->info.lDiskOffset; - lpmmioinfo->adwInfo[0] = wm->info.adwInfo[0]; - lpmmioinfo->adwInfo[1] = wm->info.adwInfo[1]; - lpmmioinfo->adwInfo[2] = wm->info.adwInfo[2]; - lpmmioinfo->adwInfo[3] = wm->info.adwInfo[3]; - lpmmioinfo->dwReserved1 = 0; - lpmmioinfo->dwReserved2 = 0; - lpmmioinfo->hmmio = HMMIO_16(wm->info.hmmio); - - return MMSYSERR_NOERROR; -} - -/************************************************************************** * mmioGetInfo [WINMM.@] */ MMRESULT WINAPI mmioGetInfo(HMMIO hmmio, MMIOINFO* lpmmioinfo, UINT uFlags) @@ -1137,39 +932,9 @@ return MMSYSERR_INVALHANDLE; memcpy(lpmmioinfo, &wm->info, sizeof(MMIOINFO)); - - return MMSYSERR_NOERROR; -} - -/************************************************************************** - * mmioSetInfo [MMSYSTEM.1216] - */ -MMRESULT16 WINAPI mmioSetInfo16(HMMIO16 hmmio, const MMIOINFO16* lpmmioinfo, UINT16 uFlags) -{ - LPWINE_MMIO wm; - - TRACE("(0x%04x,%p,0x%08x)\n",hmmio,lpmmioinfo,uFlags); - - if ((wm = MMIO_Get(NULL, HMMIO_32(hmmio))) == NULL) - return MMSYSERR_INVALHANDLE; - - /* check if seg and lin buffers are the same */ - if (wm->info.cchBuffer != lpmmioinfo->cchBuffer || - wm->info.pchBuffer != MapSL(wm->buffer16)) - return MMSYSERR_INVALPARAM; - - /* check pointers coherence */ - if (lpmmioinfo->pchNext < lpmmioinfo->pchBuffer || - lpmmioinfo->pchNext > lpmmioinfo->pchBuffer + lpmmioinfo->cchBuffer || - lpmmioinfo->pchEndRead < lpmmioinfo->pchBuffer || - lpmmioinfo->pchEndRead > lpmmioinfo->pchBuffer + lpmmioinfo->cchBuffer || - lpmmioinfo->pchEndWrite < lpmmioinfo->pchBuffer || - lpmmioinfo->pchEndWrite > lpmmioinfo->pchBuffer + lpmmioinfo->cchBuffer) - return MMSYSERR_INVALPARAM; - - wm->info.pchNext = wm->info.pchBuffer + (lpmmioinfo->pchNext - lpmmioinfo->pchBuffer); - wm->info.pchEndRead = wm->info.pchBuffer + (lpmmioinfo->pchEndRead - lpmmioinfo->pchBuffer); - wm->info.pchEndWrite = wm->info.pchBuffer + (lpmmioinfo->pchEndWrite - lpmmioinfo->pchBuffer); + /* don't expose 16 bit ioproc:s */ + if (wm->ioProc->type != MMIO_PROC_16) + lpmmioinfo->pIOProc = wm->ioProc->pIOProc; return MMSYSERR_NOERROR; } @@ -1214,24 +979,7 @@ if ((wm = MMIO_Get(NULL, hmmio)) == NULL) return MMSYSERR_INVALHANDLE; - return MMIO_SetBuffer(wm, pchBuffer, cchBuffer, uFlags, TRUE); -} - -/************************************************************************** - * mmioSetBuffer [MMSYSTEM.1217] - */ -MMRESULT16 WINAPI mmioSetBuffer16(HMMIO16 hmmio, LPSTR segpchBuffer, - LONG cchBuffer, UINT16 uFlags) -{ - LPWINE_MMIO wm; - - TRACE("(hmmio=%04x, segpchBuf=%p, cchBuf=%ld, uFlags=%#08x)\n", - hmmio, segpchBuffer, cchBuffer, uFlags); - - if ((wm = MMIO_Get(NULL, HMMIO_32(hmmio))) == NULL) - return MMSYSERR_INVALHANDLE; - - return MMIO_SetBuffer(wm, segpchBuffer, cchBuffer, uFlags, FALSE); + return MMIO_SetBuffer(wm, pchBuffer, cchBuffer, uFlags); } /************************************************************************** @@ -1250,14 +998,6 @@ } /************************************************************************** - * mmioFlush [MMSYSTEM.1218] - */ -MMRESULT16 WINAPI mmioFlush16(HMMIO16 hmmio, UINT16 uFlags) -{ - return mmioFlush(HMMIO_32(hmmio), uFlags); -} - -/************************************************************************** * mmioAdvance [WINMM.@] */ MMRESULT WINAPI mmioAdvance(HMMIO hmmio, MMIOINFO* lpmmioinfo, UINT uFlags) @@ -1266,6 +1006,9 @@ TRACE("hmmio=%04X, lpmmioinfo=%p, uFlags=%04X\n", hmmio, lpmmioinfo, uFlags); + /* NOTE: mmioAdvance16 heavily relies on parameters from lpmmioinfo we're using + * here. be sure if you change something here to check mmioAdvance16 as well + */ if ((wm = MMIO_Get(NULL, hmmio)) == NULL) return MMSYSERR_INVALHANDLE; @@ -1277,16 +1020,19 @@ if (uFlags == MMIO_WRITE && (lpmmioinfo->dwFlags & MMIO_DIRTY)) { - MMIO_SendMessage(wm, MMIOM_SEEK, lpmmioinfo->lBufOffset, SEEK_SET, MMIO_PROC_32A); - MMIO_SendMessage(wm, MMIOM_WRITE, (LPARAM)lpmmioinfo->pchBuffer, - lpmmioinfo->pchNext - lpmmioinfo->pchBuffer, MMIO_PROC_32A); + send_message(wm->ioProc, &wm->info, MMIOM_SEEK, + lpmmioinfo->lBufOffset, SEEK_SET, MMIO_PROC_32A); + send_message(wm->ioProc, &wm->info, MMIOM_WRITE, + (LPARAM)lpmmioinfo->pchBuffer, + lpmmioinfo->pchNext - lpmmioinfo->pchBuffer, MMIO_PROC_32A); lpmmioinfo->dwFlags &= ~MMIO_DIRTY; } if (MMIO_Flush(wm, 0) != MMSYSERR_NOERROR) return MMIOERR_CANNOTWRITE; if (lpmmioinfo) { - wm->dwFileSize = max(wm->dwFileSize, lpmmioinfo->lBufOffset + (lpmmioinfo->pchNext - lpmmioinfo->pchBuffer)); + wm->dwFileSize = max(wm->dwFileSize, lpmmioinfo->lBufOffset + + (lpmmioinfo->pchNext - lpmmioinfo->pchBuffer)); } MMIO_GrabNextBuffer(wm, uFlags == MMIO_READ); @@ -1302,40 +1048,6 @@ return MMSYSERR_NOERROR; } -/*********************************************************************** - * mmioAdvance [MMSYSTEM.1219] - */ -MMRESULT16 WINAPI mmioAdvance16(HMMIO16 hmmio, MMIOINFO16* lpmmioinfo, UINT16 uFlags) -{ - LPWINE_MMIO wm; - - TRACE("hmmio=%04X, lpmmioinfo=%p, uFlags=%04X\n", hmmio, lpmmioinfo, uFlags); - - if ((wm = MMIO_Get(NULL, HMMIO_32(hmmio))) == NULL) - return MMSYSERR_INVALHANDLE; - - if (!wm->info.cchBuffer) - return MMIOERR_UNBUFFERED; - - if (uFlags != MMIO_READ && uFlags != MMIO_WRITE) - return MMSYSERR_INVALPARAM; - - if (MMIO_Flush(wm, 0) != MMSYSERR_NOERROR) - return MMIOERR_CANNOTWRITE; - - MMIO_GrabNextBuffer(wm, uFlags == MMIO_READ); - - lpmmioinfo->pchNext = lpmmioinfo->pchBuffer; - lpmmioinfo->pchEndRead = lpmmioinfo->pchBuffer + - (wm->info.pchEndRead - wm->info.pchBuffer); - lpmmioinfo->pchEndWrite = lpmmioinfo->pchBuffer + - (wm->info.pchEndWrite - wm->info.pchBuffer); - lpmmioinfo->lDiskOffset = wm->info.lDiskOffset; - lpmmioinfo->lBufOffset = wm->info.lBufOffset; - - return MMSYSERR_NOERROR; -} - /************************************************************************** * mmioStringToFOURCCA [WINMM.@] */ @@ -1372,24 +1084,6 @@ } /************************************************************************** - * mmioStringToFOURCC [MMSYSTEM.1220] - */ -FOURCC WINAPI mmioStringToFOURCC16(LPCSTR sz, UINT16 uFlags) -{ - return mmioStringToFOURCCA(sz, uFlags); -} - -/************************************************************************** - * mmioInstallIOProc [MMSYSTEM.1221] - */ -LPMMIOPROC16 WINAPI mmioInstallIOProc16(FOURCC fccIOProc, LPMMIOPROC16 pIOProc, - DWORD dwFlags) -{ - return (LPMMIOPROC16)MMIO_InstallIOProc(fccIOProc, (LPMMIOPROC)pIOProc, - dwFlags, MMIO_PROC_16); -} - -/************************************************************************** * mmioInstallIOProcA [WINMM.@] */ LPMMIOPROC WINAPI mmioInstallIOProcA(FOURCC fccIOProc, @@ -1407,23 +1101,25 @@ return MMIO_InstallIOProc(fccIOProc, pIOProc, dwFlags, MMIO_PROC_32W); } -/************************************************************************** - * mmioSendMessage [MMSYSTEM.1222] +/****************************************************************** + * MMIO_SendMessage + * + * */ -LRESULT WINAPI mmioSendMessage16(HMMIO16 hmmio, UINT16 uMessage, - LPARAM lParam1, LPARAM lParam2) +LRESULT MMIO_SendMessage(HMMIO hmmio, UINT uMessage, LPARAM lParam1, + LPARAM lParam2, enum mmioProcType type) { LPWINE_MMIO wm; - TRACE("(%04X, %u, %ld, %ld)\n", hmmio, uMessage, lParam1, lParam2); + TRACE("(%04X, %u, %ld, %ld, %d)\n", hmmio, uMessage, lParam1, lParam2, type); if (uMessage < MMIOM_USER) return MMSYSERR_INVALPARAM; - if ((wm = MMIO_Get(NULL, HMMIO_32(hmmio))) == NULL) + if ((wm = MMIO_Get(NULL, hmmio)) == NULL) return MMSYSERR_INVALHANDLE; - return MMIO_SendMessage(wm, uMessage, lParam1, lParam2, MMIO_PROC_16); + return send_message(wm->ioProc, &wm->info, uMessage, lParam1, lParam2, type); } /************************************************************************** @@ -1432,17 +1128,7 @@ LRESULT WINAPI mmioSendMessage(HMMIO hmmio, UINT uMessage, LPARAM lParam1, LPARAM lParam2) { - LPWINE_MMIO wm; - - TRACE("(%04X, %u, %ld, %ld)\n", hmmio, uMessage, lParam1, lParam2); - - if (uMessage < MMIOM_USER) - return MMSYSERR_INVALPARAM; - - if ((wm = MMIO_Get(NULL, hmmio)) == NULL) - return MMSYSERR_INVALHANDLE; - - return MMIO_SendMessage(wm, uMessage, lParam1, lParam2, MMIO_PROC_32A); + return MMIO_SendMessage(hmmio, uMessage, lParam1, lParam2, MMIO_PROC_32A); } /************************************************************************** @@ -1550,15 +1236,6 @@ } /************************************************************************** - * mmioDescend [MMSYSTEM.1223] - */ -MMRESULT16 WINAPI mmioDescend16(HMMIO16 hmmio, LPMMCKINFO lpck, - const MMCKINFO* lpckParent, UINT16 uFlags) -{ - return mmioDescend(HMMIO_32(hmmio), lpck, lpckParent, uFlags); -} - -/************************************************************************** * mmioAscend [WINMM.@] */ MMRESULT WINAPI mmioAscend(HMMIO hmmio, LPMMCKINFO lpck, UINT uFlags) @@ -1593,14 +1270,6 @@ } /************************************************************************** - * mmioAscend [MMSYSTEM.1224] - */ -MMRESULT16 WINAPI mmioAscend16(HMMIO16 hmmio, MMCKINFO* lpck, UINT16 uFlags) -{ - return mmioAscend(HMMIO_32(hmmio),lpck,uFlags); -} - -/************************************************************************** * mmioCreateChunk [WINMM.@] */ MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio, MMCKINFO* lpck, UINT uFlags) @@ -1640,93 +1309,52 @@ } /************************************************************************** - * mmioCreateChunk [MMSYSTEM.1225] - */ -MMRESULT16 WINAPI mmioCreateChunk16(HMMIO16 hmmio, MMCKINFO* lpck, UINT16 uFlags) -{ - return mmioCreateChunk(HMMIO_32(hmmio), lpck, uFlags); -} - -/************************************************************************** - * mmioRename [MMSYSTEM.1226] - */ -MMRESULT16 WINAPI mmioRename16(LPCSTR szFileName, LPCSTR szNewFileName, - MMIOINFO16* lpmmioinfo, DWORD dwRenameFlags) -{ - UINT16 result = MMSYSERR_ERROR; - LPMMIOPROC16 ioProc; - - TRACE("('%s', '%s', %p, %08lX);\n", - szFileName, szNewFileName, lpmmioinfo, dwRenameFlags); - - /* If both params are NULL, then parse the file name */ - if (lpmmioinfo && lpmmioinfo->fccIOProc == 0 && lpmmioinfo->pIOProc == NULL) - lpmmioinfo->fccIOProc = MMIO_ParseExt(szFileName); - - /* Handle any unhandled/error case from above. Assume DOS file */ - if (!lpmmioinfo || (lpmmioinfo->fccIOProc == 0 && lpmmioinfo->pIOProc == NULL)) - ioProc = (LPMMIOPROC16)mmioDosIOProc; - /* if just the four character code is present, look up IO proc */ - else if (lpmmioinfo->pIOProc == NULL) - ioProc = mmioInstallIOProc16(lpmmioinfo->fccIOProc, NULL, MMIO_FINDPROC); - else - ioProc = lpmmioinfo->pIOProc; - - /* FIXME: ioProc is likely a segmented address, thus needing a - * thunk somewhere. The main issue is that Wine's current thunking - * 32 to 16 only supports pascal calling convention - */ - if (ioProc) - result = (ioProc)(0, MMIOM_RENAME, - (LPARAM)szFileName, (LPARAM)szNewFileName); - - return result; -} - -/************************************************************************** * mmioRenameA [WINMM.@] */ MMRESULT WINAPI mmioRenameA(LPCSTR szFileName, LPCSTR szNewFileName, - MMIOINFO* lpmmioinfo, DWORD dwRenameFlags) + MMIOINFO* lpmmioinfo, DWORD dwFlags) { - UINT result = MMSYSERR_ERROR; - LPMMIOPROC ioProc; + struct IOProcList* ioProc = NULL; + struct IOProcList tmp; TRACE("('%s', '%s', %p, %08lX);\n", - szFileName, szNewFileName, lpmmioinfo, dwRenameFlags); + debugstr_a(szFileName), debugstr_a(szNewFileName), lpmmioinfo, dwFlags); /* If both params are NULL, then parse the file name */ if (lpmmioinfo && lpmmioinfo->fccIOProc == 0 && lpmmioinfo->pIOProc == NULL) - lpmmioinfo->fccIOProc = MMIO_ParseExt(szFileName); + lpmmioinfo->fccIOProc = MMIO_ParseExtA(szFileName); /* Handle any unhandled/error case from above. Assume DOS file */ if (!lpmmioinfo || (lpmmioinfo->fccIOProc == 0 && lpmmioinfo->pIOProc == NULL)) - ioProc = (LPMMIOPROC)mmioDosIOProc; + ioProc = MMIO_FindProcNode(FOURCC_DOS); /* if just the four character code is present, look up IO proc */ else if (lpmmioinfo->pIOProc == NULL) - ioProc = MMIO_InstallIOProc(lpmmioinfo->fccIOProc, NULL, - MMIO_FINDPROC, MMIO_PROC_32A); + ioProc = MMIO_FindProcNode(lpmmioinfo->fccIOProc); else /* use relevant ioProc */ - ioProc = lpmmioinfo->pIOProc; - - if (ioProc) - result = (ioProc)(0, MMIOM_RENAME, - (LPARAM)szFileName, (LPARAM)szNewFileName); + { + ioProc = &tmp; + tmp.fourCC = lpmmioinfo->fccIOProc; + tmp.pIOProc = lpmmioinfo->pIOProc; + tmp.type = MMIO_PROC_32A; + tmp.count = 1; + } - return result; + return send_message(ioProc, lpmmioinfo, MMIOM_RENAME, + (LPARAM)szFileName, (LPARAM)szNewFileName, MMIO_PROC_32A); } /************************************************************************** * mmioRenameW [WINMM.@] */ MMRESULT WINAPI mmioRenameW(LPCWSTR szFileName, LPCWSTR szNewFileName, - MMIOINFO* lpmmioinfo, DWORD dwRenameFlags) + MMIOINFO* lpmmioinfo, DWORD dwFlags) { LPSTR szFn = HEAP_strdupWtoA(GetProcessHeap(), 0, szFileName); LPSTR sznFn = HEAP_strdupWtoA(GetProcessHeap(), 0, szNewFileName); - UINT ret = mmioRenameA(szFn, sznFn, lpmmioinfo, dwRenameFlags); + UINT ret = mmioRenameA(szFn, sznFn, lpmmioinfo, dwFlags); HeapFree(GetProcessHeap(),0,szFn); HeapFree(GetProcessHeap(),0,sznFn); return ret; } + Index: dlls/winmm/mmsystem.c =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/dlls/winmm/mmsystem.c,v retrieving revision 1.72 diff -u -u -r1.72 mmsystem.c --- dlls/winmm/mmsystem.c 10 Oct 2002 23:28:22 -0000 1.72 +++ dlls/winmm/mmsystem.c 20 Oct 2002 09:30:53 -0000 @@ -44,6 +44,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(mmsys); +/* ### start build ### */ +extern LONG CALLBACK MMSYSTEM_CallTo16_long_l (FARPROC16,LONG); +extern LONG CALLBACK MMSYSTEM_CallTo16_long_lwll (LPMMIOPROC16,LONG,WORD,LONG,LONG); +/* ### stop build ### */ + +static LRESULT CALLBACK mmioCallback16(SEGPTR cb16, + LPMMIOINFO lpmmioinfo, UINT uMessage, + LPARAM lParam1, LPARAM lParam2); + +/* ################################################### + * # LIBRARY # + * ################################################### + */ + /************************************************************************** * DllEntryPoint (MMSYSTEM.2046) * @@ -73,6 +87,7 @@ iData = MULTIMEDIA_GetIData(); iData->hWinMM16Instance = hinstDLL; iData->h16Module32 = hndl; + iData->pFnMmioCallback16 = mmioCallback16; break; case DLL_PROCESS_DETACH: iData = MULTIMEDIA_GetIData(); @@ -95,6 +110,11 @@ return TRUE; } +/* ################################################### + * # PlaySound # + * ################################################### + */ + /************************************************************************** * PlaySound [MMSYSTEM.3] */ @@ -125,6 +145,11 @@ return retv; } +/* ################################################### + * # MISC # + * ################################################### + */ + /************************************************************************** * mmsystemGetVersion [MMSYSTEM.5] * @@ -145,6 +170,20 @@ } /************************************************************************** + * OutputDebugStr [MMSYSTEM.30] + */ +void WINAPI OutputDebugStr16(LPCSTR str) +{ + OutputDebugStringA( str ); +} + + +/* ################################################### + * # MIXER # + * ################################################### + */ + +/************************************************************************** * Mixer devices. New to Win95 */ @@ -386,6 +425,11 @@ return MMDRV_GetNum(MMDRV_AUX); } +/* ################################################### + * # AUX # + * ################################################### + */ + /************************************************************************** * auxGetDevCaps [MMSYSTEM.351] */ @@ -457,6 +501,11 @@ return MMDRV_Message(wmld, uMessage, dw1, dw2, TRUE); } +/* ################################################### + * # MCI # + * ################################################### + */ + /************************************************************************** * mciGetErrorString [MMSYSTEM.706] */ @@ -604,6 +653,11 @@ return ret; } +/* ################################################### + * # MIDI # + * ################################################### + */ + /************************************************************************** * midiOutGetNumDevs [MMSYSTEM.201] */ @@ -1103,6 +1157,11 @@ return midiStreamStop(HMIDISTRM_32(hMidiStrm)); } +/* ################################################### + * # WAVE # + * ################################################### + */ + /************************************************************************** * waveOutGetNumDevs [MMSYSTEM.401] */ @@ -1635,6 +1694,11 @@ return MMDRV_Message(wmld, uMessage, dwParam1, dwParam2, TRUE); } +/* ################################################### + * # TASK # + * ################################################### + */ + /*#define USE_MM_TSK_WINE*/ /************************************************************************** @@ -2013,10 +2077,6 @@ return ret; } -/* ### start build ### */ -extern LONG CALLBACK MMSYSTEM_CallTo16_long_l (FARPROC16,LONG); -/* ### stop build ### */ - /************************************************************************** * __wine_mmThreadEntryPoint (MMSYSTEM.2047) */ @@ -2107,17 +2167,13 @@ */ void WINAPI WMMMidiRunOnce16(void) { - FIXME("(), stub!\n"); + FIXME("(), stub!\n"); } -/************************************************************************** - * OutputDebugStr [MMSYSTEM.30] +/* ################################################### + * # DRIVER # + * ################################################### */ -void WINAPI OutputDebugStr16( - LPCSTR str) /* [in] The message to be logged and given to the debugger. */ -{ - OutputDebugStringA( str ); -} /************************************************************************** * DrvOpen [MMSYSTEM.1100] @@ -2173,6 +2229,11 @@ return DrvDefDriverProc16(dwDevID, hDrv, wMsg, dwParam1, dwParam2); } +/* ################################################### + * # TIME # + * ################################################### + */ + /************************************************************************** * timeGetSystemTime [MMSYSTEM.601] */ @@ -2276,3 +2337,406 @@ return mciFreeCommandResource(uTable); } + +/* ################################################### + * # MMIO # + * ################################################### + */ + +/**************************************************************** + * MMIO_Map32To16 [INTERNAL] + */ +static LRESULT MMIO_Map32To16(DWORD wMsg, LPARAM* lp1, LPARAM* lp2) +{ + switch (wMsg) { + case MMIOM_CLOSE: + case MMIOM_SEEK: + /* nothing to do */ + break; + case MMIOM_OPEN: + case MMIOM_READ: + case MMIOM_WRITE: + case MMIOM_WRITEFLUSH: + *lp1 = MapLS( (void *)*lp1 ); + break; + case MMIOM_RENAME: + *lp1 = MapLS( (void *)*lp1 ); + *lp2 = MapLS( (void *)*lp2 ); + break; + default: + if (wMsg < MMIOM_USER) + TRACE("Not a mappable message (%ld)\n", wMsg); + } + return MMSYSERR_NOERROR; +} + +/**************************************************************** + * MMIO_UnMap32To16 [INTERNAL] + */ +static LRESULT MMIO_UnMap32To16(DWORD wMsg, LPARAM lParam1, LPARAM lParam2, + LPARAM lp1, LPARAM lp2) +{ + switch (wMsg) { + case MMIOM_CLOSE: + case MMIOM_SEEK: + /* nothing to do */ + break; + case MMIOM_OPEN: + case MMIOM_READ: + case MMIOM_WRITE: + case MMIOM_WRITEFLUSH: + UnMapLS( lp1 ); + break; + case MMIOM_RENAME: + UnMapLS( lp1 ); + UnMapLS( lp2 ); + break; + default: + if (wMsg < MMIOM_USER) + TRACE("Not a mappable message (%ld)\n", wMsg); + } + return MMSYSERR_NOERROR; +} + +/****************************************************************** + * mmioCallback16 + * + * + */ +static LRESULT CALLBACK mmioCallback16(SEGPTR cb16, + LPMMIOINFO lpmmioinfo, UINT uMessage, + LPARAM lParam1, LPARAM lParam2) +{ + LRESULT result; + MMIOINFO16 mmioInfo16; + SEGPTR segmmioInfo16; + LPARAM lp1 = lParam1, lp2 = lParam2; + + memset(&mmioInfo16, 0, sizeof(MMIOINFO16)); + mmioInfo16.lDiskOffset = lpmmioinfo->lDiskOffset; + mmioInfo16.adwInfo[0] = lpmmioinfo->adwInfo[0]; + mmioInfo16.adwInfo[1] = lpmmioinfo->adwInfo[1]; + mmioInfo16.adwInfo[2] = lpmmioinfo->adwInfo[2]; + mmioInfo16.adwInfo[3] = lpmmioinfo->adwInfo[3]; + /* map (lParam1, lParam2) into (lp1, lp2) 32=>16 */ + if ((result = MMIO_Map32To16(uMessage, &lp1, &lp2)) != MMSYSERR_NOERROR) + return result; + + segmmioInfo16 = MapLS(&mmioInfo16); + + result = MMSYSTEM_CallTo16_long_lwll((LPMMIOPROC16)cb16, segmmioInfo16, uMessage, lp1, lp2); + UnMapLS(segmmioInfo16); + MMIO_UnMap32To16(uMessage, lParam1, lParam2, lp1, lp2); + + lpmmioinfo->lDiskOffset = mmioInfo16.lDiskOffset; + lpmmioinfo->adwInfo[0] = mmioInfo16.adwInfo[0]; + lpmmioinfo->adwInfo[1] = mmioInfo16.adwInfo[1]; + lpmmioinfo->adwInfo[2] = mmioInfo16.adwInfo[2]; + lpmmioinfo->adwInfo[3] = mmioInfo16.adwInfo[3]; + + return result; +} + +/****************************************************************** + * MMIO_ResetSegmentedData + * + * + * + */ +static LRESULT MMIO_SetSegmentedBuffer(HMMIO hmmio, SEGPTR ptr) +{ + LPWINE_MMIO wm; + + if ((wm = MMIO_Get(NULL, hmmio)) == NULL) + return MMSYSERR_INVALHANDLE; + wm->segBuffer16 = ptr; + return MMSYSERR_NOERROR; +} + +/************************************************************************** + * mmioOpen [MMSYSTEM.1210] + */ +HMMIO16 WINAPI mmioOpen16(LPSTR szFileName, MMIOINFO16* lpmmioinfo16, + DWORD dwOpenFlags) +{ + HMMIO ret; + + if (lpmmioinfo16) { + MMIOINFO mmioinfo; + + memset(&mmioinfo, 0, sizeof(mmioinfo)); + + mmioinfo.dwFlags = lpmmioinfo16->dwFlags; + mmioinfo.fccIOProc = lpmmioinfo16->fccIOProc; + mmioinfo.pIOProc = (LPMMIOPROC)lpmmioinfo16->pIOProc; + mmioinfo.cchBuffer = lpmmioinfo16->cchBuffer; + mmioinfo.pchBuffer = MapSL((DWORD)lpmmioinfo16->pchBuffer); + mmioinfo.adwInfo[0] = lpmmioinfo16->adwInfo[0]; + mmioinfo.adwInfo[1] = lpmmioinfo16->adwInfo[1]; + mmioinfo.adwInfo[2] = lpmmioinfo16->adwInfo[2]; + mmioinfo.adwInfo[3] = lpmmioinfo16->adwInfo[3]; + + ret = MMIO_Open(szFileName, &mmioinfo, dwOpenFlags, MMIO_PROC_16); + MMIO_SetSegmentedBuffer(mmioinfo.hmmio, (SEGPTR)lpmmioinfo16->pchBuffer); + + lpmmioinfo16->wErrorRet = mmioinfo.wErrorRet; + lpmmioinfo16->hmmio = HMMIO_16(mmioinfo.hmmio); + } else { + ret = MMIO_Open(szFileName, NULL, dwOpenFlags, MMIO_PROC_32A); + } + return HMMIO_16(ret); +} + +/************************************************************************** + * mmioClose [MMSYSTEM.1211] + */ +MMRESULT16 WINAPI mmioClose16(HMMIO16 hmmio, UINT16 uFlags) +{ + return mmioClose(HMMIO_32(hmmio), uFlags); +} + +/************************************************************************** + * mmioRead [MMSYSTEM.1212] + */ +LONG WINAPI mmioRead16(HMMIO16 hmmio, HPSTR pch, LONG cch) +{ + return mmioRead(HMMIO_32(hmmio), pch, cch); +} + +/************************************************************************** + * mmioWrite [MMSYSTEM.1213] + */ +LONG WINAPI mmioWrite16(HMMIO16 hmmio, HPCSTR pch, LONG cch) +{ + return mmioWrite(HMMIO_32(hmmio),pch,cch); +} + +/************************************************************************** + * mmioSeek [MMSYSTEM.1214] + */ +LONG WINAPI mmioSeek16(HMMIO16 hmmio, LONG lOffset, INT16 iOrigin) +{ + return mmioSeek(HMMIO_32(hmmio), lOffset, iOrigin); +} + +/************************************************************************** + * mmioGetInfo [MMSYSTEM.1215] + */ +MMRESULT16 WINAPI mmioGetInfo16(HMMIO16 hmmio, MMIOINFO16* lpmmioinfo, UINT16 uFlags) +{ + MMIOINFO mmioinfo; + MMRESULT ret; + LPWINE_MMIO wm; + + TRACE("(0x%04x,%p,0x%08x)\n", hmmio, lpmmioinfo, uFlags); + + if ((wm = MMIO_Get(NULL, hmmio)) == NULL) + return MMSYSERR_INVALHANDLE; + + ret = mmioGetInfo(HMMIO_32(hmmio), &mmioinfo, uFlags); + if (ret != MMSYSERR_NOERROR) return ret; + + lpmmioinfo->dwFlags = mmioinfo.dwFlags; + lpmmioinfo->fccIOProc = mmioinfo.fccIOProc; + lpmmioinfo->pIOProc = (wm->ioProc->type == MMIO_PROC_16) ? + (LPMMIOPROC16)wm->ioProc->pIOProc : NULL; + lpmmioinfo->wErrorRet = mmioinfo.wErrorRet; + lpmmioinfo->hTask = mmioinfo.hTask; + lpmmioinfo->cchBuffer = mmioinfo.cchBuffer; + lpmmioinfo->pchBuffer = (void*)wm->segBuffer16; + lpmmioinfo->pchNext = (void*)(wm->segBuffer16 + (mmioinfo.pchNext - mmioinfo.pchBuffer)); + lpmmioinfo->pchEndRead = (void*)(wm->segBuffer16 + (mmioinfo.pchEndRead - mmioinfo.pchBuffer)); + lpmmioinfo->pchEndWrite = (void*)(wm->segBuffer16 + (mmioinfo.pchEndWrite - mmioinfo.pchBuffer)); + lpmmioinfo->lBufOffset = mmioinfo.lBufOffset; + lpmmioinfo->lDiskOffset = mmioinfo.lDiskOffset; + lpmmioinfo->adwInfo[0] = mmioinfo.adwInfo[0]; + lpmmioinfo->adwInfo[1] = mmioinfo.adwInfo[1]; + lpmmioinfo->adwInfo[2] = mmioinfo.adwInfo[2]; + lpmmioinfo->adwInfo[3] = mmioinfo.adwInfo[3]; + lpmmioinfo->dwReserved1 = 0; + lpmmioinfo->dwReserved2 = 0; + lpmmioinfo->hmmio = HMMIO_16(mmioinfo.hmmio); + + return MMSYSERR_NOERROR; +} + +/************************************************************************** + * mmioSetInfo [MMSYSTEM.1216] + */ +MMRESULT16 WINAPI mmioSetInfo16(HMMIO16 hmmio, const MMIOINFO16* lpmmioinfo, UINT16 uFlags) +{ + MMIOINFO mmioinfo; + MMRESULT ret; + + TRACE("(0x%04x,%p,0x%08x)\n",hmmio,lpmmioinfo,uFlags); + + ret = mmioGetInfo(HMMIO_32(hmmio), &mmioinfo, 0); + if (ret != MMSYSERR_NOERROR) return ret; + + /* check if seg and lin buffers are the same */ + if (mmioinfo.cchBuffer != lpmmioinfo->cchBuffer || + mmioinfo.pchBuffer != MapSL((DWORD)lpmmioinfo->pchBuffer)) + return MMSYSERR_INVALPARAM; + + /* check pointers coherence */ + if (lpmmioinfo->pchNext < lpmmioinfo->pchBuffer || + lpmmioinfo->pchNext > lpmmioinfo->pchBuffer + lpmmioinfo->cchBuffer || + lpmmioinfo->pchEndRead < lpmmioinfo->pchBuffer || + lpmmioinfo->pchEndRead > lpmmioinfo->pchBuffer + lpmmioinfo->cchBuffer || + lpmmioinfo->pchEndWrite < lpmmioinfo->pchBuffer || + lpmmioinfo->pchEndWrite > lpmmioinfo->pchBuffer + lpmmioinfo->cchBuffer) + return MMSYSERR_INVALPARAM; + + mmioinfo.pchNext = mmioinfo.pchBuffer + (lpmmioinfo->pchNext - lpmmioinfo->pchBuffer); + mmioinfo.pchEndRead = mmioinfo.pchBuffer + (lpmmioinfo->pchEndRead - lpmmioinfo->pchBuffer); + mmioinfo.pchEndWrite = mmioinfo.pchBuffer + (lpmmioinfo->pchEndWrite - lpmmioinfo->pchBuffer); + + return mmioSetInfo(HMMIO_32(hmmio), &mmioinfo, uFlags); +} + +/************************************************************************** + * mmioSetBuffer [MMSYSTEM.1217] + */ +MMRESULT16 WINAPI mmioSetBuffer16(HMMIO16 hmmio, LPSTR pchBuffer, + LONG cchBuffer, UINT16 uFlags) +{ + MMRESULT ret = mmioSetBuffer(HMMIO_32(hmmio), MapSL((DWORD)pchBuffer), + cchBuffer, uFlags); + + if (ret == MMSYSERR_NOERROR) + MMIO_SetSegmentedBuffer(HMMIO_32(hmmio), (DWORD)pchBuffer); + return ret; +} + +/************************************************************************** + * mmioFlush [MMSYSTEM.1218] + */ +MMRESULT16 WINAPI mmioFlush16(HMMIO16 hmmio, UINT16 uFlags) +{ + return mmioFlush(HMMIO_32(hmmio), uFlags); +} + +/*********************************************************************** + * mmioAdvance [MMSYSTEM.1219] + */ +MMRESULT16 WINAPI mmioAdvance16(HMMIO16 hmmio, MMIOINFO16* lpmmioinfo, UINT16 uFlags) +{ + MMIOINFO mmioinfo; + LRESULT ret; + + /* WARNING: this heavily relies on mmioAdvance implementation (for choosing which + * fields to init + */ + if (lpmmioinfo) + { + mmioinfo.pchBuffer = MapSL((DWORD)lpmmioinfo->pchBuffer); + mmioinfo.pchNext = MapSL((DWORD)lpmmioinfo->pchNext); + mmioinfo.dwFlags = lpmmioinfo->dwFlags; + mmioinfo.lBufOffset = lpmmioinfo->lBufOffset; + ret = mmioAdvance(HMMIO_32(hmmio), &mmioinfo, uFlags); + } + else + ret = mmioAdvance(HMMIO_32(hmmio), NULL, uFlags); + + if (ret != MMSYSERR_NOERROR) return ret; + + if (lpmmioinfo) + { + lpmmioinfo->dwFlags = mmioinfo.dwFlags; + lpmmioinfo->pchNext = (void*)(lpmmioinfo->pchBuffer + (mmioinfo.pchNext - mmioinfo.pchBuffer)); + lpmmioinfo->pchEndRead = (void*)(lpmmioinfo->pchBuffer + (mmioinfo.pchEndRead - mmioinfo.pchBuffer)); + lpmmioinfo->pchEndWrite = (void*)(lpmmioinfo->pchBuffer + (mmioinfo.pchEndWrite - mmioinfo.pchBuffer)); + lpmmioinfo->lBufOffset = mmioinfo.lBufOffset; + lpmmioinfo->lDiskOffset = mmioinfo.lDiskOffset; + } + + return MMSYSERR_NOERROR; +} + +/************************************************************************** + * mmioStringToFOURCC [MMSYSTEM.1220] + */ +FOURCC WINAPI mmioStringToFOURCC16(LPCSTR sz, UINT16 uFlags) +{ + return mmioStringToFOURCCA(sz, uFlags); +} + +/************************************************************************** + * mmioInstallIOProc [MMSYSTEM.1221] + */ +LPMMIOPROC16 WINAPI mmioInstallIOProc16(FOURCC fccIOProc, LPMMIOPROC16 pIOProc, + DWORD dwFlags) +{ + return (LPMMIOPROC16)MMIO_InstallIOProc(fccIOProc, (LPMMIOPROC)pIOProc, + dwFlags, MMIO_PROC_16); +} + +/************************************************************************** + * mmioSendMessage [MMSYSTEM.1222] + */ +LRESULT WINAPI mmioSendMessage16(HMMIO16 hmmio, UINT16 uMessage, + LPARAM lParam1, LPARAM lParam2) +{ + return MMIO_SendMessage(HMMIO_32(hmmio), uMessage, + lParam1, lParam2, MMIO_PROC_16); +} + +/************************************************************************** + * mmioDescend [MMSYSTEM.1223] + */ +MMRESULT16 WINAPI mmioDescend16(HMMIO16 hmmio, LPMMCKINFO lpck, + const MMCKINFO* lpckParent, UINT16 uFlags) +{ + return mmioDescend(HMMIO_32(hmmio), lpck, lpckParent, uFlags); +} + +/************************************************************************** + * mmioAscend [MMSYSTEM.1224] + */ +MMRESULT16 WINAPI mmioAscend16(HMMIO16 hmmio, MMCKINFO* lpck, UINT16 uFlags) +{ + return mmioAscend(HMMIO_32(hmmio),lpck,uFlags); +} + +/************************************************************************** + * mmioCreateChunk [MMSYSTEM.1225] + */ +MMRESULT16 WINAPI mmioCreateChunk16(HMMIO16 hmmio, MMCKINFO* lpck, UINT16 uFlags) +{ + return mmioCreateChunk(HMMIO_32(hmmio), lpck, uFlags); +} + +/************************************************************************** + * mmioRename [MMSYSTEM.1226] + */ +MMRESULT16 WINAPI mmioRename16(LPCSTR szFileName, LPCSTR szNewFileName, + MMIOINFO16* lpmmioinfo, DWORD dwRenameFlags) +{ + BOOL inst = FALSE; + MMRESULT ret; + MMIOINFO mmioinfo; + + if (lpmmioinfo != NULL && lpmmioinfo->pIOProc != NULL && + lpmmioinfo->fccIOProc == 0) { + FIXME("Can't handle this case yet\n"); + return MMSYSERR_ERROR; + } + + /* this is a bit hacky, but it'll work if we get a fourCC code or nothing. + * but a non installed ioproc without a fourcc won't do + */ + if (lpmmioinfo && lpmmioinfo->fccIOProc && lpmmioinfo->pIOProc) { + MMIO_InstallIOProc(lpmmioinfo->fccIOProc, (LPMMIOPROC)lpmmioinfo->pIOProc, + MMIO_INSTALLPROC, MMIO_PROC_16); + inst = TRUE; + } + memset(&mmioinfo, 0, sizeof(mmioinfo)); + mmioinfo.fccIOProc = lpmmioinfo->fccIOProc; + ret = mmioRenameA(szFileName, szNewFileName, &mmioinfo, dwRenameFlags); + if (inst) { + MMIO_InstallIOProc(lpmmioinfo->fccIOProc, NULL, + MMIO_REMOVEPROC, MMIO_PROC_16); + } + return ret; +} + Index: dlls/winmm/winemm.h =================================================================== RCS file: /home/cvs/cvsroot/wine/wine/dlls/winmm/winemm.h,v retrieving revision 1.25 diff -u -u -r1.25 winemm.h --- dlls/winmm/winemm.h 17 Oct 2002 16:43:43 -0000 1.25 +++ dlls/winmm/winemm.h 17 Oct 2002 20:08:40 -0000 @@ -146,14 +146,24 @@ struct tagWINE_TIMERENTRY* lpNext; } WINE_TIMERENTRY, *LPWINE_TIMERENTRY; +enum mmioProcType {MMIO_PROC_16,MMIO_PROC_32A,MMIO_PROC_32W}; + +struct IOProcList +{ + struct IOProcList*pNext; /* Next item in linked list */ + FOURCC fourCC; /* four-character code identifying IOProc */ + LPMMIOPROC pIOProc; /* pointer to IProc */ + enum mmioProcType type; /* 16, 32A or 32W */ + int count; /* number of objects linked to it */ +}; + typedef struct tagWINE_MMIO { MMIOINFO info; - struct IOProcList* ioProc; - BOOL bTmpIOProc; - HANDLE hMem; - SEGPTR buffer16; struct tagWINE_MMIO* lpNext; - BOOL bBufferLoaded; + struct IOProcList* ioProc; + BOOL bTmpIOProc : 1, + bBufferLoaded : 1; + SEGPTR segBuffer16; DWORD dwFileSize; } WINE_MMIO, *LPWINE_MMIO; @@ -186,6 +196,7 @@ /* LPWINE_MIXER lpMixer; */ /* mmio part */ LPWINE_MMIO lpMMIO; + LRESULT (CALLBACK* pFnMmioCallback16)(SEGPTR,LPMMIOINFO,UINT,LPARAM,LPARAM); /* playsound and sndPlaySound */ WINE_PLAYSOUND* lpPlaySound; HANDLE psLastEvent; @@ -233,6 +244,13 @@ DWORD dwInstance, DWORD dwFlags, BOOL bFrom32); WORD timeSetEventInternal(UINT wDelay, UINT wResol, FARPROC16 lpFunc, DWORD dwUser, UINT wFlags); +HMMIO MMIO_Open(LPSTR szFileName, MMIOINFO* refmminfo, + DWORD dwOpenFlags, enum mmioProcType type); +LPMMIOPROC MMIO_InstallIOProc(FOURCC fccIOProc, LPMMIOPROC pIOProc, + DWORD dwFlags, enum mmioProcType type); +LRESULT MMIO_SendMessage(HMMIO hmmio, UINT uMessage, LPARAM lParam1, + LPARAM lParam2, enum mmioProcType type); +LPWINE_MMIO MMIO_Get(LPWINE_MM_IDATA iData, HMMIO h); BOOL MULTIMEDIA_MciInit(void); LPWINE_MM_IDATA MULTIMEDIA_GetIData(void);