1 /* -*- tab-width: 8; c-basic-offset: 4 -*- */
3 * Sample MCI ANIMATION Wine Driver for Linux
5 * Copyright 1994 Martin Ayotte
10 #include "multimedia.h"
11 #include "debugtools.h"
13 DEFAULT_DEBUG_CHANNEL(mcianim
)
15 #define ANIMFRAMES_PERSEC 30
16 #define ANIMFRAMES_PERMIN 1800
17 #define SECONDS_PERMIN 60
21 int nUseCount
; /* Incremented for each shared open */
22 BOOL16 fShareable
; /* TRUE if first open was shareable */
23 WORD wNotifyDeviceID
; /* MCI device ID with a pending notification */
24 HANDLE16 hCallback
; /* Callback handle for pending notification */
25 MCI_OPEN_PARMSA openParms
;
36 /*-----------------------------------------------------------------------*/
38 /**************************************************************************
39 * ANIM_drvOpen [internal]
41 static DWORD
ANIM_drvOpen(LPSTR str
, LPMCI_OPEN_DRIVER_PARMSA modp
)
43 WINE_MCIANIM
* wma
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WINE_MCIANIM
));
48 wma
->wDevID
= modp
->wDeviceID
;
49 mciSetDriverData(wma
->wDevID
, (DWORD
)wma
);
50 modp
->wCustomCommandTable
= MCI_NO_COMMAND_TABLE
;
51 modp
->wType
= MCI_DEVTYPE_SEQUENCER
;
52 return modp
->wDeviceID
;
55 /**************************************************************************
56 * ANIM_drvClose [internal]
58 static DWORD
ANIM_drvClose(DWORD dwDevID
)
60 WINE_MCIANIM
* wma
= (WINE_MCIANIM
*)mciGetDriverData(dwDevID
);
63 HeapFree(GetProcessHeap(), 0, wma
);
69 /**************************************************************************
70 * ANIM_mciGetOpenDrv [internal]
72 static WINE_MCIANIM
* ANIM_mciGetOpenDrv(UINT16 wDevID
)
74 WINE_MCIANIM
* wma
= (WINE_MCIANIM
*)mciGetDriverData(wDevID
);
76 if (wma
== NULL
|| wma
->nUseCount
== 0) {
77 WARN("Invalid wDevID=%u\n", wDevID
);
83 /**************************************************************************
84 * ANIM_mciOpen [internal]
86 static DWORD
ANIM_mciOpen(UINT16 wDevID
, DWORD dwFlags
, LPMCI_OPEN_PARMSA lpOpenParms
)
89 WINE_MCIANIM
* wma
= (WINE_MCIANIM
*)mciGetDriverData(wDevID
);
91 TRACE("(%04X, %08lX, %p);\n", wDevID
, dwFlags
, lpOpenParms
);
93 if (lpOpenParms
== NULL
) return MCIERR_INTERNAL
;
94 if (wma
== NULL
) return MCIERR_INVALID_DEVICE_ID
;
96 if (wma
->nUseCount
> 0) {
97 /* The driver already open on this channel */
98 /* If the driver was opened shareable before and this open specifies */
99 /* shareable then increment the use count */
100 if (wma
->fShareable
&& (dwFlags
& MCI_OPEN_SHAREABLE
))
103 return MCIERR_MUST_USE_SHAREABLE
;
106 wma
->fShareable
= dwFlags
& MCI_OPEN_SHAREABLE
;
109 dwDeviceID
= lpOpenParms
->wDeviceID
;
111 TRACE("wDevID=%04X\n", wDevID
);
112 /* FIXME this is not consistent with other implementations */
113 lpOpenParms
->wDeviceID
= wDevID
;
115 /*TRACE("lpParms->wDevID=%04X\n", lpParms->wDeviceID);*/
116 if (dwFlags
& MCI_OPEN_ELEMENT
) {
117 TRACE("MCI_OPEN_ELEMENT '%s' !\n", lpOpenParms
->lpstrElementName
);
118 if (lpOpenParms
->lpstrElementName
&& strlen(lpOpenParms
->lpstrElementName
) > 0) {
120 FIXME("element is not opened\n");
122 memcpy(&wma
->openParms
, lpOpenParms
, sizeof(MCI_OPEN_PARMSA
));
123 wma
->wNotifyDeviceID
= dwDeviceID
;
125 wma
->dwTimeFormat
= MCI_FORMAT_TMSF
;
129 wma
->lpdwTrackLen
= NULL
;
130 wma
->lpdwTrackPos
= NULL
;
132 Moved to mmsystem.c mciOpen routine
134 if (dwFlags & MCI_NOTIFY) {
135 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n",
136 lpParms->dwCallback);
137 mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
138 wma->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
144 /**************************************************************************
145 * ANIM_mciClose [internal]
147 static DWORD
ANIM_mciClose(UINT16 wDevID
, DWORD dwParam
, LPMCI_GENERIC_PARMS lpParms
)
149 WINE_MCIANIM
* wma
= ANIM_mciGetOpenDrv(wDevID
);
151 TRACE("(%u, %08lX, %p);\n", wDevID
, dwParam
, lpParms
);
153 if (wma
== NULL
) return MCIERR_INVALID_DEVICE_ID
;
155 if (--wma
->nUseCount
== 0) {
156 /* do the actual clean-up */
161 /**************************************************************************
162 * ANIM_mciGetDevCaps [internal]
164 static DWORD
ANIM_mciGetDevCaps(UINT16 wDevID
, DWORD dwFlags
,
165 LPMCI_GETDEVCAPS_PARMS lpParms
)
167 WINE_MCIANIM
* wma
= ANIM_mciGetOpenDrv(wDevID
);
170 TRACE("(%u, %08lX, %p);\n", wDevID
, dwFlags
, lpParms
);
172 if (lpParms
== NULL
) return MCIERR_NULL_PARAMETER_BLOCK
;
173 if (wma
== NULL
) return MCIERR_INVALID_DEVICE_ID
;
175 if (dwFlags
& MCI_GETDEVCAPS_ITEM
) {
176 TRACE("MCI_GETDEVCAPS_ITEM dwItem=%08lX;\n", lpParms
->dwItem
);
178 switch(lpParms
->dwItem
) {
179 case MCI_GETDEVCAPS_CAN_RECORD
:
180 lpParms
->dwReturn
= MAKEMCIRESOURCE(FALSE
, MCI_FALSE
);
181 ret
= MCI_RESOURCE_RETURNED
;
183 case MCI_GETDEVCAPS_HAS_AUDIO
:
184 lpParms
->dwReturn
= MAKEMCIRESOURCE(FALSE
, MCI_FALSE
);
185 ret
= MCI_RESOURCE_RETURNED
;
187 case MCI_GETDEVCAPS_HAS_VIDEO
:
188 lpParms
->dwReturn
= MAKEMCIRESOURCE(FALSE
, MCI_FALSE
);
189 ret
= MCI_RESOURCE_RETURNED
;
191 case MCI_GETDEVCAPS_DEVICE_TYPE
:
192 lpParms
->dwReturn
= MAKEMCIRESOURCE(MCI_DEVTYPE_ANIMATION
, MCI_DEVTYPE_ANIMATION
);
193 ret
= MCI_RESOURCE_RETURNED
;
195 case MCI_GETDEVCAPS_USES_FILES
:
196 lpParms
->dwReturn
= MAKEMCIRESOURCE(TRUE
, MCI_TRUE
);
197 ret
= MCI_RESOURCE_RETURNED
;
199 case MCI_GETDEVCAPS_COMPOUND_DEVICE
:
200 lpParms
->dwReturn
= MAKEMCIRESOURCE(FALSE
, MCI_FALSE
);
201 ret
= MCI_RESOURCE_RETURNED
;
203 case MCI_GETDEVCAPS_CAN_EJECT
:
204 lpParms
->dwReturn
= MAKEMCIRESOURCE(TRUE
, MCI_TRUE
);
205 ret
= MCI_RESOURCE_RETURNED
;
207 case MCI_GETDEVCAPS_CAN_PLAY
:
208 lpParms
->dwReturn
= MAKEMCIRESOURCE(FALSE
, MCI_FALSE
);
209 ret
= MCI_RESOURCE_RETURNED
;
211 case MCI_GETDEVCAPS_CAN_SAVE
:
212 lpParms
->dwReturn
= MAKEMCIRESOURCE(FALSE
, MCI_FALSE
);
213 ret
= MCI_RESOURCE_RETURNED
;
216 FIXME("Unknown capability (%08lx) !\n", lpParms
->dwItem
);
217 return MCIERR_UNRECOGNIZED_COMMAND
;
220 WARN("No GETDEVCAPS_ITEM !\n");
221 return MCIERR_UNRECOGNIZED_COMMAND
;
223 TRACE("lpParms->dwReturn=%08lX;\n", lpParms
->dwReturn
);
228 /**************************************************************************
229 * ANIM_CalcTime [internal]
231 static DWORD
ANIM_CalcTime(WINE_MCIANIM
* wma
, DWORD dwFormatType
, DWORD dwFrame
, LPDWORD lpRet
)
239 TRACE("(%p, %08lX, %lu);\n", wma
, dwFormatType
, dwFrame
);
241 switch (dwFormatType
) {
242 case MCI_FORMAT_MILLISECONDS
:
243 dwTime
= dwFrame
/ ANIMFRAMES_PERSEC
* 1000;
245 TRACE("MILLISECONDS %lu\n", dwTime
);
248 wMinutes
= dwFrame
/ ANIMFRAMES_PERMIN
;
249 wSeconds
= (dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
) / ANIMFRAMES_PERSEC
;
250 wFrames
= dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
-
251 ANIMFRAMES_PERSEC
* wSeconds
;
252 dwTime
= MCI_MAKE_MSF(wMinutes
, wSeconds
, wFrames
);
253 TRACE("MSF %02u:%02u:%02u -> dwTime=%lu\n",wMinutes
, wSeconds
, wFrames
, dwTime
);
254 *lpRet
= MCI_COLONIZED3_RETURN
;
257 /* unknown format ! force TMSF ! ... */
258 dwFormatType
= MCI_FORMAT_TMSF
;
259 case MCI_FORMAT_TMSF
:
260 for (wTrack
= 0; wTrack
< wma
->nTracks
; wTrack
++) {
261 /* dwTime += wma->lpdwTrackLen[wTrack - 1];
262 TRACE("Adding trk#%u curpos=%u \n", dwTime);
263 if (dwTime >= dwFrame) break; */
264 if (wma
->lpdwTrackPos
[wTrack
- 1] >= dwFrame
) break;
266 wMinutes
= dwFrame
/ ANIMFRAMES_PERMIN
;
267 wSeconds
= (dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
) / ANIMFRAMES_PERSEC
;
268 wFrames
= dwFrame
- ANIMFRAMES_PERMIN
* wMinutes
-
269 ANIMFRAMES_PERSEC
* wSeconds
;
270 dwTime
= MCI_MAKE_TMSF(wTrack
, wMinutes
, wSeconds
, wFrames
);
271 *lpRet
= MCI_COLONIZED4_RETURN
;
272 TRACE("%02u-%02u:%02u:%02u\n", wTrack
, wMinutes
, wSeconds
, wFrames
);
279 /**************************************************************************
280 * ANIM_CalcFrame [internal]
282 static DWORD
ANIM_CalcFrame(WINE_MCIANIM
* wma
, DWORD dwFormatType
, DWORD dwTime
)
287 TRACE("(%p, %08lX, %lu);\n", wma
, dwFormatType
, dwTime
);
289 switch (dwFormatType
) {
290 case MCI_FORMAT_MILLISECONDS
:
291 dwFrame
= dwTime
* ANIMFRAMES_PERSEC
/ 1000;
292 TRACE("MILLISECONDS %lu\n", dwFrame
);
295 TRACE("MSF %02u:%02u:%02u\n",
296 MCI_MSF_MINUTE(dwTime
), MCI_MSF_SECOND(dwTime
),
297 MCI_MSF_FRAME(dwTime
));
298 dwFrame
+= ANIMFRAMES_PERMIN
* MCI_MSF_MINUTE(dwTime
);
299 dwFrame
+= ANIMFRAMES_PERSEC
* MCI_MSF_SECOND(dwTime
);
300 dwFrame
+= MCI_MSF_FRAME(dwTime
);
303 /* unknown format ! force TMSF ! ... */
304 dwFormatType
= MCI_FORMAT_TMSF
;
305 case MCI_FORMAT_TMSF
:
306 wTrack
= MCI_TMSF_TRACK(dwTime
);
307 TRACE("TMSF %02u-%02u:%02u:%02u\n",
308 MCI_TMSF_TRACK(dwTime
), MCI_TMSF_MINUTE(dwTime
),
309 MCI_TMSF_SECOND(dwTime
), MCI_TMSF_FRAME(dwTime
));
310 TRACE("TMSF trackpos[%u]=%lu\n",
311 wTrack
, wma
->lpdwTrackPos
[wTrack
- 1]);
312 dwFrame
= wma
->lpdwTrackPos
[wTrack
- 1];
313 dwFrame
+= ANIMFRAMES_PERMIN
* MCI_TMSF_MINUTE(dwTime
);
314 dwFrame
+= ANIMFRAMES_PERSEC
* MCI_TMSF_SECOND(dwTime
);
315 dwFrame
+= MCI_TMSF_FRAME(dwTime
);
321 /**************************************************************************
322 * ANIM_mciInfo [internal]
324 static DWORD
ANIM_mciInfo(UINT16 wDevID
, DWORD dwFlags
, LPMCI_INFO_PARMS16 lpParms
)
326 WINE_MCIANIM
* wma
= ANIM_mciGetOpenDrv(wDevID
);
329 TRACE("(%u, %08lX, %p);\n", wDevID
, dwFlags
, lpParms
);
331 if (lpParms
== NULL
|| lpParms
->lpstrReturn
== NULL
)
332 return MCIERR_NULL_PARAMETER_BLOCK
;
335 return MCIERR_INVALID_DEVICE_ID
;
337 TRACE("buf=%p, len=%lu\n", lpParms
->lpstrReturn
, lpParms
->dwRetSize
);
340 case MCI_INFO_PRODUCT
:
341 str
= "Wine's animation";
344 str
= wma
->openParms
.lpstrElementName
;
346 case MCI_ANIM_INFO_TEXT
:
347 str
= "Animation Window";
350 WARN("Don't know this info command (%lu)\n", dwFlags
);
351 return MCIERR_UNRECOGNIZED_COMMAND
;
354 return MCI_WriteString(lpParms
->lpstrReturn
, lpParms
->dwRetSize
, str
);
357 /**************************************************************************
358 * ANIM_mciStatus [internal]
360 static DWORD
ANIM_mciStatus(UINT16 wDevID
, DWORD dwFlags
, LPMCI_STATUS_PARMS lpParms
)
362 WINE_MCIANIM
* wma
= ANIM_mciGetOpenDrv(wDevID
);
365 TRACE("(%u, %08lX, %p);\n", wDevID
, dwFlags
, lpParms
);
367 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
368 if (wma
== NULL
) return MCIERR_INVALID_DEVICE_ID
;
370 if (dwFlags
& MCI_NOTIFY
) {
371 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms
->dwCallback
);
373 mciDriverNotify16((HWND16
)LOWORD(lpParms
->dwCallback
),
374 wma
->wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
376 if (dwFlags
& MCI_STATUS_ITEM
) {
377 switch(lpParms
->dwItem
) {
378 case MCI_STATUS_CURRENT_TRACK
:
379 lpParms
->dwReturn
= wma
->nCurTrack
;
380 TRACE("CURRENT_TRACK=%lu!\n", lpParms
->dwReturn
);
382 case MCI_STATUS_LENGTH
:
383 if (dwFlags
& MCI_TRACK
) {
384 TRACE("MCI_TRACK #%lu LENGTH=??? !\n", lpParms
->dwTrack
);
385 if (lpParms
->dwTrack
> wma
->nTracks
)
386 return MCIERR_OUTOFRANGE
;
387 lpParms
->dwReturn
= wma
->lpdwTrackLen
[lpParms
->dwTrack
];
390 lpParms
->dwReturn
= wma
->dwTotalLen
;
391 lpParms
->dwReturn
= ANIM_CalcTime(wma
, wma
->dwTimeFormat
, lpParms
->dwReturn
, &ret
);
392 TRACE("LENGTH=%lu !\n", lpParms
->dwReturn
);
394 case MCI_STATUS_MODE
:
395 TRACE("MCI_STATUS_MODE=%04X !\n", wma
->mode
);
396 lpParms
->dwReturn
= MAKEMCIRESOURCE(wma
->mode
, wma
->mode
);
397 ret
= MCI_RESOURCE_RETURNED
;
399 case MCI_STATUS_MEDIA_PRESENT
:
400 lpParms
->dwReturn
= MAKEMCIRESOURCE(TRUE
, MCI_TRUE
);
401 ret
= MCI_RESOURCE_RETURNED
;
402 TRACE("MCI_STATUS_MEDIA_PRESENT !\n");
404 case MCI_STATUS_NUMBER_OF_TRACKS
:
405 lpParms
->dwReturn
= 1;
406 TRACE("MCI_STATUS_NUMBER_OF_TRACKS = %lu !\n", lpParms
->dwReturn
);
408 case MCI_STATUS_POSITION
:
409 lpParms
->dwReturn
= wma
->dwCurFrame
;
410 if (dwFlags
& MCI_STATUS_START
) {
411 lpParms
->dwReturn
= 0;
412 TRACE("get MCI_STATUS_START !\n");
414 if (dwFlags
& MCI_TRACK
) {
415 if (lpParms
->dwTrack
> wma
->nTracks
)
416 return MCIERR_OUTOFRANGE
;
417 lpParms
->dwReturn
= wma
->lpdwTrackPos
[lpParms
->dwTrack
- 1];
418 TRACE("get MCI_TRACK #%lu !\n", lpParms
->dwTrack
);
420 lpParms
->dwReturn
= ANIM_CalcTime(wma
, wma
->dwTimeFormat
, lpParms
->dwReturn
, &ret
);
421 TRACE("MCI_STATUS_POSITION=%08lX !\n", lpParms
->dwReturn
);
423 case MCI_STATUS_READY
:
424 TRACE("MCI_STATUS_READY !\n");
425 lpParms
->dwReturn
= MAKEMCIRESOURCE(TRUE
, MCI_TRUE
);
426 ret
= MCI_RESOURCE_RETURNED
;
428 case MCI_STATUS_TIME_FORMAT
:
429 TRACE("MCI_STATUS_TIME_FORMAT !\n");
430 lpParms
->dwReturn
= MAKEMCIRESOURCE(MCI_FORMAT_MILLISECONDS
, MCI_FORMAT_MILLISECONDS
);
431 TRACE("MCI_STATUS_TIME_FORMAT => %u\n", LOWORD(lpParms
->dwReturn
));
432 ret
= MCI_RESOURCE_RETURNED
;
435 FIXME("Unknown command %08lX !\n", lpParms
->dwItem
);
436 return MCIERR_UNRECOGNIZED_COMMAND
;
439 WARN("No MCI_STATUS_ITEM !\n");
440 return MCIERR_UNRECOGNIZED_COMMAND
;
446 /**************************************************************************
447 * ANIM_mciPlay [internal]
449 static DWORD
ANIM_mciPlay(UINT16 wDevID
, DWORD dwFlags
, LPMCI_PLAY_PARMS lpParms
)
451 WINE_MCIANIM
* wma
= ANIM_mciGetOpenDrv(wDevID
);
454 TRACE("(%u, %08lX, %p);\n", wDevID
, dwFlags
, lpParms
);
456 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
457 if (wma
== NULL
) return MCIERR_INVALID_DEVICE_ID
;
459 start
= 0; end
= wma
->dwTotalLen
;
461 if (dwFlags
& MCI_FROM
) {
462 start
= ANIM_CalcFrame(wma
, wma
->dwTimeFormat
, lpParms
->dwFrom
);
463 TRACE("MCI_FROM=%08lX -> %u \n", lpParms
->dwFrom
, start
);
465 if (dwFlags
& MCI_TO
) {
466 end
= ANIM_CalcFrame(wma
, wma
->dwTimeFormat
, lpParms
->dwTo
);
467 TRACE("MCI_TO=%08lX -> %u \n", lpParms
->dwTo
, end
);
469 wma
->mode
= MCI_MODE_PLAY
;
470 if (dwFlags
& MCI_NOTIFY
) {
471 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n",
472 lpParms
->dwCallback
);
473 mciDriverNotify16((HWND16
)LOWORD(lpParms
->dwCallback
),
474 wma
->wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
479 /**************************************************************************
480 * ANIM_mciStop [internal]
482 static DWORD
ANIM_mciStop(UINT16 wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
484 WINE_MCIANIM
* wma
= ANIM_mciGetOpenDrv(wDevID
);
486 TRACE("(%u, %08lX, %p);\n", wDevID
, dwFlags
, lpParms
);
488 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
489 if (wma
== NULL
) return MCIERR_INVALID_DEVICE_ID
;
491 wma
->mode
= MCI_MODE_STOP
;
492 if (dwFlags
& MCI_NOTIFY
) {
493 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms
->dwCallback
);
495 mciDriverNotify16((HWND16
)LOWORD(lpParms
->dwCallback
),
496 wma
->wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
501 /**************************************************************************
502 * ANIM_mciPause [internal]
504 static DWORD
ANIM_mciPause(UINT16 wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
506 WINE_MCIANIM
* wma
= ANIM_mciGetOpenDrv(wDevID
);
508 TRACE("(%u, %08lX, %p);\n", wDevID
, dwFlags
, lpParms
);
509 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
510 wma
->mode
= MCI_MODE_PAUSE
;
511 if (dwFlags
& MCI_NOTIFY
) {
512 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms
->dwCallback
);
514 mciDriverNotify16((HWND16
)LOWORD(lpParms
->dwCallback
),
515 wma
->wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
520 /**************************************************************************
521 * ANIM_mciResume [internal]
523 static DWORD
ANIM_mciResume(UINT16 wDevID
, DWORD dwFlags
, LPMCI_GENERIC_PARMS lpParms
)
525 WINE_MCIANIM
* wma
= ANIM_mciGetOpenDrv(wDevID
);
527 TRACE("(%u, %08lX, %p);\n", wDevID
, dwFlags
, lpParms
);
528 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
529 wma
->mode
= MCI_MODE_STOP
;
530 if (dwFlags
& MCI_NOTIFY
) {
531 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms
->dwCallback
);
533 mciDriverNotify16((HWND16
)LOWORD(lpParms
->dwCallback
),
534 wma
->wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
539 /**************************************************************************
540 * ANIM_mciSeek [internal]
542 static DWORD
ANIM_mciSeek(UINT16 wDevID
, DWORD dwFlags
, LPMCI_SEEK_PARMS lpParms
)
544 WINE_MCIANIM
* wma
= ANIM_mciGetOpenDrv(wDevID
);
546 MCI_PLAY_PARMS PlayParms
;
548 TRACE("(%u, %08lX, %p);\n", wDevID
, dwFlags
, lpParms
);
550 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
551 wma
->mode
= MCI_MODE_SEEK
;
553 case MCI_SEEK_TO_START
:
554 PlayParms
.dwFrom
= 0;
556 case MCI_SEEK_TO_END
:
557 PlayParms
.dwFrom
= wma
->dwTotalLen
;
560 PlayParms
.dwFrom
= lpParms
->dwTo
;
563 dwRet
= ANIM_mciPlay(wDevID
, MCI_WAIT
| MCI_FROM
, &PlayParms
);
564 if (dwRet
!= 0) return dwRet
;
565 dwRet
= ANIM_mciStop(wDevID
, MCI_WAIT
, (LPMCI_GENERIC_PARMS
)&PlayParms
);
566 if (dwFlags
& MCI_NOTIFY
) {
567 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms
->dwCallback
);
569 mciDriverNotify16((HWND16
)LOWORD(lpParms
->dwCallback
),
570 wma
->wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
576 /**************************************************************************
577 * ANIM_mciSet [internal]
579 static DWORD
ANIM_mciSet(UINT16 wDevID
, DWORD dwFlags
, LPMCI_SET_PARMS lpParms
)
581 WINE_MCIANIM
* wma
= ANIM_mciGetOpenDrv(wDevID
);
583 TRACE("(%u, %08lX, %p);\n", wDevID
, dwFlags
, lpParms
);
585 if (lpParms
== NULL
) return MCIERR_INTERNAL
;
586 if (wma
== NULL
) return MCIERR_INVALID_DEVICE_ID
;
588 TRACE("(dwTimeFormat=%08lX)\n", lpParms->dwTimeFormat);
589 TRACE("(dwAudio=%08lX)\n", lpParms->dwAudio);
591 if (dwFlags
& MCI_SET_TIME_FORMAT
) {
592 switch (lpParms
->dwTimeFormat
) {
593 case MCI_FORMAT_MILLISECONDS
:
594 TRACE("MCI_FORMAT_MILLISECONDS !\n");
597 TRACE("MCI_FORMAT_MSF !\n");
599 case MCI_FORMAT_TMSF
:
600 TRACE("MCI_FORMAT_TMSF !\n");
603 WARN("Bad time format !\n");
604 return MCIERR_BAD_TIME_FORMAT
;
606 wma
->dwTimeFormat
= lpParms
->dwTimeFormat
;
608 if (dwFlags
& MCI_SET_VIDEO
) return MCIERR_UNSUPPORTED_FUNCTION
;
609 if (dwFlags
& MCI_SET_ON
) return MCIERR_UNSUPPORTED_FUNCTION
;
610 if (dwFlags
& MCI_SET_OFF
) return MCIERR_UNSUPPORTED_FUNCTION
;
611 if (dwFlags
& MCI_NOTIFY
) {
612 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms
->dwCallback
);
613 mciDriverNotify16((HWND16
)LOWORD(lpParms
->dwCallback
),
614 wma
->wNotifyDeviceID
, MCI_NOTIFY_SUCCESSFUL
);
619 /**************************************************************************
620 * ANIM_DriverProc [sample driver]
622 LONG CALLBACK
MCIANIM_DriverProc(DWORD dwDevID
, HDRVR hDriv
, DWORD wMsg
,
623 DWORD dwParam1
, DWORD dwParam2
)
626 case DRV_LOAD
: return 1;
627 case DRV_FREE
: return 1;
628 case DRV_OPEN
: return ANIM_drvOpen((LPSTR
)dwParam1
, (LPMCI_OPEN_DRIVER_PARMSA
)dwParam2
);
629 case DRV_CLOSE
: return ANIM_drvClose(dwDevID
);
630 case DRV_ENABLE
: return 1;
631 case DRV_DISABLE
: return 1;
632 case DRV_QUERYCONFIGURE
: return 1;
633 case DRV_CONFIGURE
: MessageBoxA(0, "Sample MultiMedia Driver !", "Wine Driver", MB_OK
); return 1;
634 case DRV_INSTALL
: return DRVCNF_RESTART
;
635 case DRV_REMOVE
: return DRVCNF_RESTART
;
637 case MCI_OPEN_DRIVER
: return ANIM_mciOpen(dwDevID
, dwParam1
, (LPMCI_OPEN_PARMSA
)dwParam2
);
638 case MCI_CLOSE_DRIVER
: return ANIM_mciClose(dwDevID
, dwParam1
, (LPMCI_GENERIC_PARMS
)dwParam2
);
639 case MCI_GETDEVCAPS
: return ANIM_mciGetDevCaps(dwDevID
, dwParam1
, (LPMCI_GETDEVCAPS_PARMS
)dwParam2
);
640 case MCI_INFO
: return ANIM_mciInfo(dwDevID
, dwParam1
, (LPMCI_INFO_PARMS16
)dwParam2
);
641 case MCI_STATUS
: return ANIM_mciStatus(dwDevID
, dwParam1
, (LPMCI_STATUS_PARMS
)dwParam2
);
642 case MCI_SET
: return ANIM_mciSet(dwDevID
, dwParam1
, (LPMCI_SET_PARMS
)dwParam2
);
643 case MCI_PLAY
: return ANIM_mciPlay(dwDevID
, dwParam1
, (LPMCI_PLAY_PARMS
)dwParam2
);
644 case MCI_STOP
: return ANIM_mciStop(dwDevID
, dwParam1
, (LPMCI_GENERIC_PARMS
)dwParam2
);
645 case MCI_PAUSE
: return ANIM_mciPause(dwDevID
, dwParam1
, (LPMCI_GENERIC_PARMS
)dwParam2
);
646 case MCI_RESUME
: return ANIM_mciResume(dwDevID
, dwParam1
, (LPMCI_GENERIC_PARMS
)dwParam2
);
647 case MCI_SEEK
: return ANIM_mciSeek(dwDevID
, dwParam1
, (LPMCI_SEEK_PARMS
)dwParam2
);
664 FIXME("Unsupported message=%s\n", MCI_MessageToString(wMsg
));
668 ERR("Shouldn't receive a MCI_OPEN or CLOSE message\n");
671 TRACE("Sending msg=%s to default driver proc\n", MCI_MessageToString(wMsg
));
672 return DefDriverProc(dwDevID
, hDriv
, wMsg
, dwParam1
, dwParam2
);
674 return MCIERR_UNRECOGNIZED_COMMAND
;
677 /*-----------------------------------------------------------------------*/