[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