Jörg Höhle : mciavi: Step is like Seek.

Alexandre Julliard julliard at winehq.org
Fri Feb 12 10:17:44 CST 2010


Module: wine
Branch: master
Commit: 541c6c2d97fba1745c738116692e3abd8c0217d8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=541c6c2d97fba1745c738116692e3abd8c0217d8

Author: Jörg Höhle <hoehle at users.sourceforge.net>
Date:   Sat Nov 28 08:26:36 2009 +0100

mciavi: Step is like Seek.

---

 dlls/mciavi32/mciavi.c |   51 ++++++++++++++++++++++++++++++++---------------
 1 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/dlls/mciavi32/mciavi.c b/dlls/mciavi32/mciavi.c
index 46bd991..d77525c 100644
--- a/dlls/mciavi32/mciavi.c
+++ b/dlls/mciavi32/mciavi.c
@@ -674,6 +674,7 @@ static	DWORD	MCIAVI_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lp
 static	DWORD	MCIAVI_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms)
 {
     WINE_MCIAVI *wma;
+    DWORD position;
 
     TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms);
 
@@ -681,27 +682,28 @@ static	DWORD	MCIAVI_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms
 
     wma = MCIAVI_mciGetOpenDev(wDevID);
     if (wma == NULL)		return MCIERR_INVALID_DEVICE_ID;
+
+    position = dwFlags & (MCI_SEEK_TO_START|MCI_SEEK_TO_END|MCI_TO);
+    if (!position)		return MCIERR_MISSING_PARAMETER;
+    if (position&(position-1))	return MCIERR_FLAGS_NOT_COMPATIBLE;
+
+    if (dwFlags & MCI_TO) {
+	position = MCIAVI_ConvertTimeFormatToFrame(wma, lpParms->dwTo);
+	if (position >= wma->dwPlayableVideoFrames)
+	    return MCIERR_OUTOFRANGE;
+    } else if (dwFlags & MCI_SEEK_TO_START) {
+	position = 0;
+    } else {
+	position = wma->dwPlayableVideoFrames - 1;
+    }
     if (dwFlags & MCI_TEST)	return 0;
 
     MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
 
     EnterCriticalSection(&wma->cs);
 
-    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) {
-        if (lpParms->dwTo > wma->dwPlayableVideoFrames - 1)
-            lpParms->dwTo = wma->dwPlayableVideoFrames - 1;
-	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=%u bytes\n", wma->dwCurrVideoFrame);
+    wma->dwCurrVideoFrame = position;
+    TRACE("Seeking to frame=%u\n", wma->dwCurrVideoFrame);
 
     if (dwFlags & MCI_NOTIFY) {
 	mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),
@@ -777,17 +779,34 @@ static	DWORD	MCIAVI_mciUpdate(UINT wDevID, DWORD dwFlags, LPMCI_DGV_UPDATE_PARMS
 static	DWORD	MCIAVI_mciStep(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STEP_PARMS lpParms)
 {
     WINE_MCIAVI *wma;
+    DWORD position;
+    int delta = 1;
 
-    FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms);
+    TRACE("(%04x, %08x, %p)\n", wDevID, dwFlags, lpParms);
 
     if (lpParms == NULL)	return MCIERR_NULL_PARAMETER_BLOCK;
 
     wma = MCIAVI_mciGetOpenDev(wDevID);
     if (wma == NULL)		return MCIERR_INVALID_DEVICE_ID;
+
+    if (dwFlags & MCI_DGV_STEP_FRAMES)  delta = lpParms->dwFrames;
+    if (dwFlags & MCI_DGV_STEP_REVERSE) delta = -delta;
+    position = wma->dwCurrVideoFrame + delta;
+    if (position >= wma->dwPlayableVideoFrames) return MCIERR_OUTOFRANGE;
     if (dwFlags & MCI_TEST)	return 0;
 
     MCIAVI_mciStop(wDevID, MCI_WAIT, NULL);
 
+    EnterCriticalSection(&wma->cs);
+
+    wma->dwCurrVideoFrame = position;
+    TRACE("Stepping to frame=%u\n", wma->dwCurrVideoFrame);
+
+    if (dwFlags & MCI_NOTIFY) {
+	mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)),
+                       wDevID, MCI_NOTIFY_SUCCESSFUL);
+    }
+    LeaveCriticalSection(&wma->cs);
     return 0;
 }
 




More information about the wine-cvs mailing list