📄 mciavi.c
字号:
/*************************************************************************** * MCIAVI_mciPlay [internal] */static DWORD MCIAVI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms){ WINE_MCIAVI* wma = MCIAVI_mciGetOpenDev(wDevID); DWORD tc; DWORD frameTime; DWORD delta; DWORD dwRet; LPWAVEHDR waveHdr = NULL; unsigned i, nHdr = 0; DWORD dwFromFrame, dwToFrame; TRACE("(%04x, %08lX, %p)\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; if (!wma->hFile) return MCIERR_FILE_NOT_FOUND; if (!wma->hWnd) return MCIERR_NO_WINDOW; wma->dwStatus = MCI_MODE_PLAY; if (!(dwFlags & MCI_WAIT)) { return MCI_SendCommandAsync(wma->openParms.wDeviceID, MCI_PLAY, dwFlags, (DWORD)lpParms, sizeof(MCI_PLAY_PARMS)); } ShowWindow(wma->hWnd, SW_SHOW); dwFromFrame = wma->dwCurrVideoFrame; dwToFrame = wma->dwPlayableVideoFrames - 1; if (lpParms && (dwFlags & MCI_FROM)) { dwFromFrame = MCIAVI_ConvertTimeFormatToFrame(wma, lpParms->dwFrom); } if (lpParms && (dwFlags & MCI_TO)) { dwToFrame = MCIAVI_ConvertTimeFormatToFrame(wma, lpParms->dwTo); } if (dwToFrame >= wma->dwPlayableVideoFrames) dwToFrame = wma->dwPlayableVideoFrames - 1; TRACE("Playing from frame=%lu to frame=%lu\n", dwFromFrame, dwToFrame); if (dwToFrame <= wma->dwCurrVideoFrame) return TRUE; wma->dwCurrVideoFrame = dwFromFrame; if (dwFlags & (MCI_DGV_PLAY_REPEAT|MCI_DGV_PLAY_REVERSE|MCI_MCIAVI_PLAY_WINDOW|MCI_MCIAVI_PLAY_FULLSCREEN)) FIXME("Unsupported flag %08lx\n", dwFlags); /* time is in microseconds, we should convert it to milliseconds */ frameTime = (wma->mah.dwMicroSecPerFrame + 500) / 1000; if (wma->lpWaveFormat) { if ((dwRet = MCIAVI_OpenAudio(wma, &nHdr, &waveHdr)) != 0) goto cleanUp; /* fill the queue with as many wave headers as possible */ MCIAVI_PlayAudioBlocks(wma, nHdr, waveHdr); } while (wma->dwStatus != MCI_MODE_STOP && wma->dwStatus != MCI_MODE_NOT_READY) { tc = GetTickCount(); MCIAVI_DrawFrame(wma); if (wma->lpWaveFormat) { MCIAVI_PlayAudioBlocks(wma, nHdr, waveHdr); delta = GetTickCount() - tc; WaitForSingleObject(wma->hEvent, (delta >= frameTime) ? 0 : frameTime - delta); } delta = GetTickCount() - tc; if (delta < frameTime) Sleep(frameTime - delta); if (wma->dwCurrVideoFrame++ >= dwToFrame) { wma->dwCurrVideoFrame--; wma->dwStatus = MCI_MODE_STOP; } } if (wma->lpWaveFormat) { while (*(volatile DWORD*)&wma->dwEventCount != nHdr - 1) { Sleep(100); } /* just to get rid of some race conditions between play, stop and pause */ waveOutReset(wma->hWave); for (i = 0; i < nHdr; i++) waveOutUnprepareHeader(wma->hWave, &waveHdr[i], sizeof(WAVEHDR)); } dwRet = 0;cleanUp: if (wma->lpWaveFormat) { HeapFree(GetProcessHeap(), 0, waveHdr); if (wma->hWave) { waveOutClose(wma->hWave); wma->hWave = 0; } CloseHandle(wma->hEvent); } if (lpParms && (dwFlags & MCI_NOTIFY)) { TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), wma->openParms.wDeviceID, MCI_NOTIFY_SUCCESSFUL); } wma->dwStatus = MCI_MODE_STOP; return dwRet;}/*************************************************************************** * MCIAVI_mciRecord [internal] */static DWORD MCIAVI_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECORD_PARMS lpParms){ WINE_MCIAVI* wma = MCIAVI_mciGetOpenDev(wDevID); FIXME("(%04x, %08lX, %p) : stub\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; wma->dwStatus = MCI_MODE_RECORD; return 0;}/*************************************************************************** * MCIAVI_mciStop [internal] */static DWORD MCIAVI_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms){ WINE_MCIAVI* wma = MCIAVI_mciGetOpenDev(wDevID); DWORD dwRet = 0; TRACE("(%04x, %08lX, %p)\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; switch (wma->dwStatus) { case MCI_MODE_PAUSE: case MCI_MODE_PLAY: case MCI_MODE_RECORD: { int oldStat = wma->dwStatus; wma->dwStatus = MCI_MODE_NOT_READY; if (oldStat == MCI_MODE_PAUSE) dwRet = waveOutReset(wma->hWave); } while (wma->dwStatus != MCI_MODE_STOP) Sleep(10); break; default: wma->dwStatus = MCI_MODE_STOP; break; } if ((dwFlags & MCI_NOTIFY) && lpParms) { mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), wma->openParms.wDeviceID, MCI_NOTIFY_SUCCESSFUL); } return dwRet;}/*************************************************************************** * MCIAVI_mciPause [internal] */static DWORD MCIAVI_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms){ WINE_MCIAVI* wma = MCIAVI_mciGetOpenDev(wDevID); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; if (wma->dwStatus == MCI_MODE_PLAY) wma->dwStatus = MCI_MODE_PAUSE; return (wma->lpWaveFormat) ? waveOutPause(wma->hWave) : 0;}/*************************************************************************** * MCIAVI_mciResume [internal] */static DWORD MCIAVI_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms){ WINE_MCIAVI* wma = MCIAVI_mciGetOpenDev(wDevID); FIXME("(%04x, %08lX, %p) : stub\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; if (wma->dwStatus == MCI_MODE_PAUSE) wma->dwStatus = MCI_MODE_PLAY; return (wma->lpWaveFormat) ? waveOutRestart(wma->hWave) : 0;}/*************************************************************************** * MCIAVI_mciSeek [internal] */static DWORD MCIAVI_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms){ WINE_MCIAVI* wma = MCIAVI_mciGetOpenDev(wDevID); TRACE("(%04x, %08lX, %p)\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; EnterCriticalSection(&wma->cs); MCIAVI_mciStop(wDevID, MCI_WAIT, 0); if (dwFlags & MCI_SEEK_TO_START) { wma->dwCurrVideoFrame = 0; } else if (dwFlags & MCI_SEEK_TO_END) { wma->dwCurrVideoFrame = wma->dwPlayableVideoFrames - 1; } else if (dwFlags & MCI_TO) { wma->dwCurrVideoFrame = MCIAVI_ConvertTimeFormatToFrame(wma, lpParms->dwTo); } else { WARN("dwFlag doesn't tell where to seek to...\n"); LeaveCriticalSection(&wma->cs); return MCIERR_MISSING_PARAMETER; } TRACE("Seeking to frame=%lu bytes\n", wma->dwCurrVideoFrame); if (dwFlags & MCI_NOTIFY) { mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), wma->openParms.wDeviceID, MCI_NOTIFY_SUCCESSFUL); } LeaveCriticalSection(&wma->cs); return 0;}/***************************************************************************** * MCIAVI_mciLoad [internal] */static DWORD MCIAVI_mciLoad(UINT wDevID, DWORD dwFlags, LPMCI_DGV_LOAD_PARMSA lpParms){ WINE_MCIAVI* wma = MCIAVI_mciGetOpenDev(wDevID); FIXME("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; return 0;}/****************************************************************************** * MCIAVI_mciSave [internal] */static DWORD MCIAVI_mciSave(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SAVE_PARMSA lpParms){ WINE_MCIAVI* wma = MCIAVI_mciGetOpenDev(wDevID); FIXME("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; return 0;}/****************************************************************************** * MCIAVI_mciFreeze [internal] */static DWORD MCIAVI_mciFreeze(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lpParms){ WINE_MCIAVI* wma = MCIAVI_mciGetOpenDev(wDevID); FIXME("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; return 0;}/****************************************************************************** * MCIAVI_mciRealize [internal] */static DWORD MCIAVI_mciRealize(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms){ WINE_MCIAVI* wma = MCIAVI_mciGetOpenDev(wDevID); FIXME("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; return 0;}/****************************************************************************** * MCIAVI_mciUnFreeze [internal] */static DWORD MCIAVI_mciUnFreeze(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lpParms){ WINE_MCIAVI* wma = MCIAVI_mciGetOpenDev(wDevID); FIXME("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; return 0;}/****************************************************************************** * MCIAVI_mciUpdate [internal] */static DWORD MCIAVI_mciUpdate(UINT wDevID, DWORD dwFlags, LPMCI_DGV_UPDATE_PARMS lpParms){ WINE_MCIAVI* wma = MCIAVI_mciGetOpenDev(wDevID); FIXME("(%04x, %08lx, %p) : stub\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; return 0;}/******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -