Module: wine Branch: master Commit: 5512c2482f1ddceffb298cbff06949373bab3efa URL: http://source.winehq.org/git/wine.git/?a=commit;h=5512c2482f1ddceffb298cbff0...
Author: Andrew Eikum aeikum@codeweavers.com Date: Mon Aug 1 13:11:59 2011 -0500
winmm: Fix looping handling.
---
dlls/winmm/waveform.c | 25 ++++++++++++++++--------- 1 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/dlls/winmm/waveform.c b/dlls/winmm/waveform.c index 1b18037..8801900 100644 --- a/dlls/winmm/waveform.c +++ b/dlls/winmm/waveform.c @@ -1263,7 +1263,7 @@ static WAVEHDR *WOD_MarkDoneHeaders(WINMM_Device *device) HRESULT hr; WAVEHDR *queue, *first = device->first; UINT64 clock_freq, clock_pos, clock_frames; - UINT32 nloops, queue_frames; + UINT32 nloops, queue_frames = 0;
hr = IAudioClock_GetFrequency(device->clock, &clock_freq); if(FAILED(hr)){ @@ -1282,19 +1282,21 @@ static WAVEHDR *WOD_MarkDoneHeaders(WINMM_Device *device) first = queue = device->first; nloops = device->loop_counter; while(queue && - (queue_frames = WINMM_HeaderLenFrames(device, queue)) <= + (queue_frames += WINMM_HeaderLenFrames(device, queue)) <= clock_frames - device->last_clock_pos){ - WAVEHDR *next = queue->lpNext; if(!nloops){ device->first->dwFlags &= ~WHDR_INQUEUE; device->first->dwFlags |= WHDR_DONE; device->last_clock_pos += queue_frames; - queue = device->first = next; + queue_frames = 0; + queue = device->first = queue->lpNext; }else{ - if(queue->dwFlags & WHDR_BEGINLOOP) - queue = next; - - if(queue->dwFlags & WHDR_ENDLOOP){ + if(queue->dwFlags & WHDR_BEGINLOOP){ + if(queue->dwFlags & WHDR_ENDLOOP) + --nloops; + else + queue = queue->lpNext; + }else if(queue->dwFlags & WHDR_ENDLOOP){ queue = device->loop_start; --nloops; } @@ -2476,8 +2478,13 @@ UINT WINAPI waveOutWrite(HWAVEOUT hWaveOut, WAVEHDR *header, UINT uSize) device->last = header; if(!device->playing) device->playing = header; - }else + }else{ device->playing = device->first = device->last = header; + if(header->dwFlags & WHDR_BEGINLOOP){ + device->loop_counter = header->dwLoops; + device->loop_start = header; + } + }
header->lpNext = NULL; header->dwFlags &= ~WHDR_DONE;