Module: wine Branch: master Commit: aebcb1a996724aadc2fc02f913c10bdc1e711faf URL: https://gitlab.winehq.org/wine/wine/-/commit/aebcb1a996724aadc2fc02f913c10bd...
Author: Yuxuan Shui yshui@codeweavers.com Date: Tue Feb 27 15:42:52 2024 +0000
dmime: Better MIDI parsing interface.
MIDI tracks don't map one-to-one to segment tracks, so it doesn't make sense to use a "get_next_track()" interface.
---
dlls/dmime/dmime_private.h | 7 ++----- dlls/dmime/midi.c | 23 +++++++++++++++++------ dlls/dmime/segment.c | 16 +--------------- 3 files changed, 20 insertions(+), 26 deletions(-)
diff --git a/dlls/dmime/dmime_private.h b/dlls/dmime/dmime_private.h index cdf0810381d..1c030dc314d 100644 --- a/dlls/dmime/dmime_private.h +++ b/dlls/dmime/dmime_private.h @@ -70,11 +70,8 @@ extern HRESULT create_dmtempotrack(REFIID riid, void **ret_iface); extern HRESULT create_dmtimesigtrack(REFIID riid, void **ret_iface); extern HRESULT create_dmwavetrack(REFIID riid, void **ret_iface);
-/* Create a new MIDI file parser. Note the stream might still be modified even - * when this function fails. */ -extern HRESULT midi_parser_new(IStream *stream, struct midi_parser **out_parser); -extern HRESULT midi_parser_next_track(struct midi_parser *parser, IDirectMusicTrack **out_track, MUSIC_TIME *out_length); -extern void midi_parser_destroy(struct midi_parser *parser); +/* Parse a MIDI file. Note the stream might still be modified even when this function fails. */ +extern HRESULT parse_midi(IStream *stream, IDirectMusicSegment8 *segment);
extern void set_audiopath_perf_pointer(IDirectMusicAudioPath*,IDirectMusicPerformance8*); extern void set_audiopath_dsound_buffer(IDirectMusicAudioPath*,IDirectSoundBuffer*); diff --git a/dlls/dmime/midi.c b/dlls/dmime/midi.c index a31146e636f..40db1d2232c 100644 --- a/dlls/dmime/midi.c +++ b/dlls/dmime/midi.c @@ -125,10 +125,10 @@ static HRESULT read_midi_event(IStream *stream, BYTE *last_status, ULONG *bytes_ return S_OK; }
-HRESULT midi_parser_next_track(struct midi_parser *parser, IDirectMusicTrack **out_track, MUSIC_TIME *out_length) +static HRESULT midi_parser_parse(struct midi_parser *parser, IDirectMusicSegment8 *segment) { WORD i = 0; - TRACE("(%p, %p): stub\n", parser, out_length); + TRACE("(%p, %p): stub\n", parser, segment); for (i = 0;; i++) { HRESULT hr; @@ -159,7 +159,13 @@ HRESULT midi_parser_next_track(struct midi_parser *parser, IDirectMusicTrack **o return S_FALSE; }
-HRESULT midi_parser_new(IStream *stream, struct midi_parser **out_parser) +static void midi_parser_destroy(struct midi_parser *parser) +{ + IStream_Release(parser->stream); + free(parser); +} + +static HRESULT midi_parser_new(IStream *stream, struct midi_parser **out_parser) { LARGE_INTEGER offset; DWORD length; @@ -202,8 +208,13 @@ HRESULT midi_parser_new(IStream *stream, struct midi_parser **out_parser) return hr; }
-void midi_parser_destroy(struct midi_parser *parser) +HRESULT parse_midi(IStream *stream, IDirectMusicSegment8 *segment) { - IStream_Release(parser->stream); - free(parser); + struct midi_parser *parser; + HRESULT hr; + + if (FAILED(hr = midi_parser_new(stream, &parser))) return hr; + hr = midi_parser_parse(parser, segment); + midi_parser_destroy(parser); + return hr; } diff --git a/dlls/dmime/segment.c b/dlls/dmime/segment.c index b0485aaedd9..b96f0e2e401 100644 --- a/dlls/dmime/segment.c +++ b/dlls/dmime/segment.c @@ -791,10 +791,7 @@ static inline struct segment *impl_from_IPersistStream(IPersistStream *iface) static HRESULT WINAPI segment_persist_stream_Load(IPersistStream *iface, IStream *stream) { struct segment *This = impl_from_IPersistStream(iface); - IDirectMusicTrack *track; - MUSIC_TIME length; struct chunk_entry chunk = {0}; - struct midi_parser *midi_parser; HRESULT hr;
TRACE("(%p, %p): Loading\n", This, stream); @@ -810,18 +807,7 @@ static HRESULT WINAPI segment_persist_stream_Load(IPersistStream *iface, IStream break;
case mmioFOURCC('M','T','h','d'): - hr = midi_parser_new(stream, &midi_parser); - if (FAILED(hr)) break; - This->header.mtLength = 0; - while ((hr = midi_parser_next_track(midi_parser, &track, &length)) == S_OK) - { - hr = segment_append_track(This, track, 1, 0); - IDirectMusicTrack_Release(track); - if (FAILED(hr)) break; - if (length > This->header.mtLength) - This->header.mtLength = length; - } - midi_parser_destroy(midi_parser); + hr = parse_midi(stream, &This->IDirectMusicSegment8_iface); break;
case MAKE_IDTYPE(FOURCC_RIFF, mmioFOURCC('W','A','V','E')):