/*********************************************************************** * acmDriverRemove (MSACM32.@) */ MMRESULT WINAPI acmDriverRemove(HACMDRIVERID hadid, DWORD fdwRemove) { PWINE_ACMDRIVERID padid; PWINE_ACMNOTIFYWND panwnd; TRACE("(%p, %08x)\n", hadid, fdwRemove); padid = MSACM_GetDriverID(hadid); panwnd = MSACM_GetNotifyWnd(hadid); if (!padid && !panwnd) { WARN("invalid handle\n"); return MMSYSERR_INVALHANDLE; } if (fdwRemove) { WARN("invalid flag\n"); return MMSYSERR_INVALFLAG; } if (padid) MSACM_UnregisterDriver(padid); if (panwnd) MSACM_UnRegisterNotificationWindow(panwnd); MSACM_BroadcastNotification(); return MMSYSERR_NOERROR; }
/*********************************************************************** * MSACM_UnregisterAllDrivers() */ void MSACM_UnregisterAllDrivers(void) { PWINE_ACMDRIVERID p = MSACM_pFirstACMDriverID; while (p) { MSACM_WriteCache(p); p = MSACM_UnregisterDriver(p); } }
/*********************************************************************** * MSACM_RegisterDriver() */ PWINE_ACMDRIVERID MSACM_RegisterDriver(LPCWSTR pszDriverAlias, LPCWSTR pszFileName, PWINE_ACMLOCALDRIVER pLocalDriver) { PWINE_ACMDRIVERID padid; TRACE("(%s, %s, %p)\n", debugstr_w(pszDriverAlias), debugstr_w(pszFileName), pLocalDriver); padid = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVERID)); padid->obj.dwType = WINE_ACMOBJ_DRIVERID; padid->obj.pACMDriverID = padid; padid->pszDriverAlias = NULL; if (pszDriverAlias) { padid->pszDriverAlias = HeapAlloc( MSACM_hHeap, 0, (strlenW(pszDriverAlias)+1) * sizeof(WCHAR) ); strcpyW( padid->pszDriverAlias, pszDriverAlias ); } padid->pszFileName = NULL; if (pszFileName) { padid->pszFileName = HeapAlloc( MSACM_hHeap, 0, (strlenW(pszFileName)+1) * sizeof(WCHAR) ); strcpyW( padid->pszFileName, pszFileName ); } padid->pLocalDriver = pLocalDriver; padid->pACMDriverList = NULL; if (pLocalDriver) { padid->pPrevACMDriverID = NULL; padid->pNextACMDriverID = MSACM_pFirstACMDriverID; if (MSACM_pFirstACMDriverID) MSACM_pFirstACMDriverID->pPrevACMDriverID = padid; MSACM_pFirstACMDriverID = padid; if (!MSACM_pLastACMDriverID) MSACM_pLastACMDriverID = padid; } else { padid->pNextACMDriverID = NULL; padid->pPrevACMDriverID = MSACM_pLastACMDriverID; if (MSACM_pLastACMDriverID) MSACM_pLastACMDriverID->pNextACMDriverID = padid; MSACM_pLastACMDriverID = padid; if (!MSACM_pFirstACMDriverID) MSACM_pFirstACMDriverID = padid; } /* disable the driver if we cannot load the cache */ if ((!padid->pszDriverAlias || !MSACM_ReadCache(padid)) && !MSACM_FillCache(padid)) { WARN("Couldn't load cache for ACM driver (%s)\n", debugstr_w(pszFileName)); MSACM_UnregisterDriver(padid); return NULL; } if (pLocalDriver) padid->fdwSupport |= ACMDRIVERDETAILS_SUPPORTF_LOCAL; return padid; }
/*********************************************************************** * MSACM_UnregisterAllDrivers() */ void MSACM_UnregisterAllDrivers(void) { PWINE_ACMNOTIFYWND panwnd = MSACM_pFirstACMNotifyWnd; PWINE_ACMDRIVERID p = MSACM_pFirstACMDriverID; while (p) { MSACM_WriteCache(p); p = MSACM_UnregisterDriver(p); } while (panwnd) { panwnd = MSACM_UnRegisterNotificationWindow(panwnd); } }
/*********************************************************************** * acmDriverRemove (MSACM32.12) */ MMRESULT WINAPI acmDriverRemove(HACMDRIVERID hadid, DWORD fdwRemove) { PWINE_ACMDRIVERID padid; padid = MSACM_GetDriverID(hadid); if (!padid) return MMSYSERR_INVALHANDLE; if (fdwRemove) return MMSYSERR_INVALFLAG; MSACM_UnregisterDriver(padid); return MMSYSERR_NOERROR; }
/*********************************************************************** * MSACM_RegisterDriver() */ PWINE_ACMDRIVERID MSACM_RegisterDriver(LPSTR pszDriverAlias, LPSTR pszFileName, HINSTANCE hinstModule) { PWINE_ACMDRIVERID padid; TRACE("('%s', '%s', 0x%08x)\n", pszDriverAlias, pszFileName, hinstModule); padid = (PWINE_ACMDRIVERID) HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVERID)); padid->obj.dwType = WINE_ACMOBJ_DRIVERID; padid->obj.pACMDriverID = padid; padid->pszDriverAlias = NULL; if (pszDriverAlias) { padid->pszDriverAlias = HeapAlloc( MSACM_hHeap, 0, strlen(pszDriverAlias)+1 ); strcpy( padid->pszDriverAlias, pszDriverAlias ); } padid->pszFileName = NULL; if (pszFileName) { padid->pszFileName = HeapAlloc( MSACM_hHeap, 0, strlen(pszFileName)+1 ); strcpy( padid->pszFileName, pszFileName ); } padid->hInstModule = hinstModule; padid->pACMDriverList = NULL; padid->pNextACMDriverID = NULL; padid->pPrevACMDriverID = MSACM_pLastACMDriverID; if (MSACM_pLastACMDriverID) MSACM_pLastACMDriverID->pNextACMDriverID = padid; MSACM_pLastACMDriverID = padid; if (!MSACM_pFirstACMDriverID) MSACM_pFirstACMDriverID = padid; /* disable the driver if we cannot load the cache */ if (!MSACM_ReadCache(padid) && !MSACM_FillCache(padid)) { WARN("Couldn't load cache for ACM driver (%s)\n", pszFileName); MSACM_UnregisterDriver(padid); return NULL; } return padid; }
/*********************************************************************** * MSACM_UnregisterAllDrivers32() * FIXME * Where should this function be called? */ void MSACM_UnregisterAllDrivers(void) { PWINE_ACMDRIVERID p; for (p = MSACM_pFirstACMDriverID; p; p = MSACM_UnregisterDriver(p)); }