Jörg Höhle : mcicda: Access the first CD-ROM unless given a device letter.
Alexandre Julliard
julliard at winehq.org
Wed Aug 25 12:35:07 CDT 2010
Module: wine
Branch: master
Commit: ecb02ec9b78670152d6672299e856e63d18e90a5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ecb02ec9b78670152d6672299e856e63d18e90a5
Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date: Mon Aug 23 09:55:22 2010 +0200
mcicda: Access the first CD-ROM unless given a device letter.
---
dlls/mcicda/mcicda.c | 16 +++++++++-------
dlls/winmm/tests/mcicda.c | 9 ++++-----
2 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/dlls/mcicda/mcicda.c b/dlls/mcicda/mcicda.c
index 0334f2e..4c67085 100644
--- a/dlls/mcicda/mcicda.c
+++ b/dlls/mcicda/mcicda.c
@@ -161,6 +161,7 @@ static DWORD MCICDA_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp)
WINE_MCICDAUDIO* wmcda;
if (!modp) return 0xFFFFFFFF;
+ /* FIXME: MCIERR_CANNOT_LOAD_DRIVER if there's no drive of type CD-ROM */
wmcda = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MCICDAUDIO));
@@ -400,11 +401,10 @@ static DWORD MCICDA_Stop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms
*/
static DWORD MCICDA_Open(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenParms)
{
- DWORD dwDeviceID;
- DWORD ret = MCIERR_HARDWARE;
+ MCIDEVICEID dwDeviceID;
+ DWORD ret;
WINE_MCICDAUDIO* wmcda = (WINE_MCICDAUDIO*)mciGetDriverData(wDevID);
WCHAR root[7], drive = 0;
- unsigned int count;
TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpOpenParms);
@@ -450,11 +450,10 @@ static DWORD MCICDA_Open(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenPar
}
else
{
- /* drive letter isn't passed... get the dwDeviceID'th cdrom in the system */
root[0] = 'A'; root[1] = ':'; root[2] = '\\'; root[3] = '\0';
- for (count = 0; root[0] <= 'Z'; root[0]++)
+ for ( ; root[0] <= 'Z'; root[0]++)
{
- if (GetDriveTypeW(root) == DRIVE_CDROM && ++count >= dwDeviceID)
+ if (GetDriveTypeW(root) == DRIVE_CDROM)
{
drive = root[0];
break;
@@ -462,7 +461,7 @@ static DWORD MCICDA_Open(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenPar
}
if (!drive)
{
- ret = MCIERR_INVALID_DEVICE_ID;
+ ret = MCIERR_CANNOT_LOAD_DRIVER; /* drvOpen should return this */
goto the_error;
}
}
@@ -474,7 +473,10 @@ static DWORD MCICDA_Open(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenPar
root[0] = root[1] = '\\'; root[2] = '.'; root[3] = '\\'; root[4] = drive; root[5] = ':'; root[6] = '\0';
wmcda->handle = CreateFileW(root, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
if (wmcda->handle == INVALID_HANDLE_VALUE)
+ {
+ ret = MCIERR_MUST_USE_SHAREABLE;
goto the_error;
+ }
if (dwFlags & MCI_NOTIFY) {
mciDriverNotify(HWND_32(LOWORD(lpOpenParms->dwCallback)),
diff --git a/dlls/winmm/tests/mcicda.c b/dlls/winmm/tests/mcicda.c
index 3dc610a..b6bb0bf 100644
--- a/dlls/winmm/tests/mcicda.c
+++ b/dlls/winmm/tests/mcicda.c
@@ -166,13 +166,12 @@ static void test_play(HWND hwnd)
parm.gen.dwCallback = (DWORD_PTR)hwnd; /* once to rule them all */
err = mciSendString("open cdaudio alias c notify shareable", buf, sizeof(buf), hwnd);
- if (err == MCIERR_INVALID_DEVICE_ID) /* Wine special */ todo_wine
- ok(!err, "open cdaudio must succeed even without CD-ROM drive\n"); else
- ok(!err || broken(err == MCIERR_MUST_USE_SHAREABLE),
+ ok(!err || err == MCIERR_CANNOT_LOAD_DRIVER || err == MCIERR_MUST_USE_SHAREABLE,
"mci open cdaudio notify returned %s\n", dbg_mcierr(err));
test_notification(hwnd, "open alias notify", err ? 0 : MCI_NOTIFY_SUCCESSFUL);
- /* Some machines return MUST_USE_SHAREABLE when there's trouble with the hardware
- * (e.g. unreadable disk), yet adding that flag does not help get past this error. */
+ /* Native returns MUST_USE_SHAREABLE when there's trouble with the hardware
+ * (e.g. unreadable disk) or when Media Player already has the device open,
+ * yet adding that flag does not help get past this error. */
if(err) {
skip("Cannot open any cdaudio device, %s.\n", dbg_mcierr(err));
More information about the wine-cvs
mailing list