Andrew Eikum : winmm: Fix looping handling.
Alexandre Julliard
julliard at winehq.org
Tue Aug 2 14:18:24 CDT 2011
Module: wine
Branch: master
Commit: 5512c2482f1ddceffb298cbff06949373bab3efa
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5512c2482f1ddceffb298cbff06949373bab3efa
Author: Andrew Eikum <aeikum at 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;
More information about the wine-cvs
mailing list