/* * MSACM32 library * * Copyright 1998 Patrik Stridvall */ #include "windows.h" #include "winerror.h" #include "wintypes.h" #include "debug.h" #include "driver.h" #include "heap.h" #include "mmsystem.h" #include "msacm.h" #include "msacmdrv.h" #include "winreg.h" /*********************************************************************** * acmDriverAddA (MSACM32.2) */ MMRESULT32 WINAPI acmDriverAdd32A( PHACMDRIVERID32 phadid, HINSTANCE32 hinstModule, LPARAM lParam, DWORD dwPriority, DWORD fdwAdd) { PWINE_ACMLOCALDRIVER32 pld; if(!phadid) return MMSYSERR_INVALPARAM; /* Check if any unknown flags */ if(fdwAdd & ~(ACM_DRIVERADDF_FUNCTION|ACM_DRIVERADDF_NOTIFYHWND| ACM_DRIVERADDF_GLOBAL)) return MMSYSERR_INVALFLAG; /* Check if any incompatible flags */ if((fdwAdd & ACM_DRIVERADDF_FUNCTION) && (fdwAdd & ACM_DRIVERADDF_NOTIFYHWND)) return MMSYSERR_INVALFLAG; pld = HeapAlloc(MSACM_hHeap32, 0, sizeof(WINE_ACMLOCALDRIVER32)); pld->pfnDriverProc = (DRIVERPROC32) GetProcAddress32(hinstModule, "DriverProc"); *phadid = (HACMDRIVERID32) MSACM_RegisterDriver32(NULL, NULL, pld); /* FIXME: lParam, dwPriority and fdwAdd ignored */ return MMSYSERR_NOERROR; } /*********************************************************************** * acmDriverAddW (MSACM32.3) * FIXME * Not implemented */ MMRESULT32 WINAPI acmDriverAdd32W( PHACMDRIVERID32 phadid, HINSTANCE32 hinstModule, LPARAM lParam, DWORD dwPriority, DWORD fdwAdd) { FIXME(msacm, "(%p, 0x%08x, %ld, %ld, %ld): stub\n", phadid, hinstModule, lParam, dwPriority, fdwAdd ); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return MMSYSERR_ERROR; } /*********************************************************************** * acmDriverClose (MSACM32.4) */ MMRESULT32 WINAPI acmDriverClose32( HACMDRIVER32 had, DWORD fdwClose) { PWINE_ACMDRIVER32 p; if(fdwClose) return MMSYSERR_INVALFLAG; p = MSACM_GetDriver32(had); if(!p) return MMSYSERR_INVALHANDLE; p->obj.pACMDriverID->pACMDriver = NULL; /* FIXME: CloseDriver32 not implemented */ #if 0 if(p->hDrvr) CloseDriver32(p->hDrvr, 0, 0); #endif HeapFree(MSACM_hHeap32, 0, p); return MMSYSERR_NOERROR; } /*********************************************************************** * acmDriverDetailsA (MSACM32.5) */ MMRESULT32 WINAPI acmDriverDetails32A( HACMDRIVERID32 hadid, PACMDRIVERDETAILS32A padd, DWORD fdwDetails) { PWINE_ACMDRIVERID32 p; MMRESULT32 mmr; BOOL32 bOpenTemporary; p = MSACM_GetDriverID32(hadid); if(!p) return MMSYSERR_INVALHANDLE; if(fdwDetails) return MMSYSERR_INVALFLAG; bOpenTemporary = !p->pACMDriver; if(bOpenTemporary) { bOpenTemporary = TRUE; acmDriverOpen32((PHACMDRIVER32) &p->pACMDriver, hadid, 0); } /* FIXME * How does the driver know if the ANSI or * the UNICODE variant of PACMDRIVERDETAILS is used? * It might check cbStruct or does it only accept ANSI. */ mmr = (MMRESULT32) acmDriverMessage32( (HACMDRIVER32) p->pACMDriver, ACMDM_DRIVER_DETAILS, (LPARAM) padd, 0 ); if(bOpenTemporary) { acmDriverClose32((HACMDRIVER32) p->pACMDriver, 0); p->pACMDriver = NULL; } return mmr; } /*********************************************************************** * acmDriverDetailsW (MSACM32.6) * FIXME * Not implemented */ MMRESULT32 WINAPI acmDriverDetails32W( HACMDRIVERID32 hadid, PACMDRIVERDETAILS32W padd, DWORD fdwDetails) { FIXME(msacm, "(0x%08x, %p, %ld): stub\n", hadid, padd, fdwDetails); SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return MMSYSERR_ERROR; } /*********************************************************************** * acmDriverEnum (MSACM32.7) */ MMRESULT32 WINAPI acmDriverEnum32( ACMDRIVERENUMCB32 fnCallback, DWORD dwInstance, DWORD fdwEnum) { PWINE_ACMDRIVERID32 p; if(!fnCallback) { return MMSYSERR_INVALPARAM; } if(fdwEnum && ~(ACM_DRIVERENUMF_NOLOCAL|ACM_DRIVERENUMF_DISABLED)) { return MMSYSERR_INVALFLAG; } p = MSACM_pFirstACMDriverID32; while(p) { (*fnCallback)((HACMDRIVERID32) p, dwInstance, ACMDRIVERDETAILS_SUPPORTF_CODEC); p = p->pNextACMDriverID; } return MMSYSERR_NOERROR; } /*********************************************************************** * acmDriverID (MSACM32.8) */ MMRESULT32 WINAPI acmDriverID32( HACMOBJ32 hao, PHACMDRIVERID32 phadid, DWORD fdwDriverID) { PWINE_ACMOBJ32 pao; pao = MSACM_GetObj32(hao); if(!pao) return MMSYSERR_INVALHANDLE; if(!phadid) return MMSYSERR_INVALPARAM; if(fdwDriverID) return MMSYSERR_INVALFLAG; *phadid = (HACMDRIVERID32) pao->pACMDriverID; return MMSYSERR_NOERROR; } /*********************************************************************** * acmDriverMessage (MSACM32.9) * FIXME * Not implemented */ LRESULT WINAPI acmDriverMessage32( HACMDRIVER32 had, UINT32 uMsg, LPARAM lParam1, LPARAM lParam2) { PWINE_ACMDRIVER32 pad = MSACM_GetDriver32(had); if(!pad) return MMSYSERR_INVALPARAM; /* FIXME: Check if uMsg legal */ if(!SendDriverMessage32(pad->hDrvr, uMsg, lParam1, lParam2)) return MMSYSERR_NOTSUPPORTED; return MMSYSERR_NOERROR; } /*********************************************************************** * acmDriverOpen (MSACM32.10) */ MMRESULT32 WINAPI acmDriverOpen32( PHACMDRIVER32 phad, HACMDRIVERID32 hadid, DWORD fdwOpen) { PWINE_ACMDRIVERID32 padid; if(!phad) return MMSYSERR_INVALPARAM; padid = MSACM_GetDriverID32(hadid); if(!padid) return MMSYSERR_INVALHANDLE; if(fdwOpen) return MMSYSERR_INVALFLAG; if(padid->pACMDriver) { /* FIXME: Is it allowed? */ ERR(msacm, "Can't open driver twice\n"); return MMSYSERR_ERROR; } padid->pACMDriver = HeapAlloc( MSACM_hHeap32, 0, sizeof(WINE_ACMDRIVER32) ); padid->pACMDriver->obj.pACMDriverID = padid; if(!padid->pACMLocalDriver) padid->pACMDriver->hDrvr = OpenDriver32A(padid->pszDriverAlias, "drivers32", 0); else { padid->pACMDriver->hDrvr = MSACM_OpenDriverProc32( padid->pACMLocalDriver->pfnDriverProc ); } if(!padid->pACMDriver->hDrvr) return MMSYSERR_ERROR; /* FIXME: Create a WINE_ACMDRIVER32 */ *phad = (HACMDRIVER32) NULL; return MMSYSERR_ERROR; } /*********************************************************************** * acmDriverPriority (MSACM32.11) */ MMRESULT32 WINAPI acmDriverPriority32( HACMDRIVERID32 hadid, DWORD dwPriority, DWORD fdwPriority) { PWINE_ACMDRIVERID32 padid; CHAR szSubKey[17]; CHAR szBuffer[256]; LONG lBufferLength = sizeof(szBuffer); LONG lError; HKEY hPriorityKey; DWORD dwPriorityCounter; padid = MSACM_GetDriverID32(hadid); if(!padid) return MMSYSERR_INVALHANDLE; /* Check for unknown flags */ if(fdwPriority & ~(ACM_DRIVERPRIORITYF_ENABLE|ACM_DRIVERPRIORITYF_DISABLE| ACM_DRIVERPRIORITYF_BEGIN|ACM_DRIVERPRIORITYF_END)) return MMSYSERR_INVALFLAG; /* Check for incompatible flags */ if((fdwPriority & ACM_DRIVERPRIORITYF_ENABLE) && (fdwPriority & ACM_DRIVERPRIORITYF_DISABLE)) return MMSYSERR_INVALFLAG; /* Check for incompatible flags */ if((fdwPriority & ACM_DRIVERPRIORITYF_BEGIN) && (fdwPriority & ACM_DRIVERPRIORITYF_END)) return MMSYSERR_INVALFLAG; lError = RegOpenKey32A(HKEY_CURRENT_USER, "Software\\Microsoft\\Multimedia\\" "Audio Compression Manager\\Priority v4.00", &hPriorityKey ); /* FIXME: Create key */ if(lError != ERROR_SUCCESS) return MMSYSERR_ERROR; for(dwPriorityCounter = 1; ; dwPriorityCounter++) { snprintf(szSubKey, 17, "Priorty%ld", dwPriorityCounter); lError = RegQueryValue32A(hPriorityKey, szSubKey, szBuffer, &lBufferLength); if(lError != ERROR_SUCCESS) break; FIXME(msacm, "(0x%08x, %ld, %ld): stub (partial)\n", hadid, dwPriority, fdwPriority ); break; } RegCloseKey(hPriorityKey); return MMSYSERR_ERROR; } /*********************************************************************** * acmDriverRemove (MSACM32.12) */ MMRESULT32 WINAPI acmDriverRemove32( HACMDRIVERID32 hadid, DWORD fdwRemove) { PWINE_ACMDRIVERID32 padid; padid = MSACM_GetDriverID32(hadid); if(!padid) return MMSYSERR_INVALHANDLE; if(fdwRemove) return MMSYSERR_INVALFLAG; MSACM_UnregisterDriver32(padid); return MMSYSERR_NOERROR; }