/************************************************************************** * MCIAVI_drvClose [internal] */ static DWORD MCIAVI_drvClose(DWORD dwDevID) { WINE_MCIAVI *wma; TRACE("%04x\n", dwDevID); /* finish all outstanding things */ MCIAVI_mciClose(dwDevID, MCI_WAIT, NULL); wma = (WINE_MCIAVI*)mciGetDriverData(dwDevID); if (wma) { MCIAVI_UnregisterClass(); EnterCriticalSection(&wma->cs); mciSetDriverData(dwDevID, 0); mciFreeCommandResource(wma->wCommandTable); CloseHandle(wma->hStopEvent); LeaveCriticalSection(&wma->cs); wma->cs.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&wma->cs); HeapFree(GetProcessHeap(), 0, wma); return 1; } return (dwDevID == 0xFFFFFFFF) ? 1 : 0; }
static LRESULT WINAPI MCIAVI_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { TRACE("hwnd=%p msg=%x wparam=%lx lparam=%lx\n", hWnd, uMsg, wParam, lParam); switch (uMsg) { case WM_CREATE: SetWindowLongW(hWnd, 0, (LPARAM)((CREATESTRUCTW *)lParam)->lpCreateParams); return DefWindowProcW(hWnd, uMsg, wParam, lParam); case WM_DESTROY: MCIAVI_mciClose(GetWindowLongW(hWnd, 0), MCI_WAIT, NULL); SetWindowLongW(hWnd, 0, 0); return DefWindowProcW(hWnd, uMsg, wParam, lParam); case WM_ERASEBKGND: { RECT rect; GetClientRect(hWnd, &rect); FillRect((HDC)wParam, &rect, GetStockObject(BLACK_BRUSH)); } return 1; case WM_PAINT: { WINE_MCIAVI *wma = (WINE_MCIAVI *)mciGetDriverData(GetWindowLongW(hWnd, 0)); if (!wma) return DefWindowProcW(hWnd, uMsg, wParam, lParam); EnterCriticalSection(&wma->cs); /* the animation isn't playing, don't paint */ if (wma->dwStatus == MCI_MODE_NOT_READY) { LeaveCriticalSection(&wma->cs); /* default paint handling */ return DefWindowProcW(hWnd, uMsg, wParam, lParam); } if (wParam) MCIAVI_PaintFrame(wma, (HDC)wParam); else { PAINTSTRUCT ps; BeginPaint(hWnd, &ps); MCIAVI_PaintFrame(wma, ps.hdc); EndPaint(hWnd, &ps); } LeaveCriticalSection(&wma->cs); } return 1; default: return DefWindowProcW(hWnd, uMsg, wParam, lParam); } }
/************************************************************************** * DriverProc (MCIAVI.@) */ LRESULT CALLBACK MCIAVI_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, LPARAM dwParam1, LPARAM dwParam2) { TRACE("(%08lX, %p, %08X, %08lX, %08lX)\n", dwDevID, hDriv, wMsg, dwParam1, dwParam2); switch (wMsg) { case DRV_LOAD: return 1; case DRV_FREE: return 1; case DRV_OPEN: return MCIAVI_drvOpen((LPCWSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSW)dwParam2); case DRV_CLOSE: return MCIAVI_drvClose(dwDevID); case DRV_ENABLE: return 1; case DRV_DISABLE: return 1; case DRV_QUERYCONFIGURE: return 1; case DRV_CONFIGURE: return MCIAVI_drvConfigure(dwDevID); case DRV_INSTALL: return DRVCNF_RESTART; case DRV_REMOVE: return DRVCNF_RESTART; } /* session instance */ if (dwDevID == 0xFFFFFFFF) return 1; switch (wMsg) { case MCI_OPEN_DRIVER: return MCIAVI_mciOpen (dwDevID, dwParam1, (LPMCI_DGV_OPEN_PARMSW) dwParam2); case MCI_CLOSE_DRIVER: return MCIAVI_mciClose (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_PLAY: return MCIAVI_mciPlay (dwDevID, dwParam1, (LPMCI_PLAY_PARMS) dwParam2); case MCI_STOP: return MCIAVI_mciStop (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_SET: return MCIAVI_mciSet (dwDevID, dwParam1, (LPMCI_DGV_SET_PARMS) dwParam2); case MCI_PAUSE: return MCIAVI_mciPause (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_RESUME: return MCIAVI_mciResume (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_STATUS: return MCIAVI_mciStatus (dwDevID, dwParam1, (LPMCI_DGV_STATUS_PARMSW) dwParam2); case MCI_GETDEVCAPS: return MCIAVI_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS) dwParam2); case MCI_INFO: return MCIAVI_mciInfo (dwDevID, dwParam1, (LPMCI_DGV_INFO_PARMSW) dwParam2); case MCI_SEEK: return MCIAVI_mciSeek (dwDevID, dwParam1, (LPMCI_SEEK_PARMS) dwParam2); case MCI_PUT: return MCIAVI_mciPut (dwDevID, dwParam1, (LPMCI_DGV_PUT_PARMS) dwParam2); case MCI_WINDOW: return MCIAVI_mciWindow (dwDevID, dwParam1, (LPMCI_DGV_WINDOW_PARMSW) dwParam2); case MCI_LOAD: return MCIAVI_mciLoad (dwDevID, dwParam1, (LPMCI_DGV_LOAD_PARMSW) dwParam2); case MCI_REALIZE: return MCIAVI_mciRealize (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_UPDATE: return MCIAVI_mciUpdate (dwDevID, dwParam1, (LPMCI_DGV_UPDATE_PARMS) dwParam2); case MCI_WHERE: return MCIAVI_mciWhere (dwDevID, dwParam1, (LPMCI_DGV_RECT_PARMS) dwParam2); case MCI_STEP: return MCIAVI_mciStep (dwDevID, dwParam1, (LPMCI_DGV_STEP_PARMS) dwParam2); case MCI_CUE: return MCIAVI_mciCue (dwDevID, dwParam1, (LPMCI_DGV_CUE_PARMS) dwParam2); /* Digital Video specific */ case MCI_SETAUDIO: return MCIAVI_mciSetAudio (dwDevID, dwParam1, (LPMCI_DGV_SETAUDIO_PARMSW) dwParam2); case MCI_SIGNAL: return MCIAVI_mciSignal (dwDevID, dwParam1, (LPMCI_DGV_SIGNAL_PARMS) dwParam2); case MCI_SETVIDEO: return MCIAVI_mciSetVideo (dwDevID, dwParam1, (LPMCI_DGV_SETVIDEO_PARMSW) dwParam2); case MCI_CONFIGURE: return MCIAVI_mciConfigure (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); /* no editing, recording, saving, locking without inputs */ case MCI_CAPTURE: case MCI_COPY: case MCI_CUT: case MCI_DELETE: case MCI_FREEZE: case MCI_LIST: case MCI_MONITOR: case MCI_PASTE: case MCI_QUALITY: case MCI_RECORD: case MCI_RESERVE: case MCI_RESTORE: case MCI_SAVE: case MCI_UNDO: case MCI_UNFREEZE: TRACE("Unsupported function [0x%x] flags=%08x\n", wMsg, (DWORD)dwParam1); return MCIERR_UNSUPPORTED_FUNCTION; case MCI_SPIN: case MCI_ESCAPE: WARN("Unsupported command [0x%x] %08x\n", wMsg, (DWORD)dwParam1); break; case MCI_OPEN: case MCI_CLOSE: FIXME("Shouldn't receive a MCI_OPEN or CLOSE message\n"); break; default: TRACE("Sending msg [%u] to default driver proc\n", wMsg); return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2); } return MCIERR_UNRECOGNIZED_COMMAND; }