[PATCH 17/17] mciqtz32: Implement MCI_STATUS_LENGTH

Maarten Lankhorst m.b.lankhorst at gmail.com
Tue May 18 08:08:31 CDT 2010


---
 dlls/mciqtz32/mciqtz.c |   42 +++++++++++++++++++++++++++++++++++-------
 1 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c
index 1b41915..24bd979 100644
--- a/dlls/mciqtz32/mciqtz.c
+++ b/dlls/mciqtz32/mciqtz.c
@@ -505,6 +505,7 @@ static DWORD MCIQTZ_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SET_PARMS lpPar
 static DWORD MCIQTZ_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSW lpParms)
 {
     WINE_MCIQTZ* wma;
+    HRESULT hr;
 
     TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms);
 
@@ -521,14 +522,41 @@ static DWORD MCIQTZ_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMS
     }
 
     switch (lpParms->dwItem) {
-        case MCI_STATUS_LENGTH:
-            FIXME("MCI_STATUS_LENGTH not implemented yet\n");
-            return MCIERR_UNRECOGNIZED_COMMAND;
-        case MCI_STATUS_POSITION:
-        {
-            HRESULT hr;
-            REFTIME curpos;
+        case MCI_STATUS_LENGTH: {
+            IMediaSeeking *seek;
+            LONGLONG duration = -1;
+            GUID format;
+            switch (wma->time_format) {
+                case MCI_FORMAT_MILLISECONDS: format = TIME_FORMAT_MEDIA_TIME; break;
+                case MCI_FORMAT_FRAMES: format = TIME_FORMAT_FRAME; break;
+                default: ERR("Unhandled format %x\n", wma->time_format); break;
+            }
+            hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IMediaSeeking, (void**)&seek);
+            if (FAILED(hr)) {
+                FIXME("Cannot get IMediaPostion interface (hr = %x)\n", hr);
+                return MCIERR_INTERNAL;
+            }
+            hr = IMediaSeeking_SetTimeFormat(seek, &format);
+            if (FAILED(hr)) {
+                IMediaSeeking_Release(seek);
+                FIXME("Cannot set time format (hr = %x)\n", hr);
+                lpParms->dwReturn = 0;
+                break;
+            }
+            hr = IMediaSeeking_GetDuration(seek, &duration);
+            IMediaSeeking_Release(seek);
+            if (FAILED(hr) || duration < 0) {
+                FIXME("Cannot read duration (hr = %x)\n", hr);
+                lpParms->dwReturn = 0;
+            } else if (wma->time_format != MCI_FORMAT_MILLISECONDS)
+                lpParms->dwReturn = duration;
+            else
+                lpParms->dwReturn = duration / 10000;
+            break;
+        }
+        case MCI_STATUS_POSITION: {
             IMediaPosition* pmpos;
+            REFTIME curpos;
 
             hr = IGraphBuilder_QueryInterface(wma->pgraph, &IID_IMediaPosition, (LPVOID*)&pmpos);
             if (FAILED(hr)) {
-- 
1.7.0.4


--------------000003030201030008070103--



More information about the wine-patches mailing list