static void TIME_TriggerCallBack(LPWINE_TIMERENTRY lpTimer) { TRACE("%04lx:CallBack => lpFunc=%p wTimerID=%04X dwUser=%08lX dwTriggerTime %ld(delta %ld)\n", GetCurrentThreadId(), lpTimer->lpFunc, lpTimer->wTimerID, lpTimer->dwUser, lpTimer->dwTriggerTime, GetTickCount() - lpTimer->dwTriggerTime); /* - TimeProc callback that is called here is something strange, under Windows 3.1x it is called * during interrupt time, is allowed to execute very limited number of API calls (like * PostMessage), and must reside in DLL (therefore uses stack of active application). So I * guess current implementation via SetTimer has to be improved upon. */ switch (lpTimer->wFlags & 0x30) { case TIME_CALLBACK_FUNCTION: if (lpTimer->wFlags & WINE_TIMER_IS32) (lpTimer->lpFunc)(lpTimer->wTimerID, 0, lpTimer->dwUser, 0, 0); else if (pFnCallMMDrvFunc16) pFnCallMMDrvFunc16((DWORD)lpTimer->lpFunc, lpTimer->wTimerID, 0, lpTimer->dwUser, 0, 0); break; case TIME_CALLBACK_EVENT_SET: SetEvent((HANDLE)lpTimer->lpFunc); break; case TIME_CALLBACK_EVENT_PULSE: PulseEvent((HANDLE)lpTimer->lpFunc); break; default: FIXME("Unknown callback type 0x%04x for mmtime callback (%p), ignored.\n", lpTimer->wFlags, lpTimer->lpFunc); break; } }
/************************************************************************** * MMDRV_Message [internal] */ DWORD MMDRV_Message(LPWINE_MLD mld, UINT wMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2, BOOL bFrom32) { LPWINE_MM_DRIVER lpDrv; DWORD ret; WINE_MM_DRIVER_PART* part; WINE_LLTYPE* llType = &llTypes[mld->type]; WINMM_MapType map; int devID; TRACE("(%s %u %u 0x%08x 0x%08lx 0x%08lx %c)\n", llTypes[mld->type].typestr, mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2, bFrom32?'Y':'N'); if (mld->uDeviceID == (UINT16)-1) { if (!llType->bSupportMapper) { WARN("uDev=-1 requested on non-mappable ll type %s\n", llTypes[mld->type].typestr); return MMSYSERR_BADDEVICEID; } devID = -1; } else { if (mld->uDeviceID >= llType->wMaxId) { WARN("uDev(%u) requested >= max (%d)\n", mld->uDeviceID, llType->wMaxId); return MMSYSERR_BADDEVICEID; } devID = mld->uDeviceID; } lpDrv = &MMDrvs[mld->mmdIndex]; part = &lpDrv->parts[mld->type]; #if 0 /* some sanity checks */ if (!(part->nIDMin <= devID)) ERR("!(part->nIDMin(%d) <= devID(%d))\n", part->nIDMin, devID); if (!(devID < part->nIDMax)) ERR("!(devID(%d) < part->nIDMax(%d))\n", devID, part->nIDMax); #endif if (lpDrv->bIs32) { assert(part->u.fnMessage32); if (bFrom32) { TRACE("Calling message(dev=%u msg=%u usr=0x%08x p1=0x%08lx p2=0x%08lx)\n", mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2); ret = part->u.fnMessage32(mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2); TRACE("=> %s\n", WINMM_ErrorToString(ret)); } else { map = llType->Map16To32A(wMsg, &mld->dwDriverInstance, &dwParam1, &dwParam2); switch (map) { case WINMM_MAP_NOMEM: ret = MMSYSERR_NOMEM; break; case WINMM_MAP_MSGERROR: FIXME("NIY: no conversion yet 16->32 (%u)\n", wMsg); ret = MMSYSERR_ERROR; break; case WINMM_MAP_OK: case WINMM_MAP_OKMEM: TRACE("Calling message(dev=%u msg=%u usr=0x%08x p1=0x%08lx p2=0x%08lx)\n", mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2); ret = part->u.fnMessage32(mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2); TRACE("=> %s\n", WINMM_ErrorToString(ret)); if (map == WINMM_MAP_OKMEM) llType->UnMap16To32A(wMsg, &mld->dwDriverInstance, &dwParam1, &dwParam2, ret); break; default: FIXME("NIY\n"); ret = MMSYSERR_NOTSUPPORTED; break; } } } else { assert(part->u.fnMessage16 && pFnCallMMDrvFunc16); if (bFrom32) { map = llType->Map32ATo16(wMsg, &mld->dwDriverInstance, &dwParam1, &dwParam2); switch (map) { case WINMM_MAP_NOMEM: ret = MMSYSERR_NOMEM; break; case WINMM_MAP_MSGERROR: FIXME("NIY: no conversion yet 32->16 (%u)\n", wMsg); ret = MMSYSERR_ERROR; break; case WINMM_MAP_OK: case WINMM_MAP_OKMEM: TRACE("Calling message(dev=%u msg=%u usr=0x%08x p1=0x%08lx p2=0x%08lx)\n", mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2); ret = pFnCallMMDrvFunc16((DWORD)part->u.fnMessage16, mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2); TRACE("=> %s\n", WINMM_ErrorToString(ret)); if (map == WINMM_MAP_OKMEM) llType->UnMap32ATo16(wMsg, &mld->dwDriverInstance, &dwParam1, &dwParam2, ret); break; default: FIXME("NIY\n"); ret = MMSYSERR_NOTSUPPORTED; break; } } else { TRACE("Calling message(dev=%u msg=%u usr=0x%08x p1=0x%08lx p2=0x%08lx)\n", mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2); ret = pFnCallMMDrvFunc16((DWORD)part->u.fnMessage16, mld->uDeviceID, wMsg, mld->dwDriverInstance, dwParam1, dwParam2); TRACE("=> %s\n", WINMM_ErrorToString(ret)); } } return ret; }