wine/dlls/winmm mmsystem.c winemm.h

Eric Pouech eric.pouech at wanadoo.fr
Thu May 16 14:52:00 CDT 2002


Michael Stefaniuc a écrit :
> 
> Hello,
> 
> this patch has introduced a regression, see
> http://bugs.winehq.com/show_bug.cgi?id=684 for details.
this should fix it
A+
-------------- next part --------------
Name:          ps_a2w
ChangeLog:     fixed hangs when playing an ASCII resource
License:       X11
GenDate:       2002/05/16 19:48:36 UTC
ModifiedFiles: dlls/winmm/mmsystem.c
AddedFiles:    
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/dlls/winmm/mmsystem.c,v
retrieving revision 1.52
diff -u -u -r1.52 mmsystem.c
--- dlls/winmm/mmsystem.c	12 May 2002 03:10:26 -0000	1.52
+++ dlls/winmm/mmsystem.c	16 May 2002 19:39:46 -0000
@@ -447,6 +447,7 @@
     waveOutUnprepareHeader(hWave, &waveHdr[1], sizeof(WAVEHDR));
 
 errCleanUp:
+    TRACE("Done playing='%s' !\n", debugstr_w(wps->pszSound));
     CloseHandle(s.hEvent);
     HeapFree(GetProcessHeap(), 0, waveHdr);
     HeapFree(GetProcessHeap(), 0, lpWaveFormat);
@@ -463,6 +464,21 @@
     return bRet;
 }
 
+static BOOL MULTIMEDIA_IsString(DWORD fdwSound, const void* psz)
+{
+    /* SND_RESOURCE is 0x40004 while
+     * SND_MEMORY is 0x00004
+     */
+    switch (fdwSound & SND_RESOURCE)
+    {
+    case SND_RESOURCE:  return HIWORD(psz) != 0; /* by name or by ID ? */
+    case SND_MEMORY:    return FALSE;
+    /* any other case (SND_ALIAS, SND_FILENAME... shall drop into this one) */
+    case 0:             return TRUE; 
+    default:            FIXME("WTF\n"); return FALSE;
+    }
+}
+
 static BOOL MULTIMEDIA_PlaySound(LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound, DWORD search)
 {
     WINE_PLAYSOUND*     wps = NULL;
@@ -515,10 +531,9 @@
     } while (InterlockedCompareExchangePointer((void**)&iData->lpPlaySound, wps, NULL) != NULL);
 
     if (fdwSound & SND_ASYNC) {
-	if (!((fdwSound & SND_MEMORY) || ((fdwSound & SND_RESOURCE) && 
-					  !((DWORD)pszSound >> 16)) || 
-              !pszSound)) {
-	    wps->pszSound = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(pszSound)+1) * sizeof(WCHAR) );
+	if (MULTIMEDIA_IsString(fdwSound, pszSound))
+        {
+	    wps->pszSound = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(pszSound)+1) * sizeof(WCHAR));
 	    lstrcpyW((LPWSTR)wps->pszSound, pszSound);
 	}
 	wps->bLoop = fdwSound & SND_LOOP;
@@ -541,16 +556,13 @@
 {
     LPWSTR 	pszSoundW;
     BOOL	bSound;
+
+    pszSoundW = (MULTIMEDIA_IsString(fdwSound, pszSoundA)) ?
+        HEAP_strdupAtoW(GetProcessHeap(), 0, pszSoundA) : (LPWSTR)pszSoundA;
     
-    if (!((fdwSound & SND_MEMORY) || 
-          ((fdwSound & SND_RESOURCE) && !((DWORD)pszSoundA >> 16)) ||
-          !pszSoundA)) {
-	pszSoundW = HEAP_strdupAtoW(GetProcessHeap(), 0, pszSoundA);
-	bSound = PlaySoundW(pszSoundW, hmod, fdwSound);
-	HeapFree(GetProcessHeap(), 0, pszSoundW);
-    } else  
-	bSound = PlaySoundW((LPWSTR)pszSoundA, hmod, fdwSound);
-    
+    bSound = PlaySoundW(pszSoundW, hmod, fdwSound);
+    if ((void*)pszSoundW != (void*)pszSoundA) HeapFree(GetProcessHeap(), 0, pszSoundW);
+
     return bSound;
 }
 
@@ -585,14 +597,12 @@
     LPWSTR 	pszSoundW;
     BOOL	bSound;
     
-    if (!((uFlags & SND_MEMORY) || 
-          ((uFlags & SND_RESOURCE) && !((DWORD)pszSoundA >> 16)) ||
-          !pszSoundA)) {
-	pszSoundW = HEAP_strdupAtoW(GetProcessHeap(), 0, pszSoundA);
-	bSound = sndPlaySoundW(pszSoundW, uFlags);
+    pszSoundW = (MULTIMEDIA_IsString(uFlags, pszSoundA)) ?
+        HEAP_strdupAtoW(GetProcessHeap(), 0, pszSoundA) : (LPWSTR)pszSoundA;
+
+    bSound = sndPlaySoundW(pszSoundW, uFlags);
+    if ((void*)pszSoundW != (void*)pszSoundA)
 	HeapFree(GetProcessHeap(), 0, pszSoundW);
-    } else  
-	bSound = sndPlaySoundW((LPWSTR)pszSoundA, uFlags);
     
     return bSound;
 }
@@ -2448,8 +2458,17 @@
 
     TRACE("(%04X, %04X, %08lX, %08lX)\n", hMidiOut, uMessage, dwParam1, dwParam2);
 
-    if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, FALSE)) == NULL) 
+    if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, FALSE)) == NULL) {
+	/* HACK... */
+	if (uMessage == 0x0001) {
+	    *(LPDWORD)dwParam1 = 1;
+	    return 0;
+	}
+	if ((wmld = MMDRV_Get(hMidiOut, MMDRV_MIDIOUT, TRUE)) != NULL) {
+	    return MMDRV_PhysicalFeatures(wmld, uMessage, dwParam1, dwParam2);
+	}
 	return MMSYSERR_INVALHANDLE;
+    }
 
     switch (uMessage) {
     case MODM_OPEN:


More information about the wine-patches mailing list