Added mappings for a few messages.
[wine] / dlls / winmm / mciavi / info.c
1 /* -*- tab-width: 8; c-basic-offset: 4 -*- */
2
3 /*
4  * Digital video MCI Wine Driver
5  *
6  * Copyright 1999, 2000 Eric POUECH
7  */
8
9 #include <string.h>
10 #include "private_mciavi.h"
11 #include "debugtools.h"
12
13 DEFAULT_DEBUG_CHANNEL(mciavi);
14
15 /**************************************************************************
16  *                              MCIAVI_ConvertFrameToTimeFormat [internal]      
17  */
18 DWORD   MCIAVI_ConvertFrameToTimeFormat(WINE_MCIAVI* wma, DWORD val, LPDWORD lpRet)
19 {
20     DWORD          ret = 0;
21     
22     switch (wma->dwMciTimeFormat) {
23     case MCI_FORMAT_MILLISECONDS:
24         ret = (val * wma->mah.dwMicroSecPerFrame) / 1000;
25         break;
26     case MCI_FORMAT_FRAMES:
27         ret = val;
28         break;
29     default:
30         WARN("Bad time format %lu!\n", wma->dwMciTimeFormat);
31     }
32     TRACE("val=%lu=0x%08lx [tf=%lu] => ret=%lu\n", val, val, wma->dwMciTimeFormat, ret);
33     *lpRet = 0;
34     return ret;
35 }
36
37 /**************************************************************************
38  *                              MCIAVI_ConvertTimeFormatToFrame [internal]      
39  */
40 DWORD   MCIAVI_ConvertTimeFormatToFrame(WINE_MCIAVI* wma, DWORD val)
41 {
42     DWORD       ret = 0;
43     
44     switch (wma->dwMciTimeFormat) {
45     case MCI_FORMAT_MILLISECONDS:
46         ret = (val * 1000) / wma->mah.dwMicroSecPerFrame;
47         break;
48     case MCI_FORMAT_FRAMES:
49         ret = val;
50         break;
51     default:
52         WARN("Bad time format %lu!\n", wma->dwMciTimeFormat);
53     }
54     TRACE("val=%lu=0x%08lx [tf=%lu] => ret=%lu\n", val, val, wma->dwMciTimeFormat, ret);
55     return ret;
56 }
57
58 /***************************************************************************
59  *                              MCIAVI_mciGetDevCaps            [internal]
60  */
61 DWORD   MCIAVI_mciGetDevCaps(UINT wDevID, DWORD dwFlags,  LPMCI_GETDEVCAPS_PARMS lpParms)
62 {
63     WINE_MCIAVI*        wma = MCIAVI_mciGetOpenDev(wDevID);
64     DWORD               ret;
65     
66     TRACE("(%04x, %08lX, %p)\n", wDevID, dwFlags, lpParms);
67     
68     if (lpParms == NULL)        return MCIERR_NULL_PARAMETER_BLOCK;
69     if (wma == NULL)            return MCIERR_INVALID_DEVICE_ID;
70     
71     if (dwFlags & MCI_GETDEVCAPS_ITEM) {
72         switch (lpParms->dwItem) {
73         case MCI_GETDEVCAPS_DEVICE_TYPE:
74             TRACE("MCI_GETDEVCAPS_DEVICE_TYPE !\n");
75             lpParms->dwReturn = MAKEMCIRESOURCE(MCI_DEVTYPE_DIGITAL_VIDEO, MCI_DEVTYPE_DIGITAL_VIDEO);
76             ret = MCI_RESOURCE_RETURNED;
77             break;
78         case MCI_GETDEVCAPS_HAS_AUDIO:
79             TRACE("MCI_GETDEVCAPS_HAS_AUDIO !\n");
80             lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
81             ret = MCI_RESOURCE_RETURNED;
82             break;
83         case MCI_GETDEVCAPS_HAS_VIDEO:
84             TRACE("MCI_GETDEVCAPS_HAS_VIDEO !\n");
85             lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
86             ret = MCI_RESOURCE_RETURNED;
87             break;
88         case MCI_GETDEVCAPS_USES_FILES:
89             TRACE("MCI_GETDEVCAPS_USES_FILES !\n");
90             lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
91             ret = MCI_RESOURCE_RETURNED;
92             break;
93         case MCI_GETDEVCAPS_COMPOUND_DEVICE:
94             TRACE("MCI_GETDEVCAPS_COMPOUND_DEVICE !\n");
95             lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
96             ret = MCI_RESOURCE_RETURNED;
97             break;
98         case MCI_GETDEVCAPS_CAN_EJECT:
99             TRACE("MCI_GETDEVCAPS_CAN_EJECT !\n");
100             lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
101             ret = MCI_RESOURCE_RETURNED;
102             break;
103         case MCI_GETDEVCAPS_CAN_PLAY:
104             TRACE("MCI_GETDEVCAPS_CAN_PLAY !\n");
105             lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
106             ret = MCI_RESOURCE_RETURNED;
107             break;
108         case MCI_GETDEVCAPS_CAN_RECORD:
109             TRACE("MCI_GETDEVCAPS_CAN_RECORD !\n");
110             lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
111             ret = MCI_RESOURCE_RETURNED;
112             break;
113         case MCI_GETDEVCAPS_CAN_SAVE:
114             TRACE("MCI_GETDEVCAPS_CAN_SAVE !\n");
115             lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE);
116             ret = MCI_RESOURCE_RETURNED;
117             break;
118         default:
119             FIXME("Unknown capability (%08lx) !\n", lpParms->dwItem);
120             return MCIERR_UNRECOGNIZED_COMMAND;
121         }
122     } else {
123         WARN("No GetDevCaps-Item !\n");
124         return MCIERR_UNRECOGNIZED_COMMAND;
125     }
126     return ret;
127 }
128
129 /***************************************************************************
130  *                              MCIAVI_mciInfo                  [internal]
131  */
132 DWORD   MCIAVI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_INFO_PARMSA lpParms)
133 {
134     LPSTR               str = 0;
135     WINE_MCIAVI*        wma = MCIAVI_mciGetOpenDev(wDevID);
136     DWORD               ret = 0;
137     
138     if (lpParms == NULL || lpParms->lpstrReturn == NULL)
139         return MCIERR_NULL_PARAMETER_BLOCK;
140     if (wma == NULL) return MCIERR_INVALID_DEVICE_ID;
141     
142     TRACE("buf=%p, len=%lu\n", lpParms->lpstrReturn, lpParms->dwRetSize);
143     
144     switch (dwFlags) {
145     case MCI_INFO_PRODUCT:
146         str = "Wine's AVI player";
147         break;
148     case MCI_INFO_FILE:
149         str = wma->openParms.lpstrElementName;
150         break;
151     default:
152         WARN("Don't know this info command (%lu)\n", dwFlags);
153         return MCIERR_UNRECOGNIZED_COMMAND;
154     }
155     if (str) {
156         if (strlen(str) + 1 > lpParms->dwRetSize) {
157             ret = MCIERR_PARAM_OVERFLOW;
158         } else {
159             lstrcpynA(lpParms->lpstrReturn, str, lpParms->dwRetSize);
160         }
161     } else {
162         lpParms->lpstrReturn[0] = 0;
163     }
164     return ret;
165 }
166
167 /***************************************************************************
168  *                              MCIAVI_mciSet                   [internal]
169  */
170 DWORD   MCIAVI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SET_PARMS lpParms)
171 {
172     WINE_MCIAVI*        wma = MCIAVI_mciGetOpenDev(wDevID);
173     
174     if (lpParms == NULL)        return MCIERR_NULL_PARAMETER_BLOCK;
175     if (wma == NULL)            return MCIERR_INVALID_DEVICE_ID;
176     
177     if (dwFlags & MCI_SET_TIME_FORMAT) {
178         switch (lpParms->dwTimeFormat) {
179         case MCI_FORMAT_MILLISECONDS:
180             TRACE("MCI_FORMAT_MILLISECONDS !\n");
181             wma->dwMciTimeFormat = MCI_FORMAT_MILLISECONDS;
182             break;
183         case MCI_FORMAT_FRAMES:
184             TRACE("MCI_FORMAT_FRAMES !\n");
185             wma->dwMciTimeFormat = MCI_FORMAT_FRAMES;
186             break;
187         default:
188             WARN("Bad time format %lu!\n", lpParms->dwTimeFormat);
189             return MCIERR_BAD_TIME_FORMAT;
190         }
191     }
192     
193     if (dwFlags & MCI_SET_DOOR_OPEN) {
194         TRACE("No support for door open !\n");
195         return MCIERR_UNSUPPORTED_FUNCTION;
196     }
197     if (dwFlags & MCI_SET_DOOR_CLOSED) {
198         TRACE("No support for door close !\n");
199         return MCIERR_UNSUPPORTED_FUNCTION;
200     }
201     if (dwFlags & MCI_SET_ON) {
202         char    buffer[256];
203         
204         strcpy(buffer, "MCI_SET_ON:");
205         
206         if (dwFlags & MCI_SET_VIDEO) {
207             strncat(buffer, " video", sizeof(buffer));
208             wma->dwSet |= 4;
209         }
210         if (dwFlags & MCI_SET_AUDIO) {
211             strncat(buffer, " audio", sizeof(buffer));
212             switch (lpParms->dwAudio) {
213             case MCI_SET_AUDIO_ALL:
214                 strncat(buffer, " all", sizeof(buffer));
215                 wma->dwSet |= 3;
216                 break;
217             case MCI_SET_AUDIO_LEFT:
218                 strncat(buffer, " left", sizeof(buffer));
219                 wma->dwSet |= 1;
220                 break;
221             case MCI_SET_AUDIO_RIGHT:
222                 strncat(buffer, " right", sizeof(buffer));
223                 wma->dwSet |= 2;
224                 break;
225             default:
226                 WARN("Unknown audio chanel %lu\n", lpParms->dwAudio);
227                 break;
228             }
229         }
230         if (dwFlags & MCI_DGV_SET_SEEK_EXACTLY) {
231             strncat(buffer, " seek_exactly", sizeof(buffer));
232         }
233         FIXME("%s\n", buffer);
234     }
235     
236     if (dwFlags & MCI_SET_OFF) {
237         char    buffer[256];
238         
239         strcpy(buffer, "MCI_SET_OFF:");
240         if (dwFlags & MCI_SET_VIDEO) {
241             strncat(buffer, " video", sizeof(buffer));
242             wma->dwSet &= ~4;
243         }
244         if (dwFlags & MCI_SET_AUDIO) {
245             strncat(buffer, " audio", sizeof(buffer));
246             switch (lpParms->dwAudio) {
247             case MCI_SET_AUDIO_ALL:
248                 strncat(buffer, " all", sizeof(buffer));
249                 wma->dwSet &= ~3;
250                 break;
251             case MCI_SET_AUDIO_LEFT:
252                 strncat(buffer, " left", sizeof(buffer));
253                 wma->dwSet &= ~2;
254                 break;
255             case MCI_SET_AUDIO_RIGHT:
256                 strncat(buffer, " right", sizeof(buffer));
257                 wma->dwSet &= ~2;
258                 break;
259             default:
260                 WARN("Unknown audio chanel %lu\n", lpParms->dwAudio);
261                 break;
262             }
263         }
264         if (dwFlags & MCI_DGV_SET_SEEK_EXACTLY) {
265             strncat(buffer, " seek_exactly", sizeof(buffer));
266         }
267         FIXME("%s\n", buffer);
268     }
269     if (dwFlags & MCI_DGV_SET_FILEFORMAT) {
270         LPSTR   str = "save";
271         if (dwFlags & MCI_DGV_SET_STILL)        
272             str = "capture";
273         
274         switch (lpParms->dwFileFormat) {
275         case MCI_DGV_FF_AVI:    FIXME("Setting file format (%s) to 'AVI'\n", str);      break;
276         case MCI_DGV_FF_AVSS:   FIXME("Setting file format (%s) to 'AVSS'\n", str);     break;
277         case MCI_DGV_FF_DIB:    FIXME("Setting file format (%s) to 'DIB'\n", str);      break;
278         case MCI_DGV_FF_JFIF:   FIXME("Setting file format (%s) to 'JFIF'\n", str);     break;
279         case MCI_DGV_FF_JPEG:   FIXME("Setting file format (%s) to 'JPEG'\n", str);     break;
280         case MCI_DGV_FF_MPEG:   FIXME("Setting file format (%s) to 'MPEG'\n", str);     break;
281         case MCI_DGV_FF_RDIB:   FIXME("Setting file format (%s) to 'RLE DIB'\n", str);  break;
282         case MCI_DGV_FF_RJPEG:  FIXME("Setting file format (%s) to 'RJPEG'\n", str);    break;
283         default:                FIXME("Setting unknown file format (%s): %ld\n", str, lpParms->dwFileFormat);
284         }
285     }
286     
287     if (dwFlags & MCI_DGV_SET_SPEED) {
288         FIXME("Setting speed to %ld\n", lpParms->dwSpeed);
289     }
290     
291     return 0;
292 }
293
294 /***************************************************************************
295  *                              MCIAVI_mciStatus                        [internal]
296  */
297 DWORD   MCIAVI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSA lpParms)
298 {
299     WINE_MCIAVI*        wma = MCIAVI_mciGetOpenDev(wDevID);
300     DWORD               ret = 0;
301     
302     if (lpParms == NULL)        return MCIERR_NULL_PARAMETER_BLOCK;
303     if (wma == NULL)            return MCIERR_INVALID_DEVICE_ID;
304     
305     if (dwFlags & MCI_STATUS_ITEM) {
306         switch (lpParms->dwItem) {
307         case MCI_STATUS_CURRENT_TRACK:
308             lpParms->dwReturn = 1;
309             TRACE("MCI_STATUS_CURRENT_TRACK => %lu\n", lpParms->dwReturn);
310             break;
311         case MCI_STATUS_LENGTH:
312             if (!wma->hFile) {
313                 lpParms->dwReturn = 0;
314                 return MCIERR_UNSUPPORTED_FUNCTION;
315             }
316             /* only one track in file is currently handled, so don't take care of MCI_TRACK flag */
317             lpParms->dwReturn = MCIAVI_ConvertFrameToTimeFormat(wma, wma->mah.dwTotalFrames, &ret);
318             TRACE("MCI_STATUS_LENGTH => %lu\n", lpParms->dwReturn);
319             break;
320         case MCI_STATUS_MODE:
321             lpParms->dwReturn = MAKEMCIRESOURCE(wma->dwStatus, wma->dwStatus);
322             ret = MCI_RESOURCE_RETURNED;
323             TRACE("MCI_STATUS_MODE => %u\n", LOWORD(lpParms->dwReturn));
324             break;
325         case MCI_STATUS_MEDIA_PRESENT:
326             TRACE("MCI_STATUS_MEDIA_PRESENT => TRUE\n");
327             lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE);
328             ret = MCI_RESOURCE_RETURNED;
329             break;
330         case MCI_STATUS_NUMBER_OF_TRACKS:
331             lpParms->dwReturn = 1;
332             TRACE("MCI_STATUS_NUMBER_OF_TRACKS => %lu\n", lpParms->dwReturn);
333             break;
334         case MCI_STATUS_POSITION:
335             if (!wma->hFile) {
336                 lpParms->dwReturn = 0;
337                 return MCIERR_UNSUPPORTED_FUNCTION;
338             }
339             /* only one track in file is currently handled, so don't take care of MCI_TRACK flag */
340             lpParms->dwReturn = MCIAVI_ConvertFrameToTimeFormat(wma, 
341                                                              (dwFlags & MCI_STATUS_START) ? 0 : wma->dwCurrVideoFrame,
342                                                              &ret);
343             TRACE("MCI_STATUS_POSITION %s => %lu\n", 
344                   (dwFlags & MCI_STATUS_START) ? "start" : "current", lpParms->dwReturn);
345             break;
346         case MCI_STATUS_READY:
347             lpParms->dwReturn = (wma->dwStatus == MCI_MODE_NOT_READY) ?
348                 MAKEMCIRESOURCE(FALSE, MCI_FALSE) : MAKEMCIRESOURCE(TRUE, MCI_TRUE);
349             ret = MCI_RESOURCE_RETURNED;
350             TRACE("MCI_STATUS_READY = %u\n", LOWORD(lpParms->dwReturn));
351             break;
352         case MCI_STATUS_TIME_FORMAT:
353             lpParms->dwReturn = MAKEMCIRESOURCE(wma->dwMciTimeFormat, wma->dwMciTimeFormat);
354             TRACE("MCI_STATUS_TIME_FORMAT => %u\n", LOWORD(lpParms->dwReturn));
355             ret = MCI_RESOURCE_RETURNED;
356             break;
357 #if 0
358         case MCI_AVI_STATUS_AUDIO_BREAKS:
359         case MCI_AVI_STATUS_FRAMES_SKIPPED:
360         case MCI_AVI_STATUS_LAST_PLAY_SPEED:
361         case MCI_DGV_STATUS_AUDIO:
362         case MCI_DGV_STATUS_AUDIO_INPUT:
363         case MCI_DGV_STATUS_AUDIO_RECORD:
364         case MCI_DGV_STATUS_AUDIO_SOURCE:
365         case MCI_DGV_SETAUDIO_AVERAGE:
366         case MCI_DGV_SETAUDIO_LEFT:
367         case MCI_DGV_SETAUDIO_RIGHT:
368         case MCI_DGV_SETAUDIO_STEREO:
369         case MCI_DGV_STATUS_AUDIO_STREAM:
370         case MCI_DGV_STATUS_AVGBYTESPERSEC:
371         case MCI_DGV_STATUS_BASS:
372         case MCI_DGV_STATUS_BITSPERPEL:
373         case MCI_DGV_STATUS_BITSPERSAMPLE:
374         case MCI_DGV_STATUS_BLOCKALIGN:
375         case MCI_DGV_STATUS_BRIGHTNESS:
376         case MCI_DGV_STATUS_COLOR:
377         case MCI_DGV_STATUS_CONTRAST:
378         case MCI_DGV_STATUS_FILEFORMAT:
379         case MCI_DGV_STATUS_FILE_MODE:
380         case MCI_DGV_STATUS_FILE_COMPLETION:
381         case MCI_DGV_STATUS_FORWARD:
382         case MCI_DGV_STATUS_FRAME_RATE:
383         case MCI_DGV_STATUS_GAMMA:
384 #endif
385         case MCI_DGV_STATUS_HPAL:
386             lpParms->dwReturn = 0;
387             TRACE("MCI_DGV_STATUS_HPAL => %lx\n", lpParms->dwReturn);
388             break;
389         case MCI_DGV_STATUS_HWND:
390             lpParms->dwReturn = wma->hWnd;
391             TRACE("MCI_DGV_STATUS_HWND => %u\n", wma->hWnd);
392             break;
393 #if 0
394         case MCI_DGV_STATUS_KEY_COLOR:
395         case MCI_DGV_STATUS_KEY_INDEX:
396         case MCI_DGV_STATUS_MONITOR:
397         case MCI_DGV_MONITOR_FILE:
398         case MCI_DGV_MONITOR_INPUT:
399         case MCI_DGV_STATUS_MONITOR_METHOD:
400         case MCI_DGV_STATUS_PAUSE_MODE:
401         case MCI_DGV_STATUS_SAMPLESPERSECOND:
402         case MCI_DGV_STATUS_SEEK_EXACTLY:
403         case MCI_DGV_STATUS_SHARPNESS:
404         case MCI_DGV_STATUS_SIZE:
405         case MCI_DGV_STATUS_SMPTE:
406         case MCI_DGV_STATUS_SPEED:
407         case MCI_DGV_STATUS_STILL_FILEFORMAT:
408         case MCI_DGV_STATUS_TINT:
409         case MCI_DGV_STATUS_TREBLE:
410         case MCI_DGV_STATUS_UNSAVED:
411         case MCI_DGV_STATUS_VIDEO:
412         case MCI_DGV_STATUS_VIDEO_RECORD:
413         case MCI_DGV_STATUS_VIDEO_SOURCE:
414         case MCI_DGV_STATUS_VIDEO_SRC_NUM:
415         case MCI_DGV_STATUS_VIDEO_STREAM:
416         case MCI_DGV_STATUS_VOLUME:
417         case MCI_DGV_STATUS_WINDOW_VISIBLE:
418         case MCI_DGV_STATUS_WINDOW_MINIMIZED:
419         case MCI_DGV_STATUS_WINDOW_MAXIMIZED:
420         case MCI_STATUS_MEDIA_PRESENT:
421 #endif
422         default:
423             FIXME("Unknowm command %08lX !\n", lpParms->dwItem);
424             TRACE("(%04x, %08lX, %p)\n", wDevID, dwFlags, lpParms);
425             return MCIERR_UNRECOGNIZED_COMMAND;
426         }
427     } else {
428         WARN("No Status-Item!\n");
429         return MCIERR_UNRECOGNIZED_COMMAND;
430     }
431     if (dwFlags & MCI_NOTIFY) {
432         TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback);
433         mciDriverNotify((HWND)LOWORD(lpParms->dwCallback),
434                         wma->openParms.wDeviceID, MCI_NOTIFY_SUCCESSFUL);
435     }
436     
437     return ret;
438 }
439
440