blob: 6903a04863cf533365bc7185a3af79a118228902 [file] [log] [blame]
Eric Pouechefba9f81999-03-15 15:40:27 +00001/* -*- tab-width: 8; c-basic-offset: 4 -*- */
2
Eric Pouechc11b1671999-02-13 12:38:09 +00003/*
4 * Digital video MCI Wine Driver
5 *
6 * Copyright 1999 Eric POUECH
7 */
8
Eric Pouech8d108a21999-07-15 14:43:13 +00009#include <string.h>
Michael Vekslerff5ae3d1999-04-22 15:26:11 +000010#include "winuser.h"
Eric Pouech37c02171999-09-05 16:44:38 +000011#include "mmddk.h"
Eric Pouechc11b1671999-02-13 12:38:09 +000012#include "user.h"
13#include "driver.h"
Eric Pouechefba9f81999-03-15 15:40:27 +000014#include "digitalv.h"
Eric Pouech8d108a21999-07-15 14:43:13 +000015#include "debugtools.h"
Eric Pouechc11b1671999-02-13 12:38:09 +000016
Eric Pouech8d108a21999-07-15 14:43:13 +000017DEFAULT_DEBUG_CHANNEL(mciavi)
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000018
Eric Pouechc11b1671999-02-13 12:38:09 +000019typedef struct {
Eric Pouech281c9271999-05-02 10:21:49 +000020 UINT wDevID;
Eric Pouechc11b1671999-02-13 12:38:09 +000021 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 */
Alexandre Julliarda3960291999-02-26 11:11:13 +000025 HMMIO hFile; /* mmio file handle open as Element */
Eric Pouechefba9f81999-03-15 15:40:27 +000026 WORD wStatus; /* One of MCI_MODE_XXX */
Alexandre Julliarda3960291999-02-26 11:11:13 +000027 MCI_OPEN_PARMSA openParms;
Eric Pouechc11b1671999-02-13 12:38:09 +000028 DWORD dwTimeFormat;
29} WINE_MCIAVI;
30
Eric Pouechc11b1671999-02-13 12:38:09 +000031/*======================================================================*
32 * MCI AVI implemantation *
33 *======================================================================*/
34
35/**************************************************************************
Eric Pouech281c9271999-05-02 10:21:49 +000036 * AVI_drvOpen [internal]
37 */
38static DWORD AVI_drvOpen(LPSTR str, LPMCI_OPEN_DRIVER_PARMSA modp)
39{
Eric Pouech8d108a21999-07-15 14:43:13 +000040 WINE_MCIAVI* wma = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MCIAVI));
Eric Pouech281c9271999-05-02 10:21:49 +000041
Eric Pouech8d108a21999-07-15 14:43:13 +000042 if (!wma)
43 return 0;
44
45 wma->wDevID = modp->wDeviceID;
46 mciSetDriverData(wma->wDevID, (DWORD)wma);
Eric Pouechb26cfe71999-07-24 10:45:24 +000047 modp->wCustomCommandTable = MCI_NO_COMMAND_TABLE;
Eric Pouech9000e7f1999-09-22 16:41:00 +000048 modp->wType = MCI_DEVTYPE_DIGITAL_VIDEO;
Eric Pouech8d108a21999-07-15 14:43:13 +000049 return modp->wDeviceID;
Eric Pouech281c9271999-05-02 10:21:49 +000050}
51
52/**************************************************************************
53 * MCIAVI_drvClose [internal]
54 */
55static DWORD AVI_drvClose(DWORD dwDevID)
56{
Eric Pouech8d108a21999-07-15 14:43:13 +000057 WINE_MCIAVI* wma = (WINE_MCIAVI*)mciGetDriverData(dwDevID);
Eric Pouech281c9271999-05-02 10:21:49 +000058
59 if (wma) {
Eric Pouech8d108a21999-07-15 14:43:13 +000060 HeapFree(GetProcessHeap(), 0, wma);
61 mciSetDriverData(dwDevID, 0);
Eric Pouech281c9271999-05-02 10:21:49 +000062 return 1;
63 }
64 return 0;
65}
66
67/**************************************************************************
Eric Pouechc11b1671999-02-13 12:38:09 +000068 * AVI_mciGetOpenDev [internal]
69 */
70static WINE_MCIAVI* AVI_mciGetOpenDev(UINT16 wDevID)
71{
Eric Pouech8d108a21999-07-15 14:43:13 +000072 WINE_MCIAVI* wma = (WINE_MCIAVI*)mciGetDriverData(wDevID);
Eric Pouech281c9271999-05-02 10:21:49 +000073
74 if (wma == NULL || wma->nUseCount == 0) {
Eric Pouech8d108a21999-07-15 14:43:13 +000075 WARN("Invalid wDevID=%u\n", wDevID);
Eric Pouechc11b1671999-02-13 12:38:09 +000076 return 0;
77 }
Eric Pouech281c9271999-05-02 10:21:49 +000078 return wma;
Eric Pouechc11b1671999-02-13 12:38:09 +000079}
80
81static DWORD AVI_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms);
82
Eric Pouechefba9f81999-03-15 15:40:27 +000083/***************************************************************************
84 * AVI_mciOpen [internal]
85 */
86static DWORD AVI_mciOpen(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_OPEN_PARMSA lpParms)
Eric Pouechc11b1671999-02-13 12:38:09 +000087{
Eric Pouech8d108a21999-07-15 14:43:13 +000088 WINE_MCIAVI* wma = (WINE_MCIAVI*)mciGetDriverData(wDevID);
Eric Pouechefba9f81999-03-15 15:40:27 +000089
Eric Pouech8d108a21999-07-15 14:43:13 +000090 TRACE("(%04x, %08lX, %p) : semi-stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +000091
Eric Pouechc11b1671999-02-13 12:38:09 +000092 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
Eric Pouech281c9271999-05-02 10:21:49 +000093 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
Eric Pouechefba9f81999-03-15 15:40:27 +000094
Eric Pouechc11b1671999-02-13 12:38:09 +000095 if (wma->nUseCount > 0) {
96 /* The driver is already open on this channel */
97 /* If the driver was opened shareable before and this open specifies */
98 /* shareable then increment the use count */
99 if (wma->fShareable && (dwFlags & MCI_OPEN_SHAREABLE))
100 ++wma->nUseCount;
101 else
102 return MCIERR_MUST_USE_SHAREABLE;
103 } else {
104 wma->nUseCount = 1;
105 wma->fShareable = dwFlags & MCI_OPEN_SHAREABLE;
106 }
107 if (dwFlags & MCI_OPEN_ELEMENT) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000108 TRACE("MCI_OPEN_ELEMENT !\n");
Eric Pouechc11b1671999-02-13 12:38:09 +0000109 /* return MCIERR_NO_ELEMENT_ALLOWED; */
110 }
Eric Pouechefba9f81999-03-15 15:40:27 +0000111
Eric Pouechc11b1671999-02-13 12:38:09 +0000112 wma->openParms.dwCallback = lpParms->dwCallback;
113 wma->openParms.wDeviceID = (WORD)lpParms->wDeviceID;
114 wma->openParms.lpstrDeviceType = lpParms->lpstrDeviceType;
115 wma->openParms.lpstrElementName = lpParms->lpstrElementName;
116 wma->openParms.lpstrAlias = lpParms->lpstrAlias;
Eric Pouechefba9f81999-03-15 15:40:27 +0000117
Eric Pouechc11b1671999-02-13 12:38:09 +0000118 wma->wNotifyDeviceID = lpParms->wDeviceID;
119 /* FIXME: do real open */
Eric Pouechefba9f81999-03-15 15:40:27 +0000120 wma->wStatus = MCI_MODE_STOP;
Eric Pouechc11b1671999-02-13 12:38:09 +0000121 wma->dwTimeFormat = MCI_FORMAT_TMSF;
Eric Pouechefba9f81999-03-15 15:40:27 +0000122
Eric Pouechc11b1671999-02-13 12:38:09 +0000123 return 0;
Eric Pouechefba9f81999-03-15 15:40:27 +0000124
Eric Pouechc11b1671999-02-13 12:38:09 +0000125}
126
Eric Pouechefba9f81999-03-15 15:40:27 +0000127/***************************************************************************
128 * AVI_mciClose [internal]
129 */
Eric Pouechc11b1671999-02-13 12:38:09 +0000130static DWORD AVI_mciClose(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
131{
132 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
Eric Pouechefba9f81999-03-15 15:40:27 +0000133
Eric Pouech8d108a21999-07-15 14:43:13 +0000134 TRACE("(%04x, %08lX, %p) : semi-stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000135
Eric Pouechc11b1671999-02-13 12:38:09 +0000136 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
137
138 if (wma->nUseCount == 1) {
139 AVI_mciStop(wDevID, 0, NULL);
140 /* FIXME: do real closing */
141 }
142 wma->nUseCount--;
143 return 0;
144}
145
Eric Pouechefba9f81999-03-15 15:40:27 +0000146/***************************************************************************
147 * AVI_mciPlay [internal]
148 */
Eric Pouechc11b1671999-02-13 12:38:09 +0000149static DWORD AVI_mciPlay(UINT16 wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms)
150{
Eric Pouechefba9f81999-03-15 15:40:27 +0000151 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
152
Eric Pouech8d108a21999-07-15 14:43:13 +0000153 TRACE("(%04x, %08lX, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000154
155 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
156 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
157
158 wma->wStatus = MCI_MODE_PLAY;
159 if (lpParms && (dwFlags & MCI_NOTIFY)) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000160 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
Eric Pouechefba9f81999-03-15 15:40:27 +0000161 mciDriverNotify16((HWND16)LOWORD(lpParms->dwCallback),
162 wma->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
163 }
Eric Pouechc11b1671999-02-13 12:38:09 +0000164 return 0;
165}
166
Eric Pouechefba9f81999-03-15 15:40:27 +0000167/***************************************************************************
168 * AVI_mciRecord [internal]
169 */
170static DWORD AVI_mciRecord(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_RECORD_PARMS lpParms)
Eric Pouechc11b1671999-02-13 12:38:09 +0000171{
Eric Pouechefba9f81999-03-15 15:40:27 +0000172 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
173
Eric Pouech8d108a21999-07-15 14:43:13 +0000174 TRACE("(%04x, %08lX, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000175
176 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
177 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
178
179 wma->wStatus = MCI_MODE_RECORD;
Eric Pouechc11b1671999-02-13 12:38:09 +0000180 return 0;
181}
182
Eric Pouechefba9f81999-03-15 15:40:27 +0000183/***************************************************************************
184 * AVI_mciStop [internal]
185 */
Eric Pouechc11b1671999-02-13 12:38:09 +0000186static DWORD AVI_mciStop(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
187{
Eric Pouechefba9f81999-03-15 15:40:27 +0000188 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
189
Eric Pouech8d108a21999-07-15 14:43:13 +0000190 TRACE("(%04x, %08lX, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000191
192 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
193 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
194
195 wma->wStatus = MCI_MODE_STOP;
Eric Pouechc11b1671999-02-13 12:38:09 +0000196 return 0;
197}
198
Eric Pouechefba9f81999-03-15 15:40:27 +0000199/***************************************************************************
200 * AVI_mciPause [internal]
201 */
Eric Pouechc11b1671999-02-13 12:38:09 +0000202static DWORD AVI_mciPause(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
203{
Eric Pouechefba9f81999-03-15 15:40:27 +0000204 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
205
Eric Pouech8d108a21999-07-15 14:43:13 +0000206 TRACE("(%04x, %08lX, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000207
208 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
209 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
210
211 wma->wStatus = MCI_MODE_PAUSE;
Eric Pouechc11b1671999-02-13 12:38:09 +0000212 return 0;
213}
214
Eric Pouechefba9f81999-03-15 15:40:27 +0000215/***************************************************************************
216 * AVI_mciResume [internal]
217 */
Eric Pouechc11b1671999-02-13 12:38:09 +0000218static DWORD AVI_mciResume(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
219{
Eric Pouechefba9f81999-03-15 15:40:27 +0000220 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
221
Eric Pouech8d108a21999-07-15 14:43:13 +0000222 TRACE("(%04x, %08lX, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000223
224 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
225 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
226
227 wma->wStatus = MCI_MODE_PLAY;
Eric Pouechc11b1671999-02-13 12:38:09 +0000228 return 0;
229}
230
Eric Pouechefba9f81999-03-15 15:40:27 +0000231/***************************************************************************
232 * AVI_mciSeek [internal]
233 */
234static DWORD AVI_mciSeek(UINT16 wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
Eric Pouechc11b1671999-02-13 12:38:09 +0000235{
Eric Pouechefba9f81999-03-15 15:40:27 +0000236 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
237
Eric Pouech8d108a21999-07-15 14:43:13 +0000238 TRACE("(%04x, %08lX, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000239
240 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
241 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
242
Eric Pouechc11b1671999-02-13 12:38:09 +0000243 return 0;
244}
245
Eric Pouechefba9f81999-03-15 15:40:27 +0000246/***************************************************************************
247 * AVI_mciSet [internal]
248 */
249static DWORD AVI_mciSet(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_SET_PARMS lpParms)
250{
251 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
252
Eric Pouech8d108a21999-07-15 14:43:13 +0000253 TRACE("(%04x, %08lX, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000254
255 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
256 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
257
258 if (dwFlags & MCI_SET_TIME_FORMAT) {
259 switch (lpParms->dwTimeFormat) {
260 case MCI_FORMAT_MILLISECONDS:
Eric Pouech8d108a21999-07-15 14:43:13 +0000261 TRACE("MCI_FORMAT_MILLISECONDS !\n");
Eric Pouechefba9f81999-03-15 15:40:27 +0000262 wma->dwTimeFormat = MCI_FORMAT_MILLISECONDS;
263 break;
264 case MCI_FORMAT_FRAMES:
Eric Pouech8d108a21999-07-15 14:43:13 +0000265 TRACE("MCI_FORMAT_FRAMES !\n");
Eric Pouechefba9f81999-03-15 15:40:27 +0000266 wma->dwTimeFormat = MCI_FORMAT_FRAMES;
267 break;
268 default:
Eric Pouech8d108a21999-07-15 14:43:13 +0000269 WARN("Bad time format %lu!\n", lpParms->dwTimeFormat);
Eric Pouechefba9f81999-03-15 15:40:27 +0000270 return MCIERR_BAD_TIME_FORMAT;
271 }
272 }
273
274 if (dwFlags & MCI_SET_DOOR_OPEN) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000275 TRACE("No support for door open !\n");
Eric Pouechefba9f81999-03-15 15:40:27 +0000276 return MCIERR_UNSUPPORTED_FUNCTION;
277 }
278 if (dwFlags & MCI_SET_DOOR_CLOSED) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000279 TRACE("No support for door close !\n");
Eric Pouechefba9f81999-03-15 15:40:27 +0000280 return MCIERR_UNSUPPORTED_FUNCTION;
281 }
282 if (dwFlags & MCI_SET_ON) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000283 char buffer[256];
Eric Pouechefba9f81999-03-15 15:40:27 +0000284
Eric Pouech8d108a21999-07-15 14:43:13 +0000285 strcpy(buffer, "MCI_SET_ON:");
Eric Pouechefba9f81999-03-15 15:40:27 +0000286
287 if (dwFlags & MCI_SET_VIDEO) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000288 strncat(buffer, " video", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000289 }
290 if (dwFlags & MCI_SET_AUDIO) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000291 strncat(buffer, " audio", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000292 if (lpParms->dwAudio & MCI_SET_AUDIO_ALL)
Eric Pouech8d108a21999-07-15 14:43:13 +0000293 strncat(buffer, " all", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000294 if (lpParms->dwAudio & MCI_SET_AUDIO_LEFT)
Eric Pouech8d108a21999-07-15 14:43:13 +0000295 strncat(buffer, " left", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000296 if (lpParms->dwAudio & MCI_SET_AUDIO_RIGHT)
Eric Pouech8d108a21999-07-15 14:43:13 +0000297 strncat(buffer, " right", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000298 }
299 if (dwFlags & MCI_DGV_SET_SEEK_EXACTLY) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000300 strncat(buffer, " seek_exactly", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000301 }
Eric Pouech8d108a21999-07-15 14:43:13 +0000302 TRACE("%s\n", buffer);
Eric Pouechefba9f81999-03-15 15:40:27 +0000303 }
304
305 if (dwFlags & MCI_SET_OFF) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000306 char buffer[256];
Eric Pouechefba9f81999-03-15 15:40:27 +0000307
Eric Pouech8d108a21999-07-15 14:43:13 +0000308 strcpy(buffer, "MCI_SET_OFF:");
Eric Pouechefba9f81999-03-15 15:40:27 +0000309 if (dwFlags & MCI_SET_VIDEO) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000310 strncat(buffer, " video", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000311 }
312 if (dwFlags & MCI_SET_AUDIO) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000313 strncat(buffer, " audio", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000314 if (lpParms->dwAudio & MCI_SET_AUDIO_ALL)
Eric Pouech8d108a21999-07-15 14:43:13 +0000315 strncat(buffer, " all", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000316 if (lpParms->dwAudio & MCI_SET_AUDIO_LEFT)
Eric Pouech8d108a21999-07-15 14:43:13 +0000317 strncat(buffer, " left", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000318 if (lpParms->dwAudio & MCI_SET_AUDIO_RIGHT)
Eric Pouech8d108a21999-07-15 14:43:13 +0000319 strncat(buffer, " right", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000320 }
321 if (dwFlags & MCI_DGV_SET_SEEK_EXACTLY) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000322 strncat(buffer, " seek_exactly", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000323 }
Eric Pouech8d108a21999-07-15 14:43:13 +0000324 TRACE("%s\n", buffer);
Eric Pouechefba9f81999-03-15 15:40:27 +0000325 }
326 if (dwFlags & MCI_DGV_SET_FILEFORMAT) {
327 LPSTR str = "save";
328 if (dwFlags & MCI_DGV_SET_STILL)
329 str = "capture";
330
331 switch (lpParms->dwFileFormat) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000332 case MCI_DGV_FF_AVI: TRACE("Setting file format (%s) to 'AVI'\n", str); break;
333 case MCI_DGV_FF_AVSS: TRACE("Setting file format (%s) to 'AVSS'\n", str); break;
334 case MCI_DGV_FF_DIB: TRACE("Setting file format (%s) to 'DIB'\n", str); break;
335 case MCI_DGV_FF_JFIF: TRACE("Setting file format (%s) to 'JFIF'\n", str); break;
336 case MCI_DGV_FF_JPEG: TRACE("Setting file format (%s) to 'JPEG'\n", str); break;
337 case MCI_DGV_FF_MPEG: TRACE("Setting file format (%s) to 'MPEG'\n", str); break;
338 case MCI_DGV_FF_RDIB: TRACE("Setting file format (%s) to 'RLE DIB'\n", str); break;
339 case MCI_DGV_FF_RJPEG: TRACE("Setting file format (%s) to 'RJPEG'\n", str); break;
340 default: TRACE("Setting unknown file format (%s): %ld\n", str, lpParms->dwFileFormat);
Eric Pouechefba9f81999-03-15 15:40:27 +0000341 }
342 }
343
344 if (dwFlags & MCI_DGV_SET_SPEED) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000345 TRACE("Setting speed to %ld\n", lpParms->dwSpeed);
Eric Pouechefba9f81999-03-15 15:40:27 +0000346 }
347
348 return 0;
349}
350
351/***************************************************************************
352 * AVI_mciStatus [internal]
353 */
354static DWORD AVI_mciStatus(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSA lpParms)
355{
356 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
Eric Pouechb26cfe71999-07-24 10:45:24 +0000357 DWORD ret = 0;
358
Eric Pouech8d108a21999-07-15 14:43:13 +0000359 TRACE("(%04x, %08lX, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000360
361 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
362 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
363
364 if (dwFlags & MCI_STATUS_ITEM) {
365 switch (lpParms->dwItem) {
366 case MCI_STATUS_CURRENT_TRACK:
367 lpParms->dwReturn = 1;
Eric Pouech8d108a21999-07-15 14:43:13 +0000368 TRACE("MCI_STATUS_CURRENT_TRACK => %lu\n", lpParms->dwReturn);
Eric Pouechefba9f81999-03-15 15:40:27 +0000369 break;
370 case MCI_STATUS_LENGTH:
371 if (dwFlags & MCI_TRACK) {
372 /* lpParms->dwTrack contains track # */
373 lpParms->dwReturn = 0x1234;
374 } else {
375 lpParms->dwReturn = 0x4321;
376 }
Eric Pouech8d108a21999-07-15 14:43:13 +0000377 TRACE("MCI_STATUS_LENGTH => %lu\n", lpParms->dwReturn);
Eric Pouechefba9f81999-03-15 15:40:27 +0000378 break;
379 case MCI_STATUS_MODE:
Eric Pouechb26cfe71999-07-24 10:45:24 +0000380 lpParms->dwReturn = MAKEMCIRESOURCE(wma->wStatus, wma->wStatus);
381 ret = MCI_RESOURCE_RETURNED;
382 TRACE("MCI_STATUS_MODE => %u\n", LOWORD(lpParms->dwReturn));
Eric Pouechefba9f81999-03-15 15:40:27 +0000383 break;
384 case MCI_STATUS_MEDIA_PRESENT:
Eric Pouech8d108a21999-07-15 14:43:13 +0000385 TRACE("MCI_STATUS_MEDIA_PRESENT => TRUE\n");
Eric Pouechb26cfe71999-07-24 10:45:24 +0000386 lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
387 ret = MCI_RESOURCE_RETURNED;
Eric Pouechefba9f81999-03-15 15:40:27 +0000388 break;
389 case MCI_STATUS_NUMBER_OF_TRACKS:
390 lpParms->dwReturn = 3;
Eric Pouech8d108a21999-07-15 14:43:13 +0000391 TRACE("MCI_STATUS_NUMBER_OF_TRACKS => %lu\n", lpParms->dwReturn);
Eric Pouechefba9f81999-03-15 15:40:27 +0000392 break;
393 case MCI_STATUS_POSITION:
394 /* FIXME: do I need to use MCI_TRACK ? */
395 lpParms->dwReturn = 0x0123;
Eric Pouech8d108a21999-07-15 14:43:13 +0000396 TRACE("MCI_STATUS_POSITION %s => %lu\n",
Eric Pouechefba9f81999-03-15 15:40:27 +0000397 (dwFlags & MCI_STATUS_START) ? "start" : "current", lpParms->dwReturn);
398 break;
399 case MCI_STATUS_READY:
Eric Pouechb26cfe71999-07-24 10:45:24 +0000400 lpParms->dwReturn = (wma->wStatus == MCI_MODE_NOT_READY) ?
401 MAKEMCIRESOURCE(FALSE, MCI_FALSE) : MAKEMCIRESOURCE(TRUE, MCI_TRUE);
402 ret = MCI_RESOURCE_RETURNED;
403 TRACE("MCI_STATUS_READY = %u\n", LOWORD(lpParms->dwReturn));
Eric Pouechefba9f81999-03-15 15:40:27 +0000404 break;
405 case MCI_STATUS_TIME_FORMAT:
Eric Pouechb26cfe71999-07-24 10:45:24 +0000406 lpParms->dwReturn = MAKEMCIRESOURCE(wma->dwTimeFormat, wma->dwTimeFormat);
407 TRACE("MCI_STATUS_TIME_FORMAT => %u\n", LOWORD(lpParms->dwReturn));
408 ret = MCI_RESOURCE_RETURNED;
Eric Pouechefba9f81999-03-15 15:40:27 +0000409 break;
410 default:
Eric Pouechb26cfe71999-07-24 10:45:24 +0000411 FIXME("Unknowm command %08lX !\n", lpParms->dwItem);
Eric Pouechefba9f81999-03-15 15:40:27 +0000412 return MCIERR_UNRECOGNIZED_COMMAND;
413 }
414 } else {
Eric Pouech8d108a21999-07-15 14:43:13 +0000415 WARN("No Status-Item!\n");
Eric Pouechefba9f81999-03-15 15:40:27 +0000416 return MCIERR_UNRECOGNIZED_COMMAND;
417 }
418 if (dwFlags & MCI_NOTIFY) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000419 TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
Eric Pouechefba9f81999-03-15 15:40:27 +0000420 mciDriverNotify16((HWND16)LOWORD(lpParms->dwCallback),
421 wma->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL);
422 }
423
Eric Pouechb26cfe71999-07-24 10:45:24 +0000424 return ret;
Eric Pouechefba9f81999-03-15 15:40:27 +0000425}
426
427/***************************************************************************
428 * AVI_mciGetDevCaps [internal]
429 */
Eric Pouechc11b1671999-02-13 12:38:09 +0000430static DWORD AVI_mciGetDevCaps(UINT16 wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS lpParms)
431{
Eric Pouechefba9f81999-03-15 15:40:27 +0000432 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
Eric Pouechb26cfe71999-07-24 10:45:24 +0000433 DWORD ret;
434
Eric Pouech8d108a21999-07-15 14:43:13 +0000435 TRACE("(%04x, %08lX, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechc11b1671999-02-13 12:38:09 +0000436
437 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
Eric Pouechefba9f81999-03-15 15:40:27 +0000438 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
Eric Pouechc11b1671999-02-13 12:38:09 +0000439
440 if (dwFlags & MCI_GETDEVCAPS_ITEM) {
441 switch (lpParms->dwItem) {
442 case MCI_GETDEVCAPS_DEVICE_TYPE:
Eric Pouech8d108a21999-07-15 14:43:13 +0000443 TRACE("MCI_GETDEVCAPS_DEVICE_TYPE !\n");
Eric Pouechb26cfe71999-07-24 10:45:24 +0000444 lpParms->dwReturn = MAKEMCIRESOURCE(MCI_DEVTYPE_DIGITAL_VIDEO, MCI_DEVTYPE_DIGITAL_VIDEO);
445 ret = MCI_RESOURCE_RETURNED;
Eric Pouechc11b1671999-02-13 12:38:09 +0000446 break;
447 case MCI_GETDEVCAPS_HAS_AUDIO:
Eric Pouech8d108a21999-07-15 14:43:13 +0000448 TRACE("MCI_GETDEVCAPS_HAS_AUDIO !\n");
Eric Pouechb26cfe71999-07-24 10:45:24 +0000449 lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
450 ret = MCI_RESOURCE_RETURNED;
Eric Pouechc11b1671999-02-13 12:38:09 +0000451 break;
452 case MCI_GETDEVCAPS_HAS_VIDEO:
Eric Pouech8d108a21999-07-15 14:43:13 +0000453 TRACE("MCI_GETDEVCAPS_HAS_VIDEO !\n");
Eric Pouechb26cfe71999-07-24 10:45:24 +0000454 lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
455 ret = MCI_RESOURCE_RETURNED;
Eric Pouechc11b1671999-02-13 12:38:09 +0000456 break;
457 case MCI_GETDEVCAPS_USES_FILES:
Eric Pouech8d108a21999-07-15 14:43:13 +0000458 TRACE("MCI_GETDEVCAPS_USES_FILES !\n");
Eric Pouechb26cfe71999-07-24 10:45:24 +0000459 lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
460 ret = MCI_RESOURCE_RETURNED;
Eric Pouechc11b1671999-02-13 12:38:09 +0000461 break;
462 case MCI_GETDEVCAPS_COMPOUND_DEVICE:
Eric Pouech8d108a21999-07-15 14:43:13 +0000463 TRACE("MCI_GETDEVCAPS_COMPOUND_DEVICE !\n");
Eric Pouechb26cfe71999-07-24 10:45:24 +0000464 lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
465 ret = MCI_RESOURCE_RETURNED;
Eric Pouechc11b1671999-02-13 12:38:09 +0000466 break;
467 case MCI_GETDEVCAPS_CAN_EJECT:
Eric Pouech8d108a21999-07-15 14:43:13 +0000468 TRACE("MCI_GETDEVCAPS_CAN_EJECT !\n");
Eric Pouechb26cfe71999-07-24 10:45:24 +0000469 lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
470 ret = MCI_RESOURCE_RETURNED;
Eric Pouechc11b1671999-02-13 12:38:09 +0000471 break;
472 case MCI_GETDEVCAPS_CAN_PLAY:
Eric Pouech8d108a21999-07-15 14:43:13 +0000473 TRACE("MCI_GETDEVCAPS_CAN_PLAY !\n");
Eric Pouechb26cfe71999-07-24 10:45:24 +0000474 lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
475 ret = MCI_RESOURCE_RETURNED;
Eric Pouechc11b1671999-02-13 12:38:09 +0000476 break;
477 case MCI_GETDEVCAPS_CAN_RECORD:
Eric Pouech8d108a21999-07-15 14:43:13 +0000478 TRACE("MCI_GETDEVCAPS_CAN_RECORD !\n");
Eric Pouechb26cfe71999-07-24 10:45:24 +0000479 lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
480 ret = MCI_RESOURCE_RETURNED;
Eric Pouechc11b1671999-02-13 12:38:09 +0000481 break;
482 case MCI_GETDEVCAPS_CAN_SAVE:
Eric Pouech8d108a21999-07-15 14:43:13 +0000483 TRACE("MCI_GETDEVCAPS_CAN_SAVE !\n");
Eric Pouechb26cfe71999-07-24 10:45:24 +0000484 lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
485 ret = MCI_RESOURCE_RETURNED;
Eric Pouechc11b1671999-02-13 12:38:09 +0000486 break;
487 default:
Eric Pouechb26cfe71999-07-24 10:45:24 +0000488 FIXME("Unknown capability (%08lx) !\n", lpParms->dwItem);
Eric Pouechc11b1671999-02-13 12:38:09 +0000489 return MCIERR_UNRECOGNIZED_COMMAND;
490 }
491 } else {
Eric Pouechb26cfe71999-07-24 10:45:24 +0000492 WARN("No GetDevCaps-Item !\n");
Eric Pouechc11b1671999-02-13 12:38:09 +0000493 return MCIERR_UNRECOGNIZED_COMMAND;
494 }
Eric Pouechb26cfe71999-07-24 10:45:24 +0000495 return ret;
Eric Pouechc11b1671999-02-13 12:38:09 +0000496}
497
Eric Pouechefba9f81999-03-15 15:40:27 +0000498/***************************************************************************
499 * AVI_mciInfo [internal]
500 */
501static DWORD AVI_mciInfo(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_INFO_PARMSA lpParms)
Eric Pouechc11b1671999-02-13 12:38:09 +0000502{
Eric Pouechc11b1671999-02-13 12:38:09 +0000503 LPSTR str = 0;
504 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
Eric Pouechd19d25a1999-09-27 13:38:57 +0000505 DWORD ret = 0;
506
Eric Pouech8d108a21999-07-15 14:43:13 +0000507 TRACE("(%04X, %08lX, %p) : stub;\n", wDevID, dwFlags, lpParms);
Eric Pouechc11b1671999-02-13 12:38:09 +0000508
Eric Pouechb26cfe71999-07-24 10:45:24 +0000509 if (lpParms == NULL || lpParms->lpstrReturn == NULL)
510 return MCIERR_NULL_PARAMETER_BLOCK;
511 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
512
513 TRACE("buf=%p, len=%lu\n", lpParms->lpstrReturn, lpParms->dwRetSize);
Eric Pouechc11b1671999-02-13 12:38:09 +0000514
Eric Pouechb26cfe71999-07-24 10:45:24 +0000515 switch (dwFlags) {
516 case MCI_INFO_PRODUCT:
517 str = "Wine's AVI player";
518 break;
519 case MCI_INFO_FILE:
520 str = "";
521 break;
522#if 0
523 /* FIXME: the following manifest constants are not defined in <WINE>/include/mmsystem.h */
524 case MCI_INFO_COPYRIGHT:
525 break;
526 case MCI_INFO_NAME:
527 break;
528#endif
529 default:
530 WARN("Don't know this info command (%lu)\n", dwFlags);
531 return MCIERR_UNRECOGNIZED_COMMAND;
532 }
Eric Pouechd19d25a1999-09-27 13:38:57 +0000533 if (str) {
534 if (lpParms->dwRetSize <= strlen(str)) {
535 lstrcpynA(lpParms->lpstrReturn, str, lpParms->dwRetSize - 1);
536 ret = MCIERR_PARAM_OVERFLOW;
537 } else {
538 strcpy(lpParms->lpstrReturn, str);
539 }
540 } else {
541 *lpParms->lpstrReturn = 0;
542 }
543 return ret;
Eric Pouechc11b1671999-02-13 12:38:09 +0000544}
545
Eric Pouechefba9f81999-03-15 15:40:27 +0000546/***************************************************************************
547 * AVI_mciPut [internal]
548 */
549static DWORD AVI_mciPut(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_PUT_PARMS lpParms)
Eric Pouechc11b1671999-02-13 12:38:09 +0000550{
Eric Pouechefba9f81999-03-15 15:40:27 +0000551 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
552 RECT rc;
Eric Pouech8d108a21999-07-15 14:43:13 +0000553 char buffer[256];
Eric Pouechefba9f81999-03-15 15:40:27 +0000554
Eric Pouech8d108a21999-07-15 14:43:13 +0000555 TRACE("(%04x, %08lX, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000556
557 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
558 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
559
560 if (dwFlags & MCI_DGV_RECT) {
561 rc = lpParms->rc;
562 } else {
563 SetRectEmpty(&rc);
564 }
565
Eric Pouech8d108a21999-07-15 14:43:13 +0000566 *buffer = 0;
Eric Pouechefba9f81999-03-15 15:40:27 +0000567 if (dwFlags & MCI_DGV_PUT_CLIENT) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000568 strncat(buffer, "PUT_CLIENT", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000569 }
570 if (dwFlags & MCI_DGV_PUT_DESTINATION) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000571 strncat(buffer, "PUT_DESTINATION", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000572 }
573 if (dwFlags & MCI_DGV_PUT_FRAME) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000574 strncat(buffer, "PUT_FRAME", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000575 }
576 if (dwFlags & MCI_DGV_PUT_SOURCE) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000577 strncat(buffer, "PUT_SOURCE", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000578 }
579 if (dwFlags & MCI_DGV_PUT_VIDEO) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000580 strncat(buffer, "PUT_VIDEO", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000581 }
582 if (dwFlags & MCI_DGV_PUT_WINDOW) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000583 strncat(buffer, "PUT_WINDOW", sizeof(buffer));
Eric Pouechefba9f81999-03-15 15:40:27 +0000584 }
Eric Pouech8d108a21999-07-15 14:43:13 +0000585 TRACE("%s (%d,%d,%d,%d)\n", buffer, rc.left, rc.top, rc.right, rc.bottom);
Eric Pouechefba9f81999-03-15 15:40:27 +0000586
Eric Pouechc11b1671999-02-13 12:38:09 +0000587 return 0;
588}
589
Eric Pouechefba9f81999-03-15 15:40:27 +0000590/***************************************************************************
591 * AVI_mciWindow [internal]
592 */
593static DWORD AVI_mciWindow(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMSA lpParms)
594{
595 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
596
Eric Pouech8d108a21999-07-15 14:43:13 +0000597 TRACE("(%04x, %08lX, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000598
599 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
600 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
601
602 if (dwFlags & MCI_DGV_WINDOW_HWND) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000603 TRACE("Setting hWnd to %08lx\n", (DWORD)lpParms->hWnd);
Eric Pouechefba9f81999-03-15 15:40:27 +0000604 }
605 if (dwFlags & MCI_DGV_WINDOW_STATE) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000606 TRACE("Setting nCmdShow to %d\n", lpParms->nCmdShow);
Eric Pouechefba9f81999-03-15 15:40:27 +0000607 }
608 if (dwFlags & MCI_DGV_WINDOW_TEXT) {
Eric Pouech8d108a21999-07-15 14:43:13 +0000609 TRACE("Setting caption to '%s'\n", lpParms->lpstrText);
Eric Pouechefba9f81999-03-15 15:40:27 +0000610 }
611
612 return 0;
613}
614
615/*****************************************************************************
616 * AVI_mciLoad [internal]
617 */
618static DWORD AVI_mciLoad(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_LOAD_PARMSA lpParms)
619{
620 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
621
Eric Pouech8d108a21999-07-15 14:43:13 +0000622 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000623
624 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
625 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
626
627 return 0;
628}
629
630/******************************************************************************
631 * AVI_mciSave [internal]
632 */
633static DWORD AVI_mciSave(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_SAVE_PARMSA lpParms)
634{
635 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
636
Eric Pouech8d108a21999-07-15 14:43:13 +0000637 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000638
639 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
640 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
641
642 return 0;
643}
644
645/******************************************************************************
646 * AVI_mciFreeze [internal]
647 */
648static DWORD AVI_mciFreeze(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lpParms)
649{
650 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
651
Eric Pouech8d108a21999-07-15 14:43:13 +0000652 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000653
654 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
655 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
656
657 return 0;
658}
659
660/******************************************************************************
661 * AVI_mciRealize [internal]
662 */
663static DWORD AVI_mciRealize(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
664{
665 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
666
Eric Pouech8d108a21999-07-15 14:43:13 +0000667 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000668
669 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
670 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
671
672 return 0;
673}
674
675/******************************************************************************
676 * AVI_mciUnFreeze [internal]
677 */
678static DWORD AVI_mciUnFreeze(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lpParms)
679{
680 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
681
Eric Pouech8d108a21999-07-15 14:43:13 +0000682 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000683
684 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
685 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
686
687 return 0;
688}
689
690/******************************************************************************
691 * AVI_mciUpdate [internal]
692 */
693static DWORD AVI_mciUpdate(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_UPDATE_PARMS lpParms)
694{
695 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
696
Eric Pouech8d108a21999-07-15 14:43:13 +0000697 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000698
699 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
700 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
701
702 return 0;
703}
704
705/******************************************************************************
706 * AVI_mciWhere [internal]
707 */
708static DWORD AVI_mciWhere(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lpParms)
709{
710 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
711
Eric Pouech8d108a21999-07-15 14:43:13 +0000712 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000713
714 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
715 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
716
717 return 0;
718}
719
720/******************************************************************************
721 * AVI_mciStep [internal]
722 */
723static DWORD AVI_mciStep(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_STEP_PARMS lpParms)
724{
725 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
726
Eric Pouech8d108a21999-07-15 14:43:13 +0000727 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000728
729 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
730 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
731
732 return 0;
733}
734
735/******************************************************************************
736 * AVI_mciCopy [internal]
737 */
738static DWORD AVI_mciCopy(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_COPY_PARMS lpParms)
739{
740 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
741
Eric Pouech8d108a21999-07-15 14:43:13 +0000742 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000743
744 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
745 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
746
747 return 0;
748}
749
750/******************************************************************************
751 * AVI_mciCut [internal]
752 */
753static DWORD AVI_mciCut(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_CUT_PARMS lpParms)
754{
755 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
756
Eric Pouech8d108a21999-07-15 14:43:13 +0000757 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000758
759 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
760 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
761
762 return 0;
763}
764
765/******************************************************************************
766 * AVI_mciDelete [internal]
767 */
768static DWORD AVI_mciDelete(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_DELETE_PARMS lpParms)
769{
770 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
771
Eric Pouech8d108a21999-07-15 14:43:13 +0000772 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000773
774 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
775 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
776
777 return 0;
778}
779
780/******************************************************************************
781 * AVI_mciPaste [internal]
782 */
783static DWORD AVI_mciPaste(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_PASTE_PARMS lpParms)
784{
785 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
786
Eric Pouech8d108a21999-07-15 14:43:13 +0000787 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000788
789 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
790 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
791
792 return 0;
793}
794
795/******************************************************************************
796 * AVI_mciCue [internal]
797 */
798static DWORD AVI_mciCue(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_CUE_PARMS lpParms)
799{
800 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
801
Eric Pouech8d108a21999-07-15 14:43:13 +0000802 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000803
804 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
805 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
806
807 return 0;
808}
809
810/******************************************************************************
811 * AVI_mciCapture [internal]
812 */
813static DWORD AVI_mciCapture(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_CAPTURE_PARMSA lpParms)
814{
815 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
816
Eric Pouech8d108a21999-07-15 14:43:13 +0000817 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000818
819 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
820 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
821
822 return 0;
823}
824
825/******************************************************************************
826 * AVI_mciMonitor [internal]
827 */
828static DWORD AVI_mciMonitor(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_MONITOR_PARMS lpParms)
829{
830 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
831
Eric Pouech8d108a21999-07-15 14:43:13 +0000832 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000833
834 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
835 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
836
837 return 0;
838}
839
840/******************************************************************************
841 * AVI_mciReserve [internal]
842 */
843static DWORD AVI_mciReserve(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_RESERVE_PARMSA lpParms)
844{
845 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
846
Eric Pouech8d108a21999-07-15 14:43:13 +0000847 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000848
849 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
850 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
851
852 return 0;
853}
854
855/******************************************************************************
856 * AVI_mciSetAudio [internal]
857 */
858static DWORD AVI_mciSetAudio(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_SETAUDIO_PARMSA lpParms)
859{
860 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
861
Eric Pouech8d108a21999-07-15 14:43:13 +0000862 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000863
864 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
865 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
866
867 return 0;
868}
869
870/******************************************************************************
871 * AVI_mciSignal [internal]
872 */
873static DWORD AVI_mciSignal(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_SIGNAL_PARMS lpParms)
874{
875 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
876
Eric Pouech8d108a21999-07-15 14:43:13 +0000877 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000878
879 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
880 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
881
882 return 0;
883}
884
885/******************************************************************************
886 * AVI_mciSetVideo [internal]
887 */
888static DWORD AVI_mciSetVideo(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_SETVIDEO_PARMSA lpParms)
889{
890 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
891
Eric Pouech8d108a21999-07-15 14:43:13 +0000892 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000893
894 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
895 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
896
897 return 0;
898}
899
900/******************************************************************************
901 * AVI_mciQuality [internal]
902 */
903static DWORD AVI_mciQuality(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_QUALITY_PARMSA lpParms)
904{
905 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
906
Eric Pouech8d108a21999-07-15 14:43:13 +0000907 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000908
909 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
910 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
911
912 return 0;
913}
914
915/******************************************************************************
916 * AVI_mciList [internal]
917 */
918static DWORD AVI_mciList(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_LIST_PARMSA lpParms)
919{
920 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
921
Eric Pouech8d108a21999-07-15 14:43:13 +0000922 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000923
924 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
925 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
926
927 return 0;
928}
929
930/******************************************************************************
931 * AVI_mciUndo [internal]
932 */
933static DWORD AVI_mciUndo(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
934{
935 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
936
Eric Pouech8d108a21999-07-15 14:43:13 +0000937 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000938
939 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
940 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
941
942 return 0;
943}
944
945/******************************************************************************
946 * AVI_mciConfigure [internal]
947 */
948static DWORD AVI_mciConfigure(UINT16 wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms)
949{
950 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
951
Eric Pouech8d108a21999-07-15 14:43:13 +0000952 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000953
954 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
955 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
956
957 return 0;
958}
959
960/******************************************************************************
961 * AVI_mciRestore [internal]
962 */
963static DWORD AVI_mciRestore(UINT16 wDevID, DWORD dwFlags, LPMCI_DGV_RESTORE_PARMSA lpParms)
964{
965 WINE_MCIAVI* wma = AVI_mciGetOpenDev(wDevID);
966
Eric Pouech8d108a21999-07-15 14:43:13 +0000967 TRACE("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms);
Eric Pouechefba9f81999-03-15 15:40:27 +0000968
969 if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
970 if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
971
972 return 0;
973}
Eric Pouechc11b1671999-02-13 12:38:09 +0000974
975/*======================================================================*
976 * MCI AVI entry points *
977 *======================================================================*/
978
979/**************************************************************************
Eric Pouechefba9f81999-03-15 15:40:27 +0000980 * MCIAVI_DriverProc [sample driver]
Eric Pouechc11b1671999-02-13 12:38:09 +0000981 */
Eric Pouech8d108a21999-07-15 14:43:13 +0000982LONG CALLBACK MCIAVI_DriverProc(DWORD dwDevID, HDRVR hDriv, DWORD wMsg,
983 DWORD dwParam1, DWORD dwParam2)
Eric Pouechc11b1671999-02-13 12:38:09 +0000984{
985 switch (wMsg) {
986 case DRV_LOAD: return 1;
987 case DRV_FREE: return 1;
Eric Pouech281c9271999-05-02 10:21:49 +0000988 case DRV_OPEN: return AVI_drvOpen((LPSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSA)dwParam2);
989 case DRV_CLOSE: return AVI_drvClose(dwDevID);
Eric Pouechc11b1671999-02-13 12:38:09 +0000990 case DRV_ENABLE: return 1;
991 case DRV_DISABLE: return 1;
992 case DRV_QUERYCONFIGURE: return 1;
Alexandre Julliarda3960291999-02-26 11:11:13 +0000993 case DRV_CONFIGURE: MessageBoxA(0, "Sample AVI Wine Driver !", "MM-Wine Driver", MB_OK); return 1;
Eric Pouechc11b1671999-02-13 12:38:09 +0000994 case DRV_INSTALL: return DRVCNF_RESTART;
995 case DRV_REMOVE: return DRVCNF_RESTART;
Eric Pouechefba9f81999-03-15 15:40:27 +0000996
997 case MCI_OPEN_DRIVER: return AVI_mciOpen (dwDevID, dwParam1, (LPMCI_DGV_OPEN_PARMSA) dwParam2);
998 case MCI_CLOSE_DRIVER: return AVI_mciClose (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
999 case MCI_PLAY: return AVI_mciPlay (dwDevID, dwParam1, (LPMCI_PLAY_PARMS) dwParam2);
1000 case MCI_RECORD: return AVI_mciRecord (dwDevID, dwParam1, (LPMCI_DGV_RECORD_PARMS) dwParam2);
1001 case MCI_STOP: return AVI_mciStop (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
1002 case MCI_SET: return AVI_mciSet (dwDevID, dwParam1, (LPMCI_DGV_SET_PARMS) dwParam2);
1003 case MCI_PAUSE: return AVI_mciPause (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
1004 case MCI_RESUME: return AVI_mciResume (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
1005 case MCI_STATUS: return AVI_mciStatus (dwDevID, dwParam1, (LPMCI_DGV_STATUS_PARMSA) dwParam2);
1006 case MCI_GETDEVCAPS: return AVI_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS) dwParam2);
1007 case MCI_INFO: return AVI_mciInfo (dwDevID, dwParam1, (LPMCI_DGV_INFO_PARMSA) dwParam2);
1008 case MCI_SEEK: return AVI_mciSeek (dwDevID, dwParam1, (LPMCI_SEEK_PARMS) dwParam2);
1009 case MCI_PUT: return AVI_mciPut (dwDevID, dwParam1, (LPMCI_DGV_PUT_PARMS) dwParam2);
1010 case MCI_WINDOW: return AVI_mciWindow (dwDevID, dwParam1, (LPMCI_DGV_WINDOW_PARMSA) dwParam2);
1011 case MCI_LOAD: return AVI_mciLoad (dwDevID, dwParam1, (LPMCI_DGV_LOAD_PARMSA) dwParam2);
1012 case MCI_SAVE: return AVI_mciSave (dwDevID, dwParam1, (LPMCI_DGV_SAVE_PARMSA) dwParam2);
1013 case MCI_FREEZE: return AVI_mciFreeze (dwDevID, dwParam1, (LPMCI_DGV_RECT_PARMS) dwParam2);
1014 case MCI_REALIZE: return AVI_mciRealize (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
1015 case MCI_UNFREEZE: return AVI_mciUnFreeze (dwDevID, dwParam1, (LPMCI_DGV_RECT_PARMS) dwParam2);
1016 case MCI_UPDATE: return AVI_mciUpdate (dwDevID, dwParam1, (LPMCI_DGV_UPDATE_PARMS) dwParam2);
1017 case MCI_WHERE: return AVI_mciWhere (dwDevID, dwParam1, (LPMCI_DGV_RECT_PARMS) dwParam2);
1018 case MCI_STEP: return AVI_mciStep (dwDevID, dwParam1, (LPMCI_DGV_STEP_PARMS) dwParam2);
1019 case MCI_COPY: return AVI_mciCopy (dwDevID, dwParam1, (LPMCI_DGV_COPY_PARMS) dwParam2);
1020 case MCI_CUT: return AVI_mciCut (dwDevID, dwParam1, (LPMCI_DGV_CUT_PARMS) dwParam2);
1021 case MCI_DELETE: return AVI_mciDelete (dwDevID, dwParam1, (LPMCI_DGV_DELETE_PARMS) dwParam2);
1022 case MCI_PASTE: return AVI_mciPaste (dwDevID, dwParam1, (LPMCI_DGV_PASTE_PARMS) dwParam2);
1023 case MCI_CUE: return AVI_mciCue (dwDevID, dwParam1, (LPMCI_DGV_CUE_PARMS) dwParam2);
1024 /* Digital Video specific */
1025 case MCI_CAPTURE: return AVI_mciCapture (dwDevID, dwParam1, (LPMCI_DGV_CAPTURE_PARMSA) dwParam2);
1026 case MCI_MONITOR: return AVI_mciMonitor (dwDevID, dwParam1, (LPMCI_DGV_MONITOR_PARMS) dwParam2);
1027 case MCI_RESERVE: return AVI_mciReserve (dwDevID, dwParam1, (LPMCI_DGV_RESERVE_PARMSA) dwParam2);
1028 case MCI_SETAUDIO: return AVI_mciSetAudio (dwDevID, dwParam1, (LPMCI_DGV_SETAUDIO_PARMSA) dwParam2);
1029 case MCI_SIGNAL: return AVI_mciSignal (dwDevID, dwParam1, (LPMCI_DGV_SIGNAL_PARMS) dwParam2);
1030 case MCI_SETVIDEO: return AVI_mciSetVideo (dwDevID, dwParam1, (LPMCI_DGV_SETVIDEO_PARMSA) dwParam2);
1031 case MCI_QUALITY: return AVI_mciQuality (dwDevID, dwParam1, (LPMCI_DGV_QUALITY_PARMSA) dwParam2);
1032 case MCI_LIST: return AVI_mciList (dwDevID, dwParam1, (LPMCI_DGV_LIST_PARMSA) dwParam2);
1033 case MCI_UNDO: return AVI_mciUndo (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
1034 case MCI_CONFIGURE: return AVI_mciConfigure (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2);
1035 case MCI_RESTORE: return AVI_mciRestore (dwDevID, dwParam1, (LPMCI_DGV_RESTORE_PARMSA) dwParam2);
1036
1037 case MCI_SPIN:
Eric Pouechc11b1671999-02-13 12:38:09 +00001038 case MCI_ESCAPE:
Eric Pouechd19d25a1999-09-27 13:38:57 +00001039 WARN("Unsupported command [%lu]\n", wMsg);
Eric Pouechc11b1671999-02-13 12:38:09 +00001040 break;
1041 case MCI_OPEN:
1042 case MCI_CLOSE:
Eric Pouech8d108a21999-07-15 14:43:13 +00001043 FIXME("Shouldn't receive a MCI_OPEN or CLOSE message\n");
Eric Pouechc11b1671999-02-13 12:38:09 +00001044 break;
1045 default:
Eric Pouechd19d25a1999-09-27 13:38:57 +00001046 TRACE("Sending msg [%lu] to default driver proc\n", wMsg);
Alexandre Julliarda3960291999-02-26 11:11:13 +00001047 return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
Eric Pouechc11b1671999-02-13 12:38:09 +00001048 }
1049 return MCIERR_UNRECOGNIZED_COMMAND;
1050}
Eric Pouechefba9f81999-03-15 15:40:27 +00001051
1052