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