[PATCH 2/3] [Msacm32]: convert acmFormatChoose internals to Unicode, implement acmFormatChoose[AW] on top of it

Eric Pouech eric.pouech at orange.fr
Sun Aug 12 03:03:41 CDT 2012


(#26465)

A+
---

 dlls/msacm32/format.c |  181 ++++++++++++++++++++++++++++++++++---------------
 1 file changed, 125 insertions(+), 56 deletions(-)


diff --git a/dlls/msacm32/format.c b/dlls/msacm32/format.c
index f117994..c81b5dc 100644
--- a/dlls/msacm32/format.c
+++ b/dlls/msacm32/format.c
@@ -1,5 +1,3 @@
-/* -*- tab-width: 8; c-basic-offset: 4 -*- */
-
 /*
  *      MSACM32 library
  *
@@ -45,13 +43,13 @@ struct MSACM_FillFormatData {
 #define WINE_ACMFF_FORMAT	1
 #define WINE_ACMFF_WFX		2
     int			mode;
-    char		szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
-    PACMFORMATCHOOSEA	afc;
+    WCHAR		szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
+    PACMFORMATCHOOSEW	afc;
     DWORD		ret;
 };
 
 static BOOL CALLBACK MSACM_FillFormatTagsCB(HACMDRIVERID hadid,
-					    PACMFORMATTAGDETAILSA paftd,
+                                            PACMFORMATTAGDETAILSW paftd,
                                             DWORD_PTR dwInstance,
                                             DWORD fdwSupport)
 {
@@ -59,21 +57,21 @@ static BOOL CALLBACK MSACM_FillFormatTagsCB(HACMDRIVERID hadid,
 
     switch (affd->mode) {
     case WINE_ACMFF_TAG:
-	if (SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
+	if (SendDlgItemMessageW(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
                                 CB_FINDSTRINGEXACT, -1,
                                 (LPARAM)paftd->szFormatTag) == CB_ERR)
-	    SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
+	    SendDlgItemMessageW(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
                                 CB_ADDSTRING, 0, (LPARAM)paftd->szFormatTag);
 	break;
     case WINE_ACMFF_FORMAT:
-	if (strcmp(affd->szFormatTag, paftd->szFormatTag) == 0) {
+	if (strcmpW(affd->szFormatTag, paftd->szFormatTag) == 0) {
 	    HACMDRIVER		had;
 
 	    if (acmDriverOpen(&had, hadid, 0) == MMSYSERR_NOERROR) {
-		ACMFORMATDETAILSA	afd;
-               unsigned int            i, len;
+		ACMFORMATDETAILSW	afd;
+                unsigned int            i, len;
 		MMRESULT		mmr;
-		char			buffer[ACMFORMATDETAILS_FORMAT_CHARS+16];
+		WCHAR			buffer[ACMFORMATDETAILS_FORMAT_CHARS+16];
 
 		afd.cbStruct = sizeof(afd);
 		afd.dwFormatTag = paftd->dwFormatTag;
@@ -84,42 +82,45 @@ static BOOL CALLBACK MSACM_FillFormatTagsCB(HACMDRIVERID hadid,
 		afd.cbwfx = paftd->cbFormatSize;
 
 		for (i = 0; i < paftd->cStandardFormats; i++) {
+                    static const WCHAR fmtW[] = {'%','d',' ','K','o','/','s','\0'};
+                    int j;
+
 		    afd.dwFormatIndex = i;
-		    mmr = acmFormatDetailsA(had, &afd, ACM_FORMATDETAILSF_INDEX);
+		    mmr = acmFormatDetailsW(had, &afd, ACM_FORMATDETAILSF_INDEX);
 		    if (mmr == MMSYSERR_NOERROR) {
-                       lstrcpynA(buffer, afd.szFormat, ACMFORMATTAGDETAILS_FORMATTAG_CHARS + 1);
-                       len = strlen(buffer);
-                       memset(buffer+len, ' ', ACMFORMATTAGDETAILS_FORMATTAG_CHARS - len);
-			wsprintfA(buffer + ACMFORMATTAGDETAILS_FORMATTAG_CHARS,
-				  "%d Ko/s",
-				  (afd.pwfx->nAvgBytesPerSec + 512) / 1024);
-			SendDlgItemMessageA(affd->hWnd,
-					    IDD_ACMFORMATCHOOSE_CMB_FORMAT,
-                                            CB_ADDSTRING, 0, (LPARAM)buffer);
+                       lstrcpynW(buffer, afd.szFormat, ACMFORMATTAGDETAILS_FORMATTAG_CHARS + 1);
+                       len = strlenW(buffer);
+                       for (j = len; j < ACMFORMATTAGDETAILS_FORMATTAG_CHARS; j++)
+                           buffer[j] = ' ';
+                       wsprintfW(buffer + ACMFORMATTAGDETAILS_FORMATTAG_CHARS,
+                                 fmtW, (afd.pwfx->nAvgBytesPerSec + 512) / 1024);
+                       SendDlgItemMessageW(affd->hWnd,
+                                           IDD_ACMFORMATCHOOSE_CMB_FORMAT,
+                                           CB_ADDSTRING, 0, (LPARAM)buffer);
 		    }
 		}
 		acmDriverClose(had, 0);
-		SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT,
+		SendDlgItemMessageW(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT,
 				    CB_SETCURSEL, 0, 0);
 		HeapFree(MSACM_hHeap, 0, afd.pwfx);
 	    }
 	}
 	break;
     case WINE_ACMFF_WFX:
-	if (strcmp(affd->szFormatTag, paftd->szFormatTag) == 0) {
+	if (strcmpW(affd->szFormatTag, paftd->szFormatTag) == 0) {
 	    HACMDRIVER		had;
 
 	    if (acmDriverOpen(&had, hadid, 0) == MMSYSERR_NOERROR) {
-		ACMFORMATDETAILSA	afd;
+		ACMFORMATDETAILSW	afd;
 
 		afd.cbStruct = sizeof(afd);
 		afd.dwFormatTag = paftd->dwFormatTag;
 		afd.pwfx = affd->afc->pwfx;
 		afd.cbwfx = affd->afc->cbwfx;
 
-		afd.dwFormatIndex = SendDlgItemMessageA(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT,
+		afd.dwFormatIndex = SendDlgItemMessageW(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT,
 							CB_GETCURSEL, 0, 0);
-		affd->ret = acmFormatDetailsA(had, &afd, ACM_FORMATDETAILSF_INDEX);
+		affd->ret = acmFormatDetailsW(had, &afd, ACM_FORMATDETAILSF_INDEX);
 		acmDriverClose(had, 0);
 		return TRUE;
 	    }
@@ -134,7 +135,7 @@ static BOOL CALLBACK MSACM_FillFormatTagsCB(HACMDRIVERID hadid,
 
 static BOOL MSACM_FillFormatTags(HWND hWnd)
 {
-    ACMFORMATTAGDETAILSA	aftd;
+    ACMFORMATTAGDETAILSW	aftd;
     struct MSACM_FillFormatData	affd;
 
     memset(&aftd, 0, sizeof(aftd));
@@ -143,37 +144,37 @@ static BOOL MSACM_FillFormatTags(HWND hWnd)
     affd.hWnd = hWnd;
     affd.mode = WINE_ACMFF_TAG;
 
-    acmFormatTagEnumA(NULL, &aftd, MSACM_FillFormatTagsCB, (DWORD_PTR)&affd, 0);
-    SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, CB_SETCURSEL, 0, 0);
+    acmFormatTagEnumW(NULL, &aftd, MSACM_FillFormatTagsCB, (DWORD_PTR)&affd, 0);
+    SendDlgItemMessageW(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, CB_SETCURSEL, 0, 0);
     return TRUE;
 }
 
 static BOOL MSACM_FillFormat(HWND hWnd)
 {
-    ACMFORMATTAGDETAILSA	aftd;
+    ACMFORMATTAGDETAILSW	aftd;
     struct MSACM_FillFormatData	affd;
 
-    SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT, CB_RESETCONTENT, 0, 0);
+    SendDlgItemMessageW(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT, CB_RESETCONTENT, 0, 0);
 
     memset(&aftd, 0, sizeof(aftd));
     aftd.cbStruct = sizeof(aftd);
 
     affd.hWnd = hWnd;
     affd.mode = WINE_ACMFF_FORMAT;
-    SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
+    SendDlgItemMessageW(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
 			CB_GETLBTEXT,
-			SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
+			SendDlgItemMessageW(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
 					    CB_GETCURSEL, 0, 0),
                         (LPARAM)affd.szFormatTag);
 
-    acmFormatTagEnumA(NULL, &aftd, MSACM_FillFormatTagsCB, (DWORD_PTR)&affd, 0);
-    SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT, CB_SETCURSEL, 0, 0);
+    acmFormatTagEnumW(NULL, &aftd, MSACM_FillFormatTagsCB, (DWORD_PTR)&affd, 0);
+    SendDlgItemMessageW(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT, CB_SETCURSEL, 0, 0);
     return TRUE;
 }
 
-static MMRESULT MSACM_GetWFX(HWND hWnd, PACMFORMATCHOOSEA afc)
+static MMRESULT MSACM_GetWFX(HWND hWnd, PACMFORMATCHOOSEW afc)
 {
-    ACMFORMATTAGDETAILSA	aftd;
+    ACMFORMATTAGDETAILSW	aftd;
     struct MSACM_FillFormatData	affd;
 
     memset(&aftd, 0, sizeof(aftd));
@@ -183,29 +184,29 @@ static MMRESULT MSACM_GetWFX(HWND hWnd, PACMFORMATCHOOSEA afc)
     affd.mode = WINE_ACMFF_WFX;
     affd.afc = afc;
     affd.ret = MMSYSERR_NOERROR;
-    SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
+    SendDlgItemMessageW(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
 			CB_GETLBTEXT,
-			SendDlgItemMessageA(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
+			SendDlgItemMessageW(hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG,
 					    CB_GETCURSEL, 0, 0),
                         (LPARAM)affd.szFormatTag);
 
-    acmFormatTagEnumA(NULL, &aftd, MSACM_FillFormatTagsCB, (DWORD_PTR)&affd, 0);
+    acmFormatTagEnumW(NULL, &aftd, MSACM_FillFormatTagsCB, (DWORD_PTR)&affd, 0);
     return affd.ret;
 }
 
-static const char* fmt_prop = "acmprop";
+static const WCHAR fmt_prop[] = {'a','c','m','p','r','o','p','\0'};
 
 static INT_PTR CALLBACK FormatChooseDlgProc(HWND hWnd, UINT msg,
                                             WPARAM wParam, LPARAM lParam)
 {
-    PACMFORMATCHOOSEA   afc = (PACMFORMATCHOOSEA)GetPropA(hWnd, fmt_prop);
+    PACMFORMATCHOOSEW   afc = (PACMFORMATCHOOSEW)GetPropW(hWnd, fmt_prop);
 
-    TRACE("hwnd=%p msg=%i 0x%08lx 0x%08lx\n", hWnd,  msg, wParam, lParam);
+    TRACE("hwnd=%p msg=%i 0x%08lx 0x%08lx\n", hWnd, msg, wParam, lParam);
 
     switch (msg) {
     case WM_INITDIALOG:
-	afc = (PACMFORMATCHOOSEA)lParam;
-        SetPropA(hWnd, fmt_prop, (HANDLE)afc);
+	afc = (PACMFORMATCHOOSEW)lParam;
+	SetPropW(hWnd, fmt_prop, (HANDLE)afc);
 	MSACM_FillFormatTags(hWnd);
 	MSACM_FillFormat(hWnd);
 	if ((afc->fdwStyle & ~(ACMFORMATCHOOSE_STYLEF_CONTEXTHELP|
@@ -236,8 +237,8 @@ static INT_PTR CALLBACK FormatChooseDlgProc(HWND hWnd, UINT msg,
 	    break;
 	case IDD_ACMFORMATCHOOSE_BTN_HELP:
 	    if (afc->fdwStyle & ACMFORMATCHOOSE_STYLEF_SHOWHELP)
-		SendMessageA(afc->hwndOwner,
-			     RegisterWindowMessageA(ACMHELPMSGSTRINGA), 0L, 0L);
+		SendMessageW(afc->hwndOwner,
+			     RegisterWindowMessageW(ACMHELPMSGSTRINGW), 0L, 0L);
 	    break;
 
 	default:
@@ -248,15 +249,15 @@ static INT_PTR CALLBACK FormatChooseDlgProc(HWND hWnd, UINT msg,
 	break;
     case WM_CONTEXTMENU:
 	if (afc->fdwStyle & ACMFORMATCHOOSE_STYLEF_CONTEXTHELP)
-	    SendMessageA(afc->hwndOwner,
-			 RegisterWindowMessageA(ACMHELPMSGCONTEXTMENUA),
+	    SendMessageW(afc->hwndOwner,
+			 RegisterWindowMessageW(ACMHELPMSGCONTEXTMENUW),
 			 wParam, lParam);
 	break;
 #if defined(WM_CONTEXTHELP)
     case WM_CONTEXTHELP:
 	if (afc->fdwStyle & ACMFORMATCHOOSE_STYLEF_CONTEXTHELP)
-	    SendMessageA(afc->hwndOwner,
-			 RegisterWindowMessageA(ACMHELPMSGCONTEXTHELPA),
+	    SendMessageW(afc->hwndOwner,
+			 RegisterWindowMessageW(ACMHELPMSGCONTEXTHELPW),
 			 wParam, lParam);
 	break;
 #endif
@@ -273,8 +274,77 @@ static INT_PTR CALLBACK FormatChooseDlgProc(HWND hWnd, UINT msg,
  */
 MMRESULT WINAPI acmFormatChooseA(PACMFORMATCHOOSEA pafmtc)
 {
-    return DialogBoxParamA(MSACM_hInstance32, MAKEINTRESOURCEA(DLG_ACMFORMATCHOOSE_ID),
-                           pafmtc->hwndOwner, FormatChooseDlgProc, (LPARAM)pafmtc);
+    ACMFORMATCHOOSEW    afcw;
+    MMRESULT            ret;
+    LPWSTR              title = NULL;
+    LPWSTR              name = NULL;
+    LPWSTR              templ = NULL;
+    DWORD               sz;
+
+    afcw.cbStruct  = sizeof(afcw);
+    afcw.fdwStyle  = pafmtc->fdwStyle;
+    afcw.hwndOwner = pafmtc->hwndOwner;
+    afcw.pwfx      = pafmtc->pwfx;
+    afcw.cbwfx     = pafmtc->cbwfx;
+    if (pafmtc->pszTitle)
+    {
+        sz = MultiByteToWideChar(CP_ACP, 0, pafmtc->pszTitle, -1, NULL, 0);
+        if (!(title = HeapAlloc(GetProcessHeap(), 0, sz * sizeof(WCHAR))))
+        {
+            ret = MMSYSERR_NOMEM;
+            goto done;
+        }
+        MultiByteToWideChar(CP_ACP, 0, pafmtc->pszTitle, -1, title, sz);
+    }
+    afcw.pszTitle  = title;
+    if (pafmtc->pszName)
+    {
+        sz = MultiByteToWideChar(CP_ACP, 0, pafmtc->pszName, -1, NULL, 0);
+        if (!(name = HeapAlloc(GetProcessHeap(), 0, sz * sizeof(WCHAR))))
+        {
+            ret = MMSYSERR_NOMEM;
+            goto done;
+        }
+        MultiByteToWideChar(CP_ACP, 0, pafmtc->pszName, -1, name, sz);
+    }
+    afcw.pszName   = name;
+    afcw.cchName   = pafmtc->cchName;
+    afcw.fdwEnum   = pafmtc->fdwEnum;
+    afcw.pwfxEnum  = pafmtc->pwfxEnum;
+    afcw.hInstance = pafmtc->hInstance;
+    if (pafmtc->pszTemplateName)
+    {
+        sz = MultiByteToWideChar(CP_ACP, 0, pafmtc->pszTemplateName, -1, NULL, 0);
+        if (!(templ = HeapAlloc(GetProcessHeap(), 0, sz * sizeof(WCHAR))))
+        {
+            ret = MMSYSERR_NOMEM;
+            goto done;
+        }
+        MultiByteToWideChar(CP_ACP, 0, pafmtc->pszTemplateName, -1, templ, sz);
+    }
+    afcw.pszTemplateName = templ;
+    /* FIXME: hook procs not supported yet */
+    if (pafmtc->pfnHook)
+    {
+        FIXME("Unsupported hook procs\n");
+        ret = MMSYSERR_NOTSUPPORTED;
+        goto done;
+    }
+    ret = acmFormatChooseW(&afcw);
+    if (ret == MMSYSERR_NOERROR)
+    {
+        WideCharToMultiByte(CP_ACP, 0, afcw.szFormatTag, -1, pafmtc->szFormatTag, sizeof(pafmtc->szFormatTag),
+                            NULL, NULL);
+        WideCharToMultiByte(CP_ACP, 0, afcw.szFormat, -1, pafmtc->szFormat, sizeof(pafmtc->szFormat),
+                            NULL, NULL);
+        if (pafmtc->pszName)
+            WideCharToMultiByte(CP_ACP, 0, afcw.pszName, -1, pafmtc->pszName, pafmtc->cchName, NULL, NULL);
+    }
+done:
+    HeapFree(GetProcessHeap(), 0, title);
+    HeapFree(GetProcessHeap(), 0, name);
+    HeapFree(GetProcessHeap(), 0, templ);
+    return ret;
 }
 
 /***********************************************************************
@@ -282,9 +352,8 @@ MMRESULT WINAPI acmFormatChooseA(PACMFORMATCHOOSEA pafmtc)
  */
 MMRESULT WINAPI acmFormatChooseW(PACMFORMATCHOOSEW pafmtc)
 {
-    FIXME("(%p): stub\n", pafmtc);
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return MMSYSERR_ERROR;
+    return DialogBoxParamW(MSACM_hInstance32, MAKEINTRESOURCEW(DLG_ACMFORMATCHOOSE_ID),
+                           pafmtc->hwndOwner, FormatChooseDlgProc, (LPARAM)pafmtc);
 }
 
 /***********************************************************************




More information about the wine-patches mailing list