[PATCH] mciqtz32: Implement MCI_DGV_PLAY_REPEAT

Bruno Jesus 00cpxxx at gmail.com
Wed Jan 25 19:01:25 CST 2017


Found while testing game Roguelight [1] in discussion at #winehq, manually tested by me and user timo. Game music repeats correctly after it.

When repeating media it has to repeat within the same start/stop position so we have to store them, this comes from an old discussion with Joerg-Cyril [2].

[1] https://managore.itch.io/roguelight
[2] https://www.winehq.org/pipermail/wine-devel/2015-August/108991.html

Signed-off-by: Bruno Jesus <00cpxxx at gmail.com>
---
 dlls/mciqtz32/mciqtz.c         | 41 +++++++++++++++++++++++++++++------------
 dlls/mciqtz32/mciqtz_private.h |  3 +++
 2 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/dlls/mciqtz32/mciqtz.c b/dlls/mciqtz32/mciqtz.c
index 54f3b78..1aec326 100644
--- a/dlls/mciqtz32/mciqtz.c
+++ b/dlls/mciqtz32/mciqtz.c
@@ -359,6 +359,18 @@ static DWORD CALLBACK MCIQTZ_notifyThread(LPVOID parm)
                 }
             } while (hr == S_OK && event_code != EC_COMPLETE);
             if (hr == S_OK && event_code == EC_COMPLETE) {
+                /* Repeat the music by seeking and running again */
+                if (wma->mci_flags & MCI_DGV_PLAY_REPEAT) {
+                    TRACE("repeat media as requested\n");
+                    IMediaControl_Stop(wma->pmctrl);
+                    IMediaSeeking_SetPositions(wma->seek,
+                                               &wma->seek_start,
+                                               AM_SEEKING_AbsolutePositioning,
+                                               &wma->seek_stop,
+                                               AM_SEEKING_AbsolutePositioning);
+                    IMediaControl_Run(wma->pmctrl);
+                    continue;
+                }
                 old = InterlockedExchangePointer(&wma->callback, NULL);
                 if (old)
                     mciDriverNotify(old, wma->notify_devid, MCI_NOTIFY_SUCCESSFUL);
@@ -387,9 +399,8 @@ static DWORD MCIQTZ_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
 {
     WINE_MCIQTZ* wma;
     HRESULT hr;
-    REFERENCE_TIME time1 = 0, time2 = 0;
     GUID format;
-    DWORD pos1;
+    DWORD start_flags;
 
     TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms);
 
@@ -408,23 +419,29 @@ static DWORD MCIQTZ_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms
             mciDriverNotify(old, wma->notify_devid, MCI_NOTIFY_ABORTED);
     }
 
+    wma->mci_flags = dwFlags;
     IMediaSeeking_GetTimeFormat(wma->seek, &format);
     if (dwFlags & MCI_FROM) {
         if (IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME))
-            time1 = lpParms->dwFrom * 10000;
+            wma->seek_start = lpParms->dwFrom * 10000;
         else
-            time1 = lpParms->dwFrom;
-        pos1 = AM_SEEKING_AbsolutePositioning;
-    } else
-        pos1 = AM_SEEKING_NoPositioning;
+            wma->seek_start = lpParms->dwFrom;
+        start_flags = AM_SEEKING_AbsolutePositioning;
+    } else {
+        wma->seek_start = 0;
+        start_flags = AM_SEEKING_NoPositioning;
+    }
     if (dwFlags & MCI_TO) {
         if (IsEqualGUID(&format, &TIME_FORMAT_MEDIA_TIME))
-            time2 = lpParms->dwTo * 10000;
+            wma->seek_stop = lpParms->dwTo * 10000;
         else
-            time2 = lpParms->dwTo;
-    } else
-        IMediaSeeking_GetDuration(wma->seek, &time2);
-    IMediaSeeking_SetPositions(wma->seek, &time1, pos1, &time2, AM_SEEKING_AbsolutePositioning);
+            wma->seek_stop = lpParms->dwTo;
+    } else {
+        wma->seek_stop = 0;
+        IMediaSeeking_GetDuration(wma->seek, &wma->seek_stop);
+    }
+    IMediaSeeking_SetPositions(wma->seek, &wma->seek_start, start_flags,
+                               &wma->seek_stop, AM_SEEKING_AbsolutePositioning);
 
     hr = IMediaControl_Run(wma->pmctrl);
     if (FAILED(hr)) {
diff --git a/dlls/mciqtz32/mciqtz_private.h b/dlls/mciqtz32/mciqtz_private.h
index 27939aa..aa6fad9 100644
--- a/dlls/mciqtz32/mciqtz_private.h
+++ b/dlls/mciqtz32/mciqtz_private.h
@@ -37,6 +37,9 @@ typedef struct {
     IBasicVideo*   vidbasic;
     IBasicAudio*   audio;
     DWORD          time_format;
+    DWORD          mci_flags;
+    REFERENCE_TIME seek_start;
+    REFERENCE_TIME seek_stop;
     UINT           command_table;
     HWND           parent;
     MCIDEVICEID    notify_devid;
-- 
2.9.3




More information about the wine-patches mailing list