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

Andrew Eikum aeikum at codeweavers.com
Wed Jul 11 13:01:40 CDT 2018


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

On Wed, Jul 11, 2018 at 10:33:25PM +0900, Akihiro Sagawa wrote:
> 
> In v2,
> Remove awkward goto statement, duplicate TIME_MS code fragment instead.
> Andrew, as an alternative, do you prefer the following way?
> 
> ---
> redo:
>  switch (lpMMT->wType) {
>      :  :  :
>    /* fall through to alternative format */
>    case TIME_MS:
>      lpMMT->u.ms = midistream_get_playing_position(lpMidiStrm);
>      break;
>    default:
>      lpMMT->wType = TIME_MS;
>      goto redo;
>  }
> ---
> 
> Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
> ---
>  dlls/winmm/tests/midi.c |  4 ++--
>  dlls/winmm/winmm.c      | 21 ++++++++++++++++++---
>  2 files changed, 20 insertions(+), 5 deletions(-)
> 

> diff --git a/dlls/winmm/tests/midi.c b/dlls/winmm/tests/midi.c
> index 66f35ef..2b1e91f 100644
> --- a/dlls/winmm/tests/midi.c
> +++ b/dlls/winmm/tests/midi.c
> @@ -698,7 +698,7 @@ static void test_midiStream(UINT udev, HWND hwnd)
>  
>          test_position(hm, TIME_MS,      TIME_MS);
>          test_position(hm, TIME_TICKS,   TIME_TICKS);
> -        todo_wine test_position(hm, TIME_MIDI,    TIME_MIDI);
> +        test_position(hm, TIME_MIDI,    TIME_MIDI);
>          test_position(hm, TIME_SMPTE,   TIME_MS);
>          test_position(hm, TIME_SAMPLES, TIME_MS);
>          test_position(hm, TIME_BYTES,   TIME_MS);
> @@ -933,7 +933,7 @@ static void test_midiStream(UINT udev, HWND hwnd)
>      /* TIME_MIDI value is a quarter of TIME_TICKS, rounded */
>      expected = (ret + midiprop.tdiv.dwTimeDiv/8) / (midiprop.tdiv.dwTimeDiv/4);
>      ret = get_position(hm, TIME_MIDI);
> -    todo_wine ok(ret == expected, "expected song pointer %u, got %u\n", expected, ret);
> +    ok(ret == expected, "expected song pointer %u, got %u\n", expected, ret);
>  
>      ok(records.count == 2, "expected 2 MM_MOM_DONE messages, got %d\n", records.count);
>  
> diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c
> index f2dfae9..487bbff 100644
> --- a/dlls/winmm/winmm.c
> +++ b/dlls/winmm/winmm.c
> @@ -1508,9 +1508,17 @@ 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;
> @@ -1523,6 +1531,13 @@ 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);
> +	    /* use TIME_MS instead */
> +	    lpMMT->wType = TIME_MS;
> +	    lpMMT->u.ms = midistream_get_playing_position(lpMidiStrm);
> +	    TRACE("=> %d ms\n", lpMMT->u.ms);
> +	    break;
>  	}
>  	LeaveCriticalSection(&lpMidiStrm->lock);
>      }

> 




More information about the wine-devel mailing list