Release 960414
[wine.git] / multimedia / time.c
blobb49dfb782a1a909e14c0922f6c564610e419a5a9
1 /*
2 * MMSYTEM time functions
4 * Copyright 1993 Martin Ayotte
5 */
7 #ifndef WINELIB
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include "windows.h"
13 #include "win.h"
14 #include "ldt.h"
15 #include "module.h"
16 #include "callback.h"
17 #include "user.h"
18 #include "driver.h"
19 #include "mmsystem.h"
20 #include "stddebug.h"
21 #include "debug.h"
23 static BOOL mmTimeStarted = FALSE;
24 static MMTIME mmSysTimeMS;
25 static MMTIME mmSysTimeSMPTE;
27 typedef struct tagTIMERENTRY {
28 WORD wDelay;
29 WORD wResol;
30 FARPROC lpFunc;
31 HINSTANCE hInstance;
32 DWORD dwUser;
33 WORD wFlags;
34 WORD wTimerID;
35 WORD wCurTime;
36 struct tagTIMERENTRY *Next;
37 struct tagTIMERENTRY *Prev;
38 } TIMERENTRY, *LPTIMERENTRY;
40 static LPTIMERENTRY lpTimerList = NULL;
42 /**************************************************************************
43 * MMSysTimeCallback [internal]
45 WORD MMSysTimeCallback(HWND hWnd, WORD wMsg, INT nID, DWORD dwTime)
47 LPTIMERENTRY lpTimer = lpTimerList;
48 mmSysTimeMS.u.ms += 33;
49 mmSysTimeSMPTE.u.smpte.frame++;
50 while (lpTimer != NULL) {
51 lpTimer->wCurTime--;
52 if (lpTimer->wCurTime == 0) {
53 lpTimer->wCurTime = lpTimer->wDelay;
54 if (lpTimer->lpFunc != (FARPROC) NULL) {
55 dprintf_mmtime(stddeb, "MMSysTimeCallback // before CallBack16 !\n");
56 dprintf_mmtime(stddeb, "MMSysTimeCallback // lpFunc=%08lx wTimerID=%04X dwUser=%08lX !\n",
57 lpTimer->lpFunc, lpTimer->wTimerID, lpTimer->dwUser);
58 dprintf_mmtime(stddeb, "MMSysTimeCallback // hInstance=%04X !\n", lpTimer->hInstance);
60 /* This is wrong (lpFunc is NULL all the time)
62 lpFunc = MODULE_GetEntryPoint( lpTimer->hInstance,
63 MODULE_GetOrdinal(lpTimer->hInstance,"TimerCallBack" ));
64 dprintf_mmtime(stddeb, "MMSysTimeCallback // lpFunc=%08lx !\n", lpFunc);
68 /* - TimeProc callback that is called here is something strange, under Windows 3.1x it is called
69 * during interrupt time, is allowed to execute very limited number of API calls (like
70 * PostMessage), and must reside in DLL (therefore uses stack of active application). So I
71 * guess current implementation via SetTimer has to be improved upon.
74 CallTo16_word_wwlll(lpTimer->lpFunc,
75 lpTimer->hInstance, lpTimer->wTimerID,
76 0, lpTimer->dwUser, 0, 0);
78 dprintf_mmtime(stddeb, "MMSysTimeCallback // after CallBack16 !\n");
79 fflush(stdout);
81 if (lpTimer->wFlags & TIME_ONESHOT)
82 timeKillEvent(lpTimer->wTimerID);
84 lpTimer = lpTimer->Next;
86 return 0;
89 /**************************************************************************
90 * StartMMTime [internal]
92 void StartMMTime()
94 if (!mmTimeStarted) {
95 mmTimeStarted = TRUE;
96 mmSysTimeMS.wType = TIME_MS;
97 mmSysTimeMS.u.ms = 0;
98 mmSysTimeSMPTE.wType = TIME_SMPTE;
99 mmSysTimeSMPTE.u.smpte.hour = 0;
100 mmSysTimeSMPTE.u.smpte.min = 0;
101 mmSysTimeSMPTE.u.smpte.sec = 0;
102 mmSysTimeSMPTE.u.smpte.frame = 0;
103 mmSysTimeSMPTE.u.smpte.fps = 0;
104 mmSysTimeSMPTE.u.smpte.dummy = 0;
105 SetTimer(0, 1, 33, MODULE_GetWndProcEntry16("MMSysTimeCallback"));
109 /**************************************************************************
110 * timeGetSystemTime [MMSYSTEM.601]
112 WORD timeGetSystemTime(LPMMTIME lpTime, WORD wSize)
114 dprintf_mmsys(stddeb, "timeGetSystemTime(%p, %u);\n", lpTime, wSize);
115 if (!mmTimeStarted)
116 StartMMTime();
117 return 0;
120 /**************************************************************************
121 * timeSetEvent [MMSYSTEM.602]
123 WORD timeSetEvent(WORD wDelay, WORD wResol, LPTIMECALLBACK lpFunc,
124 DWORD dwUser, WORD wFlags)
126 WORD wNewID = 0;
127 LPTIMERENTRY lpNewTimer;
128 LPTIMERENTRY lpTimer = lpTimerList;
129 dprintf_mmtime(stddeb, "timeSetEvent(%u, %u, %p, %08lX, %04X);\n",
130 wDelay, wResol, lpFunc, dwUser, wFlags);
131 if (!mmTimeStarted)
132 StartMMTime();
133 lpNewTimer = (LPTIMERENTRY) malloc(sizeof(TIMERENTRY));
134 if (lpNewTimer == NULL)
135 return 0;
136 while (lpTimer != NULL) {
137 wNewID = MAX(wNewID, lpTimer->wTimerID);
138 if (lpTimer->Next == NULL)
139 break;
140 lpTimer = lpTimer->Next;
142 if (lpTimerList == NULL) {
143 lpTimerList = lpNewTimer;
144 lpNewTimer->Prev = NULL;
145 } else {
146 lpTimer->Next = lpNewTimer;
147 lpNewTimer->Prev = lpTimer;
149 lpNewTimer->Next = NULL;
150 lpNewTimer->wTimerID = wNewID + 1;
151 lpNewTimer->wCurTime = wDelay;
152 lpNewTimer->wDelay = wDelay;
153 lpNewTimer->wResol = wResol;
154 lpNewTimer->lpFunc = (FARPROC) lpFunc;
155 lpNewTimer->hInstance = GetTaskDS();
156 dprintf_mmtime(stddeb, "timeSetEvent // hInstance=%04X !\n", lpNewTimer->hInstance);
157 dprintf_mmtime(stddeb, "timeSetEvent // PTR_SEG_TO_LIN(lpFunc)=%p !\n",
158 PTR_SEG_TO_LIN(lpFunc));
159 lpNewTimer->dwUser = dwUser;
160 lpNewTimer->wFlags = wFlags;
161 return lpNewTimer->wTimerID;
164 /**************************************************************************
165 * timeKillEvent [MMSYSTEM.603]
167 WORD timeKillEvent(WORD wID)
169 LPTIMERENTRY lpTimer = lpTimerList;
170 while (lpTimer != NULL) {
171 if (wID == lpTimer->wTimerID) {
172 if (lpTimer->Prev != NULL)
173 lpTimer->Prev->Next = lpTimer->Next;
174 if (lpTimer->Next != NULL)
175 lpTimer->Next->Prev = lpTimer->Prev;
176 free(lpTimer);
177 return TRUE;
179 lpTimer = lpTimer->Next;
181 return 0;
184 /**************************************************************************
185 * timeGetDevCaps [MMSYSTEM.604]
187 WORD timeGetDevCaps(LPTIMECAPS lpCaps, WORD wSize)
189 dprintf_mmsys(stddeb, "timeGetDevCaps(%p, %u) !\n", lpCaps, wSize);
190 return 0;
193 /**************************************************************************
194 * timeBeginPeriod [MMSYSTEM.605]
196 WORD timeBeginPeriod(WORD wPeriod)
198 dprintf_mmsys(stddeb, "timeBeginPeriod(%u) !\n", wPeriod);
199 if (!mmTimeStarted)
200 StartMMTime();
201 return 0;
204 /**************************************************************************
205 * timeEndPeriod [MMSYSTEM.606]
207 WORD timeEndPeriod(WORD wPeriod)
209 dprintf_mmsys(stddeb, "timeEndPeriod(%u) !\n", wPeriod);
210 return 0;
213 /**************************************************************************
214 * timeGetTime [MMSYSTEM.607]
216 DWORD timeGetTime()
218 dprintf_mmsys(stddeb, "timeGetTime(); !\n");
219 if (!mmTimeStarted)
220 StartMMTime();
221 return 0;
224 #endif /* WINELIB */