1 /* -*- tab-width: 8; c-basic-offset: 4 -*- */
3 * Sample MCI ANIMATION Wine Driver for Linux
5 * Copyright 1994 Martin Ayotte
14 #include "debugtools.h"
16 DEFAULT_DEBUG_CHANNEL(mcianim);
18 #define ANIMFRAMES_PERSEC 30
19 #define ANIMFRAMES_PERMIN 1800
20 #define SECONDS_PERMIN 60
24 int nUseCount; /* Incremented for each shared open */
25 BOOL16 fShareable; /* TRUE if first open was shareable */
26 WORD wNotifyDeviceID; /* MCI device ID with a pending notification */
27 HANDLE16 hCallback; /* Callback handle for pending notification */
28 MCI_OPEN_PARMSA openParms;
39 /*-----------------------------------------------------------------------*/
41 /**************************************************************************
42 * MCIANIM_drvOpen [internal]
44 static DWORD MCIANIM_drvOpen(LPSTR str, LPMCI_OPEN_DRIVER_PARMSA modp)
46 WINE_MCIANIM* wma = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MCIANIM));
51 wma->wDevID = modp->wDeviceID;
52 mciSetDriverData(wma->wDevID, (DWORD)wma);
53 modp->wCustomCommandTable = MCI_NO_COMMAND_TABLE;
54 modp->wType = MCI_DEVTYPE_DIGITAL_VIDEO;
55 return modp->wDeviceID;
58 /**************************************************************************
59 * MCIANIM_drvClose [internal]
61 static DWORD MCIANIM_drvClose(DWORD dwDevID)
63 WINE_MCIANIM* wma = (WINE_MCIANIM*)mciGetDriverData(dwDevID);
66 HeapFree(GetProcessHeap(), 0, wma);
72 /**************************************************************************
73 * MCIANIM_mciGetOpenDrv [internal]
75 static WINE_MCIANIM* MCIANIM_mciGetOpenDrv(UINT16 wDevID)
77 WINE_MCIANIM* wma = (WINE_MCIANIM*)mciGetDriverData(wDevID);
79 if (wma == NULL || wma->nUseCount == 0) {
80 WARN("Invalid wDevID=%u\n", wDevID);
86 /**************************************************************************
87 * MCIANIM_mciOpen [internal]
89 static DWORD MCIANIM_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSA lpOpenParms)
92 WINE_MCIANIM* wma = (WINE_MCIANIM*)mciGetDriverData(wDevID);
94 TRACE("(%04X, %08lX, %p);\n", wDevID, dwFlags, lpOpenParms);
96 if (lpOpenParms == NULL) return MCIERR_INTERNAL;
97 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
99 if (wma->nUseCount > 0) {
100 /* The driver already open on this channel */
101 /* If the driver was opened shareable before and this open specifies */
102 /* shareable then increment the use count */
103 if (wma->fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
106 return MCIERR_MUST_USE_SHAREABLE;
109 wma->fShareable = dwFlags & MCI_OPEN_SHAREABLE;
112 dwDeviceID = lpOpenParms->wDeviceID;
114 TRACE("wDevID=%04X\n", wDevID);
115 /* FIXME this is not consistent with other implementations */
116 lpOpenParms->wDeviceID = wDevID;
118 /*TRACE("lpParms->wDevID=%04X\n", lpParms->wDeviceID);*/
119 if (dwFlags & MCI_OPEN_ELEMENT) {
120 TRACE("MCI_OPEN_ELEMENT '%s' !\n", lpOpenParms->lpstrElementName);
121 if (lpOpenParms->lpstrElementName && strlen(lpOpenParms->lpstrElementName) > 0) {
123 FIXME("element is not opened\n");
125 memcpy(&wma->openParms, lpOpenParms, sizeof(MCI_OPEN_PARMSA));
126 wma->wNotifyDeviceID = dwDeviceID;
128 wma->dwTimeFormat = MCI_FORMAT_TMSF;
132 wma->lpdwTrackLen = NULL;
133 wma->lpdwTrackPos = NULL;
135 Moved to mmsystem.c mciOpen routine
137 if (dwFlags & MCI_NOTIFY) {
138 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n",
139 lpParms->dwCallback);
140 mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
141 wma->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
147 /**************************************************************************
148 * MCIANIM_mciClose [internal]
150 static DWORD MCIANIM_mciClose(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
152 WINE_MCIANIM* wma = MCIANIM_mciGetOpenDrv(wDevID);
154 TRACE("(%u, %08lX, %p);\n", wDevID, dwParam, lpParms);
156 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
158 if (--wma->nUseCount == 0) {
159 /* do the actual clean-up */
164 /**************************************************************************
165 * MCIANIM_mciGetDevCaps [internal]
167 static DWORD MCIANIM_mciGetDevCaps(UINT16 wDevID, DWORD dwFlags,
168 LPMCI_GETDEVCAPS_PARMS lpParms)
170 WINE_MCIANIM* wma = MCIANIM_mciGetOpenDrv(wDevID);
173 TRACE("(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
175 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
176 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
178 if (dwFlags & MCI_GETDEVCAPS_ITEM) {
179 TRACE("MCI_GETDEVCAPS_ITEM dwItem=%08lX;\n", lpParms->dwItem);
181 switch(lpParms->dwItem) {
182 case MCI_GETDEVCAPS_CAN_RECORD:
183 lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
184 ret = MCI_RESOURCE_RETURNED;
186 case MCI_GETDEVCAPS_HAS_AUDIO:
187 lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
188 ret = MCI_RESOURCE_RETURNED;
190 case MCI_GETDEVCAPS_HAS_VIDEO:
191 lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
192 ret = MCI_RESOURCE_RETURNED;
194 case MCI_GETDEVCAPS_DEVICE_TYPE:
195 lpParms->dwReturn = MAKEMCIRESOURCE(MCI_DEVTYPE_ANIMATION, MCI_DEVTYPE_ANIMATION);
196 ret = MCI_RESOURCE_RETURNED;
198 case MCI_GETDEVCAPS_USES_FILES:
199 lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
200 ret = MCI_RESOURCE_RETURNED;
202 case MCI_GETDEVCAPS_COMPOUND_DEVICE:
203 lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
204 ret = MCI_RESOURCE_RETURNED;
206 case MCI_GETDEVCAPS_CAN_EJECT:
207 lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
208 ret = MCI_RESOURCE_RETURNED;
210 case MCI_GETDEVCAPS_CAN_PLAY:
211 lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
212 ret = MCI_RESOURCE_RETURNED;
214 case MCI_GETDEVCAPS_CAN_SAVE:
215 lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
216 ret = MCI_RESOURCE_RETURNED;
219 FIXME("Unknown capability (%08lx) !\n", lpParms->dwItem);
220 return MCIERR_UNRECOGNIZED_COMMAND;
223 WARN("No GETDEVCAPS_ITEM !\n");
224 return MCIERR_UNRECOGNIZED_COMMAND;
226 TRACE("lpParms->dwReturn=%08lX;\n", lpParms->dwReturn);
231 /**************************************************************************
232 * MCIANIM_CalcTime [internal]
234 static DWORD MCIANIM_CalcTime(WINE_MCIANIM* wma, DWORD dwFormatType, DWORD dwFrame, LPDWORD lpRet)
242 TRACE("(%p, %08lX, %lu);\n", wma, dwFormatType, dwFrame);
244 switch (dwFormatType) {
245 case MCI_FORMAT_MILLISECONDS:
246 dwTime = dwFrame / ANIMFRAMES_PERSEC * 1000;
248 TRACE("MILLISECONDS %lu\n", dwTime);
251 wMinutes = dwFrame / ANIMFRAMES_PERMIN;
252 wSeconds = (dwFrame - ANIMFRAMES_PERMIN * wMinutes) / ANIMFRAMES_PERSEC;
253 wFrames = dwFrame - ANIMFRAMES_PERMIN * wMinutes -
254 ANIMFRAMES_PERSEC * wSeconds;
255 dwTime = MCI_MAKE_MSF(wMinutes, wSeconds, wFrames);
256 TRACE("MSF %02u:%02u:%02u -> dwTime=%lu\n",wMinutes, wSeconds, wFrames, dwTime);
257 *lpRet = MCI_COLONIZED3_RETURN;
260 /* unknown format ! force TMSF ! ... */
261 dwFormatType = MCI_FORMAT_TMSF;
262 case MCI_FORMAT_TMSF:
263 for (wTrack = 0; wTrack < wma->nTracks; wTrack++) {
264 /* dwTime += wma->lpdwTrackLen[wTrack - 1];
265 TRACE("Adding trk#%u curpos=%u \n", dwTime);
266 if (dwTime >= dwFrame) break; */
267 if (wma->lpdwTrackPos[wTrack - 1] >= dwFrame) break;
269 wMinutes = dwFrame / ANIMFRAMES_PERMIN;
270 wSeconds = (dwFrame - ANIMFRAMES_PERMIN * wMinutes) / ANIMFRAMES_PERSEC;
271 wFrames = dwFrame - ANIMFRAMES_PERMIN * wMinutes -
272 ANIMFRAMES_PERSEC * wSeconds;
273 dwTime = MCI_MAKE_TMSF(wTrack, wMinutes, wSeconds, wFrames);
274 *lpRet = MCI_COLONIZED4_RETURN;
275 TRACE("%02u-%02u:%02u:%02u\n", wTrack, wMinutes, wSeconds, wFrames);
282 /**************************************************************************
283 * MCIANIM_CalcFrame [internal]
285 static DWORD MCIANIM_CalcFrame(WINE_MCIANIM* wma, DWORD dwFormatType, DWORD dwTime)
290 TRACE("(%p, %08lX, %lu);\n", wma, dwFormatType, dwTime);
292 switch (dwFormatType) {
293 case MCI_FORMAT_MILLISECONDS:
294 dwFrame = dwTime * ANIMFRAMES_PERSEC / 1000;
295 TRACE("MILLISECONDS %lu\n", dwFrame);
298 TRACE("MSF %02u:%02u:%02u\n",
299 MCI_MSF_MINUTE(dwTime), MCI_MSF_SECOND(dwTime),
300 MCI_MSF_FRAME(dwTime));
301 dwFrame += ANIMFRAMES_PERMIN * MCI_MSF_MINUTE(dwTime);
302 dwFrame += ANIMFRAMES_PERSEC * MCI_MSF_SECOND(dwTime);
303 dwFrame += MCI_MSF_FRAME(dwTime);
306 /* unknown format ! force TMSF ! ... */
307 dwFormatType = MCI_FORMAT_TMSF;
308 case MCI_FORMAT_TMSF:
309 wTrack = MCI_TMSF_TRACK(dwTime);
310 TRACE("TMSF %02u-%02u:%02u:%02u\n",
311 MCI_TMSF_TRACK(dwTime), MCI_TMSF_MINUTE(dwTime),
312 MCI_TMSF_SECOND(dwTime), MCI_TMSF_FRAME(dwTime));
313 TRACE("TMSF trackpos[%u]=%lu\n",
314 wTrack, wma->lpdwTrackPos[wTrack - 1]);
315 dwFrame = wma->lpdwTrackPos[wTrack - 1];
316 dwFrame += ANIMFRAMES_PERMIN * MCI_TMSF_MINUTE(dwTime);
317 dwFrame += ANIMFRAMES_PERSEC * MCI_TMSF_SECOND(dwTime);
318 dwFrame += MCI_TMSF_FRAME(dwTime);
324 /**************************************************************************
325 * MCIANIM_mciInfo [internal]
327 static DWORD MCIANIM_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_INFO_PARMSA lpParms)
329 WINE_MCIANIM* wma = MCIANIM_mciGetOpenDrv(wDevID);
333 TRACE("(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
335 if (lpParms == NULL || lpParms->lpstrReturn == NULL)
336 return MCIERR_NULL_PARAMETER_BLOCK;
339 return MCIERR_INVALID_DEVICE_ID;
341 TRACE("buf=%p, len=%lu\n", lpParms->lpstrReturn, lpParms->dwRetSize);
344 case MCI_INFO_PRODUCT:
345 str = "Wine's animation";
348 str = wma->openParms.lpstrElementName;
350 case MCI_ANIM_INFO_TEXT:
351 str = "Animation Window";
354 WARN("Don't know this info command (%lu)\n", dwFlags);
355 return MCIERR_UNRECOGNIZED_COMMAND;
359 if (lpParms->dwRetSize <= strlen(str)) {
360 lstrcpynA(lpParms->lpstrReturn, str, lpParms->dwRetSize - 1);
361 ret = MCIERR_PARAM_OVERFLOW;
363 strcpy(lpParms->lpstrReturn, str);
366 *lpParms->lpstrReturn = 0;
371 /**************************************************************************
372 * MCIANIM_mciStatus [internal]
374 static DWORD MCIANIM_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms)
376 WINE_MCIANIM* wma = MCIANIM_mciGetOpenDrv(wDevID);
379 TRACE("(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
381 if (lpParms == NULL) return MCIERR_INTERNAL;
382 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
384 if (dwFlags & MCI_NOTIFY) {
385 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
387 mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
388 wma->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
390 if (dwFlags & MCI_STATUS_ITEM) {
391 switch(lpParms->dwItem) {
392 case MCI_STATUS_CURRENT_TRACK:
393 lpParms->dwReturn = wma->nCurTrack;
394 TRACE("CURRENT_TRACK=%lu!\n", lpParms->dwReturn);
396 case MCI_STATUS_LENGTH:
397 if (dwFlags & MCI_TRACK) {
398 TRACE("MCI_TRACK #%lu LENGTH=??? !\n", lpParms->dwTrack);
399 if (lpParms->dwTrack > wma->nTracks)
400 return MCIERR_OUTOFRANGE;
401 lpParms->dwReturn = wma->lpdwTrackLen[lpParms->dwTrack];
404 lpParms->dwReturn = wma->dwTotalLen;
405 lpParms->dwReturn = MCIANIM_CalcTime(wma, wma->dwTimeFormat, lpParms->dwReturn, &ret);
406 TRACE("LENGTH=%lu !\n", lpParms->dwReturn);
408 case MCI_STATUS_MODE:
409 TRACE("MCI_STATUS_MODE=%04X !\n", wma->mode);
410 lpParms->dwReturn = MAKEMCIRESOURCE(wma->mode, wma->mode);
411 ret = MCI_RESOURCE_RETURNED;
413 case MCI_STATUS_MEDIA_PRESENT:
414 lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
415 ret = MCI_RESOURCE_RETURNED;
416 TRACE("MCI_STATUS_MEDIA_PRESENT !\n");
418 case MCI_STATUS_NUMBER_OF_TRACKS:
419 lpParms->dwReturn = 1;
420 TRACE("MCI_STATUS_NUMBER_OF_TRACKS = %lu !\n", lpParms->dwReturn);
422 case MCI_STATUS_POSITION:
423 lpParms->dwReturn = wma->dwCurFrame;
424 if (dwFlags & MCI_STATUS_START) {
425 lpParms->dwReturn = 0;
426 TRACE("get MCI_STATUS_START !\n");
428 if (dwFlags & MCI_TRACK) {
429 if (lpParms->dwTrack > wma->nTracks)
430 return MCIERR_OUTOFRANGE;
431 lpParms->dwReturn = wma->lpdwTrackPos[lpParms->dwTrack - 1];
432 TRACE("get MCI_TRACK #%lu !\n", lpParms->dwTrack);
434 lpParms->dwReturn = MCIANIM_CalcTime(wma, wma->dwTimeFormat, lpParms->dwReturn, &ret);
435 TRACE("MCI_STATUS_POSITION=%08lX !\n", lpParms->dwReturn);
437 case MCI_STATUS_READY:
438 TRACE("MCI_STATUS_READY !\n");
439 lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
440 ret = MCI_RESOURCE_RETURNED;
442 case MCI_STATUS_TIME_FORMAT:
443 TRACE("MCI_STATUS_TIME_FORMAT !\n");
444 lpParms->dwReturn = MAKEMCIRESOURCE(MCI_FORMAT_MILLISECONDS, MCI_FORMAT_MILLISECONDS);
445 TRACE("MCI_STATUS_TIME_FORMAT => %u\n", LOWORD(lpParms->dwReturn));
446 ret = MCI_RESOURCE_RETURNED;
449 FIXME("Unknown command %08lX !\n", lpParms->dwItem);
450 return MCIERR_UNRECOGNIZED_COMMAND;
453 WARN("No MCI_STATUS_ITEM !\n");
454 return MCIERR_UNRECOGNIZED_COMMAND;
460 /**************************************************************************
461 * MCIANIM_mciPlay [internal]
463 static DWORD MCIANIM_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
465 WINE_MCIANIM* wma = MCIANIM_mciGetOpenDrv(wDevID);
468 TRACE("(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
470 if (lpParms == NULL) return MCIERR_INTERNAL;
471 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
473 start = 0; end = wma->dwTotalLen;
475 if (dwFlags & MCI_FROM) {
476 start = MCIANIM_CalcFrame(wma, wma->dwTimeFormat, lpParms->dwFrom);
477 TRACE("MCI_FROM=%08lX -> %u \n", lpParms->dwFrom, start);
479 if (dwFlags & MCI_TO) {
480 end = MCIANIM_CalcFrame(wma, wma->dwTimeFormat, lpParms->dwTo);
481 TRACE("MCI_TO=%08lX -> %u \n", lpParms->dwTo, end);
483 wma->mode = MCI_MODE_PLAY;
484 if (dwFlags & MCI_NOTIFY) {
485 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n",
486 lpParms->dwCallback);
487 mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
488 wma->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
493 /**************************************************************************
494 * MCIANIM_mciStop [internal]
496 static DWORD MCIANIM_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
498 WINE_MCIANIM* wma = MCIANIM_mciGetOpenDrv(wDevID);
500 TRACE("(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
502 if (lpParms == NULL) return MCIERR_INTERNAL;
503 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
505 wma->mode = MCI_MODE_STOP;
506 if (dwFlags & MCI_NOTIFY) {
507 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
509 mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
510 wma->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
515 /**************************************************************************
516 * MCIANIM_mciPause [internal]
518 static DWORD MCIANIM_mciPause(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
520 WINE_MCIANIM* wma = MCIANIM_mciGetOpenDrv(wDevID);
522 TRACE("(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
523 if (lpParms == NULL) return MCIERR_INTERNAL;
524 wma->mode = MCI_MODE_PAUSE;
525 if (dwFlags & MCI_NOTIFY) {
526 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
528 mciDriverNotify((HWND16)LOWORD(lpParms->dwCallback),
529 wma->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
534 /**************************************************************************
535 * MCIANIM_mciResume [internal]
537 static DWORD MCIANIM_mciResume(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
539 WINE_MCIANIM* wma = MCIANIM_mciGetOpenDrv(wDevID);
541 TRACE("(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
542 if (lpParms == NULL) return MCIERR_INTERNAL;
543 wma->mode = MCI_MODE_STOP;
544 if (dwFlags & MCI_NOTIFY) {
545 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
547 mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
548 wma->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
553 /**************************************************************************
554 * MCIANIM_mciSeek [internal]
556 static DWORD MCIANIM_mciSeek(UINT16 wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
558 WINE_MCIANIM* wma = MCIANIM_mciGetOpenDrv(wDevID);
560 MCI_PLAY_PARMS PlayParms;
562 TRACE("(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
564 if (lpParms == NULL) return MCIERR_INTERNAL;
565 wma->mode = MCI_MODE_SEEK;
567 case MCI_SEEK_TO_START:
568 PlayParms.dwFrom = 0;
570 case MCI_SEEK_TO_END:
571 PlayParms.dwFrom = wma->dwTotalLen;
574 PlayParms.dwFrom = lpParms->dwTo;
577 dwRet = MCIANIM_mciPlay(wDevID, MCI_WAIT | MCI_FROM, &PlayParms);
578 if (dwRet != 0) return dwRet;
579 dwRet = MCIANIM_mciStop(wDevID, MCI_WAIT, (LPMCI_GENERIC_PARMS)&PlayParms);
580 if (dwFlags & MCI_NOTIFY) {
581 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
583 mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
584 wma->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
590 /**************************************************************************
591 * MCIANIM_mciSet [internal]
593 static DWORD MCIANIM_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms)
595 WINE_MCIANIM* wma = MCIANIM_mciGetOpenDrv(wDevID);
597 TRACE("(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
599 if (lpParms == NULL) return MCIERR_INTERNAL;
600 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
602 TRACE("(dwTimeFormat=%08lX)\n", lpParms->dwTimeFormat);
603 TRACE("(dwAudio=%08lX)\n", lpParms->dwAudio);
605 if (dwFlags & MCI_SET_TIME_FORMAT) {
606 switch (lpParms->dwTimeFormat) {
607 case MCI_FORMAT_MILLISECONDS:
608 TRACE("MCI_FORMAT_MILLISECONDS !\n");
611 TRACE("MCI_FORMAT_MSF !\n");
613 case MCI_FORMAT_TMSF:
614 TRACE("MCI_FORMAT_TMSF !\n");
617 WARN("Bad time format !\n");
618 return MCIERR_BAD_TIME_FORMAT;
620 wma->dwTimeFormat = lpParms->dwTimeFormat;
622 if (dwFlags & MCI_SET_VIDEO) return MCIERR_UNSUPPORTED_FUNCTION;
623 if (dwFlags & MCI_SET_ON) return MCIERR_UNSUPPORTED_FUNCTION;
624 if (dwFlags & MCI_SET_OFF) return MCIERR_UNSUPPORTED_FUNCTION;
625 if (dwFlags & MCI_NOTIFY) {
626 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
627 mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
628 wma->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
633 /**************************************************************************
634 * DriverProc (MCIANIM.@)
636 LONG WINAPI MCIANIM_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg,
637 DWORD dwParam1, DWORD dwParam2)
640 case DRV_LOAD: return 1;
641 case DRV_FREE: return 1;
642 case DRV_OPEN: return MCIANIM_drvOpen((LPSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSA)dwParam2);
643 case DRV_CLOSE: return MCIANIM_drvClose(dwDevID);
644 case DRV_ENABLE: return 1;
645 case DRV_DISABLE: return 1;
646 case DRV_QUERYCONFIGURE: return 1;
647 case DRV_CONFIGURE: MessageBoxA(0, "Sample MultiMedia Driver !", "Wine Driver", MB_OK); return 1;
648 case DRV_INSTALL: return DRVCNF_RESTART;
649 case DRV_REMOVE: return DRVCNF_RESTART;
651 case MCI_OPEN_DRIVER: return MCIANIM_mciOpen(dwDevID, dwParam1, (LPMCI_OPEN_PARMSA)dwParam2);
652 case MCI_CLOSE_DRIVER: return MCIANIM_mciClose(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
653 case MCI_GETDEVCAPS: return MCIANIM_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)dwParam2);
654 case MCI_INFO: return MCIANIM_mciInfo(dwDevID, dwParam1, (LPMCI_INFO_PARMSA)dwParam2);
655 case MCI_STATUS: return MCIANIM_mciStatus(dwDevID, dwParam1, (LPMCI_STATUS_PARMS)dwParam2);
656 case MCI_SET: return MCIANIM_mciSet(dwDevID, dwParam1, (LPMCI_SET_PARMS)dwParam2);
657 case MCI_PLAY: return MCIANIM_mciPlay(dwDevID, dwParam1, (LPMCI_PLAY_PARMS)dwParam2);
658 case MCI_STOP: return MCIANIM_mciStop(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
659 case MCI_PAUSE: return MCIANIM_mciPause(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
660 case MCI_RESUME: return MCIANIM_mciResume(dwDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
661 case MCI_SEEK: return MCIANIM_mciSeek(dwDevID, dwParam1, (LPMCI_SEEK_PARMS)dwParam2);
678 FIXME("Unsupported message [%lu]\n", wMsg);
682 ERR("Shouldn't receive a MCI_OPEN or CLOSE message\n");
685 TRACE("Sending msg [%lu] to default driver proc\n", wMsg);
686 return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
688 return MCIERR_UNRECOGNIZED_COMMAND;
691 /*-----------------------------------------------------------------------*/