2 * Sample MCI ANIMATION Wine Driver for Linux
4 * Copyright 1994 Martin Ayotte
12 #include <sys/ioctl.h>
22 #define ANIMFRAMES_PERSEC 30
23 #define ANIMFRAMES_PERMIN 1800
24 #define SECONDS_PERMIN 60
26 #if defined(linux) || defined(__FreeBSD__)
28 int nUseCount
; /* Incremented for each shared open */
29 BOOL16 fShareable
; /* TRUE if first open was shareable */
30 WORD wNotifyDeviceID
; /* MCI device ID with a pending notification */
31 HANDLE16 hCallback
; /* Callback handle for pending notification */
32 MCI_OPEN_PARMS openParms
;
43 static LINUX_ANIM AnimDev
[MAX_ANIMDRV
];
47 /*-----------------------------------------------------------------------*/
49 /**************************************************************************
50 * ANIM_mciOpen [internal]
52 static DWORD
ANIM_mciOpen(UINT16 wDevID
, DWORD dwFlags
, LPMCI_OPEN_PARMS lpParms
)
54 #if defined(linux) || defined(__FreeBSD__)
55 LPSTR lpstrElementName
;
58 dprintf_mcianim(stddeb
,"ANIM_mciOpen(%04X, %08lX, %p);\n",
59 wDevID
, dwFlags
, lpParms
);
60 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
61 if (AnimDev
[wDevID
].nUseCount
> 0) {
62 /* The driver already open on this channel */
63 /* If the driver was opened shareable before and this open specifies */
64 /* shareable then increment the use count */
65 if (AnimDev
[wDevID
].fShareable
&& (dwFlags
& MCI_OPEN_SHAREABLE
))
66 ++AnimDev
[wDevID
].nUseCount
;
68 return MCIERR_MUST_USE_SHAREABLE
;
71 AnimDev
[wDevID
].nUseCount
= 1;
72 AnimDev
[wDevID
].fShareable
= dwFlags
& MCI_OPEN_SHAREABLE
;
74 dprintf_mcianim(stddeb
,"ANIM_mciOpen // wDevID=%04X\n", wDevID
);
75 lpParms
->wDeviceID
= wDevID
;
76 dprintf_mcianim(stddeb
,"ANIM_mciOpen // lpParms->wDevID=%04X\n", lpParms
->wDeviceID
);
77 if (dwFlags
& MCI_OPEN_ELEMENT
) {
78 lpstrElementName
= (LPSTR
)PTR_SEG_TO_LIN(lpParms
->lpstrElementName
);
79 dprintf_mcianim(stddeb
,"ANIM_mciOpen // MCI_OPEN_ELEMENT '%s' !\n",
81 if (strlen(lpstrElementName
) > 0) {
82 strcpy(str
, lpstrElementName
);
86 memcpy(&AnimDev
[wDevID
].openParms
, lpParms
, sizeof(MCI_OPEN_PARMS
));
87 AnimDev
[wDevID
].wNotifyDeviceID
= lpParms
->wDeviceID
;
88 AnimDev
[wDevID
].mode
= 0;
89 AnimDev
[wDevID
].dwTimeFormat
= MCI_FORMAT_TMSF
;
90 AnimDev
[wDevID
].nCurTrack
= 0;
91 AnimDev
[wDevID
].nTracks
= 0;
92 AnimDev
[wDevID
].dwTotalLen
= 0;
93 AnimDev
[wDevID
].lpdwTrackLen
= NULL
;
94 AnimDev
[wDevID
].lpdwTrackPos
= NULL
;
95 if (dwFlags
& MCI_NOTIFY
) {
96 dprintf_mcianim(stddeb
,
97 "ANIM_mciOpen // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
99 mciDriverNotify((HWND16
)LOWORD(lpParms
->dwCallback
),
100 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
104 return MCIERR_HARDWARE
;
108 /**************************************************************************
109 * ANIM_mciClose [internal]
111 static DWORD
ANIM_mciClose(UINT16 wDevID
, DWORD dwParam
, LPMCI_GENERIC_PARMS lpParms
)
113 #if defined(linux) || defined(__FreeBSD__)
114 dprintf_mcianim(stddeb
,"ANIM_mciClose(%u, %08lX, %p);\n",
115 wDevID
, dwParam
, lpParms
);
116 if (AnimDev
[wDevID
].lpdwTrackLen
!= NULL
) free(AnimDev
[wDevID
].lpdwTrackLen
);
117 if (AnimDev
[wDevID
].lpdwTrackPos
!= NULL
) free(AnimDev
[wDevID
].lpdwTrackPos
);
122 /**************************************************************************
123 * ANIM_mciGetDevCaps [internal]
125 static DWORD
ANIM_mciGetDevCaps(UINT16 wDevID
, DWORD dwFlags
,
126 LPMCI_GETDEVCAPS_PARMS lpParms
)
128 #if defined(linux) || defined(__FreeBSD__)
129 dprintf_mcianim(stddeb
,"ANIM_mciGetDevCaps(%u, %08lX, %p);\n",
130 wDevID
, dwFlags
, lpParms
);
131 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
132 if (dwFlags
& MCI_GETDEVCAPS_ITEM
) {
133 dprintf_mcianim(stddeb
,
134 "ANIM_mciGetDevCaps // MCI_GETDEVCAPS_ITEM dwItem=%08lX;\n",
136 switch(lpParms
->dwItem
) {
137 case MCI_GETDEVCAPS_CAN_RECORD
:
138 lpParms
->dwReturn
= FALSE
;
140 case MCI_GETDEVCAPS_HAS_AUDIO
:
141 lpParms
->dwReturn
= FALSE
;
143 case MCI_GETDEVCAPS_HAS_VIDEO
:
144 lpParms
->dwReturn
= FALSE
;
146 case MCI_GETDEVCAPS_DEVICE_TYPE
:
147 lpParms
->dwReturn
= MCI_DEVTYPE_ANIMATION
;
149 case MCI_GETDEVCAPS_USES_FILES
:
150 lpParms
->dwReturn
= TRUE
;
152 case MCI_GETDEVCAPS_COMPOUND_DEVICE
:
153 lpParms
->dwReturn
= FALSE
;
155 case MCI_GETDEVCAPS_CAN_EJECT
:
156 lpParms
->dwReturn
= TRUE
;
158 case MCI_GETDEVCAPS_CAN_PLAY
:
159 lpParms
->dwReturn
= FALSE
;
161 case MCI_GETDEVCAPS_CAN_SAVE
:
162 lpParms
->dwReturn
= FALSE
;
165 return MCIERR_UNRECOGNIZED_COMMAND
;
168 dprintf_mcianim(stddeb
,
169 "ANIM_mciGetDevCaps // lpParms->dwReturn=%08lX;\n",
173 return MCIERR_INTERNAL
;
178 /**************************************************************************
179 * ANIM_CalcTime [internal]
181 static DWORD
ANIM_CalcTime(UINT16 wDevID
, DWORD dwFormatType
, DWORD dwFrame
)
184 #if defined(linux) || defined(__FreeBSD__)
189 dprintf_mcianim(stddeb
,"ANIM_CalcTime(%u, %08lX, %lu);\n",
190 wDevID
, dwFormatType
, dwFrame
);
192 switch (dwFormatType
) {
193 case MCI_FORMAT_MILLISECONDS
:
194 dwTime
= dwFrame
/ ANIMFRAMES_PERSEC
* 1000;
195 dprintf_mcianim(stddeb
,
196 "ANIM_CalcTime // MILLISECONDS %lu\n", dwTime
);
199 wMinutes
= dwFrame
/ ANIMFRAMES_PERMIN
;
200 wSeconds
= (dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
) / ANIMFRAMES_PERSEC
;
201 wFrames
= dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
-
202 ANIMFRAMES_PERSEC
* wSeconds
;
203 dwTime
= MCI_MAKE_MSF(wMinutes
, wSeconds
, wFrames
);
204 dprintf_mcianim(stddeb
,"ANIM_CalcTime // MSF %02u:%02u:%02u -> dwTime=%lu\n",
205 wMinutes
, wSeconds
, wFrames
, dwTime
);
208 /* unknown format ! force TMSF ! ... */
209 dwFormatType
= MCI_FORMAT_TMSF
;
210 case MCI_FORMAT_TMSF
:
211 for (wTrack
= 0; wTrack
< AnimDev
[wDevID
].nTracks
; wTrack
++) {
212 /* dwTime += AnimDev[wDevID].lpdwTrackLen[wTrack - 1];
213 printf("Adding trk#%u curpos=%u \n", dwTime);
214 if (dwTime >= dwFrame) break; */
215 if (AnimDev
[wDevID
].lpdwTrackPos
[wTrack
- 1] >= dwFrame
) break;
217 wMinutes
= dwFrame
/ ANIMFRAMES_PERMIN
;
218 wSeconds
= (dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
) / ANIMFRAMES_PERSEC
;
219 wFrames
= dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
-
220 ANIMFRAMES_PERSEC
* wSeconds
;
221 dwTime
= MCI_MAKE_TMSF(wTrack
, wMinutes
, wSeconds
, wFrames
);
222 dprintf_mcianim(stddeb
,
223 "ANIM_CalcTime // %02u-%02u:%02u:%02u\n",
224 wTrack
, wMinutes
, wSeconds
, wFrames
);
232 /**************************************************************************
233 * ANIM_CalcFrame [internal]
235 static DWORD
ANIM_CalcFrame(UINT16 wDevID
, DWORD dwFormatType
, DWORD dwTime
)
238 #if defined(linux) || defined(__FreeBSD__)
240 dprintf_mcianim(stddeb
,"ANIM_CalcFrame(%u, %08lX, %lu);\n",
241 wDevID
, dwFormatType
, dwTime
);
243 switch (dwFormatType
) {
244 case MCI_FORMAT_MILLISECONDS
:
245 dwFrame
= dwTime
* ANIMFRAMES_PERSEC
/ 1000;
246 dprintf_mcianim(stddeb
,
247 "ANIM_CalcFrame // MILLISECONDS %lu\n", dwFrame
);
250 dprintf_mcianim(stddeb
,
251 "ANIM_CalcFrame // MSF %02u:%02u:%02u\n",
252 MCI_MSF_MINUTE(dwTime
), MCI_MSF_SECOND(dwTime
),
253 MCI_MSF_FRAME(dwTime
));
254 dwFrame
+= ANIMFRAMES_PERMIN
* MCI_MSF_MINUTE(dwTime
);
255 dwFrame
+= ANIMFRAMES_PERSEC
* MCI_MSF_SECOND(dwTime
);
256 dwFrame
+= MCI_MSF_FRAME(dwTime
);
259 /* unknown format ! force TMSF ! ... */
260 dwFormatType
= MCI_FORMAT_TMSF
;
261 case MCI_FORMAT_TMSF
:
262 wTrack
= MCI_TMSF_TRACK(dwTime
);
263 dprintf_mcianim(stddeb
,
264 "ANIM_CalcFrame // TMSF %02u-%02u:%02u:%02u\n",
265 MCI_TMSF_TRACK(dwTime
), MCI_TMSF_MINUTE(dwTime
),
266 MCI_TMSF_SECOND(dwTime
), MCI_TMSF_FRAME(dwTime
));
267 dprintf_mcianim(stddeb
,
268 "ANIM_CalcFrame // TMSF trackpos[%u]=%lu\n",
269 wTrack
, AnimDev
[wDevID
].lpdwTrackPos
[wTrack
- 1]);
270 dwFrame
= AnimDev
[wDevID
].lpdwTrackPos
[wTrack
- 1];
271 dwFrame
+= ANIMFRAMES_PERMIN
* MCI_TMSF_MINUTE(dwTime
);
272 dwFrame
+= ANIMFRAMES_PERSEC
* MCI_TMSF_SECOND(dwTime
);
273 dwFrame
+= MCI_TMSF_FRAME(dwTime
);
281 /**************************************************************************
282 * ANIM_mciInfo [internal]
284 static DWORD
ANIM_mciInfo(UINT16 wDevID
, DWORD dwFlags
, LPMCI_INFO_PARMS lpParms
)
286 #if defined(linux) || defined(__FreeBSD__)
287 dprintf_mcianim(stddeb
,"ANIM_mciInfo(%u, %08lX, %p);\n",
288 wDevID
, dwFlags
, lpParms
);
289 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
290 lpParms
->lpstrReturn
= NULL
;
292 case MCI_INFO_PRODUCT
:
293 lpParms
->lpstrReturn
= "Linux ANIMATION 0.5";
296 lpParms
->lpstrReturn
=
297 (LPSTR
)AnimDev
[wDevID
].openParms
.lpstrElementName
;
299 case MCI_ANIM_INFO_TEXT
:
300 lpParms
->lpstrReturn
= "Animation Window";
303 return MCIERR_UNRECOGNIZED_COMMAND
;
305 if (lpParms
->lpstrReturn
!= NULL
)
306 lpParms
->dwRetSize
= strlen(lpParms
->lpstrReturn
);
308 lpParms
->dwRetSize
= 0;
311 return MCIERR_INTERNAL
;
315 /**************************************************************************
316 * ANIM_mciStatus [internal]
318 static DWORD
ANIM_mciStatus(UINT16 wDevID
, DWORD dwFlags
, LPMCI_STATUS_PARMS lpParms
)
320 #if defined(linux) || defined(__FreeBSD__)
321 dprintf_mcianim(stddeb
,"ANIM_mciStatus(%u, %08lX, %p);\n",
322 wDevID
, dwFlags
, lpParms
);
323 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
324 if (dwFlags
& MCI_NOTIFY
) {
325 dprintf_mcianim(stddeb
,
326 "ANIM_mciStatus // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
327 lpParms
->dwCallback
);
328 mciDriverNotify((HWND16
)LOWORD(lpParms
->dwCallback
),
329 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
331 if (dwFlags
& MCI_STATUS_ITEM
) {
332 switch(lpParms
->dwItem
) {
333 case MCI_STATUS_CURRENT_TRACK
:
334 lpParms
->dwReturn
= AnimDev
[wDevID
].nCurTrack
;
335 dprintf_mcianim(stddeb
,"ANIM_mciStatus // CURRENT_TRACK=%lu!\n", lpParms
->dwReturn
);
337 case MCI_STATUS_LENGTH
:
338 if (dwFlags
& MCI_TRACK
) {
339 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_TRACK #%lu LENGTH=??? !\n",
341 if (lpParms
->dwTrack
> AnimDev
[wDevID
].nTracks
)
342 return MCIERR_OUTOFRANGE
;
343 lpParms
->dwReturn
= AnimDev
[wDevID
].lpdwTrackLen
[lpParms
->dwTrack
];
346 lpParms
->dwReturn
= AnimDev
[wDevID
].dwTotalLen
;
347 lpParms
->dwReturn
= ANIM_CalcTime(wDevID
,
348 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwReturn
);
349 dprintf_mcianim(stddeb
,"ANIM_mciStatus // LENGTH=%lu !\n", lpParms
->dwReturn
);
351 case MCI_STATUS_MODE
:
352 lpParms
->dwReturn
= AnimDev
[wDevID
].mode
;
353 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_MODE=%08lX !\n",
356 case MCI_STATUS_MEDIA_PRESENT
:
357 lpParms
->dwReturn
= TRUE
;
358 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_MEDIA_PRESENT !\n");
360 case MCI_STATUS_NUMBER_OF_TRACKS
:
361 lpParms
->dwReturn
= 1;
362 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_NUMBER_OF_TRACKS = %lu !\n",
364 if (lpParms
->dwReturn
== (WORD
)-1) return MCIERR_INTERNAL
;
366 case MCI_STATUS_POSITION
:
367 lpParms
->dwReturn
= AnimDev
[wDevID
].dwCurFrame
;
368 if (dwFlags
& MCI_STATUS_START
) {
369 lpParms
->dwReturn
= 0;
370 dprintf_mcianim(stddeb
,"CDAUDIO_mciStatus // get MCI_STATUS_START !\n");
372 if (dwFlags
& MCI_TRACK
) {
373 if (lpParms
->dwTrack
> AnimDev
[wDevID
].nTracks
)
374 return MCIERR_OUTOFRANGE
;
375 lpParms
->dwReturn
= AnimDev
[wDevID
].lpdwTrackPos
[lpParms
->dwTrack
- 1];
376 dprintf_mcianim(stddeb
,"ANIM_mciStatus // get MCI_TRACK #%lu !\n", lpParms
->dwTrack
);
378 lpParms
->dwReturn
= ANIM_CalcTime(wDevID
,
379 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwReturn
);
380 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_POSITION=%08lX !\n",
383 case MCI_STATUS_READY
:
384 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_READY !\n");
385 lpParms
->dwReturn
= TRUE
;
387 case MCI_STATUS_TIME_FORMAT
:
388 dprintf_mcianim(stddeb
,"ANIM_mciStatus // MCI_STATUS_TIME_FORMAT !\n");
389 lpParms
->dwReturn
= MCI_FORMAT_MILLISECONDS
;
392 fprintf(stderr
,"ANIM_mciStatus // unknown command %08lX !\n", lpParms
->dwItem
);
393 return MCIERR_UNRECOGNIZED_COMMAND
;
396 fprintf(stderr
,"ANIM_mciStatus // not MCI_STATUS_ITEM !\n");
399 return MMSYSERR_NOTENABLED
;
404 /**************************************************************************
405 * ANIM_mciPlay [internal]
407 static DWORD
ANIM_mciPlay(UINT16 wDevID
, DWORD dwFlags
, LPMCI_PLAY_PARMS lpParms
)
409 #if defined(linux) || defined(__FreeBSD__)
411 dprintf_mcianim(stddeb
,"ANIM_mciPlay(%u, %08lX, %p);\n",
412 wDevID
, dwFlags
, lpParms
);
413 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
414 start
= 0; end
= AnimDev
[wDevID
].dwTotalLen
;
415 AnimDev
[wDevID
].nCurTrack
= 1;
416 if (dwFlags
& MCI_FROM
) {
417 start
= ANIM_CalcFrame(wDevID
,
418 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwFrom
);
419 dprintf_mcianim(stddeb
,"ANIM_mciPlay // MCI_FROM=%08lX -> %u \n",
420 lpParms
->dwFrom
, start
);
422 if (dwFlags
& MCI_TO
) {
423 end
= ANIM_CalcFrame(wDevID
,
424 AnimDev
[wDevID
].dwTimeFormat
, lpParms
->dwTo
);
425 dprintf_mcianim(stddeb
,
426 "ANIM_mciPlay // MCI_TO=%08lX -> %u \n",
429 AnimDev
[wDevID
].mode
= MCI_MODE_PLAY
;
430 if (dwFlags
& MCI_NOTIFY
) {
431 dprintf_mcianim(stddeb
,
432 "ANIM_mciPlay // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
433 lpParms
->dwCallback
);
434 mciDriverNotify((HWND16
)LOWORD(lpParms
->dwCallback
),
435 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
439 return MCIERR_HARDWARE
;
443 /**************************************************************************
444 * ANIM_mciStop [internal]
446 static DWORD
ANIM_mciStop(UINT16 wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
448 #if defined(linux) || defined(__FreeBSD__)
449 dprintf_mcianim(stddeb
,"ANIM_mciStop(%u, %08lX, %p);\n",
450 wDevID
, dwFlags
, lpParms
);
451 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
452 AnimDev
[wDevID
].mode
= MCI_MODE_STOP
;
453 if (dwFlags
& MCI_NOTIFY
) {
454 dprintf_mcianim(stddeb
,
455 "ANIM_mciStop // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
456 lpParms
->dwCallback
);
457 mciDriverNotify((HWND16
)LOWORD(lpParms
->dwCallback
),
458 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
462 return MCIERR_HARDWARE
;
466 /**************************************************************************
467 * ANIM_mciPause [internal]
469 static DWORD
ANIM_mciPause(UINT16 wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
471 #if defined(linux) || defined(__FreeBSD__)
472 dprintf_mcianim(stddeb
,"ANIM_mciPause(%u, %08lX, %p);\n",
473 wDevID
, dwFlags
, lpParms
);
474 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
475 AnimDev
[wDevID
].mode
= MCI_MODE_PAUSE
;
476 if (dwFlags
& MCI_NOTIFY
) {
477 dprintf_mcianim(stddeb
,
478 "ANIM_mciPause // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
479 lpParms
->dwCallback
);
480 mciDriverNotify((HWND16
)LOWORD(lpParms
->dwCallback
),
481 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
485 return MCIERR_HARDWARE
;
489 /**************************************************************************
490 * ANIM_mciResume [internal]
492 static DWORD
ANIM_mciResume(UINT16 wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
494 #if defined(linux) || defined(__FreeBSD__)
495 dprintf_mcianim(stddeb
,"ANIM_mciResume(%u, %08lX, %p);\n",
496 wDevID
, dwFlags
, lpParms
);
497 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
498 AnimDev
[wDevID
].mode
= MCI_MODE_STOP
;
499 if (dwFlags
& MCI_NOTIFY
) {
500 dprintf_mcianim(stddeb
,
501 "ANIM_mciResume // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
502 lpParms
->dwCallback
);
503 mciDriverNotify((HWND16
)LOWORD(lpParms
->dwCallback
),
504 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
508 return MCIERR_HARDWARE
;
512 /**************************************************************************
513 * ANIM_mciSeek [internal]
515 static DWORD
ANIM_mciSeek(UINT16 wDevID
, DWORD dwFlags
, LPMCI_SEEK_PARMS lpParms
)
517 #if defined(linux) || defined(__FreeBSD__)
519 MCI_PLAY_PARMS PlayParms
;
520 dprintf_mcianim(stddeb
,"ANIM_mciSeek(%u, %08lX, %p);\n",
521 wDevID
, dwFlags
, lpParms
);
522 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
523 AnimDev
[wDevID
].mode
= MCI_MODE_SEEK
;
525 case MCI_SEEK_TO_START
:
526 PlayParms
.dwFrom
= 0;
528 case MCI_SEEK_TO_END
:
529 PlayParms
.dwFrom
= AnimDev
[wDevID
].dwTotalLen
;
532 PlayParms
.dwFrom
= lpParms
->dwTo
;
535 dwRet
= ANIM_mciPlay(wDevID
, MCI_WAIT
| MCI_FROM
, &PlayParms
);
536 if (dwRet
!= 0) return dwRet
;
537 dwRet
= ANIM_mciStop(wDevID
, MCI_WAIT
, (LPMCI_GENERIC_PARMS
)&PlayParms
);
538 if (dwFlags
& MCI_NOTIFY
) {
539 dprintf_mcianim(stddeb
,
540 "ANIM_mciSeek // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
541 lpParms
->dwCallback
);
542 mciDriverNotify((HWND16
)LOWORD(lpParms
->dwCallback
),
543 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
547 return MCIERR_HARDWARE
;
552 /**************************************************************************
553 * ANIM_mciSet [internal]
555 static DWORD
ANIM_mciSet(UINT16 wDevID
, DWORD dwFlags
, LPMCI_SET_PARMS lpParms
)
557 #if defined(linux) || defined(__FreeBSD__)
558 dprintf_mcianim(stddeb
,"ANIM_mciSet(%u, %08lX, %p);\n",
559 wDevID
, dwFlags
, lpParms
);
560 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
562 printf("ANIM_mciSet // dwTimeFormat=%08lX\n", lpParms->dwTimeFormat);
563 printf("ANIM_mciSet // dwAudio=%08lX\n", lpParms->dwAudio);
565 if (dwFlags
& MCI_SET_TIME_FORMAT
) {
566 switch (lpParms
->dwTimeFormat
) {
567 case MCI_FORMAT_MILLISECONDS
:
568 dprintf_mcianim(stddeb
,
569 "ANIM_mciSet // MCI_FORMAT_MILLISECONDS !\n");
572 dprintf_mcianim(stddeb
,"ANIM_mciSet // MCI_FORMAT_MSF !\n");
574 case MCI_FORMAT_TMSF
:
575 dprintf_mcianim(stddeb
,"ANIM_mciSet // MCI_FORMAT_TMSF !\n");
578 fprintf(stderr
,"ANIM_mciSet // bad time format !\n");
579 return MCIERR_BAD_TIME_FORMAT
;
581 AnimDev
[wDevID
].dwTimeFormat
= lpParms
->dwTimeFormat
;
583 if (dwFlags
& MCI_SET_VIDEO
) return MCIERR_UNSUPPORTED_FUNCTION
;
584 if (dwFlags
& MCI_SET_ON
) return MCIERR_UNSUPPORTED_FUNCTION
;
585 if (dwFlags
& MCI_SET_OFF
) return MCIERR_UNSUPPORTED_FUNCTION
;
586 if (dwFlags
& MCI_NOTIFY
) {
587 dprintf_mcianim(stddeb
,
588 "ANIM_mciSet // MCI_NOTIFY_SUCCESSFUL %08lX !\n",
589 lpParms
->dwCallback
);
590 mciDriverNotify((HWND16
)LOWORD(lpParms
->dwCallback
),
591 AnimDev
[wDevID
].wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
595 return MCIERR_HARDWARE
;
600 /**************************************************************************
601 * ANIM_DriverProc [sample driver]
603 LONG
ANIM_DriverProc(DWORD dwDevID
, HDRVR16 hDriv
, WORD wMsg
,
604 DWORD dwParam1
, DWORD dwParam2
)
606 #if defined(linux) || defined(__FreeBSD__)
613 case MCI_OPEN_DRIVER
:
615 return ANIM_mciOpen(dwDevID
, dwParam1
,
616 (LPMCI_OPEN_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
618 case MCI_CLOSE_DRIVER
:
620 return ANIM_mciClose(dwDevID
, dwParam1
,
621 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
626 case DRV_QUERYCONFIGURE
:
629 MessageBox16(0, "Sample MultiMedia Linux Driver !",
630 "MMLinux Driver", MB_OK
);
633 return DRVCNF_RESTART
;
635 return DRVCNF_RESTART
;
637 return ANIM_mciGetDevCaps(dwDevID
, dwParam1
,
638 (LPMCI_GETDEVCAPS_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
640 return ANIM_mciInfo(dwDevID
, dwParam1
,
641 (LPMCI_INFO_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
643 return ANIM_mciStatus(dwDevID
, dwParam1
,
644 (LPMCI_STATUS_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
646 return ANIM_mciSet(dwDevID
, dwParam1
,
647 (LPMCI_SET_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
649 return ANIM_mciPlay(dwDevID
, dwParam1
,
650 (LPMCI_PLAY_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
652 return ANIM_mciStop(dwDevID
, dwParam1
,
653 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
655 return ANIM_mciPause(dwDevID
, dwParam1
,
656 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
658 return ANIM_mciResume(dwDevID
, dwParam1
,
659 (LPMCI_GENERIC_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
661 return ANIM_mciSeek(dwDevID
, dwParam1
,
662 (LPMCI_SEEK_PARMS
)PTR_SEG_TO_LIN(dwParam2
));
664 return DefDriverProc(dwDevID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
667 return MCIERR_HARDWARE
;
672 /*-----------------------------------------------------------------------*/