From: Yuxuan Shui yshui@codeweavers.com
--- dlls/dmime/midi.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/dlls/dmime/midi.c b/dlls/dmime/midi.c index f8d87ee5d4f..a203e78b996 100644 --- a/dlls/dmime/midi.c +++ b/dlls/dmime/midi.c @@ -82,8 +82,7 @@ static HRESULT read_variable_length_number(IStream *stream, DWORD *out, ULONG *b
static HRESULT read_midi_event(IStream *stream, BYTE *last_status, ULONG *bytes_left) { - BYTE byte; - BYTE status, meta_event_type; + BYTE byte, status, meta_event_type; DWORD length; LARGE_INTEGER offset; HRESULT hr = S_OK; @@ -95,8 +94,7 @@ static HRESULT read_midi_event(IStream *stream, BYTE *last_status, ULONG *bytes_
if (byte & 0x80) { - status = byte; - *last_status = byte; + status = *last_status = byte; if ((hr = stream_read_at_most(stream, &byte, 1, bytes_left)) != S_OK) return hr; } else status = *last_status; @@ -136,8 +134,9 @@ static HRESULT read_midi_event(IStream *stream, BYTE *last_status, ULONG *bytes_ } else { - if ((status & 0xf0) != 0xc0 && (status & 0xf0) != 0xd0) - if ((hr = stream_read_at_most(stream, &byte, 1, bytes_left)) != S_OK) return hr; + if ((status & 0xf0) != 0xc0 && (status & 0xf0) != 0xd0 && + (hr = stream_read_at_most(stream, &byte, 1, bytes_left)) != S_OK) + return hr; FIXME("MIDI event status %#02x, time +%lu, not supported\n", status, delta_time); }
@@ -148,7 +147,7 @@ HRESULT midi_parser_next_track(struct midi_parser *parser, IDirectMusicTrack **o { WORD i = 0; TRACE("(%p, %p): stub\n", parser, out_length); - while (TRUE) + for (i = 0;; i++) { HRESULT hr; BYTE magic[4] = {0}, last_status = 0; @@ -158,10 +157,12 @@ HRESULT midi_parser_next_track(struct midi_parser *parser, IDirectMusicTrack **o
TRACE("Start parsing track %u\n", i); if ((hr = IStream_Read(parser->stream, magic, sizeof(magic), &read)) != S_OK) return hr; - if (read == 0) break; + if (read < sizeof(magic)) break; if (memcmp(magic, "MTrk", 4) != 0) break;
- if ((hr = IStream_Read(parser->stream, &length_be, sizeof(length_be), NULL)) != S_OK) break; + if ((hr = IStream_Read(parser->stream, &length_be, sizeof(length_be), &read)) != S_OK) + break; + if (read < sizeof(length_be)) break; length = GET_BE_DWORD(length_be); TRACE("Track %u, length %lu bytes\n", i, length);
@@ -170,8 +171,8 @@ HRESULT midi_parser_next_track(struct midi_parser *parser, IDirectMusicTrack **o
if (FAILED(hr)) return hr; TRACE("End of track %u\n", i); - i += 1; } + TRACE("End of file\n"); return S_FALSE; }