2 * Sample MCI ANIMATION Wine Driver for Linux
4 * Copyright 1994 Martin Ayotte
12 #include <sys/ioctl.h>
21 #define ANIMFRAMES_PERSEC 30
22 #define ANIMFRAMES_PERMIN 1800
23 #define SECONDS_PERMIN 60
26 int nUseCount; /* Incremented for each shared open */
27 BOOL16 fShareable; /* TRUE if first open was shareable */
28 WORD wNotifyDeviceID; /* MCI device ID with a pending notification */
29 HANDLE16 hCallback; /* Callback handle for pending notification */
30 MCI_OPEN_PARMS16 openParms;
41 static LINUX_ANIM AnimDev[MAX_ANIMDRV];
44 /*-----------------------------------------------------------------------*/
46 /**************************************************************************
47 * ANIM_mciOpen [internal]
49 static DWORD ANIM_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMS16 lpParms)
51 LPSTR lpstrElementName;
54 TRACE(mcianim,"(%04X, %08lX, %p);\n",
55 wDevID, dwFlags, lpParms);
56 if (lpParms == NULL) return MCIERR_INTERNAL;
57 if (AnimDev[wDevID].nUseCount > 0) {
58 /* The driver already open on this channel */
59 /* If the driver was opened shareable before and this open specifies */
60 /* shareable then increment the use count */
61 if (AnimDev[wDevID].fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
62 ++AnimDev[wDevID].nUseCount;
64 return MCIERR_MUST_USE_SHAREABLE;
67 AnimDev[wDevID].nUseCount = 1;
68 AnimDev[wDevID].fShareable = dwFlags & MCI_OPEN_SHAREABLE;
70 TRACE(mcianim,"wDevID=%04X\n", wDevID);
71 lpParms->wDeviceID = wDevID;
72 TRACE(mcianim,"lpParms->wDevID=%04X\n", lpParms->wDeviceID);
73 if (dwFlags & MCI_OPEN_ELEMENT) {
74 lpstrElementName = (LPSTR)PTR_SEG_TO_LIN(lpParms->lpstrElementName);
75 TRACE(mcianim,"MCI_OPEN_ELEMENT '%s' !\n",
77 if (strlen(lpstrElementName) > 0) {
78 strcpy(str, lpstrElementName);
82 memcpy(&AnimDev[wDevID].openParms, lpParms, sizeof(MCI_OPEN_PARMS16));
83 AnimDev[wDevID].wNotifyDeviceID = lpParms->wDeviceID;
84 AnimDev[wDevID].mode = 0;
85 AnimDev[wDevID].dwTimeFormat = MCI_FORMAT_TMSF;
86 AnimDev[wDevID].nCurTrack = 0;
87 AnimDev[wDevID].nTracks = 0;
88 AnimDev[wDevID].dwTotalLen = 0;
89 AnimDev[wDevID].lpdwTrackLen = NULL;
90 AnimDev[wDevID].lpdwTrackPos = NULL;
92 Moved to mmsystem.c mciOpen routine
94 if (dwFlags & MCI_NOTIFY) {
95 TRACE(mcianim, "MCI_NOTIFY_SUCCESSFUL %08lX !\n",
97 mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
98 AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
104 /**************************************************************************
105 * ANIM_mciClose [internal]
107 static DWORD ANIM_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
109 TRACE(mcianim,"(%u, %08lX, %p);\n",
110 wDevID, dwParam, lpParms);
111 if (AnimDev[wDevID].lpdwTrackLen != NULL) free(AnimDev[wDevID].lpdwTrackLen);
112 if (AnimDev[wDevID].lpdwTrackPos != NULL) free(AnimDev[wDevID].lpdwTrackPos);
116 /**************************************************************************
117 * ANIM_mciGetDevCaps [internal]
119 static DWORD ANIM_mciGetDevCaps(UINT16 wDevID, DWORD dwFlags,
120 LPMCI_GETDEVCAPS_PARMS lpParms)
122 TRACE(mcianim,"(%u, %08lX, %p);\n",
123 wDevID, dwFlags, lpParms);
124 if (lpParms == NULL) return MCIERR_INTERNAL;
125 if (dwFlags & MCI_GETDEVCAPS_ITEM) {
126 TRACE(mcianim, "MCI_GETDEVCAPS_ITEM dwItem=%08lX;\n",
128 switch(lpParms->dwItem) {
129 case MCI_GETDEVCAPS_CAN_RECORD:
130 lpParms->dwReturn = FALSE;
132 case MCI_GETDEVCAPS_HAS_AUDIO:
133 lpParms->dwReturn = FALSE;
135 case MCI_GETDEVCAPS_HAS_VIDEO:
136 lpParms->dwReturn = FALSE;
138 case MCI_GETDEVCAPS_DEVICE_TYPE:
139 lpParms->dwReturn = MCI_DEVTYPE_ANIMATION;
141 case MCI_GETDEVCAPS_USES_FILES:
142 lpParms->dwReturn = TRUE;
144 case MCI_GETDEVCAPS_COMPOUND_DEVICE:
145 lpParms->dwReturn = FALSE;
147 case MCI_GETDEVCAPS_CAN_EJECT:
148 lpParms->dwReturn = TRUE;
150 case MCI_GETDEVCAPS_CAN_PLAY:
151 lpParms->dwReturn = FALSE;
153 case MCI_GETDEVCAPS_CAN_SAVE:
154 lpParms->dwReturn = FALSE;
157 return MCIERR_UNRECOGNIZED_COMMAND;
160 TRACE(mcianim, "lpParms->dwReturn=%08lX;\n",
166 /**************************************************************************
167 * ANIM_CalcTime [internal]
169 static DWORD ANIM_CalcTime(UINT16 wDevID, DWORD dwFormatType, DWORD dwFrame)
176 TRACE(mcianim,"(%u, %08lX, %lu);\n",
177 wDevID, dwFormatType, dwFrame);
179 switch (dwFormatType) {
180 case MCI_FORMAT_MILLISECONDS:
181 dwTime = dwFrame / ANIMFRAMES_PERSEC * 1000;
182 TRACE(mcianim, "MILLISECONDS %lu\n", dwTime);
185 wMinutes = dwFrame / ANIMFRAMES_PERMIN;
186 wSeconds = (dwFrame - ANIMFRAMES_PERMIN * wMinutes) / ANIMFRAMES_PERSEC;
187 wFrames = dwFrame - ANIMFRAMES_PERMIN * wMinutes -
188 ANIMFRAMES_PERSEC * wSeconds;
189 dwTime = MCI_MAKE_MSF(wMinutes, wSeconds, wFrames);
190 TRACE(mcianim,"MSF %02u:%02u:%02u -> dwTime=%lu\n",
191 wMinutes, wSeconds, wFrames, dwTime);
194 /* unknown format ! force TMSF ! ... */
195 dwFormatType = MCI_FORMAT_TMSF;
196 case MCI_FORMAT_TMSF:
197 for (wTrack = 0; wTrack < AnimDev[wDevID].nTracks; wTrack++) {
198 /* dwTime += AnimDev[wDevID].lpdwTrackLen[wTrack - 1];
199 TRACE(mcianim, "Adding trk#%u curpos=%u \n", dwTime);
200 if (dwTime >= dwFrame) break; */
201 if (AnimDev[wDevID].lpdwTrackPos[wTrack - 1] >= dwFrame) break;
203 wMinutes = dwFrame / ANIMFRAMES_PERMIN;
204 wSeconds = (dwFrame - ANIMFRAMES_PERMIN * wMinutes) / ANIMFRAMES_PERSEC;
205 wFrames = dwFrame - ANIMFRAMES_PERMIN * wMinutes -
206 ANIMFRAMES_PERSEC * wSeconds;
207 dwTime = MCI_MAKE_TMSF(wTrack, wMinutes, wSeconds, wFrames);
208 TRACE(mcianim, "%02u-%02u:%02u:%02u\n",
209 wTrack, wMinutes, wSeconds, wFrames);
216 /**************************************************************************
217 * ANIM_CalcFrame [internal]
219 static DWORD ANIM_CalcFrame(UINT16 wDevID, DWORD dwFormatType, DWORD dwTime)
223 TRACE(mcianim,"(%u, %08lX, %lu);\n",
224 wDevID, dwFormatType, dwTime);
226 switch (dwFormatType) {
227 case MCI_FORMAT_MILLISECONDS:
228 dwFrame = dwTime * ANIMFRAMES_PERSEC / 1000;
229 TRACE(mcianim, "MILLISECONDS %lu\n", dwFrame);
232 TRACE(mcianim, "MSF %02u:%02u:%02u\n",
233 MCI_MSF_MINUTE(dwTime), MCI_MSF_SECOND(dwTime),
234 MCI_MSF_FRAME(dwTime));
235 dwFrame += ANIMFRAMES_PERMIN * MCI_MSF_MINUTE(dwTime);
236 dwFrame += ANIMFRAMES_PERSEC * MCI_MSF_SECOND(dwTime);
237 dwFrame += MCI_MSF_FRAME(dwTime);
240 /* unknown format ! force TMSF ! ... */
241 dwFormatType = MCI_FORMAT_TMSF;
242 case MCI_FORMAT_TMSF:
243 wTrack = MCI_TMSF_TRACK(dwTime);
244 TRACE(mcianim, "TMSF %02u-%02u:%02u:%02u\n",
245 MCI_TMSF_TRACK(dwTime), MCI_TMSF_MINUTE(dwTime),
246 MCI_TMSF_SECOND(dwTime), MCI_TMSF_FRAME(dwTime));
247 TRACE(mcianim, "TMSF trackpos[%u]=%lu\n",
248 wTrack, AnimDev[wDevID].lpdwTrackPos[wTrack - 1]);
249 dwFrame = AnimDev[wDevID].lpdwTrackPos[wTrack - 1];
250 dwFrame += ANIMFRAMES_PERMIN * MCI_TMSF_MINUTE(dwTime);
251 dwFrame += ANIMFRAMES_PERSEC * MCI_TMSF_SECOND(dwTime);
252 dwFrame += MCI_TMSF_FRAME(dwTime);
259 /**************************************************************************
260 * ANIM_mciInfo [internal]
262 static DWORD ANIM_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMS16 lpParms)
264 TRACE(mcianim,"(%u, %08lX, %p);\n",
265 wDevID, dwFlags, lpParms);
266 if (lpParms == NULL) return MCIERR_INTERNAL;
267 lpParms->lpstrReturn = NULL;
269 case MCI_INFO_PRODUCT:
270 lpParms->lpstrReturn = "Linux ANIMATION 0.5";
273 lpParms->lpstrReturn =
274 (LPSTR)AnimDev[wDevID].openParms.lpstrElementName;
276 case MCI_ANIM_INFO_TEXT:
277 lpParms->lpstrReturn = "Animation Window";
280 return MCIERR_UNRECOGNIZED_COMMAND;
282 if (lpParms->lpstrReturn != NULL)
283 lpParms->dwRetSize = strlen(lpParms->lpstrReturn);
285 lpParms->dwRetSize = 0;
289 /**************************************************************************
290 * ANIM_mciStatus [internal]
292 static DWORD ANIM_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
294 TRACE(mcianim,"(%u, %08lX, %p);\n",
295 wDevID, dwFlags, lpParms);
296 if (lpParms == NULL) return MCIERR_INTERNAL;
297 if (dwFlags & MCI_NOTIFY) {
298 TRACE(mcianim, "MCI_NOTIFY_SUCCESSFUL %08lX !\n",
299 lpParms->dwCallback);
300 mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
301 AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
303 if (dwFlags & MCI_STATUS_ITEM) {
304 switch(lpParms->dwItem) {
305 case MCI_STATUS_CURRENT_TRACK:
306 lpParms->dwReturn = AnimDev[wDevID].nCurTrack;
307 TRACE(mcianim,"CURRENT_TRACK=%lu!\n", lpParms->dwReturn);
309 case MCI_STATUS_LENGTH:
310 if (dwFlags & MCI_TRACK) {
311 TRACE(mcianim,"MCI_TRACK #%lu LENGTH=??? !\n",
313 if (lpParms->dwTrack > AnimDev[wDevID].nTracks)
314 return MCIERR_OUTOFRANGE;
315 lpParms->dwReturn = AnimDev[wDevID].lpdwTrackLen[lpParms->dwTrack];
318 lpParms->dwReturn = AnimDev[wDevID].dwTotalLen;
319 lpParms->dwReturn = ANIM_CalcTime(wDevID,
320 AnimDev[wDevID].dwTimeFormat, lpParms->dwReturn);
321 TRACE(mcianim,"LENGTH=%lu !\n", lpParms->dwReturn);
323 case MCI_STATUS_MODE:
324 lpParms->dwReturn = AnimDev[wDevID].mode;
325 TRACE(mcianim,"MCI_STATUS_MODE=%08lX !\n",
328 case MCI_STATUS_MEDIA_PRESENT:
329 lpParms->dwReturn = TRUE;
330 TRACE(mcianim,"MCI_STATUS_MEDIA_PRESENT !\n");
332 case MCI_STATUS_NUMBER_OF_TRACKS:
333 lpParms->dwReturn = 1;
334 TRACE(mcianim,"MCI_STATUS_NUMBER_OF_TRACKS = %lu !\n",
336 if (lpParms->dwReturn == (WORD)-1) return MCIERR_INTERNAL;
338 case MCI_STATUS_POSITION:
339 lpParms->dwReturn = AnimDev[wDevID].dwCurFrame;
340 if (dwFlags & MCI_STATUS_START) {
341 lpParms->dwReturn = 0;
342 TRACE(mcianim,"get MCI_STATUS_START !\n");
344 if (dwFlags & MCI_TRACK) {
345 if (lpParms->dwTrack > AnimDev[wDevID].nTracks)
346 return MCIERR_OUTOFRANGE;
347 lpParms->dwReturn = AnimDev[wDevID].lpdwTrackPos[lpParms->dwTrack - 1];
348 TRACE(mcianim,"get MCI_TRACK #%lu !\n", lpParms->dwTrack);
350 lpParms->dwReturn = ANIM_CalcTime(wDevID,
351 AnimDev[wDevID].dwTimeFormat, lpParms->dwReturn);
352 TRACE(mcianim,"MCI_STATUS_POSITION=%08lX !\n",
355 case MCI_STATUS_READY:
356 TRACE(mcianim,"MCI_STATUS_READY !\n");
357 lpParms->dwReturn = TRUE;
359 case MCI_STATUS_TIME_FORMAT:
360 TRACE(mcianim,"MCI_STATUS_TIME_FORMAT !\n");
361 lpParms->dwReturn = MCI_FORMAT_MILLISECONDS;
364 WARN(mcianim,"Unknown command %08lX !\n", lpParms->dwItem);
365 return MCIERR_UNRECOGNIZED_COMMAND;
368 WARN(mcianim,"Not MCI_STATUS_ITEM !\n");
373 /**************************************************************************
374 * ANIM_mciPlay [internal]
376 static DWORD ANIM_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
379 TRACE(mcianim,"(%u, %08lX, %p);\n",
380 wDevID, dwFlags, lpParms);
381 if (lpParms == NULL) return MCIERR_INTERNAL;
382 start = 0; end = AnimDev[wDevID].dwTotalLen;
383 AnimDev[wDevID].nCurTrack = 1;
384 if (dwFlags & MCI_FROM) {
385 start = ANIM_CalcFrame(wDevID,
386 AnimDev[wDevID].dwTimeFormat, lpParms->dwFrom);
387 TRACE(mcianim,"MCI_FROM=%08lX -> %u \n",
388 lpParms->dwFrom, start);
390 if (dwFlags & MCI_TO) {
391 end = ANIM_CalcFrame(wDevID,
392 AnimDev[wDevID].dwTimeFormat, lpParms->dwTo);
393 TRACE(mcianim, "MCI_TO=%08lX -> %u \n",
396 AnimDev[wDevID].mode = MCI_MODE_PLAY;
397 if (dwFlags & MCI_NOTIFY) {
398 TRACE(mcianim, "MCI_NOTIFY_SUCCESSFUL %08lX !\n",
399 lpParms->dwCallback);
400 mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
401 AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
406 /**************************************************************************
407 * ANIM_mciStop [internal]
409 static DWORD ANIM_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
411 TRACE(mcianim,"(%u, %08lX, %p);\n",
412 wDevID, dwFlags, lpParms);
413 if (lpParms == NULL) return MCIERR_INTERNAL;
414 AnimDev[wDevID].mode = MCI_MODE_STOP;
415 if (dwFlags & MCI_NOTIFY) {
416 TRACE(mcianim, "MCI_NOTIFY_SUCCESSFUL %08lX !\n",
417 lpParms->dwCallback);
418 mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
419 AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
424 /**************************************************************************
425 * ANIM_mciPause [internal]
427 static DWORD ANIM_mciPause(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
429 TRACE(mcianim,"(%u, %08lX, %p);\n",
430 wDevID, dwFlags, lpParms);
431 if (lpParms == NULL) return MCIERR_INTERNAL;
432 AnimDev[wDevID].mode = MCI_MODE_PAUSE;
433 if (dwFlags & MCI_NOTIFY) {
434 TRACE(mcianim, "MCI_NOTIFY_SUCCESSFUL %08lX !\n",
435 lpParms->dwCallback);
436 mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
437 AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
442 /**************************************************************************
443 * ANIM_mciResume [internal]
445 static DWORD ANIM_mciResume(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
447 TRACE(mcianim,"(%u, %08lX, %p);\n",
448 wDevID, dwFlags, lpParms);
449 if (lpParms == NULL) return MCIERR_INTERNAL;
450 AnimDev[wDevID].mode = MCI_MODE_STOP;
451 if (dwFlags & MCI_NOTIFY) {
452 TRACE(mcianim, "MCI_NOTIFY_SUCCESSFUL %08lX !\n",
453 lpParms->dwCallback);
454 mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
455 AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
460 /**************************************************************************
461 * ANIM_mciSeek [internal]
463 static DWORD ANIM_mciSeek(UINT16 wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
466 MCI_PLAY_PARMS PlayParms;
467 TRACE(mcianim,"(%u, %08lX, %p);\n",
468 wDevID, dwFlags, lpParms);
469 if (lpParms == NULL) return MCIERR_INTERNAL;
470 AnimDev[wDevID].mode = MCI_MODE_SEEK;
472 case MCI_SEEK_TO_START:
473 PlayParms.dwFrom = 0;
475 case MCI_SEEK_TO_END:
476 PlayParms.dwFrom = AnimDev[wDevID].dwTotalLen;
479 PlayParms.dwFrom = lpParms->dwTo;
482 dwRet = ANIM_mciPlay(wDevID, MCI_WAIT | MCI_FROM, &PlayParms);
483 if (dwRet != 0) return dwRet;
484 dwRet = ANIM_mciStop(wDevID, MCI_WAIT, (LPMCI_GENERIC_PARMS)&PlayParms);
485 if (dwFlags & MCI_NOTIFY) {
486 TRACE(mcianim, "MCI_NOTIFY_SUCCESSFUL %08lX !\n",
487 lpParms->dwCallback);
488 mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
489 AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
495 /**************************************************************************
496 * ANIM_mciSet [internal]
498 static DWORD ANIM_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
500 TRACE(mcianim,"(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
501 if (lpParms == NULL) return MCIERR_INTERNAL;
503 TRACE(mcianim,"(dwTimeFormat=%08lX)\n", lpParms->dwTimeFormat);
504 TRACE(mcianim,"(dwAudio=%08lX)\n", lpParms->dwAudio);
506 if (dwFlags & MCI_SET_TIME_FORMAT) {
507 switch (lpParms->dwTimeFormat) {
508 case MCI_FORMAT_MILLISECONDS:
509 TRACE(mcianim, "MCI_FORMAT_MILLISECONDS !\n");
512 TRACE(mcianim,"MCI_FORMAT_MSF !\n");
514 case MCI_FORMAT_TMSF:
515 TRACE(mcianim,"MCI_FORMAT_TMSF !\n");
518 WARN(mcianim,"Bad time format !\n");
519 return MCIERR_BAD_TIME_FORMAT;
521 AnimDev[wDevID].dwTimeFormat = lpParms->dwTimeFormat;
523 if (dwFlags & MCI_SET_VIDEO) return MCIERR_UNSUPPORTED_FUNCTION;
524 if (dwFlags & MCI_SET_ON) return MCIERR_UNSUPPORTED_FUNCTION;
525 if (dwFlags & MCI_SET_OFF) return MCIERR_UNSUPPORTED_FUNCTION;
526 if (dwFlags & MCI_NOTIFY) {
527 TRACE(mcianim, "MCI_NOTIFY_SUCCESSFUL %08lX !\n",
528 lpParms->dwCallback);
529 mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
530 AnimDev[wDevID].wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
536 /**************************************************************************
537 * ANIM_DriverProc [sample driver]
539 LONG ANIM_DriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg,
540 DWORD dwParam1, DWORD dwParam2)
548 case MCI_OPEN_DRIVER:
550 return ANIM_mciOpen(dwDevID, dwParam1,
551 (LPMCI_OPEN_PARMS16)PTR_SEG_TO_LIN(dwParam2));
553 case MCI_CLOSE_DRIVER:
555 return ANIM_mciClose(dwDevID, dwParam1,
556 (LPMCI_GENERIC_PARMS)PTR_SEG_TO_LIN(dwParam2));
561 case DRV_QUERYCONFIGURE:
564 MessageBox16(0, "Sample MultiMedia Linux Driver !",
565 "MMLinux Driver", MB_OK);
568 return DRVCNF_RESTART;
570 return DRVCNF_RESTART;
572 return ANIM_mciGetDevCaps(dwDevID, dwParam1,
573 (LPMCI_GETDEVCAPS_PARMS)PTR_SEG_TO_LIN(dwParam2));
575 return ANIM_mciInfo(dwDevID, dwParam1,
576 (LPMCI_INFO_PARMS16)PTR_SEG_TO_LIN(dwParam2));
578 return ANIM_mciStatus(dwDevID, dwParam1,
579 (LPMCI_STATUS_PARMS)PTR_SEG_TO_LIN(dwParam2));
581 return ANIM_mciSet(dwDevID, dwParam1,
582 (LPMCI_SET_PARMS)PTR_SEG_TO_LIN(dwParam2));
584 return ANIM_mciPlay(dwDevID, dwParam1,
585 (LPMCI_PLAY_PARMS)PTR_SEG_TO_LIN(dwParam2));
587 return ANIM_mciStop(dwDevID, dwParam1,
588 (LPMCI_GENERIC_PARMS)PTR_SEG_TO_LIN(dwParam2));
590 return ANIM_mciPause(dwDevID, dwParam1,
591 (LPMCI_GENERIC_PARMS)PTR_SEG_TO_LIN(dwParam2));
593 return ANIM_mciResume(dwDevID, dwParam1,
594 (LPMCI_GENERIC_PARMS)PTR_SEG_TO_LIN(dwParam2));
596 return ANIM_mciSeek(dwDevID, dwParam1,
597 (LPMCI_SEEK_PARMS)PTR_SEG_TO_LIN(dwParam2));
599 return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
604 /*-----------------------------------------------------------------------*/