Module: wine Branch: master Commit: 82fff94c338571ec95a1cda47570a3b71523588e URL: http://source.winehq.org/git/wine.git/?a=commit;h=82fff94c338571ec95a1cda475...
Author: Ken Thomases ken@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++) {