Jörg Höhle : winmm: MCI open always creates an alias for subsequent commands.
Alexandre Julliard
julliard at winehq.org
Thu Sep 2 12:01:26 CDT 2010
Module: wine
Branch: master
Commit: ef372e259a6663e9e2ef19b5d984110aa713560b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ef372e259a6663e9e2ef19b5d984110aa713560b
Author: Jörg Höhle <Joerg-Cyril.Hoehle at t-systems.com>
Date: Wed Sep 1 17:50:43 2010 +0200
winmm: MCI open always creates an alias for subsequent commands.
---
dlls/winmm/mci.c | 31 +++++++++++++++++--------------
dlls/winmm/tests/mci.c | 2 +-
dlls/winmm/winemm.h | 1 -
3 files changed, 18 insertions(+), 16 deletions(-)
diff --git a/dlls/winmm/mci.c b/dlls/winmm/mci.c
index d604c98..2b47bd8 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 66633bc..642e346 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 75dc1e4..6d170de 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;
More information about the wine-cvs
mailing list