From: Rémi Bernon rbernon@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;