2 * MMSYTEM time functions
4 * Copyright 1993 Martin Ayotte
23 static BOOL mmTimeStarted = FALSE;
24 static MMTIME mmSysTimeMS;
25 static MMTIME mmSysTimeSMPTE;
27 typedef struct tagTIMERENTRY {
36 struct tagTIMERENTRY *Next;
37 struct tagTIMERENTRY *Prev;
38 } TIMERENTRY, *LPTIMERENTRY;
40 static LPTIMERENTRY lpTimerList = NULL;
42 /**************************************************************************
43 * TIME_MMSysTimeCallback
45 static VOID TIME_MMSysTimeCallback( HWND32 hwnd, UINT32 msg,
46 UINT32 id, DWORD dwTime )
48 LPTIMERENTRY lpTimer = lpTimerList;
49 mmSysTimeMS.u.ms += 33;
50 mmSysTimeSMPTE.u.smpte.frame++;
51 while (lpTimer != NULL) {
53 if (lpTimer->wCurTime == 0) {
54 lpTimer->wCurTime = lpTimer->wDelay;
55 if (lpTimer->lpFunc != (FARPROC16) NULL) {
56 dprintf_mmtime(stddeb, "MMSysTimeCallback // before CallBack16 !\n");
57 dprintf_mmtime(stddeb, "MMSysTimeCallback // lpFunc=%p wTimerID=%04X dwUser=%08lX !\n",
58 lpTimer->lpFunc, lpTimer->wTimerID, lpTimer->dwUser);
59 dprintf_mmtime(stddeb, "MMSysTimeCallback // hInstance=%04X !\n", lpTimer->hInstance);
61 /* This is wrong (lpFunc is NULL all the time)
63 lpFunc = MODULE_GetEntryPoint( lpTimer->hInstance,
64 MODULE_GetOrdinal(lpTimer->hInstance,"TimerCallBack" ));
65 dprintf_mmtime(stddeb, "MMSysTimeCallback // lpFunc=%08lx !\n", lpFunc);
69 /* - TimeProc callback that is called here is something strange, under Windows 3.1x it is called
70 * during interrupt time, is allowed to execute very limited number of API calls (like
71 * PostMessage), and must reside in DLL (therefore uses stack of active application). So I
72 * guess current implementation via SetTimer has to be improved upon.
75 CallTimeFuncProc(lpTimer->lpFunc, lpTimer->wTimerID,
76 0, lpTimer->dwUser, 0, 0);
78 dprintf_mmtime(stddeb, "MMSysTimeCallback // after CallBack16 !\n");
81 if (lpTimer->wFlags & TIME_ONESHOT)
82 timeKillEvent(lpTimer->wTimerID);
84 lpTimer = lpTimer->Next;
88 /**************************************************************************
89 * StartMMTime [internal]
95 mmSysTimeMS.wType = TIME_MS;
97 mmSysTimeSMPTE.wType = TIME_SMPTE;
98 mmSysTimeSMPTE.u.smpte.hour = 0;
99 mmSysTimeSMPTE.u.smpte.min = 0;
100 mmSysTimeSMPTE.u.smpte.sec = 0;
101 mmSysTimeSMPTE.u.smpte.frame = 0;
102 mmSysTimeSMPTE.u.smpte.fps = 0;
103 mmSysTimeSMPTE.u.smpte.dummy = 0;
104 SetTimer32( 0, 1, 33, TIME_MMSysTimeCallback );
108 /**************************************************************************
109 * timeGetSystemTime [MMSYSTEM.601]
111 WORD timeGetSystemTime(LPMMTIME lpTime, WORD wSize)
113 dprintf_mmsys(stddeb, "timeGetSystemTime(%p, %u);\n", lpTime, wSize);
119 /**************************************************************************
120 * timeSetEvent [MMSYSTEM.602]
122 WORD timeSetEvent(WORD wDelay, WORD wResol, LPTIMECALLBACK lpFunc,
123 DWORD dwUser, WORD wFlags)
126 LPTIMERENTRY lpNewTimer;
127 LPTIMERENTRY lpTimer = lpTimerList;
128 dprintf_mmtime(stddeb, "timeSetEvent(%u, %u, %p, %08lX, %04X);\n",
129 wDelay, wResol, lpFunc, dwUser, wFlags);
132 lpNewTimer = (LPTIMERENTRY) malloc(sizeof(TIMERENTRY));
133 if (lpNewTimer == NULL)
135 while (lpTimer != NULL) {
136 wNewID = MAX(wNewID, lpTimer->wTimerID);
137 if (lpTimer->Next == NULL)
139 lpTimer = lpTimer->Next;
141 if (lpTimerList == NULL) {
142 lpTimerList = lpNewTimer;
143 lpNewTimer->Prev = NULL;
145 lpTimer->Next = lpNewTimer;
146 lpNewTimer->Prev = lpTimer;
148 lpNewTimer->Next = NULL;
149 lpNewTimer->wTimerID = wNewID + 1;
150 lpNewTimer->wCurTime = wDelay;
151 lpNewTimer->wDelay = wDelay;
152 lpNewTimer->wResol = wResol;
153 lpNewTimer->lpFunc = (FARPROC16) lpFunc;
154 lpNewTimer->hInstance = GetTaskDS();
155 dprintf_mmtime(stddeb, "timeSetEvent // hInstance=%04X !\n", lpNewTimer->hInstance);
156 dprintf_mmtime(stddeb, "timeSetEvent // PTR_SEG_TO_LIN(lpFunc)=%p !\n",
157 PTR_SEG_TO_LIN(lpFunc));
158 lpNewTimer->dwUser = dwUser;
159 lpNewTimer->wFlags = wFlags;
160 return lpNewTimer->wTimerID;
163 /**************************************************************************
164 * timeKillEvent [MMSYSTEM.603]
166 WORD timeKillEvent(WORD wID)
168 LPTIMERENTRY lpTimer = lpTimerList;
169 while (lpTimer != NULL) {
170 if (wID == lpTimer->wTimerID) {
171 if (lpTimer->Prev != NULL)
172 lpTimer->Prev->Next = lpTimer->Next;
173 if (lpTimer->Next != NULL)
174 lpTimer->Next->Prev = lpTimer->Prev;
176 if (lpTimer==lpTimerList)
180 lpTimer = lpTimer->Next;
185 /**************************************************************************
186 * timeGetDevCaps [MMSYSTEM.604]
188 WORD timeGetDevCaps(LPTIMECAPS lpCaps, WORD wSize)
190 dprintf_mmsys(stddeb, "timeGetDevCaps(%p, %u) !\n", lpCaps, wSize);
194 /**************************************************************************
195 * timeBeginPeriod [MMSYSTEM.605]
197 WORD timeBeginPeriod(WORD wPeriod)
199 dprintf_mmsys(stddeb, "timeBeginPeriod(%u) !\n", wPeriod);
205 /**************************************************************************
206 * timeEndPeriod [MMSYSTEM.606]
208 WORD timeEndPeriod(WORD wPeriod)
210 dprintf_mmsys(stddeb, "timeEndPeriod(%u) !\n", wPeriod);
214 /**************************************************************************
215 * timeGetTime [MMSYSTEM.607]
219 dprintf_mmsys(stddeb, "timeGetTime(); !\n");