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 */