2 * MMSYTEM time functions
4 * Copyright 1993 Martin Ayotte
21 static BOOL32 mmTimeStarted
= FALSE
;
22 static MMTIME mmSysTimeMS
;
23 static MMTIME mmSysTimeSMPTE
;
25 typedef struct tagTIMERENTRY
{
29 HINSTANCE16 hInstance
;
34 struct tagTIMERENTRY
*Next
;
35 struct tagTIMERENTRY
*Prev
;
36 } TIMERENTRY
, *LPTIMERENTRY
;
38 static LPTIMERENTRY lpTimerList
= NULL
;
40 /**************************************************************************
41 * TIME_MMSysTimeCallback
43 static VOID
TIME_MMSysTimeCallback( HWND32 hwnd
, UINT32 msg
,
44 UINT32 id
, DWORD dwTime
)
46 LPTIMERENTRY lpTimer
= lpTimerList
;
47 mmSysTimeMS
.u
.ms
+= 33;
48 mmSysTimeSMPTE
.u
.smpte
.frame
++;
49 while (lpTimer
!= NULL
) {
51 if (lpTimer
->wCurTime
== 0) {
52 lpTimer
->wCurTime
= lpTimer
->wDelay
;
53 if (lpTimer
->lpFunc
!= (FARPROC16
) NULL
) {
54 dprintf_mmtime(stddeb
, "MMSysTimeCallback // before CallBack16 !\n");
55 dprintf_mmtime(stddeb
, "MMSysTimeCallback // lpFunc=%p wTimerID=%04X dwUser=%08lX !\n",
56 lpTimer
->lpFunc
, lpTimer
->wTimerID
, lpTimer
->dwUser
);
57 dprintf_mmtime(stddeb
, "MMSysTimeCallback // hInstance=%04X !\n", lpTimer
->hInstance
);
59 /* This is wrong (lpFunc is NULL all the time)
61 lpFunc = MODULE_GetEntryPoint( lpTimer->hInstance,
62 MODULE_GetOrdinal(lpTimer->hInstance,"TimerCallBack" ));
63 dprintf_mmtime(stddeb, "MMSysTimeCallback // lpFunc=%08lx !\n", lpFunc);
67 /* - TimeProc callback that is called here is something strange, under Windows 3.1x it is called
68 * during interrupt time, is allowed to execute very limited number of API calls (like
69 * PostMessage), and must reside in DLL (therefore uses stack of active application). So I
70 * guess current implementation via SetTimer has to be improved upon.
73 CallTimeFuncProc(lpTimer
->lpFunc
, lpTimer
->wTimerID
,
74 0, lpTimer
->dwUser
, 0, 0);
76 dprintf_mmtime(stddeb
, "MMSysTimeCallback // after CallBack16 !\n");
79 if (lpTimer
->wFlags
& TIME_ONESHOT
)
80 timeKillEvent(lpTimer
->wTimerID
);
82 lpTimer
= lpTimer
->Next
;
86 /**************************************************************************
87 * StartMMTime [internal]
93 mmSysTimeMS
.wType
= TIME_MS
;
95 mmSysTimeSMPTE
.wType
= TIME_SMPTE
;
96 mmSysTimeSMPTE
.u
.smpte
.hour
= 0;
97 mmSysTimeSMPTE
.u
.smpte
.min
= 0;
98 mmSysTimeSMPTE
.u
.smpte
.sec
= 0;
99 mmSysTimeSMPTE
.u
.smpte
.frame
= 0;
100 mmSysTimeSMPTE
.u
.smpte
.fps
= 0;
101 mmSysTimeSMPTE
.u
.smpte
.dummy
= 0;
102 SetTimer32( 0, 1, 33, TIME_MMSysTimeCallback
);
106 /**************************************************************************
107 * timeGetSystemTime [MMSYSTEM.601]
109 WORD
timeGetSystemTime(LPMMTIME lpTime
, WORD wSize
)
111 dprintf_mmsys(stddeb
, "timeGetSystemTime(%p, %u);\n", lpTime
, wSize
);
117 /**************************************************************************
118 * timeSetEvent [MMSYSTEM.602]
120 WORD
timeSetEvent(WORD wDelay
, WORD wResol
, LPTIMECALLBACK lpFunc
,
121 DWORD dwUser
, WORD wFlags
)
124 LPTIMERENTRY lpNewTimer
;
125 LPTIMERENTRY lpTimer
= lpTimerList
;
126 dprintf_mmtime(stddeb
, "timeSetEvent(%u, %u, %p, %08lX, %04X);\n",
127 wDelay
, wResol
, lpFunc
, dwUser
, wFlags
);
130 lpNewTimer
= (LPTIMERENTRY
) malloc(sizeof(TIMERENTRY
));
131 if (lpNewTimer
== NULL
)
133 while (lpTimer
!= NULL
) {
134 wNewID
= MAX(wNewID
, lpTimer
->wTimerID
);
135 if (lpTimer
->Next
== NULL
)
137 lpTimer
= lpTimer
->Next
;
139 if (lpTimerList
== NULL
) {
140 lpTimerList
= lpNewTimer
;
141 lpNewTimer
->Prev
= NULL
;
143 lpTimer
->Next
= lpNewTimer
;
144 lpNewTimer
->Prev
= lpTimer
;
146 lpNewTimer
->Next
= NULL
;
147 lpNewTimer
->wTimerID
= wNewID
+ 1;
148 lpNewTimer
->wCurTime
= wDelay
;
149 lpNewTimer
->wDelay
= wDelay
;
150 lpNewTimer
->wResol
= wResol
;
151 lpNewTimer
->lpFunc
= (FARPROC16
) lpFunc
;
152 lpNewTimer
->hInstance
= GetTaskDS();
153 dprintf_mmtime(stddeb
, "timeSetEvent // hInstance=%04X !\n", lpNewTimer
->hInstance
);
154 dprintf_mmtime(stddeb
, "timeSetEvent // PTR_SEG_TO_LIN(lpFunc)=%p !\n",
155 PTR_SEG_TO_LIN(lpFunc
));
156 lpNewTimer
->dwUser
= dwUser
;
157 lpNewTimer
->wFlags
= wFlags
;
158 return lpNewTimer
->wTimerID
;
161 /**************************************************************************
162 * timeKillEvent [MMSYSTEM.603]
164 WORD
timeKillEvent(WORD wID
)
166 LPTIMERENTRY lpTimer
= lpTimerList
;
167 while (lpTimer
!= NULL
) {
168 if (wID
== lpTimer
->wTimerID
) {
169 if (lpTimer
->Prev
!= NULL
)
170 lpTimer
->Prev
->Next
= lpTimer
->Next
;
171 if (lpTimer
->Next
!= NULL
)
172 lpTimer
->Next
->Prev
= lpTimer
->Prev
;
174 if (lpTimer
==lpTimerList
)
178 lpTimer
= lpTimer
->Next
;
183 /**************************************************************************
184 * timeGetDevCaps [MMSYSTEM.604]
186 WORD
timeGetDevCaps(LPTIMECAPS lpCaps
, WORD wSize
)
188 dprintf_mmsys(stddeb
, "timeGetDevCaps(%p, %u) !\n", lpCaps
, wSize
);
192 /**************************************************************************
193 * timeBeginPeriod [MMSYSTEM.605]
195 WORD
timeBeginPeriod(WORD wPeriod
)
197 dprintf_mmsys(stddeb
, "timeBeginPeriod(%u) !\n", wPeriod
);
203 /**************************************************************************
204 * timeEndPeriod [MMSYSTEM.606]
206 WORD
timeEndPeriod(WORD wPeriod
)
208 dprintf_mmsys(stddeb
, "timeEndPeriod(%u) !\n", wPeriod
);
212 /**************************************************************************
213 * timeGetTime [MMSYSTEM.607]
217 dprintf_mmsys(stddeb
, "timeGetTime(); !\n");