From: Akihiro Sagawa sagawa.aki@gmail.com
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/mciqtz32/mciqtz.c | 11 +++++++---- dlls/winmm/tests/mci.c | 5 +++++ 2 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c index a7ec0b78f33..5bde3f5dd14 100644 --- a/dlls/mciqtz32/mciqtz.c +++ b/dlls/mciqtz32/mciqtz.c @@ -449,10 +449,13 @@ static DWORD MCIQTZ_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
IVideoWindow_put_Visible(wma->vidwin, OATRUE);
- wma->thread = CreateThread(NULL, 0, MCIQTZ_notifyThread, wma, 0, NULL); - if (!wma->thread) { - TRACE("Can't create thread\n"); - return MCIERR_INTERNAL; + if (!wma->thread) + { + wma->thread = CreateThread(NULL, 0, MCIQTZ_notifyThread, wma, 0, NULL); + if (!wma->thread) { + TRACE("Can't create thread\n"); + return MCIERR_INTERNAL; + } } return 0; } diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index cfad9a77da8..786c79ea783 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -1320,6 +1320,11 @@ static void test_playWaveTypeMpegvideo(void) ok(status_parm.dwReturn == MCI_MODE_PLAY, "mciCommand status mode: %lu\n", (DWORD)status_parm.dwReturn);
+ /* a second play should be ignored */ + err = mciSendStringA("play mysound", NULL, 0, NULL); + ok(!err,"mci play retuend %s\n", dbg_mcierr(err)); + + /* audio volume */ err = mciSendStringA("setaudio mysound volume to 1000", NULL, 0, NULL); ok(!err,"mci setaudio volume to 1000 returned %s\n", dbg_mcierr(err));
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=118134
Your paranoid android.
=== debian11 (32 bit report) ===
winmm: mci.c:1340: Test failed: mci status mode: stopped
=== debian11 (32 bit Arabic:Morocco report) ===
winmm: mci.c:1333: Test failed: mci status mode: stopped mci.c:1340: Test failed: mci status mode: stopped
=== debian11 (32 bit German report) ===
winmm: mci.c:1333: Test failed: mci status mode: stopped mci.c:1340: Test failed: mci status mode: stopped
=== debian11 (32 bit Hebrew:Israel report) ===
winmm: mci.c:1340: Test failed: mci status mode: stopped
=== debian11 (32 bit Hindi:India report) ===
winmm: mci.c:1340: Test failed: mci status mode: stopped
=== debian11 (32 bit Chinese:China report) ===
winmm: mci.c:1340: Test failed: mci status mode: stopped
=== debian11 (32 bit WoW report) ===
winmm: mci.c:1333: Test failed: mci status mode: stopped mci.c:1340: Test failed: mci status mode: stopped
=== debian11 (64 bit WoW report) ===
winmm: mci.c:1333: Test failed: mci status mode: stopped mci.c:1340: Test failed: mci status mode: stopped
From: Akihiro Sagawa sagawa.aki@gmail.com
Now the video window by IVideoWindow always has WS_CHILD style regardless open parameters.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52448 Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/mciqtz32/mciqtz.c | 162 +++++++++++++++++++++++++-------- dlls/mciqtz32/mciqtz_private.h | 1 + 2 files changed, 127 insertions(+), 36 deletions(-)
diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c index 5bde3f5dd14..118f8d28f2d 100644 --- a/dlls/mciqtz32/mciqtz.c +++ b/dlls/mciqtz32/mciqtz.c @@ -31,8 +31,11 @@
WINE_DEFAULT_DEBUG_CHANNEL(mciqtz);
+#define MCIQTZ_CLASS L"MCIQTZ_Window" + static DWORD MCIQTZ_mciClose(UINT, DWORD, LPMCI_GENERIC_PARMS); static DWORD MCIQTZ_mciStop(UINT, DWORD, LPMCI_GENERIC_PARMS); +static DWORD MCIQTZ_mciPause(UINT, DWORD, LPMCI_GENERIC_PARMS);
/*======================================================================* * MCI QTZ implementation * @@ -68,6 +71,62 @@ static WINE_MCIQTZ* MCIQTZ_mciGetOpenDev(UINT wDevID) return wma; }
+static LRESULT WINAPI MCIQTZ_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + TRACE("hwnd=%p msg=%x wparam=%Ix lparam=%Ix\n", hWnd, uMsg, wParam, lParam); + + switch (uMsg) { + case WM_CREATE: + { + LPARAM wDevId = (LPARAM)((CREATESTRUCTW *)lParam)->lpCreateParams; + SetWindowLongW(hWnd, 0, wDevId); + return DefWindowProcW(hWnd, uMsg, wParam, lParam); + } + + case WM_CLOSE: + { + MCIQTZ_mciPause(GetWindowLongW(hWnd, 0), MCI_WAIT, NULL); + ShowWindow(hWnd, SW_HIDE); + return 0; + } + + case WM_ERASEBKGND: + { + RECT rect; + GetClientRect(hWnd, &rect); + FillRect((HDC)wParam, &rect, GetStockObject(BLACK_BRUSH)); + return 1; + } + + default: + return DefWindowProcW(hWnd, uMsg, wParam, lParam); + } +} + +static BOOL MCIQTZ_UnregisterClass(void) +{ + return UnregisterClassW(MCIQTZ_CLASS, MCIQTZ_hInstance); +} + +static BOOL MCIQTZ_RegisterClass(void) +{ + WNDCLASSW wndClass; + + ZeroMemory(&wndClass, sizeof(WNDCLASSW)); + wndClass.style = CS_DBLCLKS; + wndClass.lpfnWndProc = MCIQTZ_WindowProc; + wndClass.cbWndExtra = sizeof(MCIDEVICEID); + wndClass.hInstance = MCIQTZ_hInstance; + wndClass.hCursor = LoadCursorW(0, (LPCWSTR)IDC_ARROW); + wndClass.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); + wndClass.lpszClassName = MCIQTZ_CLASS; + + if (RegisterClassW(&wndClass)) return TRUE; + if (GetLastError() == ERROR_CLASS_ALREADY_EXISTS) return TRUE; + + return FALSE; +} + /************************************************************************** * MCIQTZ_drvOpen [internal] */ @@ -81,6 +140,8 @@ static DWORD MCIQTZ_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp) if (!modp) return 0xFFFFFFFF;
+ if (!MCIQTZ_RegisterClass()) return 0; + wma = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MCIQTZ)); if (!wma) return 0; @@ -109,6 +170,7 @@ static DWORD MCIQTZ_drvClose(DWORD dwDevID) /* finish all outstanding things */ MCIQTZ_mciClose(dwDevID, MCI_WAIT, NULL);
+ MCIQTZ_UnregisterClass(); mciFreeCommandResource(wma->command_table); mciSetDriverData(dwDevID, 0); CloseHandle(wma->stop_event); @@ -139,6 +201,54 @@ static DWORD MCIQTZ_drvConfigure(DWORD dwDevID) return 1; }
+static BOOL MCIQTZ_CreateWindow(WINE_MCIQTZ* wma, DWORD dwFlags, LPMCI_DGV_OPEN_PARMSW lpParms) +{ + HWND hParent = NULL; + DWORD dwStyle = (WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS) & ~WS_MAXIMIZEBOX; + RECT rc; + HRESULT hr; + + /* what should be done ? */ + if (wma->window) return TRUE; + + if (dwFlags & MCI_DGV_OPEN_PARENT) hParent = lpParms->hWndParent; + if (dwFlags & MCI_DGV_OPEN_WS) dwStyle = lpParms->dwStyle; + + dwStyle &= ~WS_VISIBLE; + + rc.left = rc.top = 0; + hr = IBasicVideo_GetVideoSize(wma->vidbasic, &rc.right, &rc.bottom); + if (FAILED(hr)) return hr == E_NOINTERFACE; /* no video renderer ? */ + + AdjustWindowRect(&rc, dwStyle, FALSE); + if (!(dwStyle & (WS_CHILD|WS_POPUP))) /* overlapped window ? */ + { + rc.right -= rc.left; + rc.bottom -= rc.top; + rc.left = rc.top = CW_USEDEFAULT; + } + + wma->window = CreateWindowW(MCIQTZ_CLASS, lpParms->lpstrElementName, dwStyle, + rc.left, rc.top, rc.right, rc.bottom, + hParent, 0, MCIQTZ_hInstance, + ULongToPtr(wma->wDevID)); + + TRACE("(%04x, %08lX, %p, style %lx, parent %p, dimensions %ldx%ld, window %p)\n", wma->wDevID, + dwFlags, lpParms, dwStyle, hParent, rc.right - (rc.left == CW_USEDEFAULT ? 0 : rc.left), rc.bottom - (rc.top == CW_USEDEFAULT ? 0 : rc.top), wma->window); + + if (!wma->window) + return FALSE; + + wma->parent = wma->window; + IVideoWindow_put_AutoShow(wma->vidwin, OAFALSE); + IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)wma->parent); + IVideoWindow_put_WindowStyle(wma->vidwin, WS_CHILD); + IVideoWindow_put_Owner(wma->vidwin, (OAHWND)wma->parent); + IVideoWindow_put_Visible(wma->vidwin, OATRUE); + + return TRUE; +} + /************************************************************************** * MCIQTZ_mciNotify [internal] * @@ -161,8 +271,6 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags, { WINE_MCIQTZ* wma; HRESULT hr; - DWORD style = 0; - RECT rc = { 0, 0, 0, 0 };
TRACE("(%04x, %08lX, %p)\n", wDevID, dwFlags, lpOpenParms);
@@ -238,22 +346,7 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags, goto err; }
- IVideoWindow_put_AutoShow(wma->vidwin, OAFALSE); - IVideoWindow_put_Visible(wma->vidwin, OAFALSE); - if (dwFlags & MCI_DGV_OPEN_WS) - style = lpOpenParms->dwStyle; - if (dwFlags & MCI_DGV_OPEN_PARENT) { - IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)lpOpenParms->hWndParent); - IVideoWindow_put_WindowState(wma->vidwin, SW_HIDE); - IVideoWindow_put_WindowStyle(wma->vidwin, style|WS_CHILD); - IVideoWindow_put_Owner(wma->vidwin, (OAHWND)lpOpenParms->hWndParent); - GetClientRect(lpOpenParms->hWndParent, &rc); - IVideoWindow_SetWindowPosition(wma->vidwin, rc.left, rc.top, rc.right - rc.top, rc.bottom - rc.top); - wma->parent = (HWND)lpOpenParms->hWndParent; - } - else if (style) - IVideoWindow_put_WindowStyle(wma->vidwin, style); - IBasicVideo_GetVideoSize(wma->vidbasic, &rc.right, &rc.bottom); + MCIQTZ_CreateWindow(wma, dwFlags, lpOpenParms); wma->opened = TRUE;
if (dwFlags & MCI_NOTIFY) @@ -307,6 +400,13 @@ static DWORD MCIQTZ_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpP MCIQTZ_mciStop(wDevID, MCI_WAIT, NULL);
if (wma->opened) { + if (wma->window) + { + IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)NULL); + IVideoWindow_put_Owner(wma->vidwin, (OAHWND)NULL); + DestroyWindow(wma->window); + wma->window = NULL; + } IVideoWindow_Release(wma->vidwin); IBasicVideo_Release(wma->vidbasic); IBasicAudio_Release(wma->audio); @@ -447,7 +547,8 @@ static DWORD MCIQTZ_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms return MCIERR_INTERNAL; }
- IVideoWindow_put_Visible(wma->vidwin, OATRUE); + if (wma->parent) + ShowWindow(wma->parent, SW_SHOW);
if (!wma->thread) { @@ -528,9 +629,6 @@ static DWORD MCIQTZ_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPa wma->thread = NULL; }
- if (!wma->parent) - IVideoWindow_put_Visible(wma->vidwin, OAFALSE); - return 0; }
@@ -577,6 +675,9 @@ static DWORD MCIQTZ_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lp return MCIERR_INTERNAL; }
+ if (wma->parent) + ShowWindow(wma->parent, SW_SHOW); + return 0; }
@@ -922,21 +1023,10 @@ static DWORD MCIQTZ_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMS return 0;
if (dwFlags & MCI_DGV_WINDOW_HWND && (IsWindow(lpParms->hWnd) || !lpParms->hWnd)) { - LONG visible = OATRUE; - LONG style = 0; TRACE("Setting hWnd to %p\n", lpParms->hWnd); - IVideoWindow_get_Visible(wma->vidwin, &visible); - IVideoWindow_put_Visible(wma->vidwin, OAFALSE); - IVideoWindow_get_WindowStyle(wma->vidwin, &style); - style &= ~WS_CHILD; - if (lpParms->hWnd) - IVideoWindow_put_WindowStyle(wma->vidwin, style|WS_CHILD); - else - IVideoWindow_put_WindowStyle(wma->vidwin, style); - IVideoWindow_put_Owner(wma->vidwin, (OAHWND)lpParms->hWnd); - IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)lpParms->hWnd); - IVideoWindow_put_Visible(wma->vidwin, visible); - wma->parent = lpParms->hWnd; + wma->parent = lpParms->hWnd ? lpParms->hWnd : wma->window; + IVideoWindow_put_MessageDrain(wma->vidwin, (OAHWND)wma->parent); + IVideoWindow_put_Owner(wma->vidwin, (OAHWND)wma->parent); } if (dwFlags & MCI_DGV_WINDOW_STATE) { TRACE("Setting nCmdShow to %d\n", lpParms->nCmdShow); diff --git a/dlls/mciqtz32/mciqtz_private.h b/dlls/mciqtz32/mciqtz_private.h index aa6fad99326..9206a88b3fa 100644 --- a/dlls/mciqtz32/mciqtz_private.h +++ b/dlls/mciqtz32/mciqtz_private.h @@ -42,6 +42,7 @@ typedef struct { REFERENCE_TIME seek_stop; UINT command_table; HWND parent; + HWND window; MCIDEVICEID notify_devid; HANDLE callback; HANDLE thread;
From: Akihiro Sagawa sagawa.aki@gmail.com
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/winmm/tests/Makefile.in | 3 ++ dlls/winmm/tests/mci.c | 75 +++++++++++++++++++++++++++++++++++ dlls/winmm/tests/rsrc.rc | 25 ++++++++++++ dlls/winmm/tests/test.mpg | Bin 0 -> 12288 bytes 4 files changed, 103 insertions(+) create mode 100644 dlls/winmm/tests/rsrc.rc create mode 100644 dlls/winmm/tests/test.mpg
diff --git a/dlls/winmm/tests/Makefile.in b/dlls/winmm/tests/Makefile.in index 1b191cb5747..2b475dd89c3 100644 --- a/dlls/winmm/tests/Makefile.in +++ b/dlls/winmm/tests/Makefile.in @@ -12,3 +12,6 @@ C_SRCS = \ mmio.c \ timer.c \ wave.c + +RC_SRCS = \ + rsrc.rc diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index 786c79ea783..57fd6932986 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -23,6 +23,7 @@ #include "windows.h" #include "mmsystem.h" #include "mmreg.h" +#include "digitalv.h" #include "wine/test.h"
/* The tests use the MCI's own save capability to create the tempfile.wav to play. @@ -37,6 +38,7 @@ typedef union { MCI_GETDEVCAPS_PARMS caps; MCI_SYSINFO_PARMSA sys; MCI_SEEK_PARMS seek; + MCI_DGV_OPEN_PARMSW dgv_open; MCI_GENERIC_PARMS gen; } MCI_PARMS_UNION;
@@ -139,6 +141,31 @@ static BOOL spurious_message(LPMSG msg) return FALSE; }
+static WCHAR *load_resource(const WCHAR *name) +{ + static WCHAR pathW[MAX_PATH]; + DWORD written; + HANDLE file; + HRSRC res; + void *ptr; + + GetTempPathW(ARRAY_SIZE(pathW), pathW); + wcscat(pathW, name); + + file = CreateFileW(pathW, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); + ok(file != INVALID_HANDLE_VALUE, "Failed to create file %s, error %lu.\n", + wine_dbgstr_w(pathW), GetLastError()); + + res = FindResourceW(NULL, name, (LPCWSTR)RT_RCDATA); + ok(!!res, "Failed to load resource, error %lu.\n", GetLastError()); + ptr = LockResource(LoadResource(GetModuleHandleA(NULL), res)); + WriteFile(file, ptr, SizeofResource( GetModuleHandleA(NULL), res), &written, NULL); + ok(written == SizeofResource(GetModuleHandleA(NULL), res), "Failed to write resource.\n"); + CloseHandle(file); + + return pathW; +} + /* A single ok() in each code path allows us to prefix this with todo_wine */ #define test_notification(hwnd, command, type) test_notification_dbg(hwnd, command, type, __LINE__) static void test_notification_dbg(HWND hwnd, const char* command, WPARAM type, int line) @@ -1431,6 +1458,51 @@ static void test_threads(void) ok(mr == 0, "close gave: 0x%lx\n", mr); }
+static void test_video_window(HWND hwnd) +{ + const WCHAR *filename = load_resource(L"test.mpg"); + MCI_PARMS_UNION parm; + MCIERROR err; + HWND video_window, parent; + MCIDEVICEID wDeviceID; + DWORD style, expected; + BOOL ret; + + parm.dgv_open.lpstrDeviceType = (WCHAR *)L"MPEGVideo"; + parm.dgv_open.lpstrElementName = (WCHAR *)filename; + parm.dgv_open.hWndParent = hwnd; + err = mciSendCommandW(0, MCI_OPEN, + MCI_OPEN_ELEMENT | MCI_OPEN_TYPE | MCI_DGV_OPEN_PARENT, + (DWORD_PTR)&parm); + ok(!err,"mciCommand open test.mpg type MPEGVideo returned %s\n", dbg_mcierr(err)); + wDeviceID = parm.dgv_open.wDeviceID; + + parm.status.dwItem = MCI_DGV_STATUS_HWND; + parm.status.dwReturn = 0xdeadbeef; + err = mciSendCommandW(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD_PTR)&parm); + todo_wine ok(!err,"mciCommand status hwnd returned %s\n", dbg_mcierr(err)); + if (err) + { + skip("MCI_DGV_STATUS_HWND got an error\n"); + goto close; + } + video_window = (HWND)parm.status.dwReturn; + + ok(IsWindow(video_window), "video window %p doesn't exist.\n", video_window); + parent = GetWindow(video_window, GW_OWNER); + ok(hwnd == parent, "expected owner %p, got %p\n", hwnd, parent); + style = GetWindowLongW(video_window, GWL_STYLE); + expected = (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW) & ~WS_MAXIMIZEBOX; + ok(style == expected, "expected style %08lx, got %08lx\n", expected, style); + +close: + err = mciSendCommandW(wDeviceID, MCI_CLOSE, 0, 0); + ok(!err,"mciCommand close returned %s\n", dbg_mcierr(err)); + + ret = DeleteFileW(filename); + ok(ret, "Failed to delete %s, error %lu.\n", debugstr_w(filename), GetLastError()); +} + START_TEST(mci) { char curdir[MAX_PATH], tmpdir[MAX_PATH]; @@ -1455,6 +1527,9 @@ START_TEST(mci) test_asyncWaveTypeMpegvideo(hwnd); }else skip("No output devices available, skipping all output tests\n"); + + test_video_window(hwnd); + /* Win9X hangs when exiting with something still open. */ err = mciSendStringA("close all", NULL, 0, hwnd); ok(!err,"final close all returned %s\n", dbg_mcierr(err)); diff --git a/dlls/winmm/tests/rsrc.rc b/dlls/winmm/tests/rsrc.rc new file mode 100644 index 00000000000..b5fde1c39ba --- /dev/null +++ b/dlls/winmm/tests/rsrc.rc @@ -0,0 +1,25 @@ +/* + * Resource file for mci tests. + * + * Copyright 2022 Akihiro Sagawa + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "windef.h" + +/* ffmpeg -f lavfi -i smptebars -f lavfi -i "sine=frequency=1000" -t 0.16 -r 25 -f mpeg -vcodec mpeg1video -vf scale=32x24 -acodec mp2 test.mpg */ +/* @makedep: test.mpg */ +test.mpg RCDATA "test.mpg" diff --git a/dlls/winmm/tests/test.mpg b/dlls/winmm/tests/test.mpg new file mode 100644 index 0000000000000000000000000000000000000000..97bb1abae1d6f0676b9f9484b9847c587bb7dd89 GIT binary patch literal 12288 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 Xt_%Ks{cC}LE%2`e{<XmWTMPU*9lmux
literal 0 HcmV?d00001
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=118136
Your paranoid android.
=== w10pro64_zh_CN (64 bit report) ===
winmm: 2068:mci: unhandled exception c0000005 at 0000000000000000
=== debian11 (32 bit report) ===
winmm: mci.c:1360: Test failed: mci status mode: stopped mci.c:1367: Test failed: mci status mode: stopped
=== debian11 (32 bit French report) ===
winmm: mci.c:1367: Test failed: mci status mode: stopped
=== debian11 (32 bit Hebrew:Israel report) ===
winmm: mci.c:1367: Test failed: mci status mode: stopped
=== debian11 (32 bit Japanese:Japan report) ===
winmm: mci.c:1360: Test failed: mci status mode: stopped mci.c:1367: Test failed: mci status mode: stopped
=== debian11 (32 bit Chinese:China report) ===
winmm: mci.c:1360: Test failed: mci status mode: stopped mci.c:1367: Test failed: mci status mode: stopped
=== debian11 (32 bit WoW report) ===
winmm: mci.c:1360: Test failed: mci status mode: stopped mci.c:1367: Test failed: mci status mode: stopped
=== debian11 (64 bit WoW report) ===
winmm: mci.c:1360: Test failed: mci status mode: stopped mci.c:1367: Test failed: mci status mode: stopped
From: Akihiro Sagawa sagawa.aki@gmail.com
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/mciqtz32/mciqtz.c | 6 ++++++ dlls/winmm/tests/mci.c | 8 +------- 2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c index 118f8d28f2d..02e5e1546a8 100644 --- a/dlls/mciqtz32/mciqtz.c +++ b/dlls/mciqtz32/mciqtz.c @@ -919,6 +919,12 @@ static DWORD MCIQTZ_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMS MCI_FORMAT_RETURN_BASE + wma->time_format); ret = MCI_RESOURCE_RETURNED; break; + case MCI_DGV_STATUS_HWND: + if (wma->window) + lpParms->dwReturn = (DWORD_PTR)wma->parent; + else + ret = MCIERR_UNSUPPORTED_FUNCTION; + break; case MCI_STATUS_READY: FIXME("MCI_STATUS_READY not implemented yet\n"); return MCIERR_UNRECOGNIZED_COMMAND; diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index 57fd6932986..6f17d6ddd4f 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -1480,12 +1480,7 @@ static void test_video_window(HWND hwnd) parm.status.dwItem = MCI_DGV_STATUS_HWND; parm.status.dwReturn = 0xdeadbeef; err = mciSendCommandW(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD_PTR)&parm); - todo_wine ok(!err,"mciCommand status hwnd returned %s\n", dbg_mcierr(err)); - if (err) - { - skip("MCI_DGV_STATUS_HWND got an error\n"); - goto close; - } + ok(!err,"mciCommand status hwnd returned %s\n", dbg_mcierr(err)); video_window = (HWND)parm.status.dwReturn;
ok(IsWindow(video_window), "video window %p doesn't exist.\n", video_window); @@ -1495,7 +1490,6 @@ static void test_video_window(HWND hwnd) expected = (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW) & ~WS_MAXIMIZEBOX; ok(style == expected, "expected style %08lx, got %08lx\n", expected, style);
-close: err = mciSendCommandW(wDeviceID, MCI_CLOSE, 0, 0); ok(!err,"mciCommand close returned %s\n", dbg_mcierr(err));
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=118137
Your paranoid android.
=== debian11 (32 bit German report) ===
winmm: mci.c:1360: Test failed: mci status mode: stopped mci.c:1367: Test failed: mci status mode: stopped
=== debian11 (32 bit French report) ===
winmm: mci.c:1360: Test failed: mci status mode: stopped mci.c:1367: Test failed: mci status mode: stopped
=== debian11 (32 bit Hebrew:Israel report) ===
winmm: mci.c:1360: Test failed: mci status mode: stopped mci.c:1367: Test failed: mci status mode: stopped
=== debian11 (32 bit Hindi:India report) ===
winmm: mci.c:1367: Test failed: mci status mode: stopped
=== debian11 (32 bit Japanese:Japan report) ===
winmm: mci.c:1367: Test failed: mci status mode: stopped
=== debian11 (32 bit Chinese:China report) ===
winmm: mci.c:1360: Test failed: mci status mode: stopped mci.c:1367: Test failed: mci status mode: stopped
=== debian11 (32 bit WoW report) ===
winmm: mci.c:1367: Test failed: mci status mode: stopped
=== debian11 (64 bit WoW report) ===
winmm: mci.c:1367: Test failed: mci status mode: stopped
From: Akihiro Sagawa sagawa.aki@gmail.com
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/winmm/tests/mci.c | 73 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+)
diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index 6f17d6ddd4f..cbbe4f70266 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -39,6 +39,7 @@ typedef union { MCI_SYSINFO_PARMSA sys; MCI_SEEK_PARMS seek; MCI_DGV_OPEN_PARMSW dgv_open; + MCI_DGV_WINDOW_PARMSW win; MCI_GENERIC_PARMS gen; } MCI_PARMS_UNION;
@@ -1463,11 +1464,14 @@ static void test_video_window(HWND hwnd) const WCHAR *filename = load_resource(L"test.mpg"); MCI_PARMS_UNION parm; MCIERROR err; + WCHAR text[32], original[32]; HWND video_window, parent; MCIDEVICEID wDeviceID; DWORD style, expected; BOOL ret;
+ GetWindowTextW(hwnd, original, ARRAY_SIZE(original)); + parm.dgv_open.lpstrDeviceType = (WCHAR *)L"MPEGVideo"; parm.dgv_open.lpstrElementName = (WCHAR *)filename; parm.dgv_open.hWndParent = hwnd; @@ -1490,9 +1494,78 @@ static void test_video_window(HWND hwnd) expected = (WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_OVERLAPPEDWINDOW) & ~WS_MAXIMIZEBOX; ok(style == expected, "expected style %08lx, got %08lx\n", expected, style);
+ err = mciSendCommandW(wDeviceID, MCI_WINDOW, 0, (DWORD_PTR)&parm); + ok(!err,"mciCommand window 0 returned %s\n", dbg_mcierr(err)); + + parm.win.lpstrText = (LPWSTR)L"abracadabra"; + err = mciSendCommandW(wDeviceID, MCI_WINDOW, MCI_DGV_WINDOW_TEXT, (DWORD_PTR)&parm); + ok(!err,"mciCommand window text returned %s\n", dbg_mcierr(err)); + + GetWindowTextW(video_window, text, ARRAY_SIZE(text)); + todo_wine ok(!wcscmp(text, parm.win.lpstrText),"expected %s, got %s\n", debugstr_w(parm.win.lpstrText), debugstr_w(text)); + + ok(!IsWindowVisible(video_window), "video window (%p) should be hidden\n", video_window); + + /* MCI_PLAY shows default video window */ + err = mciSendCommandW(wDeviceID, MCI_PLAY, 0, (DWORD_PTR)&parm); + ok(!err,"mciCommand play returned %s\n", dbg_mcierr(err)); + ok(IsWindowVisible(video_window), "video window (%p) should be visible\n", video_window); + + /* MCI_STOP doesn't hide the window */ + err = mciSendCommandW(wDeviceID, MCI_STOP, 0, (DWORD_PTR)&parm); + ok(!err,"mciCommand stop returned %s\n", dbg_mcierr(err)); + ok(IsWindowVisible(video_window), "video window (%p) should be visible\n", video_window); + + parm.win.nCmdShow = SW_HIDE; + err = mciSendCommandW(wDeviceID, MCI_WINDOW, MCI_DGV_WINDOW_STATE, (DWORD_PTR)&parm); + ok(!err,"mciCommand window state returned %s\n", dbg_mcierr(err)); + todo_wine ok(!IsWindowVisible(video_window), "video window (%p) should be hidden\n", video_window); + + parm.win.hWnd = (HWND)0xdeadbeef; + err = mciSendCommandW(wDeviceID, MCI_WINDOW, MCI_DGV_WINDOW_HWND, (DWORD_PTR)&parm); + todo_wine ok(err == MCIERR_NO_WINDOW, "mciCommand window hwnd returned %s\n", dbg_mcierr(err)); + + parm.win.hWnd = hwnd; + err = mciSendCommandW(wDeviceID, MCI_WINDOW, MCI_DGV_WINDOW_HWND, (DWORD_PTR)&parm); + ok(!err,"mciCommand window hwnd returned %s\n", dbg_mcierr(err)); + + parm.status.dwItem = MCI_DGV_STATUS_HWND; + parm.status.dwReturn = 0xdeadbeef; + err = mciSendCommandW(wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD_PTR)&parm); + ok(!err,"mciCommand status hwnd returned %s\n", dbg_mcierr(err)); + video_window = (HWND)parm.status.dwReturn; + + ok(video_window == hwnd, "got %p, expected %p\n", video_window, hwnd); + + parm.win.lpstrText = (LPWSTR)L"foobar"; + err = mciSendCommandW(wDeviceID, MCI_WINDOW, MCI_DGV_WINDOW_TEXT, (DWORD_PTR)&parm); + ok(!err,"mciCommand window text returned %s\n", dbg_mcierr(err)); + + GetWindowTextW(hwnd, text, ARRAY_SIZE(text)); + todo_wine ok(!wcscmp(text, parm.win.lpstrText),"expected %s, got %s\n", debugstr_w(parm.win.lpstrText), debugstr_w(text)); + + parm.win.lpstrText = NULL; + err = mciSendCommandW(wDeviceID, MCI_WINDOW, MCI_DGV_WINDOW_TEXT, (DWORD_PTR)&parm); + ok(!err,"mciCommand window text returned %s\n", dbg_mcierr(err)); + GetWindowTextW(hwnd, text, ARRAY_SIZE(text)); + todo_wine ok(!wcscmp(text, L""), "expected L"", got %s\n", debugstr_w(text)); + + /* MCI_PLAY shows parent window */ + err = mciSendCommandW(wDeviceID, MCI_PLAY, 0, (DWORD_PTR)&parm); + ok(!err,"mciCommand play returned %s\n", dbg_mcierr(err)); + ok(IsWindowVisible(hwnd), "window (%p) should be visible\n", hwnd); + + parm.win.nCmdShow = SW_HIDE; + err = mciSendCommandW(wDeviceID, MCI_WINDOW, MCI_DGV_WINDOW_STATE, (DWORD_PTR)&parm); + ok(!err,"mciCommand window state returned %s\n", dbg_mcierr(err)); + todo_wine ok(!IsWindowVisible(hwnd), "window (%p) should be hidden\n", hwnd); + err = mciSendCommandW(wDeviceID, MCI_CLOSE, 0, 0); ok(!err,"mciCommand close returned %s\n", dbg_mcierr(err));
+ SetWindowTextW(hwnd, original); + ShowWindow(hwnd, SW_HIDE); + ret = DeleteFileW(filename); ok(ret, "Failed to delete %s, error %lu.\n", debugstr_w(filename), GetLastError()); }
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=118138
Your paranoid android.
=== debian11 (32 bit report) ===
winmm: mci.c:1361: Test failed: mci status mode: stopped mci.c:1368: Test failed: mci status mode: stopped
=== debian11 (32 bit Arabic:Morocco report) ===
winmm: mci.c:1361: Test failed: mci status mode: stopped mci.c:1368: Test failed: mci status mode: stopped
=== debian11 (32 bit German report) ===
winmm: mci.c:1361: Test failed: mci status mode: stopped mci.c:1368: Test failed: mci status mode: stopped
=== debian11 (32 bit Japanese:Japan report) ===
winmm: mci.c:1368: Test failed: mci status mode: stopped
=== debian11 (32 bit Chinese:China report) ===
winmm: mci.c:1368: Test failed: mci status mode: stopped
=== debian11 (32 bit WoW report) ===
winmm: mci.c:1361: Test failed: mci status mode: stopped mci.c:1368: Test failed: mci status mode: stopped
=== debian11 (64 bit WoW report) ===
winmm: mci.c:1368: Test failed: mci status mode: stopped
From: Akihiro Sagawa sagawa.aki@gmail.com
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/mciqtz32/mciqtz.c | 2 +- dlls/winmm/tests/mci.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c index 02e5e1546a8..bcb0645e248 100644 --- a/dlls/mciqtz32/mciqtz.c +++ b/dlls/mciqtz32/mciqtz.c @@ -1036,7 +1036,7 @@ static DWORD MCIQTZ_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMS } if (dwFlags & MCI_DGV_WINDOW_STATE) { TRACE("Setting nCmdShow to %d\n", lpParms->nCmdShow); - IVideoWindow_put_WindowState(wma->vidwin, lpParms->nCmdShow); + ShowWindow(wma->parent, lpParms->nCmdShow); } if (dwFlags & MCI_DGV_WINDOW_TEXT) { TRACE("Setting caption to %s\n", debugstr_w(lpParms->lpstrText)); diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index cbbe4f70266..9d0b5bba938 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -1519,7 +1519,7 @@ static void test_video_window(HWND hwnd) parm.win.nCmdShow = SW_HIDE; err = mciSendCommandW(wDeviceID, MCI_WINDOW, MCI_DGV_WINDOW_STATE, (DWORD_PTR)&parm); ok(!err,"mciCommand window state returned %s\n", dbg_mcierr(err)); - todo_wine ok(!IsWindowVisible(video_window), "video window (%p) should be hidden\n", video_window); + ok(!IsWindowVisible(video_window), "video window (%p) should be hidden\n", video_window);
parm.win.hWnd = (HWND)0xdeadbeef; err = mciSendCommandW(wDeviceID, MCI_WINDOW, MCI_DGV_WINDOW_HWND, (DWORD_PTR)&parm); @@ -1558,7 +1558,7 @@ static void test_video_window(HWND hwnd) parm.win.nCmdShow = SW_HIDE; err = mciSendCommandW(wDeviceID, MCI_WINDOW, MCI_DGV_WINDOW_STATE, (DWORD_PTR)&parm); ok(!err,"mciCommand window state returned %s\n", dbg_mcierr(err)); - todo_wine ok(!IsWindowVisible(hwnd), "window (%p) should be hidden\n", hwnd); + ok(!IsWindowVisible(hwnd), "window (%p) should be hidden\n", hwnd);
err = mciSendCommandW(wDeviceID, MCI_CLOSE, 0, 0); ok(!err,"mciCommand close returned %s\n", dbg_mcierr(err));
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=118139
Your paranoid android.
=== debian11 (32 bit report) ===
winmm: mci.c:1368: Test failed: mci status mode: stopped
=== debian11 (32 bit Arabic:Morocco report) ===
winmm: mci.c:1361: Test failed: mci status mode: stopped mci.c:1368: Test failed: mci status mode: stopped
=== debian11 (32 bit German report) ===
winmm: mci.c:1368: Test failed: mci status mode: stopped
=== debian11 (32 bit Japanese:Japan report) ===
winmm: mci.c:1361: Test failed: mci status mode: stopped mci.c:1368: Test failed: mci status mode: stopped
=== debian11 (64 bit WoW report) ===
winmm: mci.c:1368: Test failed: mci status mode: stopped
From: Akihiro Sagawa sagawa.aki@gmail.com
Signed-off-by: Akihiro Sagawa sagawa.aki@gmail.com --- dlls/mciqtz32/mciqtz.c | 2 +- dlls/winmm/tests/mci.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c index bcb0645e248..86ab15a45ee 100644 --- a/dlls/mciqtz32/mciqtz.c +++ b/dlls/mciqtz32/mciqtz.c @@ -1040,7 +1040,7 @@ static DWORD MCIQTZ_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMS } if (dwFlags & MCI_DGV_WINDOW_TEXT) { TRACE("Setting caption to %s\n", debugstr_w(lpParms->lpstrText)); - IVideoWindow_put_Caption(wma->vidwin, lpParms->lpstrText); + SetWindowTextW(wma->parent, lpParms->lpstrText); } return 0; } diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index 9d0b5bba938..07c39e92ca3 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -1502,7 +1502,7 @@ static void test_video_window(HWND hwnd) ok(!err,"mciCommand window text returned %s\n", dbg_mcierr(err));
GetWindowTextW(video_window, text, ARRAY_SIZE(text)); - todo_wine ok(!wcscmp(text, parm.win.lpstrText),"expected %s, got %s\n", debugstr_w(parm.win.lpstrText), debugstr_w(text)); + ok(!wcscmp(text, parm.win.lpstrText),"expected %s, got %s\n", debugstr_w(parm.win.lpstrText), debugstr_w(text));
ok(!IsWindowVisible(video_window), "video window (%p) should be hidden\n", video_window);
@@ -1542,13 +1542,13 @@ static void test_video_window(HWND hwnd) ok(!err,"mciCommand window text returned %s\n", dbg_mcierr(err));
GetWindowTextW(hwnd, text, ARRAY_SIZE(text)); - todo_wine ok(!wcscmp(text, parm.win.lpstrText),"expected %s, got %s\n", debugstr_w(parm.win.lpstrText), debugstr_w(text)); + ok(!wcscmp(text, parm.win.lpstrText),"expected %s, got %s\n", debugstr_w(parm.win.lpstrText), debugstr_w(text));
parm.win.lpstrText = NULL; err = mciSendCommandW(wDeviceID, MCI_WINDOW, MCI_DGV_WINDOW_TEXT, (DWORD_PTR)&parm); ok(!err,"mciCommand window text returned %s\n", dbg_mcierr(err)); GetWindowTextW(hwnd, text, ARRAY_SIZE(text)); - todo_wine ok(!wcscmp(text, L""), "expected L"", got %s\n", debugstr_w(text)); + ok(!wcscmp(text, L""), "expected L"", got %s\n", debugstr_w(text));
/* MCI_PLAY shows parent window */ err = mciSendCommandW(wDeviceID, MCI_PLAY, 0, (DWORD_PTR)&parm);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=118140
Your paranoid android.
=== debian11 (32 bit report) ===
winmm: mci.c:1361: Test failed: mci status mode: stopped mci.c:1368: Test failed: mci status mode: stopped
=== debian11 (32 bit German report) ===
winmm: mci.c:1361: Test failed: mci status mode: stopped mci.c:1368: Test failed: mci status mode: stopped
=== debian11 (32 bit Hindi:India report) ===
winmm: mci.c:1368: Test failed: mci status mode: stopped
=== debian11 (32 bit Japanese:Japan report) ===
winmm: mci.c:1368: Test failed: mci status mode: stopped
=== debian11 (32 bit WoW report) ===
winmm: mci.c:1361: Test failed: mci status mode: stopped mci.c:1368: Test failed: mci status mode: stopped
=== debian11 (64 bit WoW report) ===
winmm: mci.c:1361: Test failed: mci status mode: stopped mci.c:1368: Test failed: mci status mode: stopped