PATCH: Fixes problems with properly listing audio codecs

Waldeck Schutzer schutzer at math.rutgers.edu
Wed Jan 22 10:11:10 CST 2003


Audio codecs were erroneously being listed multple times, making it 
difficult to run certain applications like VirtualDub. This patch to 
msacm/format.c fixes this problem and now codecs are apparently being 
listed correctly modulo the appearance of certain information provided 
for display on combo-boxes (check out the appearance of combo-box under 
Audio/Compression in VirtualDub 1.4.10 or later).

Enjoy,
Waldeck

PS: Eric: To preserve conciseness, I broke down that controversial patch 
into two parts, each one affecting a single source-code file. As you 
acknoledged this one seems to be correct. :-)
-------------- next part --------------
Index: wine/dlls/msacm/format.c
===================================================================
RCS file: /home/wine/wine/dlls/msacm/format.c,v
retrieving revision 1.20
diff -u -p -r1.20 format.c
--- wine/dlls/msacm/format.c	2 Dec 2002 18:10:59 -0000	1.20
+++ wine/dlls/msacm/format.c	20 Jan 2003 20:02:45 -0000
@@ -758,36 +758,74 @@ MMRESULT WINAPI acmFormatTagEnumW(HACMDR
 
     if (paftd->cbStruct < sizeof(*paftd)) return MMSYSERR_INVALPARAM;
 
-    if (had) FIXME("had != NULL, not supported\n");
+    /* (WS) MSDN info page says that if had != 0, then we should find
+     * the specific driver to get its tags from. Therefore I'm removing
+     * the FIXME call and adding a search block below. It also seems
+     * that the lack of this functionality was the responsible for 
+     * codecs to be multiply and incorrectly listed. 
+     */
+
+    /* if (had) FIXME("had != NULL, not supported\n"); */
+
+    if (had) {
+
+       if (acmDriverID((HACMOBJ)had, (HACMDRIVERID *)&padid, 0) != MMSYSERR_NOERROR)
+          return MMSYSERR_INVALHANDLE;
+
+       for (i = 0; i < padid->cFormatTags; i++) {
+	  paftd->dwFormatTagIndex = i;
+	  if (MSACM_Message(had, ACMDM_FORMATTAG_DETAILS,
+	  (LPARAM)paftd, ACM_FORMATTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) {
+	     if (paftd->dwFormatTag == WAVE_FORMAT_PCM) {
+	        if (paftd->szFormatTag[0] == 0)
+		   MultiByteToWideChar( CP_ACP, 0, "PCM", -1, paftd->szFormatTag,
+			 sizeof(paftd->szFormatTag)/sizeof(WCHAR) );
+		/* (WS) I'm preserving this PCM hack since it seems to be
+		 * correct. Please notice this block was borrowed from
+		 * below.
+	  	 */
+		if (bPcmDone) continue;
+		   bPcmDone = TRUE;
+	     }
+	     if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance, padid->fdwSupport)) 
+                return MMSYSERR_NOERROR;
+	  }
+       }
 
-    for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
-	/* should check for codec only */
-	if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
-	    acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == MMSYSERR_NOERROR) {
-	    for (i = 0; i < padid->cFormatTags; i++) {
-		paftd->dwFormatTagIndex = i;
-		if (MSACM_Message(had, ACMDM_FORMATTAG_DETAILS,
-				  (LPARAM)paftd, ACM_FORMATTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) {
-		    if (paftd->dwFormatTag == WAVE_FORMAT_PCM) {
-			if (paftd->szFormatTag[0] == 0)
-			    MultiByteToWideChar( CP_ACP, 0, "PCM", -1, paftd->szFormatTag,
-						 sizeof(paftd->szFormatTag)/sizeof(WCHAR) );
-			/* FIXME (EPP): I'm not sure this is the correct
-			 * algorithm (should make more sense to apply the same
-			 * for all already loaded formats, but this will do
-			 * for now
-			 */
-			if (bPcmDone) continue;
-			bPcmDone = TRUE;
-		    }
-		    if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance, padid->fdwSupport)) {
-                        acmDriverClose(had, 0);
-                        return MMSYSERR_NOERROR;
-		    }
-		}
-	    }
-	}
-	acmDriverClose(had, 0);
+    }
+
+    /* if had==0 then search for the first suitable driver */
+    else {
+       for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
+          /* should check for codec only */
+          if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
+	     acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == MMSYSERR_NOERROR) {
+	     for (i = 0; i < padid->cFormatTags; i++) {
+	        paftd->dwFormatTagIndex = i;
+	        if (MSACM_Message(had, ACMDM_FORMATTAG_DETAILS,
+	           (LPARAM)paftd, ACM_FORMATTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) {
+	           if (paftd->dwFormatTag == WAVE_FORMAT_PCM) {
+		      if (paftd->szFormatTag[0] == 0)
+		         MultiByteToWideChar( CP_ACP, 0, "PCM", -1, paftd->szFormatTag,
+				 sizeof(paftd->szFormatTag)/sizeof(WCHAR) );
+		      /* FIXME (EPP): I'm not sure this is the correct
+		       * algorithm (should make more sense to apply the same
+		       * for all already loaded formats, but this will do
+	  	       * for now
+	       	       */
+		      if (bPcmDone) continue;
+		         bPcmDone = TRUE;
+		   }
+		   if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance, padid->fdwSupport)) {
+                      acmDriverClose(had, 0);
+                      return MMSYSERR_NOERROR;
+		   }
+	        }
+	     }
+          }
+          acmDriverClose(had, 0);
+       }
     }
     return MMSYSERR_NOERROR;
 }
+


More information about the wine-patches mailing list