Module: wine Branch: master Commit: 71fbaba42690efd8363e0c9f5fac2158b07a977c URL: http://source.winehq.org/git/wine.git/?a=commit;h=71fbaba42690efd8363e0c9f5f...
Author: Bruno Jesus 00cpxxx@gmail.com Date: Wed Jan 25 23:01:25 2017 -0200
mciqtz32: Implement MCI_DGV_PLAY_REPEAT.
Signed-off-by: Bruno Jesus 00cpxxx@gmail.com Signed-off-by: Andrew Eikum aeikum@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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;