Keep on moving 16 bit code out of winmm, now only using linear
addresses for buffers.
This commit is contained in:
parent
1cf1b5e6ce
commit
b3854da29a
File diff suppressed because it is too large
Load Diff
|
@ -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 @@ BOOL WINAPI MMSYSTEM_LibMain(DWORD fdwReason, HINSTANCE hinstDLL, WORD ds,
|
|||
iData = MULTIMEDIA_GetIData();
|
||||
iData->hWinMM16Instance = hinstDLL;
|
||||
iData->h16Module32 = hndl;
|
||||
iData->pFnMmioCallback16 = mmioCallback16;
|
||||
break;
|
||||
case DLL_PROCESS_DETACH:
|
||||
iData = MULTIMEDIA_GetIData();
|
||||
|
@ -95,6 +110,11 @@ int WINAPI MMSYSTEM_WEP(HINSTANCE16 hInstance, WORD wDataSeg,
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
/* ###################################################
|
||||
* # PlaySound #
|
||||
* ###################################################
|
||||
*/
|
||||
|
||||
/**************************************************************************
|
||||
* PlaySound [MMSYSTEM.3]
|
||||
*/
|
||||
|
@ -125,6 +145,11 @@ BOOL16 WINAPI sndPlaySound16(LPCSTR lpszSoundName, UINT16 uFlags)
|
|||
return retv;
|
||||
}
|
||||
|
||||
/* ###################################################
|
||||
* # MISC #
|
||||
* ###################################################
|
||||
*/
|
||||
|
||||
/**************************************************************************
|
||||
* mmsystemGetVersion [MMSYSTEM.5]
|
||||
*
|
||||
|
@ -144,6 +169,20 @@ BOOL16 WINAPI DriverCallback16(DWORD dwCallBack, UINT16 uFlags, HDRVR16 hDev,
|
|||
return DriverCallback(dwCallBack, uFlags, HDRVR_32(hDev), wMsg, dwUser, dwParam1, dwParam2);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
* OutputDebugStr [MMSYSTEM.30]
|
||||
*/
|
||||
void WINAPI OutputDebugStr16(LPCSTR str)
|
||||
{
|
||||
OutputDebugStringA( str );
|
||||
}
|
||||
|
||||
|
||||
/* ###################################################
|
||||
* # MIXER #
|
||||
* ###################################################
|
||||
*/
|
||||
|
||||
/**************************************************************************
|
||||
* Mixer devices. New to Win95
|
||||
*/
|
||||
|
@ -386,6 +425,11 @@ UINT16 WINAPI auxGetNumDevs16(void)
|
|||
return MMDRV_GetNum(MMDRV_AUX);
|
||||
}
|
||||
|
||||
/* ###################################################
|
||||
* # AUX #
|
||||
* ###################################################
|
||||
*/
|
||||
|
||||
/**************************************************************************
|
||||
* auxGetDevCaps [MMSYSTEM.351]
|
||||
*/
|
||||
|
@ -457,6 +501,11 @@ DWORD WINAPI auxOutMessage16(UINT16 uDeviceID, UINT16 uMessage, DWORD dw1, DWORD
|
|||
return MMDRV_Message(wmld, uMessage, dw1, dw2, TRUE);
|
||||
}
|
||||
|
||||
/* ###################################################
|
||||
* # MCI #
|
||||
* ###################################################
|
||||
*/
|
||||
|
||||
/**************************************************************************
|
||||
* mciGetErrorString [MMSYSTEM.706]
|
||||
*/
|
||||
|
@ -604,6 +653,11 @@ UINT16 WINAPI mciDriverYield16(UINT16 uDeviceID)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* ###################################################
|
||||
* # MIDI #
|
||||
* ###################################################
|
||||
*/
|
||||
|
||||
/**************************************************************************
|
||||
* midiOutGetNumDevs [MMSYSTEM.201]
|
||||
*/
|
||||
|
@ -1103,6 +1157,11 @@ MMRESULT16 WINAPI midiStreamStop16(HMIDISTRM16 hMidiStrm)
|
|||
return midiStreamStop(HMIDISTRM_32(hMidiStrm));
|
||||
}
|
||||
|
||||
/* ###################################################
|
||||
* # WAVE #
|
||||
* ###################################################
|
||||
*/
|
||||
|
||||
/**************************************************************************
|
||||
* waveOutGetNumDevs [MMSYSTEM.401]
|
||||
*/
|
||||
|
@ -1635,6 +1694,11 @@ DWORD WINAPI waveInMessage16(HWAVEIN16 hWaveIn, UINT16 uMessage,
|
|||
return MMDRV_Message(wmld, uMessage, dwParam1, dwParam2, TRUE);
|
||||
}
|
||||
|
||||
/* ###################################################
|
||||
* # TASK #
|
||||
* ###################################################
|
||||
*/
|
||||
|
||||
/*#define USE_MM_TSK_WINE*/
|
||||
|
||||
/**************************************************************************
|
||||
|
@ -2013,10 +2077,6 @@ HANDLE16 WINAPI mmThreadGetTask16(HANDLE16 hndl)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* ### start build ### */
|
||||
extern LONG CALLBACK MMSYSTEM_CallTo16_long_l (FARPROC16,LONG);
|
||||
/* ### stop build ### */
|
||||
|
||||
/**************************************************************************
|
||||
* __wine_mmThreadEntryPoint (MMSYSTEM.2047)
|
||||
*/
|
||||
|
@ -2110,14 +2170,10 @@ void WINAPI WMMMidiRunOnce16(void)
|
|||
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 @@ LRESULT WINAPI DriverProc16(DWORD dwDevID, HDRVR16 hDrv, WORD wMsg,
|
|||
return DrvDefDriverProc16(dwDevID, hDrv, wMsg, dwParam1, dwParam2);
|
||||
}
|
||||
|
||||
/* ###################################################
|
||||
* # TIME #
|
||||
* ###################################################
|
||||
*/
|
||||
|
||||
/**************************************************************************
|
||||
* timeGetSystemTime [MMSYSTEM.601]
|
||||
*/
|
||||
|
@ -2276,3 +2337,405 @@ BOOL16 WINAPI mciFreeCommandResource16(UINT16 uTable)
|
|||
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -146,14 +146,24 @@ typedef struct tagWINE_TIMERENTRY {
|
|||
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 @@ typedef struct tagWINE_MM_IDATA {
|
|||
/* 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 @@ UINT MMSYSTEM_waveOpen(HANDLE* lphndl, UINT uDeviceID
|
|||
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);
|
||||
|
|
Loading…
Reference in New Issue