PWINE_ACMLOCALDRIVERINST MSACM_OpenLocalDriver(PWINE_ACMLOCALDRIVER paldrv, LPARAM lParam2) { PWINE_ACMLOCALDRIVERINST pDrvInst; pDrvInst = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMLOCALDRIVERINST)); if (!pDrvInst) return NULL; pDrvInst->pLocalDriver = paldrv; pDrvInst->dwDriverID = 0; pDrvInst->pNextACMInst = NULL; pDrvInst->bSession = FALSE; /* Win32 installable drivers must support a two phase opening scheme: * + first open with NULL as lParam2 (session instance), * + then do a second open with the real non null lParam2) */ if (MSACM_GetNumberOfModuleRefs(paldrv->hModule, paldrv->lpDrvProc, NULL) == 0 && lParam2) { PWINE_ACMLOCALDRIVERINST ret; if (!MSACM_AddToList(pDrvInst, 0L)) { ERR("load0 failed\n"); goto exit; } ret = MSACM_OpenLocalDriver(paldrv, lParam2); if (!ret) { ERR("load1 failed\n"); /* If MSACM_CloseLocalDriver returns TRUE, * then pDrvInst has been freed */ if (!MSACM_CloseLocalDriver(pDrvInst)) goto exit; return NULL; } pDrvInst->bSession = TRUE; return ret; } if (!MSACM_AddToList(pDrvInst, lParam2)) { ERR("load failed\n"); goto exit; } TRACE("=> %p\n", pDrvInst); return pDrvInst; exit: HeapFree(MSACM_hHeap, 0, pDrvInst); return NULL; }
/*********************************************************************** * acmDriverOpen (MSACM32.@) */ MMRESULT WINAPI acmDriverOpen(PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen) { PWINE_ACMDRIVERID padid; PWINE_ACMDRIVER pad = NULL; MMRESULT ret; TRACE("(%p, %p, %08u)\n", phad, hadid, fdwOpen); if (!phad) { WARN("invalid parameter\n"); return MMSYSERR_INVALPARAM; } if (fdwOpen) { WARN("invalid flag\n"); return MMSYSERR_INVALFLAG; } padid = MSACM_GetDriverID(hadid); if (!padid) { WARN("invalid handle\n"); return MMSYSERR_INVALHANDLE; } pad = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVER)); if (!pad) { WARN("no memory\n"); return MMSYSERR_NOMEM; } pad->obj.dwType = WINE_ACMOBJ_DRIVER; pad->obj.pACMDriverID = padid; pad->hDrvr = 0; pad->pLocalDrvrInst = NULL; if (padid->pLocalDriver == NULL) { ACMDRVOPENDESCW adod; int len; LPWSTR section_name; /* this is not an externally added driver... need to actually load it */ if (!padid->pszDriverAlias) { ret = MMSYSERR_ERROR; goto gotError; } adod.cbStruct = sizeof(adod); adod.fccType = ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC; adod.fccComp = ACMDRIVERDETAILS_FCCCOMP_UNDEFINED; adod.dwVersion = acmGetVersion(); adod.dwFlags = fdwOpen; adod.dwError = 0; len = strlen("Drivers32") + 1; section_name = HeapAlloc(MSACM_hHeap, 0, len * sizeof(WCHAR)); MultiByteToWideChar(CP_ACP, 0, "Drivers32", -1, section_name, len); adod.pszSectionName = section_name; adod.pszAliasName = padid->pszDriverAlias; adod.dnDevNode = 0; pad->hDrvr = OpenDriver(padid->pszDriverAlias, NULL, (DWORD_PTR)&adod); HeapFree(MSACM_hHeap, 0, section_name); if (!pad->hDrvr) { ret = adod.dwError; if (ret == MMSYSERR_NOERROR) ret = MMSYSERR_NODRIVER; goto gotError; } } else { ACMDRVOPENDESCW adod; pad->hDrvr = NULL; adod.cbStruct = sizeof(adod); adod.fccType = ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC; adod.fccComp = ACMDRIVERDETAILS_FCCCOMP_UNDEFINED; adod.dwVersion = acmGetVersion(); adod.dwFlags = fdwOpen; adod.dwError = 0; adod.pszSectionName = NULL; adod.pszAliasName = NULL; adod.dnDevNode = 0; pad->pLocalDrvrInst = MSACM_OpenLocalDriver(padid->pLocalDriver, (DWORD_PTR)&adod); if (!pad->pLocalDrvrInst) { ret = adod.dwError; if (ret == MMSYSERR_NOERROR) ret = MMSYSERR_NODRIVER; goto gotError; } } /* insert new pad at beg of list */ pad->pNextACMDriver = padid->pACMDriverList; padid->pACMDriverList = pad; /* FIXME: Create a WINE_ACMDRIVER32 */ *phad = (HACMDRIVER)pad; TRACE("%s => %p\n", debugstr_w(padid->pszDriverAlias), pad); return MMSYSERR_NOERROR; gotError: WARN("failed: ret = %08x\n", ret); if (pad && !pad->hDrvr) HeapFree(MSACM_hHeap, 0, pad); return ret; }