2 * Sample MCI ANIMATION Wine Driver for Linux
4 * Copyright 1994 Martin Ayotte
8 #define BUILTIN_MMSYSTEM
11 #ifdef BUILTIN_MMSYSTEM
18 #include <sys/ioctl.h>
28 #define ANIMFRAMES_PERSEC 30
29 #define ANIMFRAMES_PERMIN 1800
30 #define SECONDS_PERMIN 60
34 int nUseCount
; /* Incremented for each shared open */
35 BOOL fShareable
; /* TRUE if first open was shareable */
36 WORD wNotifyDeviceID
; /* MCI device ID with a pending notification */
37 HANDLE hCallback
; /* Callback handle for pending notification */
38 MCI_OPEN_PARMS openParms
;
49 static LINUX_ANIM AnimDev
[MAX_ANIMDRV
];
53 /*-----------------------------------------------------------------------*/
55 /**************************************************************************
56 * ANIM_mciOpen [internal]
58 static DWORD
ANIM_mciOpen(UINT wDevID
, DWORD dwFlags
, LPMCI_OPEN_PARMS lpParms
)
61 LPSTR lpstrElementName
;
63 dprintf_mcianim(stddeb
,"ANIM_mciOpen(%04X, %08lX, %p);\n",
64 wDevID
, dwFlags
, lpParms
);
65 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
66 if (AnimDev
[wDevID
].nUseCount
> 0) {
67 /* The driver already open on this channel */
68 /* If the driver was opened shareable before and this open specifies */
69 /* shareable then increment the use count */
70 if (AnimDev
[wDevID
].fShareable
&& (dwFlags
& MCI_OPEN_SHAREABLE
))
71 ++AnimDev
[wDevID
].nUseCount
;
73 return MCIERR_MUST_USE_SHAREABLE
;
76 AnimDev
[wDevID
].nUseCount
= 1;
77 AnimDev
[wDevID
].fShareable
= dwFlags
& MCI_OPEN_SHAREABLE
;
79 dprintf_mcianim(stddeb
,"ANIM_mciOpen // wDevID=%04X\n", wDevID
);
80 lpParms
->wDeviceID
= wDevID
;
81 dprintf_mcianim(stddeb
,"ANIM_mciOpen // lpParms->wDevID=%04X\n", lpParms
->wDeviceID
);
82 if (dwFlags
& MCI_OPEN_ELEMENT
) {
83 lpstrElementName
= (LPSTR
)PTR_SEG_TO_LIN(lpParms
->lpstrElementName
);
84 dprintf_mcianim(stddeb
,"ANIM_mciOpen // MCI_OPEN_ELEMENT '%s' !\n",
86 if (strlen(lpstrElementName
) > 0) {
87 strcpy(str
, lpstrElementName
);
91 memcpy(&AnimDev
[wDevID
].openParms
, lpParms
, sizeof(MCI_OPEN_PARMS
));
92 AnimDev
[wDevID
].wNotifyDeviceID
= lpParms
->wDeviceID
;
93 AnimDev
[wDevID
].mode
= 0;
94 AnimDev
[wDevID
].dwTimeFormat
= MCI_FORMAT_TMSF
;
95 AnimDev
[wDevID
].nCurTrack
= 0;
96 AnimDev
[wDevID
].nTracks
= 0;
97 AnimDev
[wDevID
].dwTotalLen
= 0;
98 AnimDev
[wDevID
].lpdwTrackLen
= NULL
;
99 AnimDev
[wDevID
].lpdwTrackPos
= NULL
;
100 if (dwFlags
& MCI_NOTIFY
) {
101 dprintf_mcianim(stddeb
,
102 "ANIM_mciOpen // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
103 lpParms
->dwCallback
);
104 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
105 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
109 return MCIERR_HARDWARE
;
113 /**************************************************************************
114 * ANIM_mciClose [internal]
116 static DWORD
ANIM_mciClose(UINT wDevID
, DWORD dwParam
, LPMCI_GENERIC_PARMS lpParms
)
119 dprintf_mcianim(stddeb
,"ANIM_mciClose(%u, %08lX, %p);\n",
120 wDevID
, dwParam
, lpParms
);
121 if (AnimDev
[wDevID
].lpdwTrackLen
!= NULL
) free(AnimDev
[wDevID
].lpdwTrackLen
);
122 if (AnimDev
[wDevID
].lpdwTrackPos
!= NULL
) free(AnimDev
[wDevID
].lpdwTrackPos
);
127 /**************************************************************************
128 * ANIM_mciGetDevCaps [internal]
130 static DWORD
ANIM_mciGetDevCaps(UINT wDevID
, DWORD dwFlags
,
131 LPMCI_GETDEVCAPS_PARMS lpParms
)
134 dprintf_mcianim(stddeb
,"ANIM_mciGetDevCaps(%u, %08lX, %p);\n",
135 wDevID
, dwFlags
, lpParms
);
136 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
137 if (dwFlags
& MCI_GETDEVCAPS_ITEM
) {
138 dprintf_mcianim(stddeb
,
139 "ANIM_mciGetDevCaps // MCI_GETDEVCAPS_ITEM dwItem=%08lX;\n",
141 switch(lpParms
->dwItem
) {
142 case MCI_GETDEVCAPS_CAN_RECORD
:
143 lpParms
->dwReturn
= FALSE
;
145 case MCI_GETDEVCAPS_HAS_AUDIO
:
146 lpParms
->dwReturn
= FALSE
;
148 case MCI_GETDEVCAPS_HAS_VIDEO
:
149 lpParms
->dwReturn
= FALSE
;
151 case MCI_GETDEVCAPS_DEVICE_TYPE
:
152 lpParms
->dwReturn
= MCI_DEVTYPE_ANIMATION
;
154 case MCI_GETDEVCAPS_USES_FILES
:
155 lpParms
->dwReturn
= TRUE
;
157 case MCI_GETDEVCAPS_COMPOUND_DEVICE
:
158 lpParms
->dwReturn
= FALSE
;
160 case MCI_GETDEVCAPS_CAN_EJECT
:
161 lpParms
->dwReturn
= TRUE
;
163 case MCI_GETDEVCAPS_CAN_PLAY
:
164 lpParms
->dwReturn
= FALSE
;
166 case MCI_GETDEVCAPS_CAN_SAVE
:
167 lpParms
->dwReturn
= FALSE
;
170 return MCIERR_UNRECOGNIZED_COMMAND
;
173 dprintf_mcianim(stddeb
,
174 "ANIM_mciGetDevCaps // lpParms->dwReturn=%08lX;\n",
178 return MCIERR_INTERNAL
;
183 /**************************************************************************
184 * ANIM_CalcTime [internal]
186 static DWORD
ANIM_CalcTime(UINT wDevID
, DWORD dwFormatType
, DWORD dwFrame
)
194 dprintf_mcianim(stddeb
,"ANIM_CalcTime(%u, %08lX, %lu);\n",
195 wDevID
, dwFormatType
, dwFrame
);
197 switch (dwFormatType
) {
198 case MCI_FORMAT_MILLISECONDS
:
199 dwTime
= dwFrame
/ ANIMFRAMES_PERSEC
* 1000;
200 dprintf_mcianim(stddeb
,
201 "ANIM_CalcTime // MILLISECONDS %lu\n", dwTime
);
204 wMinutes
= dwFrame
/ ANIMFRAMES_PERMIN
;
205 wSeconds
= (dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
) / ANIMFRAMES_PERSEC
;
206 wFrames
= dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
-
207 ANIMFRAMES_PERSEC
* wSeconds
;
208 dwTime
= MCI_MAKE_MSF(wMinutes
, wSeconds
, wFrames
);
209 dprintf_mcianim(stddeb
,"ANIM_CalcTime // MSF %02u:%02u:%02u -> dwTime=%lu\n",
210 wMinutes
, wSeconds
, wFrames
, dwTime
);
213 /* unknown format ! force TMSF ! ... */
214 dwFormatType
= MCI_FORMAT_TMSF
;
215 case MCI_FORMAT_TMSF
:
216 for (wTrack
= 0; wTrack
< AnimDev
[wDevID
].nTracks
; wTrack
++) {
217 /* dwTime += AnimDev[wDevID].lpdwTrackLen[wTrack - 1];
218 printf("Adding trk#%u curpos=%u \n", dwTime);
219 if (dwTime >= dwFrame) break; */
220 if (AnimDev
[wDevID
].lpdwTrackPos
[wTrack
- 1] >= dwFrame
) break;
222 wMinutes
= dwFrame
/ ANIMFRAMES_PERMIN
;
223 wSeconds
= (dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
) / ANIMFRAMES_PERSEC
;
224 wFrames
= dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
-
225 ANIMFRAMES_PERSEC
* wSeconds
;
226 dwTime
= MCI_MAKE_TMSF(wTrack
, wMinutes
, wSeconds
, wFrames
);
227 dprintf_mcianim(stddeb
,
228 "ANIM_CalcTime // %02u-%02u:%02u:%02u\n",
229 wTrack
, wMinutes
, wSeconds
, wFrames
);
237 /**************************************************************************
238 * ANIM_CalcFrame [internal]
240 static DWORD
ANIM_CalcFrame(UINT wDevID
, DWORD dwFormatType
, DWORD dwTime
)
245 dprintf_mcianim(stddeb
,"ANIM_CalcFrame(%u, %08lX, %lu);\n",
246 wDevID
, dwFormatType
, dwTime
);
248 switch (dwFormatType
) {
249 case MCI_FORMAT_MILLISECONDS
:
250 dwFrame
= dwTime
* ANIMFRAMES_PERSEC
/ 1000;
251 dprintf_mcianim(stddeb
,
252 "ANIM_CalcFrame // MILLISECONDS %lu\n", dwFrame
);
255 dprintf_mcianim(stddeb
,
256 "ANIM_CalcFrame // MSF %02u:%02u:%02u\n",
257 MCI_MSF_MINUTE(dwTime
), MCI_MSF_SECOND(dwTime
),
258 MCI_MSF_FRAME(dwTime
));
259 dwFrame
+= ANIMFRAMES_PERMIN
* MCI_MSF_MINUTE(dwTime
);
260 dwFrame
+= ANIMFRAMES_PERSEC
* MCI_MSF_SECOND(dwTime
);
261 dwFrame
+= MCI_MSF_FRAME(dwTime
);
264 /* unknown format ! force TMSF ! ... */
265 dwFormatType
= MCI_FORMAT_TMSF
;
266 case MCI_FORMAT_TMSF
:
267 wTrack
= MCI_TMSF_TRACK(dwTime
);
268 dprintf_mcianim(stddeb
,
269 "ANIM_CalcFrame // TMSF %02u-%02u:%02u:%02u\n",
270 MCI_TMSF_TRACK(dwTime
), MCI_TMSF_MINUTE(dwTime
),
271 MCI_TMSF_SECOND(dwTime
), MCI_TMSF_FRAME(dwTime
));
272 dprintf_mcianim(stddeb
,
273 "ANIM_CalcFrame // TMSF trackpos[%u]=%lu\n",
274 wTrack
, AnimDev
[wDevID
].lpdwTrackPos
[wTrack
- 1]);
275 dwFrame
= AnimDev
[wDevID
].lpdwTrackPos
[wTrack
- 1];
276 dwFrame
+= ANIMFRAMES_PERMIN
* MCI_TMSF_MINUTE(dwTime
);
277 dwFrame
+= ANIMFRAMES_PERSEC
* MCI_TMSF_SECOND(dwTime
);
278 dwFrame
+= MCI_TMSF_FRAME(dwTime
);
286 /**************************************************************************
287 * ANIM_mciInfo [internal]
289 static DWORD
ANIM_mciInfo(UINT wDevID
, DWORD dwFlags
, LPMCI_INFO_PARMS lpParms
)
292 dprintf_mcianim(stddeb
,"ANIM_mciInfo(%u, %08lX, %p);\n",
293 wDevID
, dwFlags
, lpParms
);
294 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
295 lpParms
->lpstrReturn
= NULL
;
297 case MCI_INFO_PRODUCT
:
298 lpParms
->lpstrReturn
= "Linux ANIMATION 0.5";
301 lpParms
->lpstrReturn
=
302 (LPSTR
)AnimDev
[wDevID
].openParms
.lpstrElementName
;
304 case MCI_ANIM_INFO_TEXT
:
305 lpParms
->lpstrReturn
= "Animation Window";
308 return MCIERR_UNRECOGNIZED_COMMAND
;
310 if (lpParms
->lpstrReturn
!= NULL
)
311 lpParms
->dwRetSize
= strlen(lpParms
->lpstrReturn
);
313 lpParms
->dwRetSize
= 0;
316 return MCIERR_INTERNAL
;
320 /**************************************************************************
321 * ANIM_mciStatus [internal]
323 static DWORD
ANIM_mciStatus(UINT wDevID
, DWORD dwFlags
, LPMCI_STATUS_PARMS lpParms
)
326 dprintf_mcianim(stddeb
,"ANIM_mciStatus(%u, %08lX, %p);\n",
327 wDevID
, dwFlags
, lpParms
);
328 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
329 if (dwFlags
& MCI_NOTIFY
) {
330 dprintf_mcianim(stddeb
,
331 "ANIM_mciStatus // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
332 lpParms
->dwCallback
);
333 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
334 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
336 if (dwFlags
& MCI_STATUS_ITEM
) {
337 switch(lpParms
->dwItem
) {
338 case MCI_STATUS_CURRENT_TRACK
:
339 lpParms
->dwReturn
= AnimDev
[wDevID
].nCurTrack
;
340 dprintf_mcianim(stddeb
,"ANIM_mciStatus // CURRENT_TRACK=%lu!\n", lpParms
->dwReturn
);
342 case MCI_STATUS_LENGTH
:
343 if (dwFlags
& MCI_TRACK
) {
344 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_TRACK #%lu LENGTH=??? !\n",
346 if (lpParms
->dwTrack
> AnimDev
[wDevID
].nTracks
)
347 return MCIERR_OUTOFRANGE
;
348 lpParms
->dwReturn
= AnimDev
[wDevID
].lpdwTrackLen
[lpParms
->dwTrack
];
351 lpParms
->dwReturn
= AnimDev
[wDevID
].dwTotalLen
;
352 lpParms
->dwReturn
= ANIM_CalcTime(wDevID
,
353 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwReturn
);
354 dprintf_mcianim(stddeb
,"ANIM_mciStatus // LENGTH=%lu !\n", lpParms
->dwReturn
);
356 case MCI_STATUS_MODE
:
357 lpParms
->dwReturn
= AnimDev
[wDevID
].mode
;
358 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_MODE=%08lX !\n",
361 case MCI_STATUS_MEDIA_PRESENT
:
362 lpParms
->dwReturn
= TRUE
;
363 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_MEDIA_PRESENT !\n");
365 case MCI_STATUS_NUMBER_OF_TRACKS
:
366 lpParms
->dwReturn
= 1;
367 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_NUMBER_OF_TRACKS = %lu !\n",
369 if (lpParms
->dwReturn
== (WORD
)-1) return MCIERR_INTERNAL
;
371 case MCI_STATUS_POSITION
:
372 lpParms
->dwReturn
= AnimDev
[wDevID
].dwCurFrame
;
373 if (dwFlags
& MCI_STATUS_START
) {
374 lpParms
->dwReturn
= 0;
375 dprintf_mcianim(stddeb
,"CDAUDIO_mciStatus // get MCI_STATUS_START !\n");
377 if (dwFlags
& MCI_TRACK
) {
378 if (lpParms
->dwTrack
> AnimDev
[wDevID
].nTracks
)
379 return MCIERR_OUTOFRANGE
;
380 lpParms
->dwReturn
= AnimDev
[wDevID
].lpdwTrackPos
[lpParms
->dwTrack
- 1];
381 dprintf_mcianim(stddeb
,"ANIM_mciStatus // get MCI_TRACK #%lu !\n", lpParms
->dwTrack
);
383 lpParms
->dwReturn
= ANIM_CalcTime(wDevID
,
384 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwReturn
);
385 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_POSITION=%08lX !\n",
388 case MCI_STATUS_READY
:
389 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_READY !\n");
390 lpParms
->dwReturn
= TRUE
;
392 case MCI_STATUS_TIME_FORMAT
:
393 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_TIME_FORMAT !\n");
394 lpParms
->dwReturn
= MCI_FORMAT_MILLISECONDS
;
397 fprintf(stderr
,"ANIM_mciStatus // unknown command %08lX !\n", lpParms
->dwItem
);
398 return MCIERR_UNRECOGNIZED_COMMAND
;
401 fprintf(stderr
,"ANIM_mciStatus // not MCI_STATUS_ITEM !\n");
404 return MMSYSERR_NOTENABLED
;
409 /**************************************************************************
410 * ANIM_mciPlay [internal]
412 static DWORD
ANIM_mciPlay(UINT wDevID
, DWORD dwFlags
, LPMCI_PLAY_PARMS lpParms
)
416 dprintf_mcianim(stddeb
,"ANIM_mciPlay(%u, %08lX, %p);\n",
417 wDevID
, dwFlags
, lpParms
);
418 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
419 start
= 0; end
= AnimDev
[wDevID
].dwTotalLen
;
420 AnimDev
[wDevID
].nCurTrack
= 1;
421 if (dwFlags
& MCI_FROM
) {
422 start
= ANIM_CalcFrame(wDevID
,
423 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwFrom
);
424 dprintf_mcianim(stddeb
,"ANIM_mciPlay // MCI_FROM=%08lX -> %u \n",
425 lpParms
->dwFrom
, start
);
427 if (dwFlags
& MCI_TO
) {
428 end
= ANIM_CalcFrame(wDevID
,
429 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwTo
);
430 dprintf_mcianim(stddeb
,
431 "ANIM_mciPlay // MCI_TO=%08lX -> %u \n",
434 AnimDev
[wDevID
].mode
= MCI_MODE_PLAY
;
435 if (dwFlags
& MCI_NOTIFY
) {
436 dprintf_mcianim(stddeb
,
437 "ANIM_mciPlay // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
438 lpParms
->dwCallback
);
439 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
440 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
444 return MCIERR_HARDWARE
;
448 /**************************************************************************
449 * ANIM_mciStop [internal]
451 static DWORD
ANIM_mciStop(UINT wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
454 dprintf_mcianim(stddeb
,"ANIM_mciStop(%u, %08lX, %p);\n",
455 wDevID
, dwFlags
, lpParms
);
456 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
457 AnimDev
[wDevID
].mode
= MCI_MODE_STOP
;
458 if (dwFlags
& MCI_NOTIFY
) {
459 dprintf_mcianim(stddeb
,
460 "ANIM_mciStop // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
461 lpParms
->dwCallback
);
462 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
463 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
467 return MCIERR_HARDWARE
;
471 /**************************************************************************
472 * ANIM_mciPause [internal]
474 static DWORD
ANIM_mciPause(UINT wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
477 dprintf_mcianim(stddeb
,"ANIM_mciPause(%u, %08lX, %p);\n",
478 wDevID
, dwFlags
, lpParms
);
479 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
480 AnimDev
[wDevID
].mode
= MCI_MODE_PAUSE
;
481 if (dwFlags
& MCI_NOTIFY
) {
482 dprintf_mcianim(stddeb
,
483 "ANIM_mciPause // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
484 lpParms
->dwCallback
);
485 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
486 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
490 return MCIERR_HARDWARE
;
494 /**************************************************************************
495 * ANIM_mciResume [internal]
497 static DWORD
ANIM_mciResume(UINT wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
500 dprintf_mcianim(stddeb
,"ANIM_mciResume(%u, %08lX, %p);\n",
501 wDevID
, dwFlags
, lpParms
);
502 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
503 AnimDev
[wDevID
].mode
= MCI_MODE_STOP
;
504 if (dwFlags
& MCI_NOTIFY
) {
505 dprintf_mcianim(stddeb
,
506 "ANIM_mciResume // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
507 lpParms
->dwCallback
);
508 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
509 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
513 return MCIERR_HARDWARE
;
517 /**************************************************************************
518 * ANIM_mciSeek [internal]
520 static DWORD
ANIM_mciSeek(UINT wDevID
, DWORD dwFlags
, LPMCI_SEEK_PARMS lpParms
)
524 MCI_PLAY_PARMS PlayParms
;
525 dprintf_mcianim(stddeb
,"ANIM_mciSeek(%u, %08lX, %p);\n",
526 wDevID
, dwFlags
, lpParms
);
527 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
528 AnimDev
[wDevID
].mode
= MCI_MODE_SEEK
;
530 case MCI_SEEK_TO_START
:
531 PlayParms
.dwFrom
= 0;
533 case MCI_SEEK_TO_END
:
534 PlayParms
.dwFrom
= AnimDev
[wDevID
].dwTotalLen
;
537 PlayParms
.dwFrom
= lpParms
->dwTo
;
540 dwRet
= ANIM_mciPlay(wDevID
, MCI_WAIT
| MCI_FROM
, &PlayParms
);
541 if (dwRet
!= 0) return dwRet
;
542 dwRet
= ANIM_mciStop(wDevID
, MCI_WAIT
, (LPMCI_GENERIC_PARMS
)&PlayParms
);
543 if (dwFlags
& MCI_NOTIFY
) {
544 dprintf_mcianim(stddeb
,
545 "ANIM_mciSeek // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
546 lpParms
->dwCallback
);
547 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
548 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
552 return MCIERR_HARDWARE
;
557 /**************************************************************************
558 * ANIM_mciSet [internal]
560 static DWORD
ANIM_mciSet(UINT wDevID
, DWORD dwFlags
, LPMCI_SET_PARMS lpParms
)
563 dprintf_mcianim(stddeb
,"ANIM_mciSet(%u, %08lX, %p);\n",
564 wDevID
, dwFlags
, lpParms
);
565 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
567 printf("ANIM_mciSet // dwTimeFormat=%08lX\n", lpParms->dwTimeFormat);
568 printf("ANIM_mciSet // dwAudio=%08lX\n", lpParms->dwAudio);
570 if (dwFlags
& MCI_SET_TIME_FORMAT
) {
571 switch (lpParms
->dwTimeFormat
) {
572 case MCI_FORMAT_MILLISECONDS
:
573 dprintf_mcianim(stddeb
,
574 "ANIM_mciSet // MCI_FORMAT_MILLISECONDS !\n");
577 dprintf_mcianim(stddeb
,"ANIM_mciSet // MCI_FORMAT_MSF !\n");
579 case MCI_FORMAT_TMSF
:
580 dprintf_mcianim(stddeb
,"ANIM_mciSet // MCI_FORMAT_TMSF !\n");
583 fprintf(stderr
,"ANIM_mciSet // bad time format !\n");
584 return MCIERR_BAD_TIME_FORMAT
;
586 AnimDev
[wDevID
].dwTimeFormat
= lpParms
->dwTimeFormat
;
588 if (dwFlags
& MCI_SET_VIDEO
) return MCIERR_UNSUPPORTED_FUNCTION
;
589 if (dwFlags
& MCI_SET_ON
) return MCIERR_UNSUPPORTED_FUNCTION
;
590 if (dwFlags
& MCI_SET_OFF
) return MCIERR_UNSUPPORTED_FUNCTION
;
591 if (dwFlags
& MCI_NOTIFY
) {
592 dprintf_mcianim(stddeb
,
593 "ANIM_mciSet // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
594 lpParms
->dwCallback
);
595 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
596 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
600 return MCIERR_HARDWARE
;
605 /**************************************************************************
606 * ANIM_DriverProc [sample driver]
608 LONG
ANIM_DriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
609 DWORD dwParam1
, DWORD dwParam2
)
618 case MCI_OPEN_DRIVER
:
620 return ANIM_mciOpen(dwDevID
, dwParam1
,
621 (LPMCI_OPEN_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
623 case MCI_CLOSE_DRIVER
:
625 return ANIM_mciClose(dwDevID
, dwParam1
,
626 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
631 case DRV_QUERYCONFIGURE
:
634 MessageBox((HWND
)NULL
, "Sample MultiMedia Linux Driver !",
635 "MMLinux Driver", MB_OK
);
638 return DRVCNF_RESTART
;
640 return DRVCNF_RESTART
;
642 return ANIM_mciGetDevCaps(dwDevID
, dwParam1
,
643 (LPMCI_GETDEVCAPS_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
645 return ANIM_mciInfo(dwDevID
, dwParam1
,
646 (LPMCI_INFO_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
648 return ANIM_mciStatus(dwDevID
, dwParam1
,
649 (LPMCI_STATUS_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
651 return ANIM_mciSet(dwDevID
, dwParam1
,
652 (LPMCI_SET_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
654 return ANIM_mciPlay(dwDevID
, dwParam1
,
655 (LPMCI_PLAY_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
657 return ANIM_mciStop(dwDevID
, dwParam1
,
658 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
660 return ANIM_mciPause(dwDevID
, dwParam1
,
661 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
663 return ANIM_mciResume(dwDevID
, dwParam1
,
664 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
666 return ANIM_mciSeek(dwDevID
, dwParam1
,
667 (LPMCI_SEEK_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
669 return DefDriverProc(dwDevID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
672 return MCIERR_HARDWARE
;
677 /*-----------------------------------------------------------------------*/
679 #endif /* #ifdef BUILTIN_MMSYSTEM */