diff --git a/dlls/winmm/mci.c b/dlls/winmm/mci.c index d604c98776d..2b47bd8ac5f 100644 --- a/dlls/winmm/mci.c +++ b/dlls/winmm/mci.c @@ -123,7 +123,7 @@ static UINT MCI_GetDriverFromString(LPCWSTR lpstrName) EnterCriticalSection(&WINMM_cs); for (wmd = MciDrivers; wmd; wmd = wmd->lpNext) { - if (wmd->lpstrElementName && strcmpW(wmd->lpstrElementName, lpstrName) == 0) { + if (wmd->lpstrAlias && strcmpiW(wmd->lpstrAlias, lpstrName) == 0) { ret = wmd->wDeviceID; break; } @@ -131,10 +131,6 @@ static UINT MCI_GetDriverFromString(LPCWSTR lpstrName) ret = wmd->wDeviceID; break; } - if (wmd->lpstrAlias && strcmpiW(wmd->lpstrAlias, lpstrName) == 0) { - ret = wmd->wDeviceID; - break; - } } LeaveCriticalSection(&WINMM_cs); @@ -770,7 +766,6 @@ static BOOL MCI_UnLoadMciDriver(LPWINE_MCIDRIVER wmd) HeapFree(GetProcessHeap(), 0, wmd->lpstrDeviceType); HeapFree(GetProcessHeap(), 0, wmd->lpstrAlias); - HeapFree(GetProcessHeap(), 0, wmd->lpstrElementName); HeapFree(GetProcessHeap(), 0, wmd); return TRUE; @@ -888,15 +883,23 @@ static DWORD MCI_SendCommandFrom32(MCIDEVICEID wDevID, UINT16 wMsg, DWORD_PTR dw static DWORD MCI_FinishOpen(LPWINE_MCIDRIVER wmd, LPMCI_OPEN_PARMSW lpParms, DWORD dwParam) { - if (dwParam & MCI_OPEN_ELEMENT) - { - wmd->lpstrElementName = HeapAlloc(GetProcessHeap(),0,(strlenW(lpParms->lpstrElementName)+1) * sizeof(WCHAR)); - strcpyW( wmd->lpstrElementName, lpParms->lpstrElementName ); + LPCWSTR alias = NULL; + /* Open always defines an alias for further reference */ + if (dwParam & MCI_OPEN_ALIAS) /* open ... alias */ + alias = lpParms->lpstrAlias; + else { + if ((dwParam & MCI_OPEN_ELEMENT) /* open file.wav */ + && !(dwParam & MCI_OPEN_ELEMENT_ID)) + alias = lpParms->lpstrElementName; + else if (dwParam & MCI_OPEN_TYPE ) /* open cdaudio */ + alias = wmd->lpstrDeviceType; } - if (dwParam & MCI_OPEN_ALIAS) - { - wmd->lpstrAlias = HeapAlloc(GetProcessHeap(), 0, (strlenW(lpParms->lpstrAlias)+1) * sizeof(WCHAR)); - strcpyW( wmd->lpstrAlias, lpParms->lpstrAlias); + if (alias) { + wmd->lpstrAlias = HeapAlloc(GetProcessHeap(), 0, (strlenW(alias)+1) * sizeof(WCHAR)); + if (!wmd->lpstrAlias) return MCIERR_OUT_OF_MEMORY; + strcpyW( wmd->lpstrAlias, alias); + /* In most cases, natives adds MCI_OPEN_ALIAS to the flags passed to the driver. + * Don't. The drivers don't care about the winmm alias. */ } lpParms->wDeviceID = wmd->wDeviceID; diff --git a/dlls/winmm/tests/mci.c b/dlls/winmm/tests/mci.c index 66633bc0706..642e34670f7 100644 --- a/dlls/winmm/tests/mci.c +++ b/dlls/winmm/tests/mci.c @@ -644,7 +644,7 @@ static void test_asyncWAVE(HWND hwnd) /* Only the alias is looked up. */ err = mciGetDeviceID("tempfile.wav"); - todo_wine ok(err==0,"mciGetDeviceID element returned %u, expected 0\n", err); + ok(err==0,"mciGetDeviceID element returned %u, expected 0\n", err); err = mciGetDeviceID("waveaudio"); todo_wine ok(err==0,"mciGetDeviceID waveaudio returned %u, expected 0\n", err); diff --git a/dlls/winmm/winemm.h b/dlls/winmm/winemm.h index 75dc1e4967a..6d170de328b 100644 --- a/dlls/winmm/winemm.h +++ b/dlls/winmm/winemm.h @@ -95,7 +95,6 @@ typedef struct { typedef struct tagWINE_MCIDRIVER { UINT wDeviceID; UINT wType; - LPWSTR lpstrElementName; LPWSTR lpstrDeviceType; LPWSTR lpstrAlias; HDRVR hDriver;