| /* | |
| * 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; | |
| } | |