Alex Villacís Lasso : msacm: acmDriverMessage() with proper support for DRV_CONFIGURE.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jan 18 05:28:42 CST 2006


Module: wine
Branch: refs/heads/master
Commit: d20addf418fd1b99ea56f399924abdda735fc0aa
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=d20addf418fd1b99ea56f399924abdda735fc0aa

Author: Alex Villacís Lasso <a_villacis at palosanto.com>
Date:   Wed Jan 18 12:13:36 2006 +0100

msacm: acmDriverMessage() with proper support for DRV_CONFIGURE.
Allocate and supply a DRVCONFIGINFO structure for DRV_CONFIGURE when
application does not supply one.

---

 dlls/msacm/driver.c |   89 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 88 insertions(+), 1 deletions(-)

diff --git a/dlls/msacm/driver.c b/dlls/msacm/driver.c
index 50c07e0..633c8bd 100644
--- a/dlls/msacm/driver.c
+++ b/dlls/msacm/driver.c
@@ -40,6 +40,7 @@
 #include "msacmdrv.h"
 #include "wineacm.h"
 #include "wine/debug.h"
+#include "wine/unicode.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(msacm);
 
@@ -369,6 +370,15 @@ MMRESULT WINAPI acmDriverID(HACMOBJ hao,
 /***********************************************************************
  *           acmDriverMessage (MSACM32.@)
  *
+ * Note: MSDN documentation (July 2001) is incomplete. This function
+ * accepts sending messages to an HACMDRIVERID in addition to the
+ * documented HACMDRIVER. In fact, for DRV_QUERYCONFIGURE and DRV_CONFIGURE, 
+ * this might actually be the required mode of operation.
+ *
+ * Note: For DRV_CONFIGURE, msacm supplies its own DRVCONFIGINFO structure
+ * when the application fails to supply one. Some native drivers depend on
+ * this and refuse to display unless a valid DRVCONFIGINFO structure is
+ * built and supplied.
  */
 LRESULT WINAPI acmDriverMessage(HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
 {
@@ -378,8 +388,85 @@ LRESULT WINAPI acmDriverMessage(HACMDRIV
 	uMsg == ACMDM_DRIVER_ABOUT ||
 	uMsg == DRV_QUERYCONFIGURE ||
 	uMsg == DRV_CONFIGURE)
-	return MSACM_Message(had, uMsg, lParam1, lParam2);
+    {
+        PWINE_ACMDRIVERID padid;
+        LRESULT lResult;
+        LPDRVCONFIGINFO pConfigInfo = NULL;
 
+        /* Check whether handle is an HACMDRIVERID */
+        padid  = MSACM_GetDriverID((HACMDRIVERID)had);
+        
+        /* If the message is DRV_CONFIGURE, and the application provides no
+           DRVCONFIGINFO structure, msacm must supply its own.
+         */
+        if (uMsg == DRV_CONFIGURE && lParam2 == 0) {
+            LPWSTR pAlias;
+            
+            /* Get the alias from the HACMDRIVERID */
+            if (padid) {
+                pAlias = padid->pszDriverAlias;
+                if (pAlias == NULL) {
+                    WARN("DRV_CONFIGURE: no alias for this driver, cannot self-supply alias\n");
+                }
+            } else {
+                FIXME("DRV_CONFIGURE: reverse lookup HACMDRIVER -> HACMDRIVERID not implemented\n");
+                pAlias = NULL;
+            }
+        
+            if (pAlias != NULL) {
+                unsigned int iStructSize = 16;
+                /* This verification is required because DRVCONFIGINFO is 12 bytes
+                   long, yet native msacm reports a 16-byte structure to codecs.
+                 */
+                if (iStructSize < sizeof(DRVCONFIGINFO)) iStructSize = sizeof(DRVCONFIGINFO);
+                pConfigInfo = HeapAlloc(MSACM_hHeap, 0, iStructSize);
+                if (!pConfigInfo) {
+                    ERR("OOM while supplying DRVCONFIGINFO for DRV_CONFIGURE, using NULL\n");
+                } else {
+                    static const WCHAR drivers32[] = {'D','r','i','v','e','r','s','3','2','\0'};
+                    pConfigInfo->dwDCISize = iStructSize;
+                
+                    pConfigInfo->lpszDCISectionName = HeapAlloc(MSACM_hHeap, 0, (strlenW(drivers32) + 1) * sizeof(WCHAR));
+                    if (pConfigInfo->lpszDCISectionName) strcpyW((WCHAR *)pConfigInfo->lpszDCISectionName, drivers32);
+                    pConfigInfo->lpszDCIAliasName = HeapAlloc(MSACM_hHeap, 0, (strlenW(pAlias) + 1) * sizeof(WCHAR));
+                    if (pConfigInfo->lpszDCIAliasName) strcpyW((WCHAR *)pConfigInfo->lpszDCIAliasName, pAlias);
+                    
+                    if (pConfigInfo->lpszDCISectionName == NULL || pConfigInfo->lpszDCIAliasName == NULL) {
+                        HeapFree(MSACM_hHeap, 0, (void *)pConfigInfo->lpszDCIAliasName);
+                        HeapFree(MSACM_hHeap, 0, (void *)pConfigInfo->lpszDCISectionName);
+                        HeapFree(MSACM_hHeap, 0, pConfigInfo);
+                        pConfigInfo = NULL;
+                        ERR("OOM while supplying DRVCONFIGINFO for DRV_CONFIGURE, using NULL\n");
+                    }
+                }
+            }
+            
+            lParam2 = (LPARAM)pConfigInfo;
+        }
+        
+        if (padid) {
+            /* Handle is really an HACMDRIVERID, must have an open session to get an HACMDRIVER */
+            if (padid->pACMDriverList != NULL) {
+                lResult = SendDriverMessage(padid->pACMDriverList->hDrvr, uMsg, lParam1, lParam2);
+            } else {
+                MMRESULT mmr = acmDriverOpen(&had, (HACMDRIVERID)padid, 0);
+                if (mmr != MMSYSERR_NOERROR) {
+                    lResult = MMSYSERR_INVALPARAM;
+                } else {
+                    lResult = acmDriverMessage(had, uMsg, lParam1, lParam2);
+                    acmDriverClose(had, 0);
+                }
+            }
+        } else {
+            lResult = MSACM_Message(had, uMsg, lParam1, lParam2);
+        }
+        if (pConfigInfo) {
+            HeapFree(MSACM_hHeap, 0, (void *)pConfigInfo->lpszDCIAliasName);
+            HeapFree(MSACM_hHeap, 0, (void *)pConfigInfo->lpszDCISectionName);
+            HeapFree(MSACM_hHeap, 0, pConfigInfo);
+        }
+        return lResult;
+    }
     WARN("invalid parameter\n");
     return MMSYSERR_INVALPARAM;
 }




More information about the wine-cvs mailing list