[PATCH] mciqtz32: Implement MCI_DGV_PLAY_REPEAT
Andrew Eikum
aeikum at codeweavers.com
Tue Jan 31 09:02:06 CST 2017
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
On Wed, Jan 25, 2017 at 11:01:25PM -0200, Bruno Jesus wrote:
> 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