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_ANIM /* */
26 /* #undef DEBUG_ANIM /* */
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(DWORD dwFlags
, LPMCI_OPEN_PARMS lpParms
)
70 dprintf_mcianim(stddeb
,"ANIM_mciOpen(%08X, %08X);\n",
72 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
73 wDevID
= lpParms
->wDeviceID
;
74 if (AnimDev
[wDevID
].nUseCount
> 0) {
75 /* The driver already open on this channel */
76 /* If the driver was opened shareable before and this open specifies */
77 /* shareable then increment the use count */
78 if (AnimDev
[wDevID
].fShareable
&& (dwFlags
& MCI_OPEN_SHAREABLE
))
79 ++AnimDev
[wDevID
].nUseCount
;
81 return MCIERR_MUST_USE_SHAREABLE
;
84 AnimDev
[wDevID
].nUseCount
= 1;
85 AnimDev
[wDevID
].fShareable
= dwFlags
& MCI_OPEN_SHAREABLE
;
87 if (dwFlags
& MCI_OPEN_ELEMENT
) {
88 dprintf_mcianim(stddeb
,"ANIM_mciOpen // MCI_OPEN_ELEMENT !\n");
89 /* return MCIERR_NO_ELEMENT_ALLOWED; */
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 %08X !\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 DWORD
ANIM_mciClose(UINT wDevID
, DWORD dwParam
, LPMCI_GENERIC_PARMS lpParms
)
119 dprintf_mcianim(stddeb
,"ANIM_mciClose(%u, %08X, %08X);\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
);
126 /**************************************************************************
127 * ANIM_mciGetDevCaps [internal]
129 DWORD
ANIM_mciGetDevCaps(UINT wDevID
, DWORD dwFlags
,
130 LPMCI_GETDEVCAPS_PARMS lpParms
)
133 dprintf_mcianim(stddeb
,"ANIM_mciGetDevCaps(%u, %08X, %08X);\n",
134 wDevID
, dwFlags
, lpParms
);
135 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
136 if (dwFlags
& MCI_GETDEVCAPS_ITEM
) {
137 dprintf_mcianim(stddeb
,
138 "ANIM_mciGetDevCaps // MCI_GETDEVCAPS_ITEM dwItem=%08X;\n",
140 switch(lpParms
->dwItem
) {
141 case MCI_GETDEVCAPS_CAN_RECORD
:
142 lpParms
->dwReturn
= FALSE
;
144 case MCI_GETDEVCAPS_HAS_AUDIO
:
145 lpParms
->dwReturn
= FALSE
;
147 case MCI_GETDEVCAPS_HAS_VIDEO
:
148 lpParms
->dwReturn
= FALSE
;
150 case MCI_GETDEVCAPS_DEVICE_TYPE
:
151 lpParms
->dwReturn
= MCI_DEVTYPE_ANIMATION
;
153 case MCI_GETDEVCAPS_USES_FILES
:
154 lpParms
->dwReturn
= TRUE
;
156 case MCI_GETDEVCAPS_COMPOUND_DEVICE
:
157 lpParms
->dwReturn
= FALSE
;
159 case MCI_GETDEVCAPS_CAN_EJECT
:
160 lpParms
->dwReturn
= TRUE
;
162 case MCI_GETDEVCAPS_CAN_PLAY
:
163 lpParms
->dwReturn
= FALSE
;
165 case MCI_GETDEVCAPS_CAN_SAVE
:
166 lpParms
->dwReturn
= FALSE
;
169 return MCIERR_UNRECOGNIZED_COMMAND
;
172 dprintf_mcianim(stddeb
,
173 "ANIM_mciGetDevCaps // lpParms->dwReturn=%08X;\n",
177 return MCIERR_INTERNAL
;
181 /**************************************************************************
182 * ANIM_mciInfo [internal]
184 DWORD
ANIM_mciInfo(UINT wDevID
, DWORD dwFlags
, LPMCI_INFO_PARMS lpParms
)
187 dprintf_mcianim(stddeb
,"ANIM_mciInfo(%u, %08X, %08X);\n",
188 wDevID
, dwFlags
, lpParms
);
189 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
190 lpParms
->lpstrReturn
= NULL
;
192 case MCI_INFO_PRODUCT
:
193 lpParms
->lpstrReturn
= "Linux ANIMATION 0.5";
196 lpParms
->lpstrReturn
=
197 (LPSTR
)AnimDev
[wDevID
].openParms
.lpstrElementName
;
199 case MCI_ANIM_INFO_TEXT
:
200 lpParms
->lpstrReturn
= "Animation Window";
203 return MCIERR_UNRECOGNIZED_COMMAND
;
205 if (lpParms
->lpstrReturn
!= NULL
)
206 lpParms
->dwRetSize
= strlen(lpParms
->lpstrReturn
);
208 lpParms
->dwRetSize
= 0;
211 return MCIERR_INTERNAL
;
215 /**************************************************************************
216 * ANIM_mciStatus [internal]
218 DWORD
ANIM_mciStatus(UINT wDevID
, DWORD dwFlags
, LPMCI_STATUS_PARMS lpParms
)
221 dprintf_mcianim(stddeb
,"ANIM_mciStatus(%u, %08X, %08X);\n",
222 wDevID
, dwFlags
, lpParms
);
223 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
224 if (dwFlags
& MCI_NOTIFY
) {
225 dprintf_mcianim(stddeb
,
226 "ANIM_mciStatus // MCI_NOTIFY_SUCCESSFUL %08X !\n",
227 lpParms
->dwCallback
);
228 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
229 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
231 if (dwFlags
& MCI_STATUS_ITEM
) {
232 switch(lpParms
->dwItem
) {
233 case MCI_STATUS_CURRENT_TRACK
:
234 lpParms
->dwReturn
= AnimDev
[wDevID
].nCurTrack
;
235 dprintf_mcianim(stddeb
,"ANIM_mciStatus // CURRENT_TRACK=%u!\n", lpParms
->dwReturn
);
237 case MCI_STATUS_LENGTH
:
238 if (dwFlags
& MCI_TRACK
) {
239 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_TRACK #%u LENGTH=??? !\n",
241 if (lpParms
->dwTrack
> AnimDev
[wDevID
].nTracks
)
242 return MCIERR_OUTOFRANGE
;
243 lpParms
->dwReturn
= AnimDev
[wDevID
].lpdwTrackLen
[lpParms
->dwTrack
];
246 lpParms
->dwReturn
= AnimDev
[wDevID
].dwTotalLen
;
247 lpParms
->dwReturn
= ANIM_CalcTime(wDevID
,
248 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwReturn
);
249 dprintf_mcianim(stddeb
,"ANIM_mciStatus // LENGTH=%u !\n", lpParms
->dwReturn
);
251 case MCI_STATUS_MODE
:
252 lpParms
->dwReturn
= AnimDev
[wDevID
].mode
;
253 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_MODE=%08X !\n",
256 case MCI_STATUS_MEDIA_PRESENT
:
257 lpParms
->dwReturn
= TRUE
;
258 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_MEDIA_PRESENT !\n");
260 case MCI_STATUS_NUMBER_OF_TRACKS
:
261 lpParms
->dwReturn
= 1;
262 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_NUMBER_OF_TRACKS = %u !\n",
264 if (lpParms
->dwReturn
== (WORD
)-1) return MCIERR_INTERNAL
;
266 case MCI_STATUS_POSITION
:
267 lpParms
->dwReturn
= AnimDev
[wDevID
].dwCurFrame
;
268 if (dwFlags
& MCI_STATUS_START
) {
269 lpParms
->dwReturn
= 0;
270 dprintf_mcianim(stddeb
,"CDAUDIO_mciStatus // get MCI_STATUS_START !\n");
272 if (dwFlags
& MCI_TRACK
) {
273 if (lpParms
->dwTrack
> AnimDev
[wDevID
].nTracks
)
274 return MCIERR_OUTOFRANGE
;
275 lpParms
->dwReturn
= AnimDev
[wDevID
].lpdwTrackPos
[lpParms
->dwTrack
- 1];
276 dprintf_mcianim(stddeb
,"ANIM_mciStatus // get MCI_TRACK #%u !\n", lpParms
->dwTrack
);
278 lpParms
->dwReturn
= ANIM_CalcTime(wDevID
,
279 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwReturn
);
280 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_POSITION=%08X !\n",
283 case MCI_STATUS_READY
:
284 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_READY !\n");
285 lpParms
->dwReturn
= TRUE
;
287 case MCI_STATUS_TIME_FORMAT
:
288 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_TIME_FORMAT !\n");
289 lpParms
->dwReturn
= MCI_FORMAT_MILLISECONDS
;
292 fprintf(stderr
,"ANIM_mciStatus // unknown command %04X !\n", lpParms
->dwItem
);
293 return MCIERR_UNRECOGNIZED_COMMAND
;
296 fprintf(stderr
,"ANIM_mciStatus // not MCI_STATUS_ITEM !\n");
299 return MMSYSERR_NOTENABLED
;
304 /**************************************************************************
305 * ANIM_CalcTime [internal]
307 DWORD
ANIM_CalcTime(UINT wDevID
, DWORD dwFormatType
, DWORD dwFrame
)
315 dprintf_mcianim(stddeb
,"ANIM_CalcTime(%u, %08X, %lu);\n",
316 wDevID
, dwFormatType
, dwFrame
);
318 switch (dwFormatType
) {
319 case MCI_FORMAT_MILLISECONDS
:
320 dwTime
= dwFrame
/ ANIMFRAMES_PERSEC
* 1000;
321 dprintf_mcianim(stddeb
,
322 "ANIM_CalcTime // MILLISECONDS %u\n", dwTime
);
325 wMinutes
= dwFrame
/ ANIMFRAMES_PERMIN
;
326 wSeconds
= (dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
) / ANIMFRAMES_PERSEC
;
327 wFrames
= dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
-
328 ANIMFRAMES_PERSEC
* wSeconds
;
329 dwTime
= MCI_MAKE_MSF(wMinutes
, wSeconds
, wFrames
);
330 dprintf_mcianim(stddeb
,"ANIM_CalcTime // MSF %02u:%02u:%02u -> dwTime=%u\n",
331 wMinutes
, wSeconds
, wFrames
, dwTime
);
333 case MCI_FORMAT_TMSF
:
334 for (wTrack
= 0; wTrack
< AnimDev
[wDevID
].nTracks
; wTrack
++) {
335 /* dwTime += AnimDev[wDevID].lpdwTrackLen[wTrack - 1];
336 printf("Adding trk#%u curpos=%u \n", dwTime);
337 if (dwTime >= dwFrame) break; */
338 if (AnimDev
[wDevID
].lpdwTrackPos
[wTrack
- 1] >= dwFrame
) break;
340 wMinutes
= dwFrame
/ ANIMFRAMES_PERMIN
;
341 wSeconds
= (dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
) / ANIMFRAMES_PERSEC
;
342 wFrames
= dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
-
343 ANIMFRAMES_PERSEC
* wSeconds
;
344 dwTime
= MCI_MAKE_TMSF(wTrack
, wMinutes
, wSeconds
, wFrames
);
345 dprintf_mcianim(stddeb
,
346 "ANIM_CalcTime // %02u-%02u:%02u:%02u\n",
347 wTrack
, wMinutes
, wSeconds
, wFrames
);
350 /* unknown format ! force TMSF ! ... */
351 dwFormatType
= MCI_FORMAT_TMSF
;
359 /**************************************************************************
360 * ANIM_CalcFrame [internal]
362 DWORD
ANIM_CalcFrame(UINT wDevID
, DWORD dwFormatType
, DWORD dwTime
)
367 dprintf_mcianim(stddeb
,"ANIM_CalcFrame(%u, %08X, %lu);\n",
368 wDevID
, dwFormatType
, dwTime
);
370 switch (dwFormatType
) {
371 case MCI_FORMAT_MILLISECONDS
:
372 dwFrame
= dwTime
* ANIMFRAMES_PERSEC
/ 1000;
373 dprintf_mcianim(stddeb
,
374 "ANIM_CalcFrame // MILLISECONDS %u\n", dwFrame
);
377 dprintf_mcianim(stddeb
,
378 "ANIM_CalcFrame // MSF %02u:%02u:%02u\n",
379 MCI_MSF_MINUTE(dwTime
), MCI_MSF_SECOND(dwTime
),
380 MCI_MSF_FRAME(dwTime
));
381 dwFrame
+= ANIMFRAMES_PERMIN
* MCI_MSF_MINUTE(dwTime
);
382 dwFrame
+= ANIMFRAMES_PERSEC
* MCI_MSF_SECOND(dwTime
);
383 dwFrame
+= MCI_MSF_FRAME(dwTime
);
385 case MCI_FORMAT_TMSF
:
386 wTrack
= MCI_TMSF_TRACK(dwTime
);
387 dprintf_mcianim(stddeb
,
388 "ANIM_CalcFrame // TMSF %02u-%02u:%02u:%02u\n",
389 MCI_TMSF_TRACK(dwTime
), MCI_TMSF_MINUTE(dwTime
),
390 MCI_TMSF_SECOND(dwTime
), MCI_TMSF_FRAME(dwTime
));
391 dprintf_mcianim(stddeb
,
392 "ANIM_CalcFrame // TMSF trackpos[%u]=%u\n",
393 wTrack
, AnimDev
[wDevID
].lpdwTrackPos
[wTrack
- 1]);
394 dwFrame
= AnimDev
[wDevID
].lpdwTrackPos
[wTrack
- 1];
395 dwFrame
+= ANIMFRAMES_PERMIN
* MCI_TMSF_MINUTE(dwTime
);
396 dwFrame
+= ANIMFRAMES_PERSEC
* MCI_TMSF_SECOND(dwTime
);
397 dwFrame
+= MCI_TMSF_FRAME(dwTime
);
400 /* unknown format ! force TMSF ! ... */
401 dwFormatType
= MCI_FORMAT_TMSF
;
410 /**************************************************************************
411 * ANIM_mciPlay [internal]
413 DWORD
ANIM_mciPlay(UINT wDevID
, DWORD dwFlags
, LPMCI_PLAY_PARMS lpParms
)
417 dprintf_mcianim(stddeb
,"ANIM_mciPlay(%u, %08X, %08X);\n",
418 wDevID
, dwFlags
, lpParms
);
419 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
420 start
= 0; end
= AnimDev
[wDevID
].dwTotalLen
;
421 AnimDev
[wDevID
].nCurTrack
= 1;
422 if (dwFlags
& MCI_FROM
) {
423 start
= ANIM_CalcFrame(wDevID
,
424 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwFrom
);
425 dprintf_mcianim(stddeb
,"ANIM_mciPlay // MCI_FROM=%08X -> %u \n",
426 lpParms
->dwFrom
, start
);
428 if (dwFlags
& MCI_TO
) {
429 end
= ANIM_CalcFrame(wDevID
,
430 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwTo
);
431 dprintf_mcianim(stddeb
,
432 "ANIM_mciPlay // MCI_TO=%08X -> %u \n",
435 AnimDev
[wDevID
].mode
= MCI_MODE_PLAY
;
436 if (dwFlags
& MCI_NOTIFY
) {
437 dprintf_mcianim(stddeb
,
438 "ANIM_mciPlay // MCI_NOTIFY_SUCCESSFUL %08X !\n",
439 lpParms
->dwCallback
);
440 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
441 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
445 return MCIERR_HARDWARE
;
449 /**************************************************************************
450 * ANIM_mciStop [internal]
452 DWORD
ANIM_mciStop(UINT wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
455 dprintf_mcianim(stddeb
,"ANIM_mciStop(%u, %08X, %08X);\n",
456 wDevID
, dwFlags
, lpParms
);
457 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
458 AnimDev
[wDevID
].mode
= MCI_MODE_STOP
;
459 if (dwFlags
& MCI_NOTIFY
) {
460 dprintf_mcianim(stddeb
,
461 "ANIM_mciStop // MCI_NOTIFY_SUCCESSFUL %08X !\n",
462 lpParms
->dwCallback
);
463 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
464 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
468 return MCIERR_HARDWARE
;
472 /**************************************************************************
473 * ANIM_mciPause [internal]
475 DWORD
ANIM_mciPause(UINT wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
478 dprintf_mcianim(stddeb
,"ANIM_mciPause(%u, %08X, %08X);\n",
479 wDevID
, dwFlags
, lpParms
);
480 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
481 AnimDev
[wDevID
].mode
= MCI_MODE_PAUSE
;
482 if (dwFlags
& MCI_NOTIFY
) {
483 dprintf_mcianim(stddeb
,
484 "ANIM_mciPause // MCI_NOTIFY_SUCCESSFUL %08X !\n",
485 lpParms
->dwCallback
);
486 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
487 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
491 return MCIERR_HARDWARE
;
495 /**************************************************************************
496 * ANIM_mciResume [internal]
498 DWORD
ANIM_mciResume(UINT wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
501 dprintf_mcianim(stddeb
,"ANIM_mciResume(%u, %08X, %08X);\n",
502 wDevID
, dwFlags
, lpParms
);
503 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
504 AnimDev
[wDevID
].mode
= MCI_MODE_STOP
;
505 if (dwFlags
& MCI_NOTIFY
) {
506 dprintf_mcianim(stddeb
,
507 "ANIM_mciResume // MCI_NOTIFY_SUCCESSFUL %08X !\n",
508 lpParms
->dwCallback
);
509 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
510 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
514 return MCIERR_HARDWARE
;
518 /**************************************************************************
519 * ANIM_mciSeek [internal]
521 DWORD
ANIM_mciSeek(UINT wDevID
, DWORD dwFlags
, LPMCI_SEEK_PARMS lpParms
)
525 MCI_PLAY_PARMS PlayParms
;
526 dprintf_mcianim(stddeb
,"ANIM_mciSeek(%u, %08X, %08X);\n",
527 wDevID
, dwFlags
, lpParms
);
528 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
529 AnimDev
[wDevID
].mode
= MCI_MODE_SEEK
;
531 case MCI_SEEK_TO_START
:
532 PlayParms
.dwFrom
= 0;
534 case MCI_SEEK_TO_END
:
535 PlayParms
.dwFrom
= AnimDev
[wDevID
].dwTotalLen
;
538 PlayParms
.dwFrom
= lpParms
->dwTo
;
541 dwRet
= ANIM_mciPlay(wDevID
, MCI_WAIT
| MCI_FROM
, &PlayParms
);
542 if (dwRet
!= 0) return dwRet
;
543 dwRet
= ANIM_mciStop(wDevID
, MCI_WAIT
, (LPMCI_GENERIC_PARMS
)&PlayParms
);
544 if (dwFlags
& MCI_NOTIFY
) {
545 dprintf_mcianim(stddeb
,
546 "ANIM_mciSeek // MCI_NOTIFY_SUCCESSFUL %08X !\n",
547 lpParms
->dwCallback
);
548 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
549 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
553 return MCIERR_HARDWARE
;
558 /**************************************************************************
559 * ANIM_mciSet [internal]
561 DWORD
ANIM_mciSet(UINT wDevID
, DWORD dwFlags
, LPMCI_SET_PARMS lpParms
)
564 dprintf_mcianim(stddeb
,"ANIM_mciSet(%u, %08X, %08X);\n",
565 wDevID
, dwFlags
, lpParms
);
566 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
568 printf("ANIM_mciSet // dwTimeFormat=%08X\n", lpParms->dwTimeFormat);
569 printf("ANIM_mciSet // dwAudio=%08X\n", lpParms->dwAudio);
571 if (dwFlags
& MCI_SET_TIME_FORMAT
) {
572 switch (lpParms
->dwTimeFormat
) {
573 case MCI_FORMAT_MILLISECONDS
:
574 dprintf_mcianim(stddeb
,
575 "ANIM_mciSet // MCI_FORMAT_MILLISECONDS !\n");
578 dprintf_mcianim(stddeb
,"ANIM_mciSet // MCI_FORMAT_MSF !\n");
580 case MCI_FORMAT_TMSF
:
581 dprintf_mcianim(stddeb
,"ANIM_mciSet // MCI_FORMAT_TMSF !\n");
584 fprintf(stderr
,"ANIM_mciSet // bad time format !\n");
585 return MCIERR_BAD_TIME_FORMAT
;
587 AnimDev
[wDevID
].dwTimeFormat
= lpParms
->dwTimeFormat
;
589 if (dwFlags
& MCI_SET_VIDEO
) return MCIERR_UNSUPPORTED_FUNCTION
;
590 if (dwFlags
& MCI_SET_ON
) return MCIERR_UNSUPPORTED_FUNCTION
;
591 if (dwFlags
& MCI_SET_OFF
) return MCIERR_UNSUPPORTED_FUNCTION
;
592 if (dwFlags
& MCI_NOTIFY
) {
593 dprintf_mcianim(stddeb
,
594 "ANIM_mciSet // MCI_NOTIFY_SUCCESSFUL %08X !\n",
595 lpParms
->dwCallback
);
596 mciDriverNotify((HWND
)LOWORD(lpParms
->dwCallback
),
597 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
601 return MCIERR_HARDWARE
;
606 /**************************************************************************
607 * ANIM_DriverProc [sample driver]
609 LRESULT
ANIM_DriverProc(DWORD dwDevID
, HDRVR hDriv
, WORD wMsg
,
610 DWORD dwParam1
, DWORD dwParam2
)
619 case MCI_OPEN_DRIVER
:
621 return ANIM_mciOpen(dwParam1
, (LPMCI_OPEN_PARMS
)dwParam2
);
623 case MCI_CLOSE_DRIVER
:
625 return ANIM_mciClose(dwDevID
, dwParam1
,
626 (LPMCI_GENERIC_PARMS
)dwParam2
);
631 case DRV_QUERYCONFIGURE
:
634 MessageBox((HWND
)NULL
, "Sample MultiMedia Linux Driver !",
635 "MMLinux Driver", MB_OK
);
638 return (LRESULT
)DRVCNF_RESTART
;
640 return (LRESULT
)DRVCNF_RESTART
;
642 return ANIM_mciGetDevCaps(dwDevID
, dwParam1
,
643 (LPMCI_GETDEVCAPS_PARMS
)dwParam2
);
645 return ANIM_mciInfo(dwDevID
, dwParam1
,
646 (LPMCI_INFO_PARMS
)dwParam2
);
648 return ANIM_mciStatus(dwDevID
, dwParam1
,
649 (LPMCI_STATUS_PARMS
)dwParam2
);
651 return ANIM_mciSet(dwDevID
, dwParam1
,
652 (LPMCI_SET_PARMS
)dwParam2
);
654 return ANIM_mciPlay(dwDevID
, dwParam1
,
655 (LPMCI_PLAY_PARMS
)dwParam2
);
657 return ANIM_mciStop(dwDevID
, dwParam1
,
658 (LPMCI_GENERIC_PARMS
)dwParam2
);
660 return ANIM_mciPause(dwDevID
, dwParam1
,
661 (LPMCI_GENERIC_PARMS
)dwParam2
);
663 return ANIM_mciResume(dwDevID
, dwParam1
,
664 (LPMCI_GENERIC_PARMS
)dwParam2
);
666 return ANIM_mciSeek(dwDevID
, dwParam1
,
667 (LPMCI_SEEK_PARMS
)dwParam2
);
669 return DefDriverProc(dwDevID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
672 return MCIERR_HARDWARE
;
677 /*-----------------------------------------------------------------------*/
679 #endif /* #ifdef BUILTIN_MMSYSTEM */