Release 970305
[wine/multimedia.git] / multimedia / time.c
blob56e4e4583e2449a450a3d49a8c61bd3c45e8ba64
1 /*
2 * MMSYTEM time functions
4 * Copyright 1993 Martin Ayotte
5 */
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include "windows.h"
11 #include "win.h"
12 #include "ldt.h"
13 #include "module.h"
14 #include "callback.h"
15 #include "user.h"
16 #include "driver.h"
17 #include "mmsystem.h"
18 #include "stddebug.h"
19 #include "debug.h"
21 static BOOL32 mmTimeStarted = FALSE;
22 static MMTIME mmSysTimeMS;
23 static MMTIME mmSysTimeSMPTE;
25 typedef struct tagTIMERENTRY {
26 WORD wDelay;
27 WORD wResol;
28 FARPROC16 lpFunc;
29 HINSTANCE16 hInstance;
30 DWORD dwUser;
31 WORD wFlags;
32 WORD wTimerID;
33 WORD wCurTime;
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) {
50 lpTimer->wCurTime--;
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");
77 fflush(stdout);
79 if (lpTimer->wFlags & TIME_ONESHOT)
80 timeKillEvent(lpTimer->wTimerID);
82 lpTimer = lpTimer->Next;
86 /**************************************************************************
87 * StartMMTime [internal]
89 void StartMMTime()
91 if (!mmTimeStarted) {
92 mmTimeStarted = TRUE;
93 mmSysTimeMS.wType = TIME_MS;
94 mmSysTimeMS.u.ms = 0;
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);
112 if (!mmTimeStarted)
113 StartMMTime();
114 return 0;
117 /**************************************************************************
118 * timeSetEvent [MMSYSTEM.602]
120 WORD timeSetEvent(WORD wDelay, WORD wResol, LPTIMECALLBACK lpFunc,
121 DWORD dwUser, WORD wFlags)
123 WORD wNewID = 0;
124 LPTIMERENTRY lpNewTimer;
125 LPTIMERENTRY lpTimer = lpTimerList;
126 dprintf_mmtime(stddeb, "timeSetEvent(%u, %u, %p, %08lX, %04X);\n",
127 wDelay, wResol, lpFunc, dwUser, wFlags);
128 if (!mmTimeStarted)
129 StartMMTime();
130 lpNewTimer = (LPTIMERENTRY) malloc(sizeof(TIMERENTRY));
131 if (lpNewTimer == NULL)
132 return 0;
133 while (lpTimer != NULL) {
134 wNewID = MAX(wNewID, lpTimer->wTimerID);
135 if (lpTimer->Next == NULL)
136 break;
137 lpTimer = lpTimer->Next;
139 if (lpTimerList == NULL) {
140 lpTimerList = lpNewTimer;
141 lpNewTimer->Prev = NULL;
142 } else {
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;
173 free(lpTimer);
174 if (lpTimer==lpTimerList)
175 lpTimerList=NULL;
176 return TRUE;
178 lpTimer = lpTimer->Next;
180 return 0;
183 /**************************************************************************
184 * timeGetDevCaps [MMSYSTEM.604]
186 WORD timeGetDevCaps(LPTIMECAPS lpCaps, WORD wSize)
188 dprintf_mmsys(stddeb, "timeGetDevCaps(%p, %u) !\n", lpCaps, wSize);
189 return 0;
192 /**************************************************************************
193 * timeBeginPeriod [MMSYSTEM.605]
195 WORD timeBeginPeriod(WORD wPeriod)
197 dprintf_mmsys(stddeb, "timeBeginPeriod(%u) !\n", wPeriod);
198 if (!mmTimeStarted)
199 StartMMTime();
200 return 0;
203 /**************************************************************************
204 * timeEndPeriod [MMSYSTEM.606]
206 WORD timeEndPeriod(WORD wPeriod)
208 dprintf_mmsys(stddeb, "timeEndPeriod(%u) !\n", wPeriod);
209 return 0;
212 /**************************************************************************
213 * timeGetTime [MMSYSTEM.607]
215 DWORD timeGetTime()
217 dprintf_mmsys(stddeb, "timeGetTime(); !\n");
218 if (!mmTimeStarted)
219 StartMMTime();
220 return 0;