2 * Sample MCI ANIMATION Wine Driver for Linux
4 * Copyright 1994 Martin Ayotte
6 static char Copyright[] = "Copyright Martin Ayotte, 1994";
9 #define BUILTIN_MMSYSTEM
12 #ifdef BUILTIN_MMSYSTEM
19 #include <sys/ioctl.h>
25 /* #define DEBUG_MCIANIM */
31 #define ANIMFRAMES_PERSEC 30
32 #define ANIMFRAMES_PERMIN 1800
33 #define SECONDS_PERMIN 60
37 int nUseCount
; /* Incremented for each shared open */
38 BOOL fShareable
; /* TRUE if first open was shareable */
39 WORD wNotifyDeviceID
; /* MCI device ID with a pending notification */
40 HANDLE hCallback
; /* Callback handle for pending notification */
41 MCI_OPEN_PARMS openParms
;
52 static LINUX_ANIM AnimDev
[MAX_ANIMDRV
];
56 DWORD
ANIM_CalcTime(UINT wDevID
, DWORD dwFormatType
, DWORD dwFrame
);
57 DWORD
ANIM_CalcFrame(UINT wDevID
, DWORD dwFormatType
, DWORD dwTime
);
60 /*-----------------------------------------------------------------------*/
62 /**************************************************************************
63 * ANIM_mciOpen [internal]
65 DWORD
ANIM_mciOpen(UINT wDevID
, DWORD dwFlags
, LPMCI_OPEN_PARMS lpParms
)
68 LPSTR lpstrElementName
;
70 dprintf_mcianim(stddeb
,"ANIM_mciOpen(%04X, %08lX, %p);\n",
71 wDevID
, dwFlags
, lpParms
);
72 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
73 if (AnimDev
[wDevID
].nUseCount
> 0) {
74 /* The driver already open on this channel */
75 /* If the driver was opened shareable before and this open specifies */
76 /* shareable then increment the use count */
77 if (AnimDev
[wDevID
].fShareable
&& (dwFlags
& MCI_OPEN_SHAREABLE
))
78 ++AnimDev
[wDevID
].nUseCount
;
80 return MCIERR_MUST_USE_SHAREABLE
;
83 AnimDev
[wDevID
].nUseCount
= 1;
84 AnimDev
[wDevID
].fShareable
= dwFlags
& MCI_OPEN_SHAREABLE
;
86 dprintf_mcianim(stddeb
,"ANIM_mciOpen // wDevID=%04X\n", wDevID
);
87 lpParms
->wDeviceID
= wDevID
;
88 dprintf_mcianim(stddeb
,"ANIM_mciOpen // lpParms->wDevID=%04X\n", lpParms
->wDeviceID
);
89 if (dwFlags
& MCI_OPEN_ELEMENT
) {
90 lpstrElementName
= (LPSTR
)PTR_SEG_TO_LIN(lpParms
->lpstrElementName
);
91 dprintf_mcianim(stddeb
,"ANIM_mciOpen // MCI_OPEN_ELEMENT '%s' !\n",
93 if (strlen(lpstrElementName
) > 0) {
94 strcpy(str
, lpstrElementName
);
98 memcpy(&AnimDev
[wDevID
].openParms
, lpParms
, sizeof(MCI_OPEN_PARMS
));
99 AnimDev
[wDevID
].wNotifyDeviceID
= lpParms
->wDeviceID
;
100 AnimDev
[wDevID
].mode
= 0;
101 AnimDev
[wDevID
].dwTimeFormat
= MCI_FORMAT_TMSF
;
102 AnimDev
[wDevID
].nCurTrack
= 0;
103 AnimDev
[wDevID
].nTracks
= 0;
104 AnimDev
[wDevID
].dwTotalLen
= 0;
105 AnimDev
[wDevID
].lpdwTrackLen
= NULL
;
106 AnimDev
[wDevID
].lpdwTrackPos
= NULL
;
107 if (dwFlags
& MCI_NOTIFY
) {
108 dprintf_mcianim(stddeb
,
109 "ANIM_mciOpen // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
110 lpParms
->dwCallback
);
111 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
112 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
116 return MCIERR_HARDWARE
;
120 /**************************************************************************
121 * ANIM_mciClose [internal]
123 DWORD
ANIM_mciClose(UINT wDevID
, DWORD dwParam
, LPMCI_GENERIC_PARMS lpParms
)
126 dprintf_mcianim(stddeb
,"ANIM_mciClose(%u, %08lX, %p);\n",
127 wDevID
, dwParam
, lpParms
);
128 if (AnimDev
[wDevID
].lpdwTrackLen
!= NULL
) free(AnimDev
[wDevID
].lpdwTrackLen
);
129 if (AnimDev
[wDevID
].lpdwTrackPos
!= NULL
) free(AnimDev
[wDevID
].lpdwTrackPos
);
134 /**************************************************************************
135 * ANIM_mciGetDevCaps [internal]
137 DWORD
ANIM_mciGetDevCaps(UINT wDevID
, DWORD dwFlags
,
138 LPMCI_GETDEVCAPS_PARMS lpParms
)
141 dprintf_mcianim(stddeb
,"ANIM_mciGetDevCaps(%u, %08lX, %p);\n",
142 wDevID
, dwFlags
, lpParms
);
143 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
144 if (dwFlags
& MCI_GETDEVCAPS_ITEM
) {
145 dprintf_mcianim(stddeb
,
146 "ANIM_mciGetDevCaps // MCI_GETDEVCAPS_ITEM dwItem=%08lX;\n",
148 switch(lpParms
->dwItem
) {
149 case MCI_GETDEVCAPS_CAN_RECORD
:
150 lpParms
->dwReturn
= FALSE
;
152 case MCI_GETDEVCAPS_HAS_AUDIO
:
153 lpParms
->dwReturn
= FALSE
;
155 case MCI_GETDEVCAPS_HAS_VIDEO
:
156 lpParms
->dwReturn
= FALSE
;
158 case MCI_GETDEVCAPS_DEVICE_TYPE
:
159 lpParms
->dwReturn
= MCI_DEVTYPE_ANIMATION
;
161 case MCI_GETDEVCAPS_USES_FILES
:
162 lpParms
->dwReturn
= TRUE
;
164 case MCI_GETDEVCAPS_COMPOUND_DEVICE
:
165 lpParms
->dwReturn
= FALSE
;
167 case MCI_GETDEVCAPS_CAN_EJECT
:
168 lpParms
->dwReturn
= TRUE
;
170 case MCI_GETDEVCAPS_CAN_PLAY
:
171 lpParms
->dwReturn
= FALSE
;
173 case MCI_GETDEVCAPS_CAN_SAVE
:
174 lpParms
->dwReturn
= FALSE
;
177 return MCIERR_UNRECOGNIZED_COMMAND
;
180 dprintf_mcianim(stddeb
,
181 "ANIM_mciGetDevCaps // lpParms->dwReturn=%08lX;\n",
185 return MCIERR_INTERNAL
;
189 /**************************************************************************
190 * ANIM_mciInfo [internal]
192 DWORD
ANIM_mciInfo(UINT wDevID
, DWORD dwFlags
, LPMCI_INFO_PARMS lpParms
)
195 dprintf_mcianim(stddeb
,"ANIM_mciInfo(%u, %08lX, %p);\n",
196 wDevID
, dwFlags
, lpParms
);
197 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
198 lpParms
->lpstrReturn
= NULL
;
200 case MCI_INFO_PRODUCT
:
201 lpParms
->lpstrReturn
= "Linux ANIMATION 0.5";
204 lpParms
->lpstrReturn
=
205 (LPSTR
)AnimDev
[wDevID
].openParms
.lpstrElementName
;
207 case MCI_ANIM_INFO_TEXT
:
208 lpParms
->lpstrReturn
= "Animation Window";
211 return MCIERR_UNRECOGNIZED_COMMAND
;
213 if (lpParms
->lpstrReturn
!= NULL
)
214 lpParms
->dwRetSize
= strlen(lpParms
->lpstrReturn
);
216 lpParms
->dwRetSize
= 0;
219 return MCIERR_INTERNAL
;
223 /**************************************************************************
224 * ANIM_mciStatus [internal]
226 DWORD
ANIM_mciStatus(UINT wDevID
, DWORD dwFlags
, LPMCI_STATUS_PARMS lpParms
)
229 dprintf_mcianim(stddeb
,"ANIM_mciStatus(%u, %08lX, %p);\n",
230 wDevID
, dwFlags
, lpParms
);
231 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
232 if (dwFlags
& MCI_NOTIFY
) {
233 dprintf_mcianim(stddeb
,
234 "ANIM_mciStatus // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
235 lpParms
->dwCallback
);
236 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
237 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
239 if (dwFlags
& MCI_STATUS_ITEM
) {
240 switch(lpParms
->dwItem
) {
241 case MCI_STATUS_CURRENT_TRACK
:
242 lpParms
->dwReturn
= AnimDev
[wDevID
].nCurTrack
;
243 dprintf_mcianim(stddeb
,"ANIM_mciStatus // CURRENT_TRACK=%lu!\n", lpParms
->dwReturn
);
245 case MCI_STATUS_LENGTH
:
246 if (dwFlags
& MCI_TRACK
) {
247 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_TRACK #%lu LENGTH=??? !\n",
249 if (lpParms
->dwTrack
> AnimDev
[wDevID
].nTracks
)
250 return MCIERR_OUTOFRANGE
;
251 lpParms
->dwReturn
= AnimDev
[wDevID
].lpdwTrackLen
[lpParms
->dwTrack
];
254 lpParms
->dwReturn
= AnimDev
[wDevID
].dwTotalLen
;
255 lpParms
->dwReturn
= ANIM_CalcTime(wDevID
,
256 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwReturn
);
257 dprintf_mcianim(stddeb
,"ANIM_mciStatus // LENGTH=%lu !\n", lpParms
->dwReturn
);
259 case MCI_STATUS_MODE
:
260 lpParms
->dwReturn
= AnimDev
[wDevID
].mode
;
261 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_MODE=%08lX !\n",
264 case MCI_STATUS_MEDIA_PRESENT
:
265 lpParms
->dwReturn
= TRUE
;
266 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_MEDIA_PRESENT !\n");
268 case MCI_STATUS_NUMBER_OF_TRACKS
:
269 lpParms
->dwReturn
= 1;
270 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_NUMBER_OF_TRACKS = %lu !\n",
272 if (lpParms
->dwReturn
== (WORD
)-1) return MCIERR_INTERNAL
;
274 case MCI_STATUS_POSITION
:
275 lpParms
->dwReturn
= AnimDev
[wDevID
].dwCurFrame
;
276 if (dwFlags
& MCI_STATUS_START
) {
277 lpParms
->dwReturn
= 0;
278 dprintf_mcianim(stddeb
,"CDAUDIO_mciStatus // get MCI_STATUS_START !\n");
280 if (dwFlags
& MCI_TRACK
) {
281 if (lpParms
->dwTrack
> AnimDev
[wDevID
].nTracks
)
282 return MCIERR_OUTOFRANGE
;
283 lpParms
->dwReturn
= AnimDev
[wDevID
].lpdwTrackPos
[lpParms
->dwTrack
- 1];
284 dprintf_mcianim(stddeb
,"ANIM_mciStatus // get MCI_TRACK #%lu !\n", lpParms
->dwTrack
);
286 lpParms
->dwReturn
= ANIM_CalcTime(wDevID
,
287 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwReturn
);
288 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_POSITION=%08lX !\n",
291 case MCI_STATUS_READY
:
292 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_READY !\n");
293 lpParms
->dwReturn
= TRUE
;
295 case MCI_STATUS_TIME_FORMAT
:
296 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_TIME_FORMAT !\n");
297 lpParms
->dwReturn
= MCI_FORMAT_MILLISECONDS
;
300 fprintf(stderr
,"ANIM_mciStatus // unknown command %08lX !\n", lpParms
->dwItem
);
301 return MCIERR_UNRECOGNIZED_COMMAND
;
304 fprintf(stderr
,"ANIM_mciStatus // not MCI_STATUS_ITEM !\n");
307 return MMSYSERR_NOTENABLED
;
312 /**************************************************************************
313 * ANIM_CalcTime [internal]
315 DWORD
ANIM_CalcTime(UINT wDevID
, DWORD dwFormatType
, DWORD dwFrame
)
323 dprintf_mcianim(stddeb
,"ANIM_CalcTime(%u, %08lX, %lu);\n",
324 wDevID
, dwFormatType
, dwFrame
);
326 switch (dwFormatType
) {
327 case MCI_FORMAT_MILLISECONDS
:
328 dwTime
= dwFrame
/ ANIMFRAMES_PERSEC
* 1000;
329 dprintf_mcianim(stddeb
,
330 "ANIM_CalcTime // MILLISECONDS %lu\n", dwTime
);
333 wMinutes
= dwFrame
/ ANIMFRAMES_PERMIN
;
334 wSeconds
= (dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
) / ANIMFRAMES_PERSEC
;
335 wFrames
= dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
-
336 ANIMFRAMES_PERSEC
* wSeconds
;
337 dwTime
= MCI_MAKE_MSF(wMinutes
, wSeconds
, wFrames
);
338 dprintf_mcianim(stddeb
,"ANIM_CalcTime // MSF %02u:%02u:%02u -> dwTime=%lu\n",
339 wMinutes
, wSeconds
, wFrames
, dwTime
);
341 case MCI_FORMAT_TMSF
:
342 for (wTrack
= 0; wTrack
< AnimDev
[wDevID
].nTracks
; wTrack
++) {
343 /* dwTime += AnimDev[wDevID].lpdwTrackLen[wTrack - 1];
344 printf("Adding trk#%u curpos=%u \n", dwTime);
345 if (dwTime >= dwFrame) break; */
346 if (AnimDev
[wDevID
].lpdwTrackPos
[wTrack
- 1] >= dwFrame
) break;
348 wMinutes
= dwFrame
/ ANIMFRAMES_PERMIN
;
349 wSeconds
= (dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
) / ANIMFRAMES_PERSEC
;
350 wFrames
= dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
-
351 ANIMFRAMES_PERSEC
* wSeconds
;
352 dwTime
= MCI_MAKE_TMSF(wTrack
, wMinutes
, wSeconds
, wFrames
);
353 dprintf_mcianim(stddeb
,
354 "ANIM_CalcTime // %02u-%02u:%02u:%02u\n",
355 wTrack
, wMinutes
, wSeconds
, wFrames
);
358 /* unknown format ! force TMSF ! ... */
359 dwFormatType
= MCI_FORMAT_TMSF
;
367 /**************************************************************************
368 * ANIM_CalcFrame [internal]
370 DWORD
ANIM_CalcFrame(UINT wDevID
, DWORD dwFormatType
, DWORD dwTime
)
375 dprintf_mcianim(stddeb
,"ANIM_CalcFrame(%u, %08lX, %lu);\n",
376 wDevID
, dwFormatType
, dwTime
);
378 switch (dwFormatType
) {
379 case MCI_FORMAT_MILLISECONDS
:
380 dwFrame
= dwTime
* ANIMFRAMES_PERSEC
/ 1000;
381 dprintf_mcianim(stddeb
,
382 "ANIM_CalcFrame // MILLISECONDS %lu\n", dwFrame
);
385 dprintf_mcianim(stddeb
,
386 "ANIM_CalcFrame // MSF %02u:%02u:%02u\n",
387 MCI_MSF_MINUTE(dwTime
), MCI_MSF_SECOND(dwTime
),
388 MCI_MSF_FRAME(dwTime
));
389 dwFrame
+= ANIMFRAMES_PERMIN
* MCI_MSF_MINUTE(dwTime
);
390 dwFrame
+= ANIMFRAMES_PERSEC
* MCI_MSF_SECOND(dwTime
);
391 dwFrame
+= MCI_MSF_FRAME(dwTime
);
393 case MCI_FORMAT_TMSF
:
394 wTrack
= MCI_TMSF_TRACK(dwTime
);
395 dprintf_mcianim(stddeb
,
396 "ANIM_CalcFrame // TMSF %02u-%02u:%02u:%02u\n",
397 MCI_TMSF_TRACK(dwTime
), MCI_TMSF_MINUTE(dwTime
),
398 MCI_TMSF_SECOND(dwTime
), MCI_TMSF_FRAME(dwTime
));
399 dprintf_mcianim(stddeb
,
400 "ANIM_CalcFrame // TMSF trackpos[%u]=%lu\n",
401 wTrack
, AnimDev
[wDevID
].lpdwTrackPos
[wTrack
- 1]);
402 dwFrame
= AnimDev
[wDevID
].lpdwTrackPos
[wTrack
- 1];
403 dwFrame
+= ANIMFRAMES_PERMIN
* MCI_TMSF_MINUTE(dwTime
);
404 dwFrame
+= ANIMFRAMES_PERSEC
* MCI_TMSF_SECOND(dwTime
);
405 dwFrame
+= MCI_TMSF_FRAME(dwTime
);
408 /* unknown format ! force TMSF ! ... */
409 dwFormatType
= MCI_FORMAT_TMSF
;
418 /**************************************************************************
419 * ANIM_mciPlay [internal]
421 DWORD
ANIM_mciPlay(UINT wDevID
, DWORD dwFlags
, LPMCI_PLAY_PARMS lpParms
)
425 dprintf_mcianim(stddeb
,"ANIM_mciPlay(%u, %08lX, %p);\n",
426 wDevID
, dwFlags
, lpParms
);
427 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
428 start
= 0; end
= AnimDev
[wDevID
].dwTotalLen
;
429 AnimDev
[wDevID
].nCurTrack
= 1;
430 if (dwFlags
& MCI_FROM
) {
431 start
= ANIM_CalcFrame(wDevID
,
432 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwFrom
);
433 dprintf_mcianim(stddeb
,"ANIM_mciPlay // MCI_FROM=%08lX -> %u \n",
434 lpParms
->dwFrom
, start
);
436 if (dwFlags
& MCI_TO
) {
437 end
= ANIM_CalcFrame(wDevID
,
438 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwTo
);
439 dprintf_mcianim(stddeb
,
440 "ANIM_mciPlay // MCI_TO=%08lX -> %u \n",
443 AnimDev
[wDevID
].mode
= MCI_MODE_PLAY
;
444 if (dwFlags
& MCI_NOTIFY
) {
445 dprintf_mcianim(stddeb
,
446 "ANIM_mciPlay // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
447 lpParms
->dwCallback
);
448 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
449 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
453 return MCIERR_HARDWARE
;
457 /**************************************************************************
458 * ANIM_mciStop [internal]
460 DWORD
ANIM_mciStop(UINT wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
463 dprintf_mcianim(stddeb
,"ANIM_mciStop(%u, %08lX, %p);\n",
464 wDevID
, dwFlags
, lpParms
);
465 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
466 AnimDev
[wDevID
].mode
= MCI_MODE_STOP
;
467 if (dwFlags
& MCI_NOTIFY
) {
468 dprintf_mcianim(stddeb
,
469 "ANIM_mciStop // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
470 lpParms
->dwCallback
);
471 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
472 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
476 return MCIERR_HARDWARE
;
480 /**************************************************************************
481 * ANIM_mciPause [internal]
483 DWORD
ANIM_mciPause(UINT wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
486 dprintf_mcianim(stddeb
,"ANIM_mciPause(%u, %08lX, %p);\n",
487 wDevID
, dwFlags
, lpParms
);
488 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
489 AnimDev
[wDevID
].mode
= MCI_MODE_PAUSE
;
490 if (dwFlags
& MCI_NOTIFY
) {
491 dprintf_mcianim(stddeb
,
492 "ANIM_mciPause // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
493 lpParms
->dwCallback
);
494 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
495 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
499 return MCIERR_HARDWARE
;
503 /**************************************************************************
504 * ANIM_mciResume [internal]
506 DWORD
ANIM_mciResume(UINT wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
509 dprintf_mcianim(stddeb
,"ANIM_mciResume(%u, %08lX, %p);\n",
510 wDevID
, dwFlags
, lpParms
);
511 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
512 AnimDev
[wDevID
].mode
= MCI_MODE_STOP
;
513 if (dwFlags
& MCI_NOTIFY
) {
514 dprintf_mcianim(stddeb
,
515 "ANIM_mciResume // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
516 lpParms
->dwCallback
);
517 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
518 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
522 return MCIERR_HARDWARE
;
526 /**************************************************************************
527 * ANIM_mciSeek [internal]
529 DWORD
ANIM_mciSeek(UINT wDevID
, DWORD dwFlags
, LPMCI_SEEK_PARMS lpParms
)
533 MCI_PLAY_PARMS PlayParms
;
534 dprintf_mcianim(stddeb
,"ANIM_mciSeek(%u, %08lX, %p);\n",
535 wDevID
, dwFlags
, lpParms
);
536 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
537 AnimDev
[wDevID
].mode
= MCI_MODE_SEEK
;
539 case MCI_SEEK_TO_START
:
540 PlayParms
.dwFrom
= 0;
542 case MCI_SEEK_TO_END
:
543 PlayParms
.dwFrom
= AnimDev
[wDevID
].dwTotalLen
;
546 PlayParms
.dwFrom
= lpParms
->dwTo
;
549 dwRet
= ANIM_mciPlay(wDevID
, MCI_WAIT
| MCI_FROM
, &PlayParms
);
550 if (dwRet
!= 0) return dwRet
;
551 dwRet
= ANIM_mciStop(wDevID
, MCI_WAIT
, (LPMCI_GENERIC_PARMS
)&PlayParms
);
552 if (dwFlags
& MCI_NOTIFY
) {
553 dprintf_mcianim(stddeb
,
554 "ANIM_mciSeek // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
555 lpParms
->dwCallback
);
556 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
557 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
561 return MCIERR_HARDWARE
;
566 /**************************************************************************
567 * ANIM_mciSet [internal]
569 DWORD
ANIM_mciSet(UINT wDevID
, DWORD dwFlags
, LPMCI_SET_PARMS lpParms
)
572 dprintf_mcianim(stddeb
,"ANIM_mciSet(%u, %08lX, %p);\n",
573 wDevID
, dwFlags
, lpParms
);
574 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
576 printf("ANIM_mciSet // dwTimeFormat=%08lX\n", lpParms->dwTimeFormat);
577 printf("ANIM_mciSet // dwAudio=%08lX\n", lpParms->dwAudio);
579 if (dwFlags
& MCI_SET_TIME_FORMAT
) {
580 switch (lpParms
->dwTimeFormat
) {
581 case MCI_FORMAT_MILLISECONDS
:
582 dprintf_mcianim(stddeb
,
583 "ANIM_mciSet // MCI_FORMAT_MILLISECONDS !\n");
586 dprintf_mcianim(stddeb
,"ANIM_mciSet // MCI_FORMAT_MSF !\n");
588 case MCI_FORMAT_TMSF
:
589 dprintf_mcianim(stddeb
,"ANIM_mciSet // MCI_FORMAT_TMSF !\n");
592 fprintf(stderr
,"ANIM_mciSet // bad time format !\n");
593 return MCIERR_BAD_TIME_FORMAT
;
595 AnimDev
[wDevID
].dwTimeFormat
= lpParms
->dwTimeFormat
;
597 if (dwFlags
& MCI_SET_VIDEO
) return MCIERR_UNSUPPORTED_FUNCTION
;
598 if (dwFlags
& MCI_SET_ON
) return MCIERR_UNSUPPORTED_FUNCTION
;
599 if (dwFlags
& MCI_SET_OFF
) return MCIERR_UNSUPPORTED_FUNCTION
;
600 if (dwFlags
& MCI_NOTIFY
) {
601 dprintf_mcianim(stddeb
,
602 "ANIM_mciSet // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
603 lpParms
->dwCallback
);
604 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
605 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
609 return MCIERR_HARDWARE
;
614 /**************************************************************************
615 * ANIM_DriverProc [sample driver]
617 LRESULT
ANIM_DriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
618 DWORD dwParam1
, DWORD dwParam2
)
627 case MCI_OPEN_DRIVER
:
629 return ANIM_mciOpen(dwDevID
, dwParam1
,
630 (LPMCI_OPEN_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
632 case MCI_CLOSE_DRIVER
:
634 return ANIM_mciClose(dwDevID
, dwParam1
,
635 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
640 case DRV_QUERYCONFIGURE
:
643 MessageBox((HWND
)NULL
, "Sample MultiMedia Linux Driver !",
644 "MMLinux Driver", MB_OK
);
647 return (LRESULT
)DRVCNF_RESTART
;
649 return (LRESULT
)DRVCNF_RESTART
;
651 return ANIM_mciGetDevCaps(dwDevID
, dwParam1
,
652 (LPMCI_GETDEVCAPS_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
654 return ANIM_mciInfo(dwDevID
, dwParam1
,
655 (LPMCI_INFO_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
657 return ANIM_mciStatus(dwDevID
, dwParam1
,
658 (LPMCI_STATUS_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
660 return ANIM_mciSet(dwDevID
, dwParam1
,
661 (LPMCI_SET_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
663 return ANIM_mciPlay(dwDevID
, dwParam1
,
664 (LPMCI_PLAY_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
666 return ANIM_mciStop(dwDevID
, dwParam1
,
667 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
669 return ANIM_mciPause(dwDevID
, dwParam1
,
670 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
672 return ANIM_mciResume(dwDevID
, dwParam1
,
673 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
675 return ANIM_mciSeek(dwDevID
, dwParam1
,
676 (LPMCI_SEEK_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
678 return DefDriverProc(dwDevID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
681 return MCIERR_HARDWARE
;
686 /*-----------------------------------------------------------------------*/
688 #endif /* #ifdef BUILTIN_MMSYSTEM */