/*********************************************************************** * acmFormatEnumW (MSACM32.@) */ static BOOL MSACM_FormatEnumHelper(PWINE_ACMDRIVERID padid, HACMDRIVER had, PACMFORMATDETAILSW pafd, PWAVEFORMATEX pwfxRef, ACMFORMATENUMCBW fnCallback, DWORD dwInstance, DWORD fdwEnum) { 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 */ } return TRUE; }
/*********************************************************************** * acmFormatDetailsA (MSACM32.@) */ MMRESULT WINAPI acmFormatDetailsA(HACMDRIVER had, PACMFORMATDETAILSA pafd, DWORD fdwDetails) { ACMFORMATDETAILSW afdw; MMRESULT mmr; memset(&afdw, 0, sizeof(afdw)); afdw.cbStruct = sizeof(afdw); afdw.dwFormatIndex = pafd->dwFormatIndex; afdw.dwFormatTag = pafd->dwFormatTag; afdw.pwfx = pafd->pwfx; afdw.cbwfx = pafd->cbwfx; mmr = acmFormatDetailsW(had, &afdw, fdwDetails); if (mmr == MMSYSERR_NOERROR) { pafd->dwFormatTag = afdw.dwFormatTag; pafd->fdwSupport = afdw.fdwSupport; WideCharToMultiByte( CP_ACP, 0, afdw.szFormat, -1, pafd->szFormat, sizeof(pafd->szFormat), NULL, NULL ); } return mmr; }
/*********************************************************************** * acmFormatEnumW (MSACM32.@) */ static BOOL MSACM_FormatEnumHelper(PWINE_ACMDRIVERID padid, HACMDRIVER had, PACMFORMATDETAILSW pafd, PWAVEFORMATEX pwfxRef, ACMFORMATENUMCBW fnCallback, DWORD_PTR dwInstance, DWORD fdwEnum) { ACMFORMATTAGDETAILSW aftd; unsigned int i, j; 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,(LPARAM)&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; }
static BOOL CALLBACK MSACM_FillFormatTagsCB(HACMDRIVERID hadid, PACMFORMATTAGDETAILSW paftd, DWORD_PTR dwInstance, DWORD fdwSupport) { struct MSACM_FillFormatData* affd = (struct MSACM_FillFormatData*)dwInstance; switch (affd->mode) { case WINE_ACMFF_TAG: if (SendDlgItemMessageW(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, CB_FINDSTRINGEXACT, -1, (LPARAM)paftd->szFormatTag) == CB_ERR) SendDlgItemMessageW(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, CB_ADDSTRING, 0, (LPARAM)paftd->szFormatTag); break; case WINE_ACMFF_FORMAT: if (strcmpW(affd->szFormatTag, paftd->szFormatTag) == 0) { HACMDRIVER had; if (acmDriverOpen(&had, hadid, 0) == MMSYSERR_NOERROR) { ACMFORMATDETAILSW afd; unsigned int i, len; MMRESULT mmr; WCHAR buffer[ACMFORMATDETAILS_FORMAT_CHARS+16]; afd.cbStruct = sizeof(afd); afd.dwFormatTag = paftd->dwFormatTag; afd.pwfx = HeapAlloc(MSACM_hHeap, 0, paftd->cbFormatSize); if (!afd.pwfx) return FALSE; afd.pwfx->wFormatTag = paftd->dwFormatTag; afd.pwfx->cbSize = paftd->cbFormatSize; 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 = acmFormatDetailsW(had, &afd, ACM_FORMATDETAILSF_INDEX); if (mmr == MMSYSERR_NOERROR) { 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); SendDlgItemMessageW(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT, CB_SETCURSEL, 0, 0); HeapFree(MSACM_hHeap, 0, afd.pwfx); } } break; case WINE_ACMFF_WFX: if (strcmpW(affd->szFormatTag, paftd->szFormatTag) == 0) { HACMDRIVER had; if (acmDriverOpen(&had, hadid, 0) == MMSYSERR_NOERROR) { ACMFORMATDETAILSW afd; afd.cbStruct = sizeof(afd); afd.dwFormatTag = paftd->dwFormatTag; afd.pwfx = affd->afc->pwfx; afd.cbwfx = affd->afc->cbwfx; afd.dwFormatIndex = SendDlgItemMessageW(affd->hWnd, IDD_ACMFORMATCHOOSE_CMB_FORMAT, CB_GETCURSEL, 0, 0); affd->ret = acmFormatDetailsW(had, &afd, ACM_FORMATDETAILSF_INDEX); acmDriverClose(had, 0); return TRUE; } } break; default: FIXME("Unknown mode (%d)\n", affd->mode); break; } return TRUE; }