Stefano Guidoni : msacm32: acmFormatEnum: Implement ACM_FORMATENUMF_SUGGEST .

Alexandre Julliard julliard at winehq.org
Fri Mar 13 09:14:01 CDT 2009


Module: wine
Branch: master
Commit: 3a54e89ff8c682f97c66d6e9c034ca0cd53f96c1
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3a54e89ff8c682f97c66d6e9c034ca0cd53f96c1

Author: Stefano Guidoni <s.guidoni at tin.it>
Date:   Tue Mar 10 16:41:19 2009 +0100

msacm32: acmFormatEnum: Implement ACM_FORMATENUMF_SUGGEST.

---

 dlls/msacm32/format.c |  117 +++++++++++++++++++++++++++++++++---------------
 1 files changed, 80 insertions(+), 37 deletions(-)

diff --git a/dlls/msacm32/format.c b/dlls/msacm32/format.c
index 0d5149c..1b20ce0 100644
--- a/dlls/msacm32/format.c
+++ b/dlls/msacm32/format.c
@@ -443,41 +443,85 @@ static BOOL MSACM_FormatEnumHelper(PWINE_ACMDRIVERID padid, HACMDRIVER had,
     ACMFORMATTAGDETAILSW	aftd;
     unsigned int			i, j;
 
-    for (i = 0; i < padid->cFormatTags; i++) {
-	memset(&aftd, 0, sizeof(aftd));
-	aftd.cbStruct = sizeof(aftd);
-	aftd.dwFormatTagIndex = i;
-	if (acmFormatTagDetailsW(had, &aftd, ACM_FORMATTAGDETAILSF_INDEX) != MMSYSERR_NOERROR)
-	    continue;
-
-	if ((fdwEnum & ACM_FORMATENUMF_WFORMATTAG) && aftd.dwFormatTag != pwfxRef->wFormatTag)
-	    continue;
-
-	for (j = 0; j < aftd.cStandardFormats; j++) {
-	    pafd->dwFormatIndex = j;
-	    pafd->dwFormatTag = aftd.dwFormatTag;
-	    if (acmFormatDetailsW(had, pafd, ACM_FORMATDETAILSF_INDEX) != MMSYSERR_NOERROR)
-		continue;
-
-	    if ((fdwEnum & ACM_FORMATENUMF_NCHANNELS) &&
-		pafd->pwfx->nChannels != pwfxRef->nChannels)
-		continue;
-	    if ((fdwEnum & ACM_FORMATENUMF_NSAMPLESPERSEC) &&
-		pafd->pwfx->nSamplesPerSec != pwfxRef->nSamplesPerSec)
-		continue;
-	    if ((fdwEnum & ACM_FORMATENUMF_WBITSPERSAMPLE) &&
-		pafd->pwfx->wBitsPerSample != pwfxRef->wBitsPerSample)
-		continue;
-	    if ((fdwEnum & ACM_FORMATENUMF_HARDWARE) &&
-		!(pafd->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_HARDWARE))
-		continue;
-
-	    /* more checks to be done on fdwEnum */
-
-	    if (!(fnCallback)((HACMDRIVERID)padid, pafd, dwInstance, padid->fdwSupport))
-		return FALSE;
-	}
-	/* the "formats" used by the filters are also reported */
+    if (fdwEnum & ACM_FORMATENUMF_SUGGEST) {
+        HDRVR hdrvr;
+        ACMDRVFORMATSUGGEST adfs;
+        pafd->dwFormatIndex = 0;
+        memset(&aftd, 0, sizeof(aftd));
+        aftd.cbStruct = sizeof(aftd);
+        memset(&adfs, 0, sizeof(adfs));
+        adfs.cbStruct = sizeof(adfs);
+
+        for (i = 0; i < padid->cFormatTags; i++) {
+            aftd.dwFormatTag = i;
+            pafd->dwFormatTag = aftd.dwFormatTag;
+            pafd->pwfx->wFormatTag = pafd->dwFormatTag;
+
+            if (acmFormatTagDetailsW(had, &aftd, ACM_FORMATTAGDETAILSF_INDEX) != MMSYSERR_NOERROR)
+                continue;
+
+            adfs.cbwfxSrc = aftd.cbFormatSize;
+            adfs.cbwfxDst = aftd.cbFormatSize;
+            adfs.pwfxSrc = pwfxRef;
+            adfs.pwfxDst = pafd->pwfx;
+            pafd->fdwSupport = padid->fdwSupport;
+
+            if ((fdwEnum & ACM_FORMATENUMF_WFORMATTAG) &&
+                aftd.dwFormatTag != pwfxRef->wFormatTag)
+                continue;
+
+            if ((fdwEnum & ACM_FORMATENUMF_HARDWARE) &&
+                !(pafd->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_HARDWARE))
+                continue;
+
+            hdrvr = OpenDriver(padid->pszFileName,0,0);
+            SendDriverMessage(hdrvr,ACMDM_FORMAT_SUGGEST,(DWORD)&adfs,(fdwEnum & 0x000000FFL));
+
+            if (acmFormatDetailsW(had, pafd, ACM_FORMATDETAILSF_FORMAT) != MMSYSERR_NOERROR)
+                continue;
+
+            pafd->cbwfx = sizeof(*(pafd->pwfx));
+
+            if (!(fnCallback)((HACMDRIVERID)padid, pafd, dwInstance, padid->fdwSupport))
+                return FALSE;
+        }
+    } else {
+        for (i = 0; i < padid->cFormatTags; i++) {
+            memset(&aftd, 0, sizeof(aftd));
+            aftd.cbStruct = sizeof(aftd);
+            aftd.dwFormatTagIndex = i;
+            if (acmFormatTagDetailsW(had, &aftd, ACM_FORMATTAGDETAILSF_INDEX) != MMSYSERR_NOERROR)
+                continue;
+
+            if ((fdwEnum & ACM_FORMATENUMF_WFORMATTAG) && aftd.dwFormatTag != pwfxRef->wFormatTag)
+                continue;
+
+            for (j = 0; j < aftd.cStandardFormats; j++) {
+                pafd->dwFormatIndex = j;
+                pafd->dwFormatTag = aftd.dwFormatTag;
+                if (acmFormatDetailsW(had, pafd, ACM_FORMATDETAILSF_INDEX) != MMSYSERR_NOERROR)
+                    continue;
+
+                if ((fdwEnum & ACM_FORMATENUMF_NCHANNELS) &&
+                    pafd->pwfx->nChannels != pwfxRef->nChannels)
+                    continue;
+                if ((fdwEnum & ACM_FORMATENUMF_NSAMPLESPERSEC) &&
+                    pafd->pwfx->nSamplesPerSec != pwfxRef->nSamplesPerSec)
+                    continue;
+                if ((fdwEnum & ACM_FORMATENUMF_WBITSPERSAMPLE) &&
+                    pafd->pwfx->wBitsPerSample != pwfxRef->wBitsPerSample)
+                    continue;
+                if ((fdwEnum & ACM_FORMATENUMF_HARDWARE) &&
+                    !(pafd->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_HARDWARE))
+                    continue;
+
+            /* more checks to be done on fdwEnum */
+
+                if (!(fnCallback)((HACMDRIVERID)padid, pafd, dwInstance, padid->fdwSupport))
+                    return FALSE;
+            }
+        /* the "formats" used by the filters are also reported */
+        }
     }
     return TRUE;
 }
@@ -514,8 +558,7 @@ MMRESULT WINAPI acmFormatEnumW(HACMDRIVER had, PACMFORMATDETAILSW pafd,
 	(pafd->dwFormatTag != pafd->pwfx->wFormatTag))
 	return MMSYSERR_INVALPARAM;
 
-    if (fdwEnum & (ACM_FORMATENUMF_CONVERT|ACM_FORMATENUMF_SUGGEST|
-		   ACM_FORMATENUMF_INPUT|ACM_FORMATENUMF_OUTPUT))
+    if (fdwEnum & (ACM_FORMATENUMF_CONVERT|ACM_FORMATENUMF_INPUT|ACM_FORMATENUMF_OUTPUT))
 	FIXME("Unsupported fdwEnum values %08x\n", fdwEnum);
 
     if (had) {




More information about the wine-cvs mailing list