From 82fff94c338571ec95a1cda47570a3b71523588e Mon Sep 17 00:00:00 2001 From: Ken Thomases Date: Thu, 21 Dec 2006 03:49:07 -0600 Subject: [PATCH] winecoreaudio: Lift mutex lock/unlock out of wodHelper_PlayPtrNext to caller. --- dlls/winmm/winecoreaudio/audio.c | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/dlls/winmm/winecoreaudio/audio.c b/dlls/winmm/winecoreaudio/audio.c index d38fe9b2e37..c967ebb5faa 100644 --- a/dlls/winmm/winecoreaudio/audio.c +++ b/dlls/winmm/winecoreaudio/audio.c @@ -897,14 +897,13 @@ static void wodHelper_CheckForLoopBegin(WINE_WAVEOUT* wwo) * 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_WAVEOUT* wwo) 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(void *inRefCon, { 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(void *inRefCon, } if (available == 0) - nextPtr = 1; - - needNotify = 1; + { + wodHelper_PlayPtrNext(wwo); + needNotify = 1; + } } else { @@ -1448,16 +1445,10 @@ OSStatus CoreAudio_woAudioUnitIOProc(void *inRefCon, 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++) {