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