[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