Release 950727
[wine/multimedia.git] / multimedia / time.c
blobbfa5abc9177147dadee4b2974f8f6220b6048f69
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 "ldt.h"
14 #include "callback.h"
15 #include "user.h"
16 #include "driver.h"
17 #include "mmsystem.h"
18 #include "selectors.h"
19 #include "stddebug.h"
20 #include "debug.h"
22 static BOOL mmTimeStarted = FALSE;
23 static MMTIME mmSysTimeMS;
24 static MMTIME mmSysTimeSMPTE;
26 typedef struct tagTIMERENTRY {
27 WORD wDelay;
28 WORD wResol;
29 FARPROC lpFunc;
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 * MMSysTimeCallback [internal]
43 WORD MMSysTimeCallback(HWND hWnd, WORD wMsg, INT nID, DWORD dwTime)
45 LPTIMERENTRY lpTimer = lpTimerList;
46 mmSysTimeMS.u.ms += 33;
47 mmSysTimeSMPTE.u.smpte.frame++;
48 while (lpTimer != NULL) {
49 lpTimer->wCurTime--;
50 if (lpTimer->wCurTime == 0) {
51 lpTimer->wCurTime = lpTimer->wDelay;
52 if (lpTimer->lpFunc != (FARPROC) NULL) {
53 dprintf_mmtime(stddeb, "MMSysTimeCallback // before CallBack16 !\n");
54 CallTimeFuncProc(lpTimer->lpFunc, lpTimer->wTimerID, 0,
55 lpTimer->dwUser, 0, 0);
56 dprintf_mmtime(stddeb, "MMSysTimeCallback // after CallBack16 !\n");
57 fflush(stdout);
59 if (lpTimer->wFlags & TIME_ONESHOT)
60 timeKillEvent(lpTimer->wTimerID);
62 lpTimer = lpTimer->Next;
64 return 0;
67 /**************************************************************************
68 * StartMMTime [internal]
70 void StartMMTime()
72 if (!mmTimeStarted) {
73 mmTimeStarted = TRUE;
74 mmSysTimeMS.wType = TIME_MS;
75 mmSysTimeMS.u.ms = 0;
76 mmSysTimeSMPTE.wType = TIME_SMPTE;
77 mmSysTimeSMPTE.u.smpte.hour = 0;
78 mmSysTimeSMPTE.u.smpte.min = 0;
79 mmSysTimeSMPTE.u.smpte.sec = 0;
80 mmSysTimeSMPTE.u.smpte.frame = 0;
81 mmSysTimeSMPTE.u.smpte.fps = 0;
82 mmSysTimeSMPTE.u.smpte.dummy = 0;
83 SetTimer(0, 1, 33, GetWndProcEntry16("MMSysTimeCallback"));
87 /**************************************************************************
88 * timeGetSystemTime [MMSYSTEM.601]
90 WORD timeGetSystemTime(LPMMTIME lpTime, WORD wSize)
92 dprintf_mmsys(stddeb, "timeGetSystemTime(%p, %u);\n", lpTime, wSize);
93 if (!mmTimeStarted)
94 StartMMTime();
95 return 0;
98 /**************************************************************************
99 * timeSetEvent [MMSYSTEM.602]
101 WORD timeSetEvent(WORD wDelay, WORD wResol, LPTIMECALLBACK lpFunc,
102 DWORD dwUser, WORD wFlags)
104 WORD wNewID = 0;
105 LPTIMERENTRY lpNewTimer;
106 LPTIMERENTRY lpTimer = lpTimerList;
107 dprintf_mmsys(stddeb, "timeSetEvent(%u, %u, %p, %08lX, %04X);\n",
108 wDelay, wResol, lpFunc, dwUser, wFlags);
109 if (!mmTimeStarted)
110 StartMMTime();
111 lpNewTimer = (LPTIMERENTRY) malloc(sizeof(TIMERENTRY));
112 if (lpNewTimer == NULL)
113 return 0;
114 while (lpTimer != NULL) {
115 wNewID = max(wNewID, lpTimer->wTimerID);
116 if (lpTimer->Next == NULL)
117 break;
118 lpTimer = lpTimer->Next;
120 if (lpTimerList == NULL) {
121 lpTimerList = lpNewTimer;
122 lpNewTimer->Prev = NULL;
123 } else {
124 lpTimer->Next = lpNewTimer;
125 lpNewTimer->Prev = lpTimer;
127 lpNewTimer->Next = NULL;
128 lpNewTimer->wTimerID = wNewID + 1;
129 lpNewTimer->wCurTime = wDelay;
130 lpNewTimer->wDelay = wDelay;
131 lpNewTimer->wResol = wResol;
132 lpNewTimer->lpFunc = (FARPROC) lpFunc;
133 lpNewTimer->dwUser = dwUser;
134 lpNewTimer->wFlags = wFlags;
135 return lpNewTimer->wTimerID;
138 /**************************************************************************
139 * timeKillEvent [MMSYSTEM.603]
141 WORD timeKillEvent(WORD wID)
143 LPTIMERENTRY lpTimer = lpTimerList;
144 while (lpTimer != NULL) {
145 if (wID == lpTimer->wTimerID) {
146 if (lpTimer->Prev != NULL)
147 lpTimer->Prev->Next = lpTimer->Next;
148 if (lpTimer->Next != NULL)
149 lpTimer->Next->Prev = lpTimer->Prev;
150 free(lpTimer);
151 return TRUE;
153 lpTimer = lpTimer->Next;
155 return 0;
158 /**************************************************************************
159 * timeGetDevCaps [MMSYSTEM.604]
161 WORD timeGetDevCaps(LPTIMECAPS lpCaps, WORD wSize)
163 dprintf_mmsys(stddeb, "timeGetDevCaps(%p, %u) !\n", lpCaps, wSize);
164 return 0;
167 /**************************************************************************
168 * timeBeginPeriod [MMSYSTEM.605]
170 WORD timeBeginPeriod(WORD wPeriod)
172 dprintf_mmsys(stddeb, "timeBeginPeriod(%u) !\n", wPeriod);
173 if (!mmTimeStarted)
174 StartMMTime();
175 return 0;
178 /**************************************************************************
179 * timeEndPeriod [MMSYSTEM.606]
181 WORD timeEndPeriod(WORD wPeriod)
183 dprintf_mmsys(stddeb, "timeEndPeriod(%u) !\n", wPeriod);
184 return 0;
187 /**************************************************************************
188 * timeGetTime [MMSYSTEM.607]
190 DWORD timeGetTime()
192 dprintf_mmsys(stddeb, "timeGetTime(); !\n");
193 if (!mmTimeStarted)
194 StartMMTime();
195 return 0;
198 #endif /* WINELIB */