[PATCH 3/6] winmm: Add playing status to MIDI stream structure and use it.

Andrew Eikum aeikum at codeweavers.com
Thu May 24 15:10:16 CDT 2018


Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>

On Mon, May 21, 2018 at 09:36:12PM +0900, Akihiro Sagawa wrote:
> Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
> ---
>  dlls/winmm/winmm.c | 15 ++++++++++-----
>  1 file changed, 10 insertions(+), 5 deletions(-)
> 

> diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
> index 0933f03..da87be2 100644
> --- a/dlls/winmm/winmm.c
> +++ b/dlls/winmm/winmm.c
> @@ -919,6 +919,7 @@ typedef struct WINE_MIDIStream {
>      DWORD			dwPulses;
>      DWORD			dwStartTicks;
>      WORD			wFlags;
> +    WORD			status;
>      HANDLE			hEvent;
>      LPMIDIHDR			lpMidiHdr;
>  } WINE_MIDIStream;
> @@ -928,6 +929,10 @@ typedef struct WINE_MIDIStream {
>  #define WINE_MSM_PAUSE		(WM_USER+2)
>  #define WINE_MSM_RESUME		(WM_USER+3)
>  
> +#define MSM_STATUS_STOPPED	WINE_MSM_STOP
> +#define MSM_STATUS_PAUSED	WINE_MSM_PAUSE
> +#define MSM_STATUS_PLAYING	WINE_MSM_RESUME
> +
>  /**************************************************************************
>   * 				MMSYSTEM_GetMidiStream		[internal]
>   */
> @@ -976,7 +981,6 @@ static	BOOL	MMSYSTEM_MidiStream_MessageHandler(WINE_MIDIStream* lpMidiStrm, LPWI
>      LPMIDIHDR	lpMidiHdr;
>      LPMIDIHDR*	lpmh;
>      LPBYTE	lpData;
> -    BOOL	paused = FALSE;
>  
>      for (;;) {
>          switch (msg->message) {
> @@ -984,6 +988,7 @@ static	BOOL	MMSYSTEM_MidiStream_MessageHandler(WINE_MIDIStream* lpMidiStrm, LPWI
>              return FALSE;
>          case WINE_MSM_STOP:
>              TRACE("STOP\n");
> +            lpMidiStrm->status = MSM_STATUS_STOPPED;
>              /* this is not quite what MS doc says... */
>              midiOutReset(lpMidiStrm->hDevice);
>              /* empty list of already submitted buffers */
> @@ -1003,10 +1008,11 @@ static	BOOL	MMSYSTEM_MidiStream_MessageHandler(WINE_MIDIStream* lpMidiStrm, LPWI
>          case WINE_MSM_RESUME:
>              /* FIXME: send out cc64 0 (turn off sustain pedal) on every channel */
>              lpMidiStrm->dwStartTicks = GetTickCount() - lpMidiStrm->dwPositionMS;
> +            lpMidiStrm->status = MSM_STATUS_PLAYING;
>              return TRUE;
>          case WINE_MSM_PAUSE:
>              /* FIXME: send out cc64 0 (turn off sustain pedal) on every channel */
> -            paused = TRUE;
> +            lpMidiStrm->status = MSM_STATUS_PAUSED;
>              break;
>  	/* FIXME(EPP): "I don't understand the content of the first MIDIHDR sent
>  	 * by native mcimidi, it doesn't look like a correct one".
> @@ -1087,7 +1093,7 @@ static	BOOL	MMSYSTEM_MidiStream_MessageHandler(WINE_MIDIStream* lpMidiStrm, LPWI
>              FIXME("Unknown message %d\n", msg->message);
>              break;
>          }
> -        if (!paused)
> +        if (lpMidiStrm->status != MSM_STATUS_PAUSED)
>              return TRUE;
>          GetMessageA(msg, 0, 0, 0);
>      }
> @@ -1292,6 +1298,7 @@ MMRESULT WINAPI midiStreamOpen(HMIDISTRM* lphMidiStrm, LPUINT lpuDeviceID,
>      lpMidiStrm->dwTempo = 500000;  /* micro seconds per quarter note, i.e. 120 BPM */
>      lpMidiStrm->dwTimeDiv = 24;    /* ticks per quarter note */
>      lpMidiStrm->dwPositionMS = 0;
> +    lpMidiStrm->status = MSM_STATUS_PAUSED;
>  
>      mosm.dwStreamID = (DWORD)lpMidiStrm;
>      /* FIXME: the correct value is not allocated yet for MAPPER */
> @@ -1332,8 +1339,6 @@ MMRESULT WINAPI midiStreamOpen(HMIDISTRM* lphMidiStrm, LPUINT lpuDeviceID,
>      /* wait for thread to have started, and for its queue to be created */
>      WaitForSingleObject(lpMidiStrm->hEvent, INFINITE);
>  
> -    PostThreadMessageA(lpMidiStrm->dwThreadID, WINE_MSM_PAUSE, 0, 0);
> -
>      TRACE("=> (%u/%d) hMidi=%p ret=%d lpMidiStrm=%p\n",
>  	  *lpuDeviceID, lpwm->mld.uDeviceID, *lphMidiStrm, ret, lpMidiStrm);
>  

> 




More information about the wine-devel mailing list