some new functions to msvfw32
eric pouech
eric.pouech at wanadoo.fr
Sat Aug 18 10:34:27 CDT 2001
implemented some MCIWnd functions
A+
--
---------------
Eric Pouech (http://perso.wanadoo.fr/eric.pouech/)
"The future will be better tomorrow", Vice President Dan Quayle
-------------- next part --------------
Name: msvideo
ChangeLog: started implementing the MCIWnd* functions
GenDate: 2001/08/18 15:23:59 UTC
ModifiedFiles: dlls/msvideo/Makefile.in dlls/msvideo/msvfw32.spec dlls/msvideo/msvideo_main.c include/vfw.h dlls/Makefile.in
AddedFiles: dlls/msvideo/mciwnd.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/msvideo/Makefile.in,v
retrieving revision 1.12
diff -u -u -r1.12 Makefile.in
--- dlls/msvideo/Makefile.in 2000/11/30 01:19:51 1.12
+++ dlls/msvideo/Makefile.in 2001/01/03 15:48:54
@@ -9,6 +9,7 @@
SYMBOLFILE = $(MODULE).tmp.o
C_SRCS = \
+ mciwnd.c \
msvideo_main.c \
drawdib.c
Index: dlls/msvideo/msvfw32.spec
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/msvideo/msvfw32.spec,v
retrieving revision 1.9
diff -u -u -r1.9 msvfw32.spec
--- dlls/msvideo/msvfw32.spec 2001/02/21 02:20:45 1.9
+++ dlls/msvideo/msvfw32.spec 2001/04/05 17:48:43
@@ -2,13 +2,14 @@
type win32
import winmm.dll
+import comctl32.dll
import version.dll
import user32.dll
import gdi32.dll
import kernel32.dll
import ntdll.dll
-debug_channels (msvideo)
+debug_channels (mci msvideo)
# Yes, ICCompress,ICDecompress,MCIWnd* and ICDraw* are cdecl (VFWAPIV).
# The rest is stdcall (VFWAPI) however. -Marcus Meissner, 990124
@@ -59,5 +60,5 @@
@ cdecl MCIWndCreate (long long long str) MCIWndCreateA
@ cdecl MCIWndCreateA (long long long str) MCIWndCreateA
@ cdecl MCIWndCreateW (long long long wstr) MCIWndCreateW
-@ stub MCIWndRegisterClass
+@ stdcall MCIWndRegisterClass (long) MCIWndRegisterClass
@ stub StretchDIB
Index: dlls/msvideo/msvideo_main.c
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/msvideo/msvideo_main.c,v
retrieving revision 1.29
diff -u -u -r1.29 msvideo_main.c
--- dlls/msvideo/msvideo_main.c 2001/07/11 18:56:42 1.29
+++ dlls/msvideo/msvideo_main.c 2001/07/12 05:13:47
@@ -1182,23 +1182,3 @@
return ICClose(hic);
}
-/***********************************************************************
- * MCIWndCreate [MSVFW32.@]
- * MCIWndCreateA [MSVFW32.@]
- */
-HWND VFWAPIV MCIWndCreateA(HWND hwndParent, HINSTANCE hInstance,
- DWORD dwStyle,LPCSTR szFile)
-{
- FIXME("%x %x %lx %s\n",hwndParent, hInstance, dwStyle, szFile);
- return 0;
-}
-
-/***********************************************************************
- * MCIWndCreateW [MSVFW32.@]
- */
-HWND VFWAPIV MCIWndCreateW(HWND hwndParent, HINSTANCE hInstance,
- DWORD dwStyle,LPCWSTR szFile)
-{
- FIXME("%x %x %lx %s\n",hwndParent, hInstance, dwStyle, debugstr_w(szFile));
- return 0;
-}
Index: include/vfw.h
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/include/vfw.h,v
retrieving revision 1.24
diff -u -u -r1.24 vfw.h
--- include/vfw.h 2001/06/07 22:28:19 1.24
+++ include/vfw.h 2001/06/08 16:57:01
@@ -27,7 +27,7 @@
/* Installable Compressor Manager */
-DECLARE_HANDLE(HIC);
+DECLARE_OLD_HANDLE(HIC);
#ifdef __WINE__
/* HIC struct (same layout as Win95 one) */
Index: dlls/Makefile.in
===================================================================
RCS file: /usr/share/cvs/cvsroot/wine/wine/dlls/Makefile.in,v
retrieving revision 1.100
diff -u -u -r1.100 Makefile.in
--- dlls/Makefile.in 2001/07/27 19:49:49 1.100
+++ dlls/Makefile.in 2001/08/15 07:57:41
@@ -445,9 +455,9 @@
lzexpand/liblz32. at LIBEXT@: libkernel32. at LIBEXT@ libntdll. at LIBEXT@
mpr/libmpr. at LIBEXT@: libkernel32. at LIBEXT@ libntdll. at LIBEXT@
msacm/libmsacm32. at LIBEXT@: libwinmm. at LIBEXT@ libuser32. at LIBEXT@ libadvapi32. at LIBEXT@ libkernel32. at LIBEXT@ libntdll. at LIBEXT@
msnet32/libmsnet32. at LIBEXT@: libntdll. at LIBEXT@
msvcrt/libmsvcrt. at LIBEXT@: libkernel32. at LIBEXT@ libntdll. at LIBEXT@
-msvideo/libmsvfw32. at LIBEXT@: libwinmm. at LIBEXT@ libversion. at LIBEXT@ libuser32. at LIBEXT@ libgdi32. at LIBEXT@ libkernel32. at LIBEXT@ libntdll. at LIBEXT@
+msvideo/libmsvfw32. at LIBEXT@: libcomctl32. at LIBEXT@ libwinmm. at LIBEXT@ libversion. at LIBEXT@ libuser32. at LIBEXT@ libgdi32. at LIBEXT@ libkernel32. at LIBEXT@ libntdll. at LIBEXT@
odbc32/libodbc32. at LIBEXT@: libntdll. at LIBEXT@
ole32/libole32. at LIBEXT@: libadvapi32. at LIBEXT@ libuser32. at LIBEXT@ libgdi32. at LIBEXT@ librpcrt4. at LIBEXT@ libkernel32. at LIBEXT@ libntdll. at LIBEXT@
oleaut32/liboleaut32. at LIBEXT@: libole32. at LIBEXT@ libuser32. at LIBEXT@ libgdi32. at LIBEXT@ libadvapi32. at LIBEXT@ libkernel32. at LIBEXT@ libntdll. at LIBEXT@
--- /dev/null Wed Sep 27 12:31:54 2000
+++ dlls/msvideo/mciwnd.c Tue Jun 19 21:08:57 2001
@@ -0,0 +1,329 @@
+/*
+ * Copyright 2000 Eric Pouech
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "winbase.h"
+#include "windef.h"
+#include "winnls.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "vfw.h"
+#include "wine/mmsystem16.h"
+#include "digitalv.h"
+#include "commctrl.h"
+#include "debugtools.h"
+
+DEFAULT_DEBUG_CHANNEL(mci);
+
+typedef struct {
+ DWORD dwStyle;
+ MCIDEVICEID mci;
+ LPSTR lpName;
+ HWND hWnd;
+ UINT uTimer;
+} MCIWndInfo;
+
+static LRESULT WINAPI MCIWndProc(HWND hWnd, UINT wMsg, WPARAM lParam1, LPARAM lParam2);
+
+#define CTL_PLAYSTOP 0x3200
+#define CTL_MENU 0x3201
+#define CTL_TRACKBAR 0x3202
+
+/***********************************************************************
+ * MCIWndRegisterClass [MSVFW.@]
+ */
+BOOL WINAPI MCIWndRegisterClass(HINSTANCE hInst)
+{
+ WNDCLASSA wc;
+
+ /* since window creation will also require some common controls, init them */
+ InitCommonControls();
+
+ wc.style = 0;
+ wc.lpfnWndProc = MCIWndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = sizeof(MCIWndInfo*);
+ wc.hInstance = hInst;
+ wc.hIcon = 0;
+ wc.hCursor = 0;
+ wc.hbrBackground = 0;
+ wc.lpszMenuName = NULL;
+ wc.lpszClassName = "MCIWndClass";
+
+ return RegisterClassA(&wc);
+
+}
+
+/***********************************************************************
+ * MCIWndCreate [MSVFW.@]
+ * MCIWndCreateA [MSVFW.@]
+ */
+HWND VFWAPIV MCIWndCreateA(HWND hwndParent, HINSTANCE hInstance,
+ DWORD dwStyle, LPCSTR szFile)
+{
+ DWORD wndStyle;
+ MCIWndInfo* mwi;
+
+ TRACE("%x %x %lx %s\n", hwndParent, hInstance, dwStyle, szFile);
+
+ MCIWndRegisterClass(hInstance);
+
+ mwi = HeapAlloc(GetProcessHeap(), 0, sizeof(*mwi));
+ if (!mwi) return 0;
+
+ mwi->dwStyle = dwStyle;
+ mwi->lpName = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(szFile) + 1), szFile);
+ mwi->uTimer = 0;
+
+ wndStyle = ((hwndParent) ? (WS_CHILD|WS_BORDER) : WS_OVERLAPPEDWINDOW) |
+ WS_VISIBLE | (dwStyle & 0xFFFF0000);
+
+ if (CreateWindowExA(0, "MCIWndClass", NULL, wndStyle,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ hwndParent, (HMENU)0, hInstance, mwi))
+ return mwi->hWnd;
+
+ HeapFree(GetProcessHeap(), 0, mwi->lpName);
+ HeapFree(GetProcessHeap(), 0, mwi);
+ return 0;
+}
+
+/***********************************************************************
+ * MCIWndCreateW [MSVFW.@]
+ */
+HWND VFWAPIV MCIWndCreateW(HWND hwndParent, HINSTANCE hInstance,
+ DWORD dwStyle, LPCWSTR szFile)
+{
+ FIXME("%x %x %lx %s\n", hwndParent, hInstance, dwStyle, debugstr_w(szFile));
+
+ MCIWndRegisterClass(hInstance);
+
+ return 0;
+}
+
+static DWORD MCIWND_GetStatus(MCIWndInfo* mwi)
+{
+ MCI_DGV_STATUS_PARMSA mdsp;
+
+ memset(&mdsp, 0, sizeof(mdsp));
+ mdsp.dwItem = MCI_STATUS_MODE;
+ if (mciSendCommandA(mwi->mci, MCI_STATUS, MCI_WAIT|MCI_STATUS_ITEM, (DWORD)&mdsp))
+ return MCI_MODE_NOT_READY;
+ if (mdsp.dwReturn == MCI_MODE_STOP && mwi->uTimer) {
+ TRACE("Killing timer\n");
+ KillTimer(mwi->hWnd, 0);
+ mwi->uTimer = 0;
+ }
+ return mdsp.dwReturn;
+}
+
+static DWORD MCIWND_Get(MCIWndInfo* mwi, DWORD what)
+{
+ MCI_DGV_STATUS_PARMSA mdsp;
+
+ memset(&mdsp, 0, sizeof(mdsp));
+ mdsp.dwItem = what;
+ if (mciSendCommandA(mwi->mci, MCI_STATUS, MCI_WAIT|MCI_STATUS_ITEM, (DWORD)&mdsp))
+ return 0;
+ return mdsp.dwReturn;
+}
+
+static void MCIWND_SetText(MCIWndInfo* mwi)
+{
+ char buffer[1024];
+
+ if (mwi->dwStyle & MCIWNDF_SHOWNAME) {
+ strcpy(buffer, mwi->lpName);
+ } else {
+ *buffer = 0;
+ }
+
+ if (mwi->dwStyle & (MCIWNDF_SHOWPOS|MCIWNDF_SHOWMODE)) {
+ if (*buffer) strcat(buffer, " ");
+ strcat(buffer, "(");
+ }
+
+ if (mwi->dwStyle & MCIWNDF_SHOWPOS) {
+ sprintf(buffer + strlen(buffer), "%ld", MCIWND_Get(mwi, MCI_STATUS_POSITION));
+ }
+
+ if ((mwi->dwStyle & (MCIWNDF_SHOWPOS|MCIWNDF_SHOWMODE)) == (MCIWNDF_SHOWPOS|MCIWNDF_SHOWMODE)) {
+ strcat(buffer, " - ");
+ }
+
+ if (mwi->dwStyle & MCIWNDF_SHOWMODE) {
+ switch (MCIWND_GetStatus(mwi)) {
+ case MCI_MODE_NOT_READY: strcat(buffer, "not ready"); break;
+ case MCI_MODE_PAUSE: strcat(buffer, "paused"); break;
+ case MCI_MODE_PLAY: strcat(buffer, "playing"); break;
+ case MCI_MODE_STOP: strcat(buffer, "stopped"); break;
+ case MCI_MODE_OPEN: strcat(buffer, "open"); break;
+ case MCI_MODE_RECORD: strcat(buffer, "recording"); break;
+ case MCI_MODE_SEEK: strcat(buffer, "seeking"); break;
+ default: strcat(buffer, "???"); break;
+ }
+ }
+ if (mwi->dwStyle & (MCIWNDF_SHOWPOS|MCIWNDF_SHOWMODE)) {
+ strcat(buffer, " )");
+ }
+ TRACE("=> '%s'\n", buffer);
+ SetWindowTextA(mwi->hWnd, buffer);
+}
+
+static void MCIWND_Create(HWND hWnd, LPCREATESTRUCTA cs)
+{
+ MCI_DGV_OPEN_PARMSA mdopn;
+ MCI_DGV_RECT_PARMS mdrct;
+ MMRESULT mmr;
+ int cx, cy;
+ HWND hChld;
+ MCIWndInfo* mwi = (MCIWndInfo*)cs->lpCreateParams;
+
+ SetWindowLongA(hWnd, 0, (LPARAM)mwi);
+ mwi->hWnd = hWnd;
+
+ /* now open MCI player for AVI file */
+ memset(&mdopn, 0, sizeof(mdopn));
+ mdopn.lpstrElementName = mwi->lpName;
+ mdopn.dwStyle = WS_VISIBLE|WS_CHILD;
+ mdopn.hWndParent = hWnd;
+
+ mmr = mciSendCommandA(0, MCI_OPEN, MCI_OPEN_ELEMENT|MCI_DGV_OPEN_PARENT|MCI_DGV_OPEN_WS, (LPARAM)&mdopn);
+ if (mmr) {
+ MessageBoxA(GetTopWindow(hWnd), "Cannot open file", "MciWnd", MB_OK);
+ return;
+ }
+ mwi->mci = mdopn.wDeviceID;
+
+ /* grab AVI window size */
+ memset(&mdrct, 0, sizeof(mdrct));
+ mmr = mciSendCommandA(mwi->mci, MCI_WHERE, MCI_DGV_WHERE_DESTINATION, (LPARAM)&mdrct);
+ if (mmr) {
+ WARN("Cannot get window rect\n");
+ return;
+ }
+ cx = mdrct.rc.right - mdrct.rc.left;
+ cy = mdrct.rc.bottom - mdrct.rc.top;
+
+ AdjustWindowRect(&mdrct.rc, GetWindowLongA(hWnd, GWL_STYLE), FALSE);
+ SetWindowPos(hWnd, 0, 0, 0, mdrct.rc.right - mdrct.rc.left,
+ mdrct.rc.bottom - mdrct.rc.top + 32, SWP_NOMOVE|SWP_NOZORDER);
+
+ /* adding the other elements: play/stop button, menu button, status */
+ hChld = CreateWindowExA(0, "BUTTON", "Play", WS_CHILD|WS_VISIBLE, 0, cy, 32, 32,
+ hWnd, (HMENU)CTL_PLAYSTOP, GetWindowLongA(hWnd, GWL_HINSTANCE), 0L);
+ TRACE("Get Button1: %04x\n", hChld);
+ hChld = CreateWindowExA(0, "BUTTON", "Menu", WS_CHILD|WS_VISIBLE, 32, cy, 32, 32,
+ hWnd, (HMENU)CTL_MENU, GetWindowLongA(hWnd, GWL_HINSTANCE), 0L);
+ TRACE("Get Button2: %04x\n", hChld);
+ hChld = CreateWindowExA(0, TRACKBAR_CLASSA, "", WS_CHILD|WS_VISIBLE, 64, cy, cx - 64, 32,
+ hWnd, (HMENU)CTL_TRACKBAR, GetWindowLongA(hWnd, GWL_HINSTANCE), 0L);
+ TRACE("Get status: %04x\n", hChld);
+ SendMessageA(hChld, TBM_SETRANGEMIN, 0L, 0L);
+ SendMessageA(hChld, TBM_SETRANGEMAX, 1L, MCIWND_Get(mwi, MCI_STATUS_LENGTH));
+
+ /* FIXME: no need to set it if child window */
+ MCIWND_SetText(mwi);
+}
+
+static void MCIWND_Paint(MCIWndInfo* mwi, WPARAM wParam)
+{
+ HDC hdc;
+ PAINTSTRUCT ps;
+
+ hdc = (wParam) ? (HDC)wParam : BeginPaint(mwi->hWnd, &ps);
+ /* something to do ? */
+ if (!wParam) EndPaint(mwi->hWnd, &ps);
+}
+
+static void MCIWND_ToggleState(MCIWndInfo* mwi)
+{
+ MCI_GENERIC_PARMS mgp;
+ MCI_DGV_PLAY_PARMS mdply;
+
+ memset(&mgp, 0, sizeof(mgp));
+ memset(&mdply, 0, sizeof(mdply));
+
+ switch (MCIWND_GetStatus(mwi)) {
+ case MCI_MODE_NOT_READY:
+ case MCI_MODE_RECORD:
+ case MCI_MODE_SEEK:
+ case MCI_MODE_OPEN:
+ TRACE("Cannot do much...\n");
+ break;
+ case MCI_MODE_PAUSE:
+ mciSendCommandA(mwi->mci, MCI_RESUME, MCI_WAIT, (LPARAM)&mgp);
+ break;
+ case MCI_MODE_PLAY:
+ mciSendCommandA(mwi->mci, MCI_PAUSE, MCI_WAIT, (LPARAM)&mgp);
+ break;
+ case MCI_MODE_STOP:
+ mdply.dwFrom = 0L;
+ mciSendCommandA(mwi->mci, MCI_PLAY, MCI_FROM, (LPARAM)&mdply);
+ mwi->uTimer = SetTimer(mwi->hWnd, 0, 333, 0L);
+ TRACE("Timer=%u\n", mwi->uTimer);
+ break;
+ }
+}
+
+static LRESULT MCIWND_Command(MCIWndInfo* mwi, WPARAM wParam, LPARAM lParam)
+{
+ switch (LOWORD(wParam)) {
+ case CTL_PLAYSTOP: MCIWND_ToggleState(mwi); break;
+ case CTL_MENU:
+ case CTL_TRACKBAR:
+ default:
+ MessageBoxA(0, "ooch", "NIY", MB_OK);
+ }
+ return 0L;
+}
+
+static void MCIWND_Timer(MCIWndInfo* mwi, WPARAM wParam, LPARAM lParam)
+{
+ TRACE("%ld\n", MCIWND_Get(mwi, MCI_STATUS_POSITION));
+ SendDlgItemMessageA(mwi->hWnd, CTL_TRACKBAR, TBM_SETPOS, 1, MCIWND_Get(mwi, MCI_STATUS_POSITION));
+ MCIWND_SetText(mwi);
+}
+
+static void MCIWND_Close(MCIWndInfo* mwi)
+{
+ MCI_GENERIC_PARMS mgp;
+
+ memset(&mgp, 0, sizeof(mgp));
+
+ mciSendCommandA(mwi->mci, MCI_CLOSE, 0, (LPARAM)&mgp);
+}
+
+static LRESULT WINAPI MCIWndProc(HWND hWnd, UINT wMsg, WPARAM lParam1, LPARAM lParam2)
+{
+ MCIWndInfo* mwi = (MCIWndInfo*)GetWindowLongA(hWnd, 0);
+
+ if (mwi || wMsg == WM_CREATE) {
+ switch (wMsg) {
+ case WM_CREATE:
+ MCIWND_Create(hWnd, (CREATESTRUCTA*)lParam2);
+ return 0;
+ case WM_DESTROY:
+ MCIWND_Close(mwi);
+ HeapFree(GetProcessHeap(), 0, mwi->lpName);
+ HeapFree(GetProcessHeap(), 0, mwi);
+ break;
+ case WM_PAINT:
+ MCIWND_Paint(mwi, lParam1);
+ break;
+ case WM_COMMAND:
+ return MCIWND_Command(mwi, lParam1, lParam2);
+ case WM_TIMER:
+ MCIWND_Timer(mwi, lParam1, lParam2);
+ return TRUE;
+ }
+ }
+
+ return DefWindowProcA(hWnd, wMsg, lParam1, lParam2);
+}
+
More information about the wine-patches
mailing list