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