Commit e8946873 authored by Jörg Höhle's avatar Jörg Höhle Committed by Alexandre Julliard

winmm: Support MCI "close all" command.

This is not yet generalized to "pause all" or "stop all".
parent 7d1199de
......@@ -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);
......
......@@ -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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment