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