Release 951003
[wine/multimedia.git] / multimedia / time.c
blob5193abde7ca6f1e40f60b6665e19e669aa7aaaf3
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 "callback.h"
16 #include "module.h"
17 #include "user.h"
18 #include "driver.h"
19 #include "mmsystem.h"
20 #include "selectors.h"
21 #include "stddebug.h"
22 #include "debug.h"
24 static BOOL mmTimeStarted = FALSE;
25 static MMTIME mmSysTimeMS;
26 static MMTIME mmSysTimeSMPTE;
28 typedef struct tagTIMERENTRY {
29 WORD wDelay;
30 WORD wResol;
31 FARPROC lpFunc;
32 HINSTANCE hInstance;
33 DWORD dwUser;
34 WORD wFlags;
35 WORD wTimerID;
36 WORD wCurTime;
37 struct tagTIMERENTRY *Next;
38 struct tagTIMERENTRY *Prev;
39 } TIMERENTRY, *LPTIMERENTRY;
41 static LPTIMERENTRY lpTimerList = NULL;
43 /**************************************************************************
44 * MMSysTimeCallback [internal]
46 WORD MMSysTimeCallback(HWND hWnd, WORD wMsg, INT nID, DWORD dwTime)
48 LPTIMERENTRY lpTimer = lpTimerList;
49 mmSysTimeMS.u.ms += 33;
50 mmSysTimeSMPTE.u.smpte.frame++;
51 while (lpTimer != NULL) {
52 lpTimer->wCurTime--;
53 if (lpTimer->wCurTime == 0) {
54 lpTimer->wCurTime = lpTimer->wDelay;
55 if (lpTimer->lpFunc != (FARPROC) NULL) {
56 dprintf_mmtime(stddeb, "MMSysTimeCallback // before CallBack16 !\n");
57 dprintf_mmtime(stddeb, "MMSysTimeCallback // lpFunc=%08lx 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 CallTo16_word_wwlll(lpTimer->lpFunc,
76 lpTimer->hInstance, lpTimer->wTimerID,
77 0, lpTimer->dwUser, 0, 0);
79 dprintf_mmtime(stddeb, "MMSysTimeCallback // after CallBack16 !\n");
80 fflush(stdout);
82 if (lpTimer->wFlags & TIME_ONESHOT)
83 timeKillEvent(lpTimer->wTimerID);
85 lpTimer = lpTimer->Next;
87 return 0;
90 /**************************************************************************
91 * StartMMTime [internal]
93 void StartMMTime()
95 if (!mmTimeStarted) {
96 mmTimeStarted = TRUE;
97 mmSysTimeMS.wType = TIME_MS;
98 mmSysTimeMS.u.ms = 0;
99 mmSysTimeSMPTE.wType = TIME_SMPTE;
100 mmSysTimeSMPTE.u.smpte.hour = 0;
101 mmSysTimeSMPTE.u.smpte.min = 0;
102 mmSysTimeSMPTE.u.smpte.sec = 0;
103 mmSysTimeSMPTE.u.smpte.frame = 0;
104 mmSysTimeSMPTE.u.smpte.fps = 0;
105 mmSysTimeSMPTE.u.smpte.dummy = 0;
106 SetTimer(0, 1, 33, GetWndProcEntry16("MMSysTimeCallback"));
110 /**************************************************************************
111 * timeGetSystemTime [MMSYSTEM.601]
113 WORD timeGetSystemTime(LPMMTIME lpTime, WORD wSize)
115 dprintf_mmsys(stddeb, "timeGetSystemTime(%p, %u);\n", lpTime, wSize);
116 if (!mmTimeStarted)
117 StartMMTime();
118 return 0;
121 /**************************************************************************
122 * timeSetEvent [MMSYSTEM.602]
124 WORD timeSetEvent(WORD wDelay, WORD wResol, LPTIMECALLBACK lpFunc,
125 DWORD dwUser, WORD wFlags)
127 WORD wNewID = 0;
128 LPTIMERENTRY lpNewTimer;
129 LPTIMERENTRY lpTimer = lpTimerList;
130 dprintf_mmtime(stddeb, "timeSetEvent(%u, %u, %p, %08lX, %04X);\n",
131 wDelay, wResol, lpFunc, dwUser, wFlags);
132 if (!mmTimeStarted)
133 StartMMTime();
134 lpNewTimer = (LPTIMERENTRY) malloc(sizeof(TIMERENTRY));
135 if (lpNewTimer == NULL)
136 return 0;
137 while (lpTimer != NULL) {
138 wNewID = max(wNewID, lpTimer->wTimerID);
139 if (lpTimer->Next == NULL)
140 break;
141 lpTimer = lpTimer->Next;
143 if (lpTimerList == NULL) {
144 lpTimerList = lpNewTimer;
145 lpNewTimer->Prev = NULL;
146 } else {
147 lpTimer->Next = lpNewTimer;
148 lpNewTimer->Prev = lpTimer;
150 lpNewTimer->Next = NULL;
151 lpNewTimer->wTimerID = wNewID + 1;
152 lpNewTimer->wCurTime = wDelay;
153 lpNewTimer->wDelay = wDelay;
154 lpNewTimer->wResol = wResol;
155 lpNewTimer->lpFunc = (FARPROC) lpFunc;
156 lpNewTimer->hInstance = GetTaskDS();
157 dprintf_mmtime(stddeb, "timeSetEvent // hInstance=%04X !\n", lpNewTimer->hInstance);
158 dprintf_mmtime(stddeb, "timeSetEvent // PTR_SEG_TO_LIN(lpFunc)=%p !\n",
159 PTR_SEG_TO_LIN(lpFunc));
160 lpNewTimer->dwUser = dwUser;
161 lpNewTimer->wFlags = wFlags;
162 return lpNewTimer->wTimerID;
165 /**************************************************************************
166 * timeKillEvent [MMSYSTEM.603]
168 WORD timeKillEvent(WORD wID)
170 LPTIMERENTRY lpTimer = lpTimerList;
171 while (lpTimer != NULL) {
172 if (wID == lpTimer->wTimerID) {
173 if (lpTimer->Prev != NULL)
174 lpTimer->Prev->Next = lpTimer->Next;
175 if (lpTimer->Next != NULL)
176 lpTimer->Next->Prev = lpTimer->Prev;
177 free(lpTimer);
178 return TRUE;
180 lpTimer = lpTimer->Next;
182 return 0;
185 /**************************************************************************
186 * timeGetDevCaps [MMSYSTEM.604]
188 WORD timeGetDevCaps(LPTIMECAPS lpCaps, WORD wSize)
190 dprintf_mmsys(stddeb, "timeGetDevCaps(%p, %u) !\n", lpCaps, wSize);
191 return 0;
194 /**************************************************************************
195 * timeBeginPeriod [MMSYSTEM.605]
197 WORD timeBeginPeriod(WORD wPeriod)
199 dprintf_mmsys(stddeb, "timeBeginPeriod(%u) !\n", wPeriod);
200 if (!mmTimeStarted)
201 StartMMTime();
202 return 0;
205 /**************************************************************************
206 * timeEndPeriod [MMSYSTEM.606]
208 WORD timeEndPeriod(WORD wPeriod)
210 dprintf_mmsys(stddeb, "timeEndPeriod(%u) !\n", wPeriod);
211 return 0;
214 /**************************************************************************
215 * timeGetTime [MMSYSTEM.607]
217 DWORD timeGetTime()
219 dprintf_mmsys(stddeb, "timeGetTime(); !\n");
220 if (!mmTimeStarted)
221 StartMMTime();
222 return 0;
225 #endif /* WINELIB */