ReactOS 0.4.17-dev-806-gffa4164
mciavi.c
Go to the documentation of this file.
1/*
2 * Digital video MCI Wine Driver
3 *
4 * Copyright 1999, 2000 Eric POUECH
5 * Copyright 2003 Dmitry Timoshkov
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 */
21
22/* TODO list :
23 * - handling of palettes
24 * - recording (which input devices ?), a cam recorder ?
25 * - lots of messages still need to be handled (cf FIXME)
26 * - synchronization between audio and video (especially for interleaved
27 * files)
28 * - robustness when reading file can be enhanced
29 * - reimplement the AVI handling part with avifile DLL because
30 * "open @1122334 type avivideo alias a" expects an AVIFile/Stream
31 * and MCI_DGV_SET|STATUS_SPEED maps to Rate/Scale
32 * - some files appear to have more than one audio stream (we only play the
33 * first one)
34 * - some files contain an index of audio/video frame. Better use it,
35 * instead of rebuilding it (AVIFile does that already)
36 * - stopping while playing a file with sound blocks until all buffered
37 * audio is played... still should be stopped ASAP
38 */
39
40#include <string.h>
41#include "private_mciavi.h"
42#include "wine/debug.h"
43
45
47
48/*======================================================================*
49 * MCI AVI implementation *
50 *======================================================================*/
51
53
54/***********************************************************************
55 * DllMain (MCIAVI.0)
56 */
58{
59 switch (fdwReason) {
62 MCIAVI_hInstance = hInstDLL;
63 break;
64 }
65 return TRUE;
66}
67
68/**************************************************************************
69 * MCIAVI_drvOpen [internal]
70 */
72{
73 WINE_MCIAVI* wma;
74
75 TRACE("%s, %p\n", debugstr_w(str), modp);
76
77 /* session instance */
78 if (!modp) return 0xFFFFFFFF;
79
80 if (!MCIAVI_RegisterClass()) return 0;
81
82 wma = calloc(1, sizeof(WINE_MCIAVI));
83 if (!wma)
84 return 0;
85
87 wma->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": WINE_MCIAVI.cs");
89 wma->wDevID = modp->wDeviceID;
95
96 return modp->wDeviceID;
97}
98
99/**************************************************************************
100 * MCIAVI_drvClose [internal]
101 */
103{
104 WINE_MCIAVI *wma;
105
106 TRACE("%04lx\n", dwDevID);
107
108 /* finish all outstanding things */
109 MCIAVI_mciClose(dwDevID, MCI_WAIT, NULL);
110
111 wma = (WINE_MCIAVI*)mciGetDriverData(dwDevID);
112
113 if (wma) {
115
117
118 mciSetDriverData(dwDevID, 0);
120
122
124 wma->cs.DebugInfo->Spare[0] = 0;
126
127 free(wma);
128 return 1;
129 }
130 return (dwDevID == 0xFFFFFFFF) ? 1 : 0;
131}
132
133/**************************************************************************
134 * MCIAVI_drvConfigure [internal]
135 */
137{
138 WINE_MCIAVI *wma;
139
140 TRACE("%04lx\n", dwDevID);
141
142 MCIAVI_mciStop(dwDevID, MCI_WAIT, NULL);
143
144 wma = (WINE_MCIAVI*)mciGetDriverData(dwDevID);
145
146 if (wma) {
147 MessageBoxA(0, "Sample AVI Wine Driver !", "MM-Wine Driver", MB_OK);
148 return 1;
149 }
150 return 0;
151}
152
153/**************************************************************************
154 * MCIAVI_mciGetOpenDev [internal]
155 */
157{
159
160 if (wma == NULL || wma->nUseCount == 0) {
161 WARN("Invalid wDevID=%u\n", wDevID);
162 return 0;
163 }
164 return wma;
165}
166
168{
169 /* to prevent handling in WindowProc */
171 if (wma->hFile) {
172 mmioClose(wma->hFile, 0);
173 wma->hFile = 0;
174
175 free(wma->lpFileName);
176 wma->lpFileName = NULL;
177
178 DrawDibClose(wma->hdd);
179
180 free(wma->lpVideoIndex);
181 wma->lpVideoIndex = NULL;
182 free(wma->lpAudioIndex);
183 wma->lpAudioIndex = NULL;
184 if (wma->hic) ICClose(wma->hic);
185 wma->hic = 0;
186 free(wma->inbih);
187 wma->inbih = NULL;
188 free(wma->outbih);
189 wma->outbih = NULL;
190 free(wma->indata);
191 wma->indata = NULL;
192 free(wma->outdata);
193 wma->outdata = NULL;
194 if (wma->hbmFrame) DeleteObject(wma->hbmFrame);
195 wma->hbmFrame = 0;
196 if (wma->hWnd) DestroyWindow(wma->hWnd);
197 wma->hWnd = 0;
198
199 free(wma->lpWaveFormat);
200 wma->lpWaveFormat = 0;
201
202 memset(&wma->mah, 0, sizeof(wma->mah));
203 memset(&wma->ash_video, 0, sizeof(wma->ash_video));
204 memset(&wma->ash_audio, 0, sizeof(wma->ash_audio));
205 wma->dwCurrVideoFrame = wma->dwCurrAudioBlock = 0;
206 wma->dwCachedFrame = -1;
207 }
208}
209
210/***************************************************************************
211 * MCIAVI_mciOpen [internal]
212 */
214 LPMCI_DGV_OPEN_PARMSW lpOpenParms)
215{
216 WINE_MCIAVI *wma;
217 LRESULT dwRet = 0;
218
219 TRACE("(%04x, %08lX, %p)\n", wDevID, dwFlags, lpOpenParms);
220
221 if (lpOpenParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
222
223 wma = (WINE_MCIAVI *)mciGetDriverData(wDevID);
224 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
225
227
228 if (wma->nUseCount > 0) {
229 /* The driver is already open on this channel */
230 /* If the driver was opened shareable before and this open specifies */
231 /* shareable then increment the use count */
232 if (wma->fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
233 ++wma->nUseCount;
234 else
235 {
238 }
239 } else {
240 wma->nUseCount = 1;
242 }
243
245
248 /* could it be that (DWORD)lpOpenParms->lpstrElementName
249 * contains the hFile value ?
250 */
252 } else if (lpOpenParms->lpstrElementName && lpOpenParms->lpstrElementName[0]) {
253 /* FIXME : what should be done id wma->hFile is already != 0, or the driver is playin' */
254 TRACE("MCI_OPEN_ELEMENT %s!\n", debugstr_w(lpOpenParms->lpstrElementName));
255
256 wma->lpFileName = wcsdup(lpOpenParms->lpstrElementName);
257
258 if (lpOpenParms->lpstrElementName[0] == '@') {
259 /* The file name @11223344 encodes an AVIFile handle in decimal notation
260 * in Win3.1 and w2k/NT, but this feature is absent in win95 (KB140750).
261 * wma->hFile = LongToHandle(wcstol(lpOpenParms->lpstrElementName+1, NULL, 10)); */
262 FIXME("Using AVIFile/Stream %s NIY\n", debugstr_w(lpOpenParms->lpstrElementName));
263 }
264 wma->hFile = mmioOpenW(lpOpenParms->lpstrElementName, NULL,
266
267 if (wma->hFile == 0) {
268 WARN("can't find file=%s!\n", debugstr_w(lpOpenParms->lpstrElementName));
269 dwRet = MCIERR_FILE_NOT_FOUND;
270 } else {
271 if (!MCIAVI_GetInfo(wma))
272 dwRet = MCIERR_INVALID_FILE;
273 else if (!MCIAVI_OpenVideo(wma))
275 else if (!MCIAVI_CreateWindow(wma, dwFlags, lpOpenParms))
276 dwRet = MCIERR_CREATEWINDOW;
277 }
278 } else {
279 FIXME("Don't record yet\n");
281 }
282 }
283
284 if (dwRet == 0) {
285 TRACE("lpOpenParms->wDeviceID = %04x\n", lpOpenParms->wDeviceID);
286
287 wma->dwStatus = MCI_MODE_STOP;
289 } else {
290 MCIAVI_CleanUp(wma);
291 }
292
294
295 if (!dwRet && (dwFlags & MCI_NOTIFY)) {
297 wDevID, MCI_NOTIFY_SUCCESSFUL);
298 }
299 return dwRet;
300}
301
302/***************************************************************************
303 * MCIAVI_mciClose [internal]
304 */
306{
307 WINE_MCIAVI *wma;
308 DWORD dwRet = 0;
309
310 TRACE("(%04x, %08lX, %p)\n", wDevID, dwFlags, lpParms);
311
312 wma = MCIAVI_mciGetOpenDev(wDevID);
313 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
314
315 MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
316
318
319 if (wma->nUseCount == 1) {
320 MCIAVI_CleanUp(wma);
321
322 if ((dwFlags & MCI_NOTIFY) && lpParms) {
324 wDevID,
326 }
328 return dwRet;
329 }
330 wma->nUseCount--;
331
333 return dwRet;
334}
335
336static double currenttime_us(void)
337{
338 LARGE_INTEGER lc, lf;
341 return (lc.QuadPart * 1000000) / lf.QuadPart;
342}
343
344/***************************************************************************
345 * MCIAVI_player [internal]
346 */
348{
349 DWORD dwRet;
350 LPWAVEHDR waveHdr = NULL;
351 unsigned i, nHdr = 0;
352 DWORD numEvents = 1;
353 HANDLE events[2];
354 double next_frame_us;
355 BOOL wait_audio = TRUE;
356
358
359 if (wma->dwToVideoFrame <= wma->dwCurrVideoFrame)
360 {
361 dwRet = 0;
362 goto mci_play_done;
363 }
364
365 events[0] = wma->hStopEvent;
366 if (wma->lpWaveFormat) {
367 if (MCIAVI_OpenAudio(wma, &nHdr, &waveHdr) != 0)
368 {
369 /* can't play audio */
370 free(wma->lpWaveFormat);
371 wma->lpWaveFormat = NULL;
372 }
373 else
374 {
375 /* fill the queue with as many wave headers as possible */
376 MCIAVI_PlayAudioBlocks(wma, nHdr, waveHdr);
377 events[1] = wma->hEvent;
378 numEvents = 2;
379 }
380 }
381
382 next_frame_us = currenttime_us();
383 while (wma->dwStatus == MCI_MODE_PLAY)
384 {
385 HDC hDC;
386 double tc, delta;
387 DWORD ret;
388
389 tc = currenttime_us();
390
391 hDC = wma->hWndPaint ? GetDC(wma->hWndPaint) : 0;
392 if (hDC)
393 {
394 while(next_frame_us <= tc && wma->dwCurrVideoFrame < wma->dwToVideoFrame){
395 double dur;
396 dur = MCIAVI_PaintFrame(wma, hDC);
397 ++wma->dwCurrVideoFrame;
398 if(!dur)
399 break;
400 next_frame_us += dur;
401 TRACE("next_frame: %f\n", next_frame_us);
402 }
403 ReleaseDC(wma->hWndPaint, hDC);
404 }
405 if (wma->dwCurrVideoFrame >= wma->dwToVideoFrame)
406 {
408 break;
409 TRACE("repeat media as requested\n");
410 wma->dwCurrVideoFrame = wma->dwCurrAudioBlock = 0;
411 }
412
413 if (wma->lpWaveFormat)
414 MCIAVI_PlayAudioBlocks(wma, nHdr, waveHdr);
415
416 tc = currenttime_us();
417 if (tc < next_frame_us)
418 delta = next_frame_us - tc;
419 else
420 delta = 0;
421
422 /* check if the playback was cancelled */
423 if ((wma->mci_break.flags & MCI_BREAK_KEY) &&
424 (GetAsyncKeyState(wma->mci_break.parms.nVirtKey) & 0x8000))
425 {
426 if (!(wma->mci_break.flags & MCI_BREAK_HWND) ||
427 GetForegroundWindow() == wma->mci_break.parms.hwndBreak)
428 {
429 /* we queue audio blocks ahead so ignore them otherwise the audio
430 * will keep playing until the buffer is empty */
431 wait_audio = FALSE;
432
433 TRACE("playback cancelled using break key\n");
434 break;
435 }
436 }
437
439 ret = WaitForMultipleObjects(numEvents, events, FALSE, delta / 1000);
441 if (ret == WAIT_OBJECT_0 || wma->dwStatus != MCI_MODE_PLAY) break;
442 }
443
444 if (wma->lpWaveFormat)
445 {
446 if (wait_audio)
447 while (wma->dwEventCount != nHdr - 1)
448 {
450 Sleep(100);
452 }
453
454 /* just to get rid of some race conditions between play, stop and pause */
456 waveOutReset(wma->hWave);
458
459 for (i = 0; i < nHdr; i++)
460 waveOutUnprepareHeader(wma->hWave, &waveHdr[i], sizeof(WAVEHDR));
461 }
462
463 dwRet = 0;
464
465 if (wma->lpWaveFormat) {
466 free(waveHdr);
467
468 if (wma->hWave) {
470 waveOutClose(wma->hWave);
472 wma->hWave = 0;
473 }
474 CloseHandle(wma->hEvent);
475 }
476
477mci_play_done:
478 wma->dwStatus = MCI_MODE_STOP;
479
480 if (dwFlags & MCI_NOTIFY) {
481 TRACE("MCI_NOTIFY_SUCCESSFUL %08IX !\n", lpParms->dwCallback);
484 }
486 return dwRet;
487}
488
490{
493 MCI_PLAY_PARMS params; /* FIXME: notify via wma->hCallback like the other MCI drivers */
494};
495
496/*
497 * MCIAVI_mciPlay_thread
498 *
499 * FIXME: probably should use a common worker thread created at the driver
500 * load time and queue all async commands to it.
501 */
503{
504 struct MCIAVI_play_data *data = (struct MCIAVI_play_data *)arg;
505 DWORD ret;
506
507 TRACE("In thread before async play command (id %u, flags %08lx)\n", data->wma->wDevID, data->flags);
508 ret = MCIAVI_player(data->wma, data->flags, &data->params);
509 TRACE("In thread after async play command (id %u, flags %08lx)\n", data->wma->wDevID, data->flags);
510
511 free(data);
512 return ret;
513}
514
515/*
516 * MCIAVI_mciPlay_async
517 */
519{
521 struct MCIAVI_play_data *data = malloc(sizeof(struct MCIAVI_play_data));
522
523 if (!data) return MCIERR_OUT_OF_MEMORY;
524
525 data->wma = wma;
526 data->flags = dwFlags;
527 if (dwFlags & MCI_NOTIFY)
528 data->params.dwCallback = lpParams->dwCallback;
529
531 {
532 WARN("Couldn't create thread for async play, playing synchronously\n");
534 }
537 return 0;
538}
539
540/***************************************************************************
541 * MCIAVI_mciPlay [internal]
542 */
544{
546 DWORD dwRet;
547 DWORD dwFromFrame, dwToFrame;
548
549 TRACE("(%04x, %08lX, %p)\n", wDevID, dwFlags, lpParms);
550
551 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
552
553 wma = MCIAVI_mciGetOpenDev(wDevID);
554 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
556 if (dwFlags & MCI_TEST) return 0;
557
559 FIXME("Unsupported flag %08lx\n", dwFlags);
560
562
563 if (!wma->hFile)
564 {
567 }
568 if (!wma->hWndPaint)
569 {
571 return MCIERR_NO_WINDOW;
572 }
573
574 dwFromFrame = wma->dwCurrVideoFrame;
575 dwToFrame = wma->dwPlayableVideoFrames;
576
577 if (dwFlags & MCI_FROM) {
578 dwFromFrame = MCIAVI_ConvertTimeFormatToFrame(wma, lpParms->dwFrom);
579 }
580 if (dwFlags & MCI_TO) {
581 dwToFrame = MCIAVI_ConvertTimeFormatToFrame(wma, lpParms->dwTo);
582 }
583 if (dwToFrame > wma->dwPlayableVideoFrames)
584 {
586 return MCIERR_OUTOFRANGE;
587 }
588
589 TRACE("Playing from frame=%lu to frame=%lu\n", dwFromFrame, dwToFrame);
590
591 wma->dwCurrVideoFrame = dwFromFrame;
592 wma->dwToVideoFrame = dwToFrame;
593
595
597 {
598 HMONITOR mon = MonitorFromWindow(wma->hWndPaint, MONITOR_DEFAULTTONEAREST);
600 mi.cbSize = sizeof(mi);
601 GetMonitorInfoA(mon, &mi);
604 NULL, NULL, NULL, 0);
605 }
606 /* if not fullscreen ensure the window is visible */
609
611
612 /* if already playing exit */
613 if (wma->dwStatus == MCI_MODE_PLAY)
614 {
616 return 0;
617 }
618
620
622
623 if (dwFlags & MCI_WAIT)
624 return MCIAVI_player(wma, dwFlags, lpParms);
625
626 dwRet = MCIAVI_mciPlay_async(wma, dwFlags, lpParms);
627
628 if (dwRet) {
632 }
633 return dwRet;
634}
635
636/***************************************************************************
637 * MCIAVI_mciStop [internal]
638 */
640{
642 DWORD dwRet = 0;
643
644 TRACE("(%04x, %08lX, %p)\n", wDevID, dwFlags, lpParms);
645
646 wma = MCIAVI_mciGetOpenDev(wDevID);
647 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
648 if (dwFlags & MCI_TEST) return 0;
649
651
652 TRACE("current status %04lx\n", wma->dwStatus);
653
654 switch (wma->dwStatus) {
655 case MCI_MODE_PLAY:
656 case MCI_MODE_RECORD:
660 /* fall through */
661 case MCI_MODE_PAUSE:
662 /* Since our wave notification callback takes the lock,
663 * we must release it before resetting the device */
665 dwRet = waveOutReset(wma->hWave);
667 /* fall through */
668 default:
669 do /* one more chance for an async thread to finish */
670 {
672 Sleep(10);
674 } while (wma->dwStatus != MCI_MODE_STOP);
675
676 break;
677
679 break;
680 }
681
682 if ((dwFlags & MCI_NOTIFY) && lpParms) {
684 wDevID, MCI_NOTIFY_SUCCESSFUL);
685 }
687 return dwRet;
688}
689
690/***************************************************************************
691 * MCIAVI_mciPause [internal]
692 */
694{
696
697 TRACE("(%04x, %08lX, %p)\n", wDevID, dwFlags, lpParms);
698
699 wma = MCIAVI_mciGetOpenDev(wDevID);
700 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
701 if (dwFlags & MCI_TEST) return 0;
702
704
705 if (wma->dwStatus == MCI_MODE_PLAY)
707
708 if (wma->lpWaveFormat) {
710 return waveOutPause(wma->hWave);
711 }
712
714 return 0;
715}
716
717/***************************************************************************
718 * MCIAVI_mciResume [internal]
719 */
721{
723
724 TRACE("(%04x, %08lX, %p)\n", wDevID, dwFlags, lpParms);
725
726 wma = MCIAVI_mciGetOpenDev(wDevID);
727 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
728 if (dwFlags & MCI_TEST) return 0;
729
731
734
735 if (wma->lpWaveFormat) {
737 return waveOutRestart(wma->hWave);
738 }
739
741 return 0;
742}
743
744/***************************************************************************
745 * MCIAVI_mciSeek [internal]
746 */
748{
750 DWORD position;
751
752 TRACE("(%04x, %08lX, %p)\n", wDevID, dwFlags, lpParms);
753
754 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
755
756 wma = MCIAVI_mciGetOpenDev(wDevID);
757 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
758
760 if (!position) return MCIERR_MISSING_PARAMETER;
761 if (position&(position-1)) return MCIERR_FLAGS_NOT_COMPATIBLE;
762
763 if (dwFlags & MCI_TO) {
764 position = MCIAVI_ConvertTimeFormatToFrame(wma, lpParms->dwTo);
765 if (position > wma->dwPlayableVideoFrames)
766 return MCIERR_OUTOFRANGE;
767 } else if (dwFlags & MCI_SEEK_TO_START) {
768 position = 0;
769 } else {
770 position = wma->dwPlayableVideoFrames;
771 }
772 if (dwFlags & MCI_TEST) return 0;
773
774 MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
775
777
778 wma->dwCurrVideoFrame = position;
779 TRACE("Seeking to frame=%lu\n", wma->dwCurrVideoFrame);
780
781 if (dwFlags & MCI_NOTIFY) {
783 wDevID, MCI_NOTIFY_SUCCESSFUL);
784 }
786 return 0;
787}
788
789/*****************************************************************************
790 * MCIAVI_mciLoad [internal]
791 */
793{
795
796 FIXME("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
797
798 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
799
800 wma = MCIAVI_mciGetOpenDev(wDevID);
801 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
802
803 return MCIERR_UNSUPPORTED_FUNCTION; /* like w2k */
804}
805
806/******************************************************************************
807 * MCIAVI_mciRealize [internal]
808 */
810{
812
813 FIXME("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
814
815 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
816
817 wma = MCIAVI_mciGetOpenDev(wDevID);
818 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
819 if (dwFlags & MCI_TEST) return 0;
820
821 return 0;
822}
823
824/******************************************************************************
825 * MCIAVI_mciUpdate [internal]
826 */
828{
830
831 TRACE("%04x, %08lx, %p\n", wDevID, dwFlags, lpParms);
832
833 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
834
835 wma = MCIAVI_mciGetOpenDev(wDevID);
836 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
837 /* Ignore MCI_TEST flag. */
838
840
842 MCIAVI_PaintFrame(wma, lpParms->hDC);
843
845
846 return 0;
847}
848
849/******************************************************************************
850 * MCIAVI_mciStep [internal]
851 */
853{
855 DWORD position;
856 int delta = 1;
857
858 TRACE("(%04x, %08lx, %p)\n", wDevID, dwFlags, lpParms);
859
860 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
861
862 wma = MCIAVI_mciGetOpenDev(wDevID);
863 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
864
865 if (dwFlags & MCI_DGV_STEP_FRAMES) delta = lpParms->dwFrames;
866 if (dwFlags & MCI_DGV_STEP_REVERSE) delta = -delta;
867 position = wma->dwCurrVideoFrame + delta;
868 if (position > wma->dwPlayableVideoFrames) return MCIERR_OUTOFRANGE;
869 if (dwFlags & MCI_TEST) return 0;
870
871 MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
872
874
875 wma->dwCurrVideoFrame = position;
876 TRACE("Stepping to frame=%lu\n", wma->dwCurrVideoFrame);
877
878 if (dwFlags & MCI_NOTIFY) {
880 wDevID, MCI_NOTIFY_SUCCESSFUL);
881 }
883 return 0;
884}
885
886/******************************************************************************
887 * MCIAVI_mciCue [internal]
888 */
890{
892
893 FIXME("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
894
895 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
896
897 wma = MCIAVI_mciGetOpenDev(wDevID);
898 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
900 if (dwFlags & MCI_TEST) return 0;
901
902 return 0;
903}
904
905/******************************************************************************
906 * MCIAVI_mciBreak [internal]
907 */
909{
911
912 TRACE("(%04x, %08lx, %p)\n", wDevID, dwFlags, lpParms);
913
914 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
915
916 wma = MCIAVI_mciGetOpenDev(wDevID);
917 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
918
920
921 wma->mci_break.flags = dwFlags;
922 wma->mci_break.parms = *lpParms;
923
925
926 return 0;
927}
928
929/******************************************************************************
930 * MCIAVI_mciSetAudio [internal]
931 */
933{
935
936 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
937
938 FIXME("(%04x, %08lx, %p) Item %04lx: stub\n", wDevID, dwFlags, lpParms, dwFlags & MCI_DGV_SETAUDIO_ITEM ? lpParms->dwItem : 0);
939
940 wma = MCIAVI_mciGetOpenDev(wDevID);
941 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
942
943 return 0;
944}
945
946/******************************************************************************
947 * MCIAVI_mciSignal [internal]
948 */
950{
952
953 FIXME("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
954
955 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
956
957 wma = MCIAVI_mciGetOpenDev(wDevID);
958 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
959
960 return 0;
961}
962
963/******************************************************************************
964 * MCIAVI_mciSetVideo [internal]
965 */
967{
969
970 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
971
972 FIXME("(%04x, %08lx, %p) Item %04lx: stub\n", wDevID, dwFlags, lpParms, dwFlags & MCI_DGV_SETVIDEO_ITEM ? lpParms->dwItem : 0);
973
974 wma = MCIAVI_mciGetOpenDev(wDevID);
975 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
976
977 return 0;
978}
979
980/******************************************************************************
981 * MCIAVI_mciConfigure [internal]
982 */
984{
986
987 FIXME("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
988
989 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
990
991 wma = MCIAVI_mciGetOpenDev(wDevID);
992 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
993 if (dwFlags & MCI_TEST) return 0;
994
995 return 0;
996}
997
998/*======================================================================*
999 * MCI AVI entry points *
1000 *======================================================================*/
1001
1002/**************************************************************************
1003 * DriverProc (MCIAVI.@)
1004 */
1006 LPARAM dwParam1, LPARAM dwParam2)
1007{
1008 TRACE("(%08IX, %p, %08X, %08IX, %08IX)\n",
1009 dwDevID, hDriv, wMsg, dwParam1, dwParam2);
1010
1011 switch (wMsg) {
1012 case DRV_LOAD: return 1;
1013 case DRV_FREE: return 1;
1014 case DRV_OPEN: return MCIAVI_drvOpen((LPCWSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSW)dwParam2);
1015 case DRV_CLOSE: return MCIAVI_drvClose(dwDevID);
1016 case DRV_ENABLE: return 1;
1017 case DRV_DISABLE: return 1;
1018 case DRV_QUERYCONFIGURE: return 1;
1019 case DRV_CONFIGURE: return MCIAVI_drvConfigure(dwDevID);
1020 case DRV_INSTALL: return DRVCNF_RESTART;
1021 case DRV_REMOVE: return DRVCNF_RESTART;
1022 }
1023
1024 /* session instance */
1025 if (dwDevID == 0xFFFFFFFF) return 1;
1026
1027 switch (wMsg) {
1028 case MCI_OPEN_DRIVER: return MCIAVI_mciOpen (dwDevID, dwParam1, (LPMCI_DGV_OPEN_PARMSW) dwParam2);
1029 case MCI_CLOSE_DRIVER: return MCIAVI_mciClose (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
1030 case MCI_PLAY: return MCIAVI_mciPlay (dwDevID, dwParam1, (LPMCI_PLAY_PARMS) dwParam2);
1031 case MCI_STOP: return MCIAVI_mciStop (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
1032 case MCI_SET: return MCIAVI_mciSet (dwDevID, dwParam1, (LPMCI_DGV_SET_PARMS) dwParam2);
1033 case MCI_PAUSE: return MCIAVI_mciPause (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
1034 case MCI_RESUME: return MCIAVI_mciResume (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
1035 case MCI_STATUS: return MCIAVI_mciStatus (dwDevID, dwParam1, (LPMCI_DGV_STATUS_PARMSW) dwParam2);
1036 case MCI_GETDEVCAPS: return MCIAVI_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS) dwParam2);
1037 case MCI_INFO: return MCIAVI_mciInfo (dwDevID, dwParam1, (LPMCI_DGV_INFO_PARMSW) dwParam2);
1038 case MCI_SEEK: return MCIAVI_mciSeek (dwDevID, dwParam1, (LPMCI_SEEK_PARMS) dwParam2);
1039 case MCI_PUT: return MCIAVI_mciPut (dwDevID, dwParam1, (LPMCI_DGV_PUT_PARMS) dwParam2);
1040 case MCI_WINDOW: return MCIAVI_mciWindow (dwDevID, dwParam1, (LPMCI_DGV_WINDOW_PARMSW) dwParam2);
1041 case MCI_LOAD: return MCIAVI_mciLoad (dwDevID, dwParam1, (LPMCI_DGV_LOAD_PARMSW) dwParam2);
1042 case MCI_REALIZE: return MCIAVI_mciRealize (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
1043 case MCI_UPDATE: return MCIAVI_mciUpdate (dwDevID, dwParam1, (LPMCI_DGV_UPDATE_PARMS) dwParam2);
1044 case MCI_WHERE: return MCIAVI_mciWhere (dwDevID, dwParam1, (LPMCI_DGV_RECT_PARMS) dwParam2);
1045 case MCI_STEP: return MCIAVI_mciStep (dwDevID, dwParam1, (LPMCI_DGV_STEP_PARMS) dwParam2);
1046 case MCI_CUE: return MCIAVI_mciCue (dwDevID, dwParam1, (LPMCI_DGV_CUE_PARMS) dwParam2);
1047 case MCI_BREAK: return MCIAVI_mciBreak (dwDevID, dwParam1, (LPMCI_BREAK_PARMS) dwParam2);
1048 /* Digital Video specific */
1049 case MCI_SETAUDIO: return MCIAVI_mciSetAudio (dwDevID, dwParam1, (LPMCI_DGV_SETAUDIO_PARMSW) dwParam2);
1050 case MCI_SIGNAL: return MCIAVI_mciSignal (dwDevID, dwParam1, (LPMCI_DGV_SIGNAL_PARMS) dwParam2);
1051 case MCI_SETVIDEO: return MCIAVI_mciSetVideo (dwDevID, dwParam1, (LPMCI_DGV_SETVIDEO_PARMSW) dwParam2);
1052 case MCI_CONFIGURE: return MCIAVI_mciConfigure (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
1053
1054 /* no editing, recording, saving, locking without inputs */
1055 case MCI_CAPTURE:
1056 case MCI_COPY:
1057 case MCI_CUT:
1058 case MCI_DELETE:
1059 case MCI_FREEZE:
1060 case MCI_LIST:
1061 case MCI_MONITOR:
1062 case MCI_PASTE:
1063 case MCI_QUALITY:
1064 case MCI_RECORD:
1065 case MCI_RESERVE:
1066 case MCI_RESTORE:
1067 case MCI_SAVE:
1068 case MCI_UNDO:
1069 case MCI_UNFREEZE:
1070 TRACE("Unsupported function [0x%x] flags=%08Ix\n", wMsg, dwParam1);
1072 case MCI_SPIN:
1073 case MCI_ESCAPE:
1074 WARN("Unsupported command [0x%x] %08Ix\n", wMsg, dwParam1);
1075 break;
1076 case MCI_OPEN:
1077 case MCI_CLOSE:
1078 FIXME("Shouldn't receive a MCI_OPEN or CLOSE message\n");
1079 break;
1080 default:
1081 TRACE("Sending msg [%u] to default driver proc\n", wMsg);
1082 return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
1083 }
1085}
static HDC hDC
Definition: 3dtext.c:33
static DWORD const fdwReason
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
DWORD LPVOID fImpLoad
Definition: misc.cpp:136
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define MCI_SETAUDIO
Definition: digitalv.h:39
#define MCI_DGV_SETAUDIO_ITEM
Definition: digitalv.h:296
#define MCI_MONITOR
Definition: digitalv.h:37
#define MCI_DGV_STEP_FRAMES
Definition: digitalv.h:431
#define MCI_LIST
Definition: digitalv.h:43
#define MCI_CAPTURE
Definition: digitalv.h:36
#define MCI_RESERVE
Definition: digitalv.h:38
#define MCI_SETVIDEO
Definition: digitalv.h:41
#define MCI_SIGNAL
Definition: digitalv.h:40
#define MCI_DGV_UPDATE_HDC
Definition: digitalv.h:439
#define MCI_DGV_STEP_REVERSE
Definition: digitalv.h:430
#define MCI_QUALITY
Definition: digitalv.h:42
#define MCI_DGV_CUE_INPUT
Definition: digitalv.h:141
#define MCI_RESTORE
Definition: digitalv.h:46
#define MCI_CONFIGURE
Definition: digitalv.h:45
#define MCI_TEST
Definition: digitalv.h:32
#define MCI_UNDO
Definition: digitalv.h:44
#define MCI_DGV_SETVIDEO_ITEM
Definition: digitalv.h:327
#define MCI_DGV_PLAY_REPEAT
Definition: digitalv.h:227
#define MCI_DGV_PLAY_REVERSE
Definition: digitalv.h:228
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define CALLBACK
Definition: compat.h:35
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
BOOL WINAPI QueryPerformanceFrequency(OUT PLARGE_INTEGER lpFrequency)
Definition: perfcnt.c:45
BOOL WINAPI QueryPerformanceCounter(OUT PLARGE_INTEGER lpPerformanceCount)
Definition: perfcnt.c:23
BOOL WINAPI SetThreadPriority(IN HANDLE hThread, IN int nPriority)
Definition: thread.c:758
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
Definition: sync.c:107
DWORD MCIAVI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSW lpParms)
Definition: info.c:360
DWORD MCIAVI_ConvertTimeFormatToFrame(WINE_MCIAVI *wma, DWORD val)
Definition: info.c:52
DWORD MCIAVI_mciGetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS lpParms)
Definition: info.c:73
DWORD MCIAVI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SET_PARMS lpParms)
Definition: info.c:224
DWORD MCIAVI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_INFO_PARMSW lpParms)
Definition: info.c:188
BOOL WINAPI mciFreeCommandResource(UINT uTable)
Definition: mci.c:1681
UINT WINAPI mciLoadCommandResource(HINSTANCE hInstance, LPCWSTR lpResName, UINT uType)
Definition: mci.c:1641
BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID, UINT uStatus)
Definition: mci.c:2223
BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD dwData)
DWORD WINAPI mciGetDriverData(UINT uDeviceID)
Definition: mci.c:2233
static wchar_t * wcsdup(const wchar_t *str)
Definition: string.h:94
BOOL VFWAPI DrawDibClose(HDRAWDIB hdd)
Definition: drawdib.c:101
LRESULT WINAPI DefDriverProc(DWORD_PTR dwDriverIdentifier, HDRVR hDrv, UINT Msg, LPARAM lParam1, LPARAM lParam2)
Definition: driver.c:554
MMRESULT WINAPI mmioClose(HMMIO hmmio, UINT uFlags)
Definition: mmio.c:702
HMMIO WINAPI mmioOpenW(LPWSTR szFileName, MMIOINFO *lpmmioinfo, DWORD dwOpenFlags)
Definition: mmio.c:670
return ret
Definition: mutex.c:147
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
pKey DeleteObject()
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
const GLfloat * tc
Definition: glext.h:8925
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: sysinfo.c:13
#define DRV_LOAD(x)
#define debugstr_w
Definition: kernel32.h:32
static DWORD MCIAVI_mciLoad(UINT wDevID, DWORD dwFlags, LPMCI_DGV_LOAD_PARMSW lpParms)
Definition: mciavi.c:792
static DWORD MCIAVI_mciSetVideo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETVIDEO_PARMSW lpParms)
Definition: mciavi.c:966
static DWORD MCIAVI_drvClose(DWORD dwDevID)
Definition: mciavi.c:102
static DWORD MCIAVI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
Definition: mciavi.c:543
static DWORD MCIAVI_mciSetAudio(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETAUDIO_PARMSW lpParms)
Definition: mciavi.c:932
static DWORD MCIAVI_mciPlay_async(WINE_MCIAVI *wma, DWORD dwFlags, LPMCI_PLAY_PARMS lpParams)
Definition: mciavi.c:518
static DWORD MCIAVI_mciRealize(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
Definition: mciavi.c:809
static DWORD MCIAVI_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
Definition: mciavi.c:720
static DWORD MCIAVI_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp)
Definition: mciavi.c:71
static DWORD MCIAVI_drvConfigure(DWORD dwDevID)
Definition: mciavi.c:136
HINSTANCE MCIAVI_hInstance
Definition: mciavi.c:52
DWORD MCIAVI_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
Definition: mciavi.c:305
static DWORD MCIAVI_mciCue(UINT wDevID, DWORD dwFlags, LPMCI_DGV_CUE_PARMS lpParms)
Definition: mciavi.c:889
static DWORD MCIAVI_mciUpdate(UINT wDevID, DWORD dwFlags, LPMCI_DGV_UPDATE_PARMS lpParms)
Definition: mciavi.c:827
static DWORD MCIAVI_mciSignal(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SIGNAL_PARMS lpParms)
Definition: mciavi.c:949
static DWORD MCIAVI_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
Definition: mciavi.c:693
static DWORD MCIAVI_mciBreak(UINT wDevID, DWORD dwFlags, LPMCI_BREAK_PARMS lpParms)
Definition: mciavi.c:908
static DWORD MCIAVI_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
Definition: mciavi.c:747
static void MCIAVI_CleanUp(WINE_MCIAVI *wma)
Definition: mciavi.c:167
static double currenttime_us(void)
Definition: mciavi.c:336
static DWORD WINAPI MCIAVI_mciPlay_thread(LPVOID arg)
Definition: mciavi.c:502
BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID fImpLoad)
Definition: mciavi.c:57
static DWORD MCIAVI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_DGV_OPEN_PARMSW lpOpenParms)
Definition: mciavi.c:213
static DWORD MCIAVI_player(WINE_MCIAVI *wma, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
Definition: mciavi.c:347
static DWORD MCIAVI_mciStop(UINT, DWORD, LPMCI_GENERIC_PARMS)
Definition: mciavi.c:639
static DWORD MCIAVI_mciConfigure(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
Definition: mciavi.c:983
static DWORD MCIAVI_mciStep(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STEP_PARMS lpParms)
Definition: mciavi.c:852
WINE_MCIAVI * MCIAVI_mciGetOpenDev(UINT wDevID)
Definition: mciavi.c:156
LRESULT CALLBACK MCIAVI_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, LPARAM dwParam1, LPARAM dwParam2)
Definition: mciavi.c:1005
#define MCI_MCIAVI_PLAY_FULLBY2
Definition: mciavi.h:6
#define MCI_MCIAVI_PLAY_WINDOW
Definition: mciavi.h:4
#define MCI_MCIAVI_PLAY_FULLSCREEN
Definition: mciavi.h:5
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
void MCIAVI_PlayAudioBlocks(WINE_MCIAVI *wma, unsigned nHdr, LPWAVEHDR waveHdr)
Definition: mmoutput.c:575
DWORD MCIAVI_OpenAudio(WINE_MCIAVI *wma, unsigned *nHdr, LPWAVEHDR *pWaveHdr)
Definition: mmoutput.c:526
double MCIAVI_PaintFrame(WINE_MCIAVI *wma, HDC hDC)
Definition: mmoutput.c:604
BOOL MCIAVI_GetInfo(WINE_MCIAVI *wma)
Definition: mmoutput.c:240
BOOL MCIAVI_OpenVideo(WINE_MCIAVI *wma)
Definition: mmoutput.c:419
#define MCI_CUT
Definition: mmsystem.h:671
#define MCI_SAVE
Definition: mmsystem.h:661
#define DRV_CLOSE
Definition: mmsystem.h:122
#define MCIERR_FLAGS_NOT_COMPATIBLE
Definition: mmsystem.h:593
#define MCI_OPEN_SHAREABLE
Definition: mmsystem.h:734
#define MCI_SEEK_TO_END
Definition: mmsystem.h:741
#define MCI_NOTIFY
Definition: mmsystem.h:729
#define MCI_TO
Definition: mmsystem.h:732
#define MMIO_ALLOCBUF
Definition: mmsystem.h:532
#define MCI_BREAK
Definition: mmsystem.h:660
#define DRV_QUERYCONFIGURE
Definition: mmsystem.h:126
#define MCI_GETDEVCAPS
Definition: mmsystem.h:654
#define MCI_OPEN_ELEMENT_ID
Definition: mmsystem.h:737
#define MCI_RESUME
Definition: mmsystem.h:675
#define MCI_OPEN_ELEMENT
Definition: mmsystem.h:735
#define MCI_DELETE
Definition: mmsystem.h:676
#define MCI_MODE_PLAY
Definition: mmsystem.h:696
#define MCI_FREEZE
Definition: mmsystem.h:668
#define MCIERR_FILE_NOT_FOUND
Definition: mmsystem.h:585
#define MCIERR_CANNOT_LOAD_DRIVER
Definition: mmsystem.h:576
#define DRVCNF_RESTART
Definition: mmsystem.h:135
#define MCI_WINDOW
Definition: mmsystem.h:665
#define MCI_STATUS
Definition: mmsystem.h:662
#define MCI_COPY
Definition: mmsystem.h:672
#define MCI_ESCAPE
Definition: mmsystem.h:648
#define MCI_BREAK_HWND
Definition: mmsystem.h:783
#define MCIERR_UNRECOGNIZED_COMMAND
Definition: mmsystem.h:571
#define MCI_SET
Definition: mmsystem.h:656
#define MCI_LOAD
Definition: mmsystem.h:670
#define MCI_UPDATE
Definition: mmsystem.h:674
#define DRV_REMOVE
Definition: mmsystem.h:128
#define DRV_ENABLE
Definition: mmsystem.h:120
#define MCI_STOP
Definition: mmsystem.h:651
#define MMIO_DENYWRITE
Definition: mmsystem.h:540
#define MCI_CLOSE
Definition: mmsystem.h:647
#define MCIERR_INVALID_DEVICE_ID
Definition: mmsystem.h:569
#define MCI_SEEK
Definition: mmsystem.h:650
#define DRV_CONFIGURE
Definition: mmsystem.h:125
#define MCIERR_INVALID_FILE
Definition: mmsystem.h:604
#define DRV_OPEN
Definition: mmsystem.h:121
#define MCIERR_MISSING_PARAMETER
Definition: mmsystem.h:583
#define MCI_WHERE
Definition: mmsystem.h:667
#define MCIERR_NULL_PARAMETER_BLOCK
Definition: mmsystem.h:605
#define MCIERR_NO_WINDOW
Definition: mmsystem.h:639
#define MCIERR_OUTOFRANGE
Definition: mmsystem.h:592
#define DRV_INSTALL
Definition: mmsystem.h:127
#define MCI_OPEN
Definition: mmsystem.h:646
#define MCIERR_CREATEWINDOW
Definition: mmsystem.h:640
#define MCI_UNFREEZE
Definition: mmsystem.h:669
#define MCIERR_OUT_OF_MEMORY
Definition: mmsystem.h:574
#define MCI_DEVTYPE_DIGITAL_VIDEO
Definition: mmsystem.h:687
#define MCI_MODE_RECORD
Definition: mmsystem.h:697
#define MCI_BREAK_KEY
Definition: mmsystem.h:782
#define MCI_PUT
Definition: mmsystem.h:666
#define MCI_SPIN
Definition: mmsystem.h:655
#define MCI_MODE_STOP
Definition: mmsystem.h:695
#define MCIERR_MUST_USE_SHAREABLE
Definition: mmsystem.h:599
#define MMIO_READ
Definition: mmsystem.h:535
#define MCI_SEEK_TO_START
Definition: mmsystem.h:740
#define MCI_WAIT
Definition: mmsystem.h:730
#define MCI_NOTIFY_SUCCESSFUL
Definition: mmsystem.h:725
#define MCI_CUE
Definition: mmsystem.h:663
#define MCI_PAUSE
Definition: mmsystem.h:652
#define MCI_FROM
Definition: mmsystem.h:731
#define MCI_INFO
Definition: mmsystem.h:653
#define MCI_MODE_NOT_READY
Definition: mmsystem.h:694
#define MCI_MODE_PAUSE
Definition: mmsystem.h:699
#define MCI_PASTE
Definition: mmsystem.h:673
#define DRV_FREE
Definition: mmsystem.h:124
#define MCIERR_UNSUPPORTED_FUNCTION
Definition: mmsystem.h:584
#define MCI_FORMAT_FRAMES
Definition: mmsystem.h:704
#define MCI_PLAY
Definition: mmsystem.h:649
#define MCI_STEP
Definition: mmsystem.h:657
#define MCI_REALIZE
Definition: mmsystem.h:664
#define MCI_RECORD
Definition: mmsystem.h:658
#define DRV_DISABLE
Definition: mmsystem.h:123
HANDLE events[2]
Definition: event.c:4
static HDC
Definition: imagelist.c:88
static MONITORINFO mi
Definition: win.c:9400
LRESULT WINAPI ICClose(HIC hic)
HMONITOR WINAPI MonitorFromWindow(HWND, DWORD)
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define LOWORD(l)
Definition: pedump.c:82
#define WS_POPUP
Definition: pedump.c:616
#define WS_VISIBLE
Definition: pedump.c:620
BOOL MCIAVI_RegisterClass(void)
Definition: wnd.c:105
DWORD MCIAVI_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMSW lpParms)
Definition: wnd.c:286
BOOL MCIAVI_CreateWindow(WINE_MCIAVI *wma, DWORD dwFlags, LPMCI_DGV_OPEN_PARMSW lpOpenParms)
Definition: wnd.c:124
BOOL MCIAVI_UnregisterClass(void)
Definition: wnd.c:100
DWORD MCIAVI_mciWhere(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lpParms)
Definition: wnd.c:218
DWORD MCIAVI_mciPut(UINT wDevID, DWORD dwFlags, LPMCI_DGV_PUT_PARMS lpParms)
Definition: wnd.c:162
#define calloc
Definition: rosglue.h:14
const WCHAR * str
#define MCI_OPEN_DRIVER
Definition: mmddk.h:338
#define MCI_CLOSE_DRIVER
Definition: mmddk.h:339
#define memset(x, y, z)
Definition: compat.h:39
#define TRACE(s)
Definition: solgame.cpp:4
MCI_PLAY_PARMS params
Definition: mciavi.c:493
WINE_MCIAVI * wma
Definition: mciavi.c:491
DWORD_PTR dwCallback
Definition: digitalv.h:604
LPWSTR lpstrElementName
Definition: digitalv.h:607
DWORD_PTR dwCallback
Definition: digitalv.h:822
UINT wCustomCommandTable
Definition: mmddk.h:438
DWORD dwToVideoFrame
MCIDEVICEID wDevID
HANDLE hStopEvent
LPWAVEFORMATEX lpWaveFormat
DWORD dwCurrAudioBlock
LPBITMAPINFOHEADER inbih
CRITICAL_SECTION cs
DWORD dwMciTimeFormat
DWORD dwCurrVideoFrame
LPWSTR lpFileName
HBITMAP hbmFrame
DWORD dwCachedFrame
LPVOID outdata
LPBITMAPINFOHEADER outbih
AVIStreamHeader ash_audio
struct MMIOPos * lpVideoIndex
WORD wCommandTable
DWORD dwPlayableVideoFrames
struct MMIOPos * lpAudioIndex
struct WINE_MCIAVI::@497 mci_break
HDRAWDIB hdd
AVIStreamHeader ash_video
MainAVIHeader mah
PRTL_CRITICAL_SECTION_DEBUG DebugInfo
Definition: rtltypes.h:1458
DWORD_PTR dwCallback
Definition: mmsystem.h:1519
DWORD_PTR dwCallback
Definition: mmsystem.h:1539
DWORD_PTR dwCallback
Definition: mmsystem.h:1545
RECT rcMonitor
Definition: winuser.h:3893
DWORD cbSize
Definition: winuser.h:3892
LONG right
Definition: windef.h:108
LONG bottom
Definition: windef.h:109
LONG top
Definition: windef.h:107
LONG left
Definition: windef.h:106
DWORD WINAPI WaitForMultipleObjects(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds)
Definition: synch.c:151
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:726
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:587
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:669
#define DWORD_PTR
Definition: treelist.c:76
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint32_t DWORD_PTR
Definition: typedefs.h:65
LONGLONG QuadPart
Definition: typedefs.h:114
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define WAIT_OBJECT_0
Definition: winbase.h:383
#define THREAD_PRIORITY_TIME_CRITICAL
Definition: winbase.h:306
#define WINAPI
Definition: msvc.h:6
UINT WINAPI waveOutReset(HWAVEOUT hWaveOut)
Definition: winmm.c:2385
UINT WINAPI waveOutUnprepareHeader(HWAVEOUT hWaveOut, LPWAVEHDR lpWaveOutHdr, UINT uSize)
Definition: winmm.c:2307
UINT WINAPI waveOutRestart(HWAVEOUT hWaveOut)
Definition: winmm.c:2399
UINT WINAPI waveOutPause(HWAVEOUT hWaveOut)
Definition: winmm.c:2371
UINT WINAPI waveOutClose(HWAVEOUT hWaveOut)
Definition: winmm.c:2257
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO
Definition: winnt_old.h:1156
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
HWND WINAPI GetForegroundWindow(void)
Definition: ntwrapper.h:392
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4469
int WINAPI MessageBoxA(_In_opt_ HWND hWnd, _In_opt_ LPCSTR lpText, _In_opt_ LPCSTR lpCaption, _In_ UINT uType)
LONG WINAPI GetWindowLongW(_In_ HWND, _In_ int)
#define SW_SHOWNA
Definition: winuser.h:789
BOOL WINAPI GetMonitorInfoA(_In_ HMONITOR, _Inout_ LPMONITORINFO)
HDC WINAPI GetDC(_In_opt_ HWND)
#define MB_OK
Definition: winuser.h:801
SHORT WINAPI GetAsyncKeyState(_In_ int)
#define GWL_STYLE
Definition: winuser.h:863
BOOL WINAPI DestroyWindow(_In_ HWND)
#define HWND_32(h16)
Definition: wownt32.h:29