[PATCH 5/5] winmm: Support TIME_MIDI position in MIDI stream.

Andrew Eikum aeikum at codeweavers.com
Mon Jul 9 09:44:27 CDT 2018


On Tue, Jun 26, 2018 at 10:10:52PM +0900, Akihiro Sagawa wrote:
> diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
> index 023f5c5..60d56a4 100644
> --- a/dlls/winmm/winmm.c
> +++ b/dlls/winmm/winmm.c
> @@ -1514,14 +1514,23 @@ MMRESULT WINAPI midiStreamPosition(HMIDISTRM hMidiStrm, LPMMTIME lpMMT, UINT cbm
>      } else {
>  	EnterCriticalSection(&lpMidiStrm->lock);
>  	switch (lpMMT->wType) {
> -	default:
> -	    FIXME("Unsupported time type %x\n", lpMMT->wType);
> -        /* fall through */
> +	case TIME_MIDI:
> +	    if (lpMidiStrm->dwTimeDiv < 0x8000) {
> +		DWORD tdiv, pulses;
> +		tdiv = (lpMidiStrm->dwTimeDiv > 24) ? lpMidiStrm->dwTimeDiv : 24;
> +		pulses = midistream_get_current_pulse(lpMidiStrm);
> +		lpMMT->u.midi.songptrpos = (pulses + tdiv/8) / (tdiv/4);
> +		if (!lpMMT->u.midi.songptrpos && pulses) lpMMT->u.midi.songptrpos++;
> +		TRACE("=> song position %d (pulses %u, tdiv %u)\n", lpMMT->u.midi.songptrpos, pulses, tdiv);
> +		break;
> +	    }
> +	/* fall through */
>  	case TIME_BYTES:
>  	case TIME_SAMPLES:
>  	    lpMMT->wType = TIME_MS;
>  	    /* fall through to alternative format */
>  	case TIME_MS:
> +	in_ms:
>  	    lpMMT->u.ms = midistream_get_playing_position(lpMidiStrm);
>  	    TRACE("=> %d ms\n", lpMMT->u.ms);
>  	    break;
> @@ -1529,6 +1538,10 @@ MMRESULT WINAPI midiStreamPosition(HMIDISTRM hMidiStrm, LPMMTIME lpMMT, UINT cbm
>  	    lpMMT->u.ticks = midistream_get_current_pulse(lpMidiStrm);
>  	    TRACE("=> %d ticks\n", lpMMT->u.ticks);
>  	    break;
> +	default:
> +	    FIXME("Unsupported time type %x\n", lpMMT->wType);
> +	    lpMMT->wType = TIME_MS;
> +	    goto in_ms;
>  	}
>  	LeaveCriticalSection(&lpMidiStrm->lock);
>      }

This goto is awkward, can you come up with a better way?

Andrew



More information about the wine-devel mailing list