From e89468734d09334f830cf98c255d68ccf2d6293f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20H=C3=B6hle?= Date: Wed, 31 Mar 2010 16:08:48 +0200 Subject: [PATCH] winmm: Support MCI "close all" command. This is not yet generalized to "pause all" or "stop all". --- dlls/winmm/mci.c | 12 +++++++++--- dlls/winmm/tests/mci.c | 6 +++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/dlls/winmm/mci.c b/dlls/winmm/mci.c index 0a15f099907..54e9e19df5b 100644 --- a/dlls/winmm/mci.c +++ b/dlls/winmm/mci.c @@ -1224,6 +1224,7 @@ DWORD WINAPI mciSendStringW(LPCWSTR lpstrCommand, LPWSTR lpstrRet, { LPWSTR verb, dev, args; LPWINE_MCIDRIVER wmd = 0; + MCIDEVICEID uDevID; DWORD dwFlags = 0, dwRet = 0; int offset = 0; DWORD_PTR data[MCI_DATA_SIZE]; @@ -1252,6 +1253,7 @@ DWORD WINAPI mciSendStringW(LPCWSTR lpstrCommand, LPWSTR lpstrRet, if ((dwRet = MCI_GetString(&dev, &args))) { goto errCleanUp; } + uDevID = strcmpiW(dev, wszAll) ? 0 : MCI_ALL_DEVICE_ID; /* Determine devType from open */ if (!strcmpW(verb, wszOpen)) { @@ -1307,6 +1309,10 @@ DWORD WINAPI mciSendStringW(LPCWSTR lpstrCommand, LPWSTR lpstrRet, dwFlags |= MCI_OPEN_ELEMENT; data[3] = (DWORD_PTR)dev; } + if (MCI_ALL_DEVICE_ID == uDevID) { + dwRet = MCIERR_CANNOT_USE_ALL; + goto errCleanUp; + } if (!strstrW(args, wszSAliasS) && !dev) { dwRet = MCIERR_NEW_REQUIRES_ALIAS; goto errCleanUp; @@ -1320,7 +1326,7 @@ DWORD WINAPI mciSendStringW(LPCWSTR lpstrCommand, LPWSTR lpstrRet, MCI_UnLoadMciDriver(wmd); goto errCleanUp; } - } else if (!(wmd = MCI_GetDriver(mciGetDeviceIDW(dev)))) { + } else if ((MCI_ALL_DEVICE_ID != uDevID) && !(wmd = MCI_GetDriver(mciGetDeviceIDW(dev)))) { /* auto open */ static const WCHAR wszOpenWait[] = {'o','p','e','n',' ','%','s',' ','w','a','i','t',0}; WCHAR buf[128]; @@ -1384,7 +1390,7 @@ DWORD WINAPI mciSendStringW(LPCWSTR lpstrCommand, LPWSTR lpstrRet, if (lpstrRet && uRetLen) *lpstrRet = '\0'; TRACE("[%d, %s, %08x, %08lx/%s %08lx/%s %08lx/%s %08lx/%s %08lx/%s %08lx/%s]\n", - wmd->wDeviceID, MCI_MessageToString(MCI_GetMessage(lpCmd)), dwFlags, + wmd ? wmd->wDeviceID : uDevID, MCI_MessageToString(MCI_GetMessage(lpCmd)), dwFlags, data[0], debugstr_w((WCHAR *)data[0]), data[1], debugstr_w((WCHAR *)data[1]), data[2], debugstr_w((WCHAR *)data[2]), data[3], debugstr_w((WCHAR *)data[3]), data[4], debugstr_w((WCHAR *)data[4]), data[5], debugstr_w((WCHAR *)data[5])); @@ -1394,7 +1400,7 @@ DWORD WINAPI mciSendStringW(LPCWSTR lpstrCommand, LPWSTR lpstrRet, MCI_UnLoadMciDriver(wmd); /* FIXME: notification is not properly shared across two opens */ } else { - dwRet = MCI_SendCommand(wmd->wDeviceID, MCI_GetMessage(lpCmd), dwFlags, (DWORD_PTR)data); + dwRet = MCI_SendCommand(wmd ? wmd->wDeviceID : uDevID, MCI_GetMessage(lpCmd), dwFlags, (DWORD_PTR)data); } TRACE("=> 1/ %x (%s)\n", dwRet, debugstr_w(lpstrRet)); dwRet = MCI_HandleReturnValues(dwRet, wmd, retType, data, lpstrRet, uRetLen); diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index 0e7ce9d82b2..6bdfefebdfe 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -217,11 +217,11 @@ static void test_openCloseWAVE(HWND hwnd) } err = mciSendString(command_close_all, NULL, 0, NULL); - todo_wine ok(!err,"mci %s (without buffer) returned %s\n", command_close_all, dbg_mcierr(err)); + ok(!err,"mci %s (without buffer) returned %s\n", command_close_all, dbg_mcierr(err)); memset(buf, 0, sizeof(buf)); err = mciSendString(command_close_all, buf, sizeof(buf), hwnd); - todo_wine ok(!err,"mci %s (with output buffer) returned %s\n", command_close_all, dbg_mcierr(err)); + ok(!err,"mci %s (with output buffer) returned %s\n", command_close_all, dbg_mcierr(err)); ok(buf[0] == 0, "mci %s changed output buffer: %s\n", command_close_all, buf); /* No notification left, everything closed already */ test_notification(hwnd, command_close_all, 0); @@ -864,7 +864,7 @@ START_TEST(mci) test_AutoOpenWAVE(hwnd); /* Win9X hangs when exiting with something still open. */ err = mciSendString("close all", NULL, 0, hwnd); - todo_wine ok(!err,"final close all returned %s\n", dbg_mcierr(err)); + ok(!err,"final close all returned %s\n", dbg_mcierr(err)); ok(DeleteFile("tempfile.wav")||ok_saved,"Delete tempfile.wav (cause auto-open?)\n"); DestroyWindow(hwnd); }