Release 950918
[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 "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"
23
24 static BOOL mmTimeStarted = FALSE;
25 static MMTIME mmSysTimeMS;
26 static MMTIME mmSysTimeSMPTE;
27
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;
40
41 static LPTIMERENTRY lpTimerList = NULL;
42
43 /**************************************************************************
44  *                              MMSysTimeCallback       [internal]
45  */
46 WORD MMSysTimeCallback(HWND hWnd, WORD wMsg, INT nID, DWORD dwTime)
47 {
48     FARPROC     lpFunc;
49     LPTIMERENTRY lpTimer = lpTimerList;
50     mmSysTimeMS.u.ms += 33;
51     mmSysTimeSMPTE.u.smpte.frame++;
52     while (lpTimer != NULL) {
53         lpTimer->wCurTime--;
54         if (lpTimer->wCurTime == 0) {
55             lpTimer->wCurTime = lpTimer->wDelay;
56             if (lpTimer->lpFunc != (FARPROC) NULL) {
57                 dprintf_mmtime(stddeb, "MMSysTimeCallback // before CallBack16 !\n");
58                 dprintf_mmtime(stddeb, "MMSysTimeCallback // lpFunc=%08lx wTimerID=%04X dwUser=%08lX !\n",
59                         lpTimer->lpFunc, lpTimer->wTimerID, lpTimer->dwUser);
60                 dprintf_mmtime(stddeb, "MMSysTimeCallback // hInstance=%04X !\n", lpTimer->hInstance);
61 /*
62                 lpFunc = MakeProcInstance(lpTimer->hInstance, lpTimer->lpFunc);
63                 dprintf_mmtime(stddeb, "MMSysTimeCallback // MakeProcInstance(lpFunc)=%p %p !\n", 
64                         lpFunc, PTR_SEG_TO_LIN(lpFunc));
65 */
66                 lpFunc = MODULE_GetEntryPoint( lpTimer->hInstance,
67                       MODULE_GetOrdinal(lpTimer->hInstance,"TimerCallBack" ));
68                 dprintf_mmtime(stddeb, "MMSysTimeCallback // lpFunc=%08lx !\n", lpFunc);
69                 
70                 CallTo16_word_wwlll(lpTimer->lpFunc,
71                         lpTimer->hInstance, lpTimer->wTimerID, 
72                         0, lpTimer->dwUser, 0, 0);
73
74 /*
75                 CallTimeFuncProc(lpTimer->lpFunc, lpTimer->wTimerID, 
76                                 0, lpTimer->dwUser, 0, 0);
77 */
78                 dprintf_mmtime(stddeb, "MMSysTimeCallback // after CallBack16 !\n");
79                 fflush(stdout);
80             }
81             if (lpTimer->wFlags & TIME_ONESHOT)
82                 timeKillEvent(lpTimer->wTimerID);
83         }
84         lpTimer = lpTimer->Next;
85     }
86     return 0;
87 }
88
89 /**************************************************************************
90  *                              StartMMTime                     [internal]
91  */
92 void StartMMTime()
93 {
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, GetWndProcEntry16("MMSysTimeCallback"));
106     }
107 }
108
109 /**************************************************************************
110  *                              timeGetSystemTime       [MMSYSTEM.601]
111  */
112 WORD timeGetSystemTime(LPMMTIME lpTime, WORD wSize)
113 {
114     dprintf_mmsys(stddeb, "timeGetSystemTime(%p, %u);\n", lpTime, wSize);
115     if (!mmTimeStarted)
116         StartMMTime();
117     return 0;
118 }
119
120 /**************************************************************************
121  *                              timeSetEvent            [MMSYSTEM.602]
122  */
123 WORD timeSetEvent(WORD wDelay, WORD wResol, LPTIMECALLBACK lpFunc,
124                   DWORD dwUser, WORD wFlags)
125 {
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;
141     }
142     if (lpTimerList == NULL) {
143         lpTimerList = lpNewTimer;
144         lpNewTimer->Prev = NULL;
145     } else {
146         lpTimer->Next = lpNewTimer;
147         lpNewTimer->Prev = lpTimer;
148     }
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;
162 }
163
164 /**************************************************************************
165  *                              timeKillEvent           [MMSYSTEM.603]
166  */
167 WORD timeKillEvent(WORD wID)
168 {
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;
178         }
179         lpTimer = lpTimer->Next;
180     }
181     return 0;
182 }
183
184 /**************************************************************************
185  *                              timeGetDevCaps          [MMSYSTEM.604]
186  */
187 WORD timeGetDevCaps(LPTIMECAPS lpCaps, WORD wSize)
188 {
189     dprintf_mmsys(stddeb, "timeGetDevCaps(%p, %u) !\n", lpCaps, wSize);
190     return 0;
191 }
192
193 /**************************************************************************
194  *                              timeBeginPeriod         [MMSYSTEM.605]
195  */
196 WORD timeBeginPeriod(WORD wPeriod)
197 {
198     dprintf_mmsys(stddeb, "timeBeginPeriod(%u) !\n", wPeriod);
199     if (!mmTimeStarted)
200         StartMMTime();
201     return 0;
202 }
203
204 /**************************************************************************
205  *                              timeEndPeriod           [MMSYSTEM.606]
206  */
207 WORD timeEndPeriod(WORD wPeriod)
208 {
209     dprintf_mmsys(stddeb, "timeEndPeriod(%u) !\n", wPeriod);
210     return 0;
211 }
212
213 /**************************************************************************
214  *                              timeGetTime             [MMSYSTEM.607]
215  */
216 DWORD timeGetTime()
217 {
218     dprintf_mmsys(stddeb, "timeGetTime(); !\n");
219     if (!mmTimeStarted)
220         StartMMTime();
221     return 0;
222 }
223
224 #endif /* WINELIB */