Bruno Jesus : mciqtz32: Implement MCI_DGV_PLAY_REPEAT.
Alexandre Julliard
julliard at winehq.org
Tue Jan 31 15:42:51 CST 2017
Module: wine
Branch: master
Commit: 71fbaba42690efd8363e0c9f5fac2158b07a977c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=71fbaba42690efd8363e0c9f5fac2158b07a977c
Author: Bruno Jesus <00cpxxx at gmail.com>
Date: Wed Jan 25 23:01:25 2017 -0200
mciqtz32: Implement MCI_DGV_PLAY_REPEAT.
Signed-off-by: Bruno Jesus <00cpxxx at gmail.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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;
More information about the wine-cvs
mailing list