From: Rémi Bernon <rbernon(a)codeweavers.com> --- dlls/dmime/segmentstate.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/dlls/dmime/segmentstate.c b/dlls/dmime/segmentstate.c index 6391f44fd9a..d2377807c43 100644 --- a/dlls/dmime/segmentstate.c +++ b/dlls/dmime/segmentstate.c @@ -53,6 +53,7 @@ struct segment_state MUSIC_TIME end_point; MUSIC_TIME played; BOOL auto_download; + DWORD repeats; struct list tracks; }; @@ -234,6 +235,7 @@ HRESULT segment_state_create(IDirectMusicSegment *segment, MUSIC_TIME start_time This->start_time = start_time; if (SUCCEEDED(hr)) hr = IDirectMusicSegment_GetStartPoint(segment, &This->start_point); if (SUCCEEDED(hr)) hr = IDirectMusicSegment_GetLength(segment, &This->end_point); + if (SUCCEEDED(hr)) hr = IDirectMusicSegment_GetRepeats(segment, &This->repeats); for (i = 0; SUCCEEDED(hr); i++) { @@ -310,10 +312,21 @@ static HRESULT segment_state_play_chunk(struct segment_state *This, IDirectMusic time + duration, &next_time))) return hr; - if ((hr = segment_state_play_until(This, performance, next_time, track_flags)) == S_FALSE) + while ((hr = segment_state_play_until(This, performance, next_time, track_flags)) == S_FALSE) { - MUSIC_TIME end_time = This->start_time + This->played; - return performance_send_segment_end(performance, end_time, iface, FALSE); + if (!This->repeats) + { + MUSIC_TIME end_time = This->start_time + This->played; + return performance_send_segment_end(performance, end_time, iface, FALSE); + } + + if (FAILED(hr = IDirectMusicSegment_GetLoopPoints(This->segment, &This->played, + &This->end_point))) + break; + This->start_time += This->end_point - This->start_point; + This->repeats--; + + if (next_time <= This->start_time || This->end_point <= This->start_point) break; } return hr; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/4358