[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