Release 950727
[wine] / multimedia / time.c
1 /*
2  * MMSYTEM time functions
3  *
4  * Copyright 1993 Martin Ayotte
5  */
6
7 #ifndef WINELIB
8
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"
21
22 static BOOL mmTimeStarted = FALSE;
23 static MMTIME mmSysTimeMS;
24 static MMTIME mmSysTimeSMPTE;
25
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;
37
38 static LPTIMERENTRY lpTimerList = NULL;
39
40 /**************************************************************************
41  *                              MMSysTimeCallback       [internal]
42  */
43 WORD MMSysTimeCallback(HWND hWnd, WORD wMsg, INT nID, DWORD dwTime)
44 {
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);
58             }
59             if (lpTimer->wFlags & TIME_ONESHOT)
60                 timeKillEvent(lpTimer->wTimerID);
61         }
62         lpTimer = lpTimer->Next;
63     }
64     return 0;
65 }
66
67 /**************************************************************************
68  *                              StartMMTime                     [internal]
69  */
70 void StartMMTime()
71 {
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"));
84     }
85 }
86
87 /**************************************************************************
88  *                              timeGetSystemTime       [MMSYSTEM.601]
89  */
90 WORD timeGetSystemTime(LPMMTIME lpTime, WORD wSize)
91 {
92     dprintf_mmsys(stddeb, "timeGetSystemTime(%p, %u);\n", lpTime, wSize);
93     if (!mmTimeStarted)
94         StartMMTime();
95     return 0;
96 }
97
98 /**************************************************************************
99  *                              timeSetEvent            [MMSYSTEM.602]
100  */
101 WORD timeSetEvent(WORD wDelay, WORD wResol, LPTIMECALLBACK lpFunc,
102                   DWORD dwUser, WORD wFlags)
103 {
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;
119     }
120     if (lpTimerList == NULL) {
121         lpTimerList = lpNewTimer;
122         lpNewTimer->Prev = NULL;
123     } else {
124         lpTimer->Next = lpNewTimer;
125         lpNewTimer->Prev = lpTimer;
126     }
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;
136 }
137
138 /**************************************************************************
139  *                              timeKillEvent           [MMSYSTEM.603]
140  */
141 WORD timeKillEvent(WORD wID)
142 {
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;
152         }
153         lpTimer = lpTimer->Next;
154     }
155     return 0;
156 }
157
158 /**************************************************************************
159  *                              timeGetDevCaps          [MMSYSTEM.604]
160  */
161 WORD timeGetDevCaps(LPTIMECAPS lpCaps, WORD wSize)
162 {
163     dprintf_mmsys(stddeb, "timeGetDevCaps(%p, %u) !\n", lpCaps, wSize);
164     return 0;
165 }
166
167 /**************************************************************************
168  *                              timeBeginPeriod         [MMSYSTEM.605]
169  */
170 WORD timeBeginPeriod(WORD wPeriod)
171 {
172     dprintf_mmsys(stddeb, "timeBeginPeriod(%u) !\n", wPeriod);
173     if (!mmTimeStarted)
174         StartMMTime();
175     return 0;
176 }
177
178 /**************************************************************************
179  *                              timeEndPeriod           [MMSYSTEM.606]
180  */
181 WORD timeEndPeriod(WORD wPeriod)
182 {
183     dprintf_mmsys(stddeb, "timeEndPeriod(%u) !\n", wPeriod);
184     return 0;
185 }
186
187 /**************************************************************************
188  *                              timeGetTime             [MMSYSTEM.607]
189  */
190 DWORD timeGetTime()
191 {
192     dprintf_mmsys(stddeb, "timeGetTime(); !\n");
193     if (!mmTimeStarted)
194         StartMMTime();
195     return 0;
196 }
197
198 #endif /* WINELIB */