[PATCH v2 0/2] MR9704: winmm, msvfw32: DGV window shenanigans with audio only files
Basically, check if we can set a HWND in the driver, before doing so. Right now, msvfw32 + mciqtz32 error out on audio only playbacks, breaking the game Transcendence. -- v2: msvfw32: Only attempt to set a dgv window, when the driver has a window itself. winmm/tests: Test dgv window behavior for audio files. https://gitlab.winehq.org/wine/wine/-/merge_requests/9704
From: Bernhard Kölbl <bkoelbl(a)codeweavers.com> --- dlls/winmm/tests/mci.c | 51 +++++++++++++++++++++++++++++++------- dlls/winmm/tests/rsrc.rc | 4 +++ dlls/winmm/tests/test.mp3 | Bin 0 -> 2157 bytes 3 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 dlls/winmm/tests/test.mp3 diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index f6654912515..d35d0b290ee 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -1316,14 +1316,15 @@ static void test_AutoOpenWAVE(HWND hwnd) ok(0xDEADF00D==intbuf[0] && 0xABADCAFE==intbuf[2],"DWORD buffer corruption\n"); } -static void test_playWaveTypeMpegvideo(void) +static void test_playTypeMpegvideo(HWND hwnd) { + const WCHAR *filename = load_resource(L"test.mp3"); + MCI_DGV_WINDOW_PARMSW window_param = { 0 }; + MCI_STATUS_PARMS status_parm = { 0 }; + MCI_PLAY_PARMS play_parm = { 0 }; + MCIDEVICEID wDeviceID = 0; + char buf[1024] = { 0 }; MCIERROR err; - MCIDEVICEID wDeviceID; - MCI_PLAY_PARMS play_parm; - MCI_STATUS_PARMS status_parm; - char buf[1024]; - memset(buf, 0, sizeof(buf)); err = mciSendStringA("open tempfile.wav type MPEGVideo alias mysound", NULL, 0, NULL); ok(err==ok_saved,"mci open tempfile.wav type MPEGVideo returned %s\n", dbg_mcierr(err)); @@ -1335,6 +1336,13 @@ static void test_playWaveTypeMpegvideo(void) wDeviceID = mciGetDeviceIDA("mysound"); ok(wDeviceID == 1, "mciGetDeviceIDA mysound returned %u, expected 1\n", wDeviceID); + err = mciSendCommandW(wDeviceID, MCI_WINDOW, MCI_DGV_WINDOW_STATE, (DWORD_PTR)&window_param); + ok(err == MCIERR_NO_WINDOW,"mciSendCommandW returned %s\n", dbg_mcierr(err)); + + window_param.hWnd = hwnd; + err = mciSendCommandW(wDeviceID, MCI_WINDOW, MCI_DGV_WINDOW_HWND, (DWORD_PTR)&window_param); + ok(err == MCIERR_INTERNAL,"mciSendCommandW returned %s\n", dbg_mcierr(err)); + err = mciSendCommandA(wDeviceID, MCI_PLAY, 0, (DWORD_PTR)&play_parm); ok(!err,"mciCommand play returned %s\n", dbg_mcierr(err)); @@ -1372,13 +1380,38 @@ static void test_playWaveTypeMpegvideo(void) ok(err==ok_saved,"mci open tempfile.wav type MPEGVideo returned %s\n", dbg_mcierr(err)); err = mciSendStringA("play mysound", NULL, 0, NULL); - ok(!err,"mci play retuend %s\n", dbg_mcierr(err)); + ok(!err,"mci play returned %s\n", dbg_mcierr(err)); err = mciSendStringA("play mysound", NULL, 0, NULL); - ok(!err,"mci play retuend %s\n", dbg_mcierr(err)); + ok(!err,"mci play returned %s\n", dbg_mcierr(err)); err = mciSendStringA("close mysound", NULL, 0, NULL); ok(!err,"mci close returned %s\n", dbg_mcierr(err)); + + /* test playing a mp3 file */ + snprintf(buf, 1024, "open %ls type MPEGVideo alias mytest", filename); + err = mciSendStringA(buf, NULL, 0, NULL); + ok(!err, "mci open test.mp3 type MPEGVideo returned %s\n", dbg_mcierr(err)); + + wDeviceID = mciGetDeviceIDA("mytest"); + ok(wDeviceID == 1, "mciGetDeviceIDA returned incorrect device id %u\n", wDeviceID); + + err = mciSendCommandW(wDeviceID, MCI_WINDOW, MCI_DGV_WINDOW_STATE, (DWORD_PTR)&window_param); + ok(err == MCIERR_NO_WINDOW,"mciSendCommandW returned %s\n", dbg_mcierr(err)); + + window_param.hWnd = hwnd; + err = mciSendCommandW(wDeviceID, MCI_WINDOW, MCI_DGV_WINDOW_HWND, (DWORD_PTR)&window_param); + ok(err == MCIERR_INTERNAL,"mciSendCommandW returned %s\n", dbg_mcierr(err)); + + err = mciSendCommandA(wDeviceID, MCI_PLAY, 0, (DWORD_PTR)&play_parm); + ok(!err,"mciCommand play returned %s\n", dbg_mcierr(err)); + + err = mciSendStringA("status mytest mode", buf, sizeof(buf), NULL); + ok(!err,"mci status mode returned %s\n", dbg_mcierr(err)); + ok(!strcmp(buf,"playing"), "mci status mode: %s\n", buf); + + err = mciSendStringA("close mytest", NULL, 0, NULL); + ok(!err,"mci close returned %s\n", dbg_mcierr(err)); } static void test_asyncWaveTypeMpegvideo(HWND hwnd) @@ -1783,7 +1816,7 @@ START_TEST(mci) test_playWAVE(hwnd); test_asyncWAVE(hwnd); test_AutoOpenWAVE(hwnd); - test_playWaveTypeMpegvideo(); + test_playTypeMpegvideo(hwnd); test_asyncWaveTypeMpegvideo(hwnd); }else skip("No output devices available, skipping all output tests\n"); diff --git a/dlls/winmm/tests/rsrc.rc b/dlls/winmm/tests/rsrc.rc index b36fa3c407d..7d36b069b78 100644 --- a/dlls/winmm/tests/rsrc.rc +++ b/dlls/winmm/tests/rsrc.rc @@ -53,3 +53,7 @@ test_mp2.wav WAVE "test_mp2.wav" * So I manually set it 11480 (the file size divided by 0.1 seconds). */ /* @makedep: test_mp3.wav */ test_mp3.wav WAVE "test_mp3.wav" + +/* ffmpeg -f lavfi -i "sine=frequency=500" -t 0.5 -ar 48000 -b:a 32k -f mp3 -acodec mp3 -write_xing 0 test.mp3 */ +/* @makedep: test.mp3 */ +test.mp3 RCDATA "test.mp3" diff --git a/dlls/winmm/tests/test.mp3 b/dlls/winmm/tests/test.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b35e6b77d1315fa5b742085226ecd0cefbdf4896 GIT binary patch literal 2157 zcmeZtF=k-^0p*b3U{?kP27U$xW}n2eG*b&bBTGF)0|SsG6#xG%a)g0_g+(+xB(cF@ za>t6pW&sQgjB70&7?@H{-ezK8V9}9hKlu4Ug93+0(ZTOe`3ma4upVGBl8cz}>Bzxe z-hHPOw+h_4R<z)M^B-2eA0@~Bcz7RjxPEGG`qH&-$qXR#nHg9r<h5iUFlbaVr)-gS z(a)ws4Q(8!g{9%5qfk9#t^0yiT=kdTW4j|_w7k(a)r#g1r~hI7WE1+F4*C&!_0c@;|`vm zykc2bzy7M#c>U$Y=7-|T8~dwYY%mFzYnvbkGM~MH`HwUY_w5vi=H{ft%8V0Bq%&pD zrQiAWBJ{0S-Jb)CgcTVa0#<7Y2Az-)S+>HB>&+Wqj?~xJzsBqe-DrAe_0?`g53i%I zTf(QY>HAje(a)MvH9$)d|ytz8rT=pM*?o(2{MX(a)S+ZT^t%9<_Ff=-j_Mdt#BY=#jXuq z(;N;gHET&&x6jc;^Va%5VPC^`&zZIL?zNUx8x9mEn22*M3E<&mt`%bvJ$WLe+cfLf zU%M%#ua`SGI50XUfXo+cVBR7v%5dMQp^-UhW5tUT0y;ljl^PN}#9bXF!qpW+b^V(a)K z>wVGwU)LpkgO6pO#$z9bkbvGkHqN(!KO~<BJ6V0KU-k6zjro5)JQ!Ge9*XT?Y}}ZA zGht%<_7foUB^a0=NUJZn#gx#{oOnh0MSx;SzjE}W{bFDBm+yX+*t$yLfItVbN1UDJ zuKKrj*6R3Q?=Ean-Jrne;A+5~c1Z0nv)S##JmK>ky)@I-#>f7uwZ9HBU$%jHhqN&F zX*Y*j=48XFClh=*6b>XNz<eQfMX<G~NHplmyYhSQo%Vl!u~18ZjWO(yRwOgil&c&E zW2fAh*<u{Gf7R2=FTcjEIyzCILD*yC9Hpfb3^aW~=BqR~pOF^TKJMmF#SD($Y8?*k zO}_>9zFhlW^vCv<wf0{FHt{fVmL`hoG&XwWavY4Uoh9=&{Gayfc>i^8xt&528WI>b zS-5&DBu%;R+Q?e^i7QBH*4Em(`TijDwHus2NDG6)zZhcv`dIA+&0>s9=Uaj_*jO6Z z!egQK9XJ+*CNvZ{Dv0JNO>{6&;SK1~o;<;q<Mq*hYfHYVU#;4zu#kme*3tXmcn6tp z)Cdlr+b#|z%}GluUYuZ#I%KfU?}&a?`Sq_=)Bk(a)p+U4NDdKHxZSYJMr(Y`#vms#f2 z`oFV4&VRG&WkN%OnLEeI6rP~jFE%Kw+vn)z5*)UE{pH$D_c)OGRt?NwAmNkWoV2jw z#fe=dp#ld26&Rq&2oeF(a)pk!1Bj)2RGOq>j>6Ggfh8x^uz5(a)Y7h<+)z4|LVGVM}Dn; z<>>0c#Co4&y$(;@tZxw@^PL!+7f1`NKJDgE(VUc6ozWo?zVs7E+_(JokM6#T_y6m& z#)+XJHo~<sAt7$IlSTM)g{cdYXNLaY9Gd;|>z$pUmpmL;XM+u#{bGZ`dhaD#3j(KR z{n)pv*7h~Xe9uPaJrMVoLBi*{*9(DDksrFIIULn2DTxpWj};R2-D<k?ZuMTS|MwUB z-saePfF~zvp_0S-%n5!CU2(fx|B37(a)S$V5^YSoOGsD*JmT-PxqCtcrkPzhvyAcOM^ zNdB#9PExGQII%x(a)iNNmm&9(Cy)0HZ{U;dI^Id#>3u$l3xL9TVz6&EC4vkb1?v2K}8 zd{EZ4cD>M&2(a)VFz3S#cyIAtznNsO7(2Fl9sLFPv^Iv;?TUjzxC%e9?uUtcdR3FTm5 zoewrQ%1TE_`&%d1vRkL_yxV*0Mc9?)?=NWjG%+&?GOX4T^jIJv#J0js^yH0M0%yy) z|3-ba((>DOb#=%hkogJC&L5=txNo&ER5d3at<LD!R?r>8aNx$)Hyb?G-+0LqU{Y;< z^G0KS(69QkWnl*y6%`y}J)AT}n3)`IfwG>I-qrdr?bY%B-tEkC=wMxshzie{AoJ52 zn4d`Vaf8Y?W^nps4QTX(a)IN$xNuJ`qIuNMgi9z6-rjZw<KV4S<&LnM5jV~OgnZ`uD^ z>)&5o*1+hrW(7FrXD!sxzVutzaX~LQC#<}>d}sKoi6HZH7?{6E^MT6G4v6`gF2ai} z0vLK&88r?C=<&!33mo`j=p%a|w8M>YfshZwi)q)NUkYV5Il;iMlP=+)u=In1%C6P~ zX#)d;0>$2`CezlxX<|vzdCs2j2V{Oh1M?hdK2ZLJrXO*JcRq(1KfJiUX`WI)@BWV) zw1oahX_f3|njz}^vn)DbN+4UniL=uBaeJ#CIygiLgfq<-xfA<om5-yZt1+m8Tm=Up z^D7#dq48VHoUB^)qysKXIRj*VL*o$xNdD?;e#*2*ft7M&;U<90Z)RYx$adPfxq+dv O^<nco1xC0m<qQBQdh)yg literal 0 HcmV?d00001 -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9704
From: Bernhard Kölbl <bkoelbl(a)codeweavers.com> --- dlls/msvfw32/mciwnd.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/dlls/msvfw32/mciwnd.c b/dlls/msvfw32/mciwnd.c index 5ab9b698e13..cdf52b3490d 100644 --- a/dlls/msvfw32/mciwnd.c +++ b/dlls/msvfw32/mciwnd.c @@ -551,9 +551,11 @@ static LRESULT WINAPI MCIWndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lPa case MCIWNDM_OPENW: { RECT rc; + BOOL has_window; HCURSOR hCursor; MCI_OPEN_PARMSW mci_open; MCI_GETDEVCAPS_PARMS mci_devcaps; + MCI_DGV_WINDOW_PARMSW mci_window; WCHAR aliasW[64]; WCHAR drv_name[MAX_PATH]; static const WCHAR formatW[] = {'%','d',0}; @@ -626,16 +628,29 @@ static LRESULT WINAPI MCIWndProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lPa mwi->dev_type = mci_devcaps.dwReturn; + mci_window.nCmdShow = -1; + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_WINDOW, MCI_DGV_WINDOW_STATE, (DWORD_PTR)&mci_window); + + if (mwi->lasterror == MCIERR_NO_WINDOW) + { + has_window = 0; + mwi->lasterror = 0; + } + else if (mwi->lasterror) + { + MCIWND_notify_error(mwi); + goto end_of_mci_open; + } + else has_window = 1; + drv_name[0] = 0; SendMessageW(hWnd, MCIWNDM_GETDEVICEW, 256, (LPARAM)drv_name); if (drv_name[0] && GetPrivateProfileStringW(mci32W, drv_name, NULL, drv_name, MAX_PATH, system_iniW)) mwi->hdrv = OpenDriver(drv_name, NULL, 0); - if (mwi->dev_type == MCI_DEVTYPE_DIGITAL_VIDEO) + if (mwi->dev_type == MCI_DEVTYPE_DIGITAL_VIDEO && has_window) { - MCI_DGV_WINDOW_PARMSW mci_window; - mci_window.hWnd = hWnd; mwi->lasterror = mciSendCommandW(mwi->mci, MCI_WINDOW, MCI_DGV_WINDOW_HWND, -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9704
participants (1)
-
Bernhard Kölbl