Ken Thomases : winecoreaudio: Lift mutex lock/ unlock out of wodHelper_PlayPtrNext to caller.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Dec 21 10:36:33 CST 2006


Module: wine
Branch: master
Commit: 82fff94c338571ec95a1cda47570a3b71523588e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=82fff94c338571ec95a1cda47570a3b71523588e

Author: Ken Thomases <ken at codeweavers.com>
Date:   Thu Dec 21 03:49:07 2006 -0600

winecoreaudio: Lift mutex lock/unlock out of wodHelper_PlayPtrNext to caller.

---

 dlls/winmm/winecoreaudio/audio.c |   27 +++++++++------------------
 1 files changed, 9 insertions(+), 18 deletions(-)

diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c
index d38fe9b..c967ebb 100644
--- a/dlls/winmm/winecoreaudio/audio.c
+++ b/dlls/winmm/winecoreaudio/audio.c
@@ -897,14 +897,13 @@ static void wodHelper_CheckForLoopBegin(
 * 				wodHelper_PlayPtrNext	        [internal]
 *
 * Advance the play pointer to the next waveheader, looping if required.
+* This is called with the WAVEOUT lock held.
 * Call from AudioUnit IO thread can't use Wine debug channels.
 */
 static void wodHelper_PlayPtrNext(WINE_WAVEOUT* wwo)
 {
     BOOL didLoopBack = FALSE;
 
-    pthread_mutex_lock(&wwo->lock);
-    
     wwo->dwPartialOffset = 0;
     if ((wwo->lpPlayPtr->dwFlags & WHDR_ENDLOOP) && wwo->lpLoopPtr)
     {
@@ -930,8 +929,6 @@ static void wodHelper_PlayPtrNext(WINE_W
         else
             wodHelper_CheckForLoopBegin(wwo);
     }
-    
-    pthread_mutex_unlock(&wwo->lock);
 }
 
 /* if force is TRUE then notify the client that all the headers were completed
@@ -1406,16 +1403,15 @@ OSStatus CoreAudio_woAudioUnitIOProc(voi
 {
     UInt32 buffer;
     WINE_WAVEOUT *wwo = (WINE_WAVEOUT *) inRefCon;
-    int nextPtr = 0;
     int needNotify = 0;
 
     unsigned int dataNeeded = ioData->mBuffers[0].mDataByteSize;
     unsigned int dataProvided = 0;
 
+    pthread_mutex_lock(&wwo->lock);
+
     while (dataNeeded > 0)
     {
-        pthread_mutex_lock(&wwo->lock);
-
         if (wwo->state == WINE_WS_PLAYING && wwo->lpPlayPtr)
         {
             unsigned int available = wwo->lpPlayPtr->dwBufferLength - wwo->dwPartialOffset;
@@ -1438,9 +1434,10 @@ OSStatus CoreAudio_woAudioUnitIOProc(voi
             }
 
             if (available == 0)
-                nextPtr = 1;
-
-            needNotify = 1;
+            {
+                wodHelper_PlayPtrNext(wwo);
+                needNotify = 1;
+            }
         }
         else
         {
@@ -1448,16 +1445,10 @@ OSStatus CoreAudio_woAudioUnitIOProc(voi
             dataProvided += dataNeeded;
             dataNeeded = 0;
         }
-
-        pthread_mutex_unlock(&wwo->lock);
-
-        if (nextPtr)
-        {
-            wodHelper_PlayPtrNext(wwo);
-            nextPtr = 0;
-        }
     }
 
+    pthread_mutex_unlock(&wwo->lock);
+
     /* We only fill buffer 0.  Set any others that might be requested to 0. */
     for (buffer = 1; buffer < ioData->mNumberBuffers; buffer++)
     {




More information about the wine-cvs mailing list